关于操作系统原理几个经典并发问题总结

来源:互联网 发布: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
原创粉丝点击