关于操作系统原理几个经典并发问题总结
来源:互联网 发布:windows7 编程看什么书 编辑:程序博客网 时间:2024/05/04 04:45
读者与写者之读者优先问题1、如果一个写者进程正在修改数据,别的写者以及任何读者都不能访问该数据2、当一个读者正在读数据时,另一个读者也需要读数据,应允许第二个读者进入, 同理第三个及随后更多的读者都被允许进入3、现在假设一个写者到来,由于写操作是排他的,所以他不能访问数据,需要阻塞等待。 如果一直都有新的读者陆续到来,写者的写操作将被严重推迟信号量x 队列1:读者信号量wsem 队列2:读者和写者1、某一时刻,队列1中读者正在进行,后续如果有读者跟进,则加入队列1,则队列1中的读 者全部执行结束后开始执行队列2(执行队列1时,若有写者跟进,则加入队列2)2、某一时刻,队列1读者全部执行结束,队列2写者执行,后续如果有读者或者写者,都不能 同时对资源进行操作,执行队列2过程中,跟进的写者放入队列2,第一次跟进的读者放在 队列2当中,其它的读者全部放在队列1中3、某一时刻,队列2中读者释放出来开始执行,读者执行结束后开始执行队列1中的读者, 队列2暂停执行,直到下一次开始。。。const int readcount = 0; /* 统计读者的个数 */读者 写者wait(x);wait(wsem);readcount = readcount + 1;写数据;if(readcount = 1) then wait(wsem);signal(wsem);signal(x);读数据;wait(x);readcount = readcount - 1;if(readcount = 0) then signal(wsem);signal(x);
读者与写者之写者优先问题1、当共享数据区被读者占用时,后续紧邻到达的读者可以继续进入,若这时有一个写者来到且阻塞等待, 则写者后面来的若干读者全部阻塞等待2、换句话说,只要有一个写者申请写数据,则不在允许新的读者进入读数据,这样,写者只需要等待先于 它到来的读者完成任务其读数据任务,而不用等待其后来的读者。3、若写者正在进行,则后加来的写者也会优于读者先执行,只有目前没有了写者要执行时,那么开始执行 读者,重复之前的操作。信号量 x,y,z,rsem,wsem : semaphore (:=1);const readcount = writecount = 0;reader线程wait(z); //执行写者线程时,后来的读者线程全部阻塞在z.queuewait(rsem);wait(x); //确保readcount正确性 readcount = readcount + 1;if(readcount = 1) then wait(wsem)signal(x);signal(rsem);signal(z);读数据;wait(x);readcount = readcount - 1;if(readcount = 0) then signal(wsem);signal(x);writer线程wait(y);writecount = writecount + 1;if(writecount = 1)then wait(resm);signal(y);wait(wsem);写数据;signal(wsem);wait(y);writecount=writecount-1;if(writecount=0)then signal(rsem);signal(y);
信号量 关于书上的生产者与消费者问题s 互斥信号量 s.count = 1; //当前对资源操作只有一个线程n 资源信号量 数据单元 n.count = 0;e 资源信号量 空存储单元 e.count = 缓冲区大小;生产者进程wait(e); //有了空储存单元wait(s); //锁定生产者的操作,资源仅限于当前生产者线程使用存入一条数据; //往空资源存入数据signal(s);//释放其它生产者或消费者线程 signal(n);//释放一个可以进行消费的资源, n.count++;消费者进程wait(n); //有了消费的数据单元wait(s); //锁定消费者的操作,资源仅限于当前消费者线城使用取出一条数据;//留下空资源一个单位signal(s);//释放其它生产者或消费者线程 signal(e);//释放空资源分析:刚开始资源全是空的,生产者开始,假设生产者线程正在处理数据,而且时间稍久,那么后面进入的生产者和消费者都放入了s.queue中,处理结束了以后踢出一个生产者或者消费者,并且增加一个可消费的资源,假设踢出来的是生产者,那么又进行wait下同样的操作,假设踢出来的是消费者,消费者对申请的资源进行处理在系统中:wait(e)申请的空资源数 = 当前生产者 + s.queue中生产者数 wait(n)申请的实资源数 = 当前消费者 + s.queue中消费者数e.count = 100;说明当前最多可以有100个生产者同时进入e.queue 保存的是生产者数n.count = 100;说明当前最多可以有100个消费者同时进入n.queue 保存的是消费者数s.count = 1;说明当前最多可以有1个生产者或者消费者进入临界资源区
0 0
- 关于操作系统原理几个经典并发问题总结
- 经典操作系统&&数据库问题总结
- 关于操作系统的几个常被问的问题
- 操作系统的几个简单问题总结
- 关于数据库并发问题总结
- 关于问题定位的几个经典定律
- 并发编程:几个关键概念和三个经典问题
- 【操作系统总结】经典的进程同步问题-生产者消费者问题
- 总结几个关于web浏览器缓存资料,非常经典
- 关于java高并发问题总结
- 关于MM的几个经典问题及回答
- 关于MM的几个经典问题及回答
- [转]关于软件测试的几个经典问题(1)
- [转]关于软件测试的几个经典问题(2)
- 操作系统经典问题
- 操作系统 经典问题
- 操作系统中的经典问题
- 几个经典问题
- C20_OC10-内存管理
- Java值传递
- 解决"No CurrentSessionContext configured"错误
- 身份照号码批量生成器
- 迭代器模式
- 关于操作系统原理几个经典并发问题总结
- Visual Studio注释模板
- C# DateTime 日期 季度 加一天 减一天 加一月 减一月 等方法
- CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)
- 性能优化之Java(Android)代码优化
- 程序地址重定位和模块绑定
- Android WebView
- C++去除程序注释实现
- C语言算术运算符和算术表达式