读者写者问题--使用信号量的读者优先与写者优先程序分析
2011-12-14 17:07
417 查看
所谓谁谁优先的问题,我认为主要体现在以下两点中:
1.当低优先级进程(线程)获得临界区时,高优先级进程能很快从低优先级的进程中抢得访问权。
2.当高优先级的进程获得临界区访问权时,低优先级得等到高优先级全部访问完的空闲时间才能抢得访问权。
这两点中, 第一点一定得要,不然无法体现出优先的意思 。
第二点可以根据程序的需要决定。
程序摘自:《操作系统精髓与设计原理》
程序中semWait 就是指信号量P 操作, semSignal 就是指V
首先明白一点 如果某一信号初始值为1 ,且在一个函数中是P,V操作是成对出现 ,那么这个信号量就是用来起互斥作用!
信号量x ,是用来保证readCount 自加自减操作和if条件语句操作的原子性。
来分析下为什么这个程序是读优先呢?
1.考虑下这种情况:如果读者已经获得临界区的访问权,那么当读者连续不断时(即中间间隔小),也就是说当一个进程读完前,另一个进程也进入到了临界区。 此时的话,任一时间在临界区中的写进程者会大于一 。 即使来了写进程,也只能有一个写者阻塞在wsem信号中,其余全阻塞在z信号中。。。直到某一时刻,无读者在临界区时,才有机会写临界区。
2.在考虑一种情况:写进程已经获得了临界区的访问权,且写进程也很密集。 此时读进程能不能优先得到访问权而不用等到写进程全部访问完呢?
答案是能。 写进程很多,那么一次又只能有一个写进程访问临界区。则其余的写进程都会在z信号中阻塞,排队且。 如果读进程也想访问了,读进程就会在wsem信号中阻塞排队即只有读进程会在wsem中阻塞排队。 注意:当此时的写进程一旦完成访问临界区WRITEUNIT . 下一句semSignal(wsem) , 好, 此时阻塞在wsem队列中的读进程就抢得到临界区的访问权。。
综上所述:在读者优先的程序中:写进程只有等待无读者访问临界区的时刻,才能得到访问权 ; 读进程在任意时候都可以得到访问权。
阻塞在wsem队列中最多只有一个写者 ,其余的写者阻塞在z信号中。 wsem队列中当然最多可能有有限个写者(因为写者能有很短的时候内得到访问权)
//写者优先
同前面一样, y是用来保护写者中对writecount操作的原子性。
1.当读者获得了访问临界区的权利时,且读者进程访问的很密集时(即很多读者都需要访问),写者如何抢得访问权。
当读者获得访问权时即有一个进程正在执行READUINT操作时。和上一个读者优先程序中的写者差不多,如果没有写者,那么读者就能一个接一个到达临界区访问。但是因为READUINT操作前由于有z信号和rsem信号的互斥作用。使得读者一个只有一个通过这一段代码,其余的者阻塞在z信号中。进入临界区时是依次进入的(但出来不一定是先进先出) 。 一旦此时来了一个写者,他就会阻塞在rsem信号中。等会此时的读者刚一执行完semSignal(rsem)时,那么写者就得到rsem信号可以继续执行了。然后写者就只用等待读者中已经进入临界区的出来就能执行了。
2.当写者获得临界区的访问权时,读者只能等到临界区空闲时才能得到临界区访问权。
因为当写者获得临界区时,所有的读者都会阻塞在z信号和rsem信号中。 而只有最后一个写者访问完临界区时,才会semSignal(rsem), 使得阻塞在rsem中唯一的读者获得临界区访问权。
z信号的作用是 当读者获得权限时, 此时来的写者不用等待他前面所有的读者都访问完才访问 。 因为z信号使得在rsem信号队列中至多只有一个读者阻塞
转载注明出处
1.当低优先级进程(线程)获得临界区时,高优先级进程能很快从低优先级的进程中抢得访问权。
2.当高优先级的进程获得临界区访问权时,低优先级得等到高优先级全部访问完的空闲时间才能抢得访问权。
这两点中, 第一点一定得要,不然无法体现出优先的意思 。
第二点可以根据程序的需要决定。
程序摘自:《操作系统精髓与设计原理》
/* program readersandwriters*/ //读者优先,经过我修改了一点 int readcount = 0; semaphore x = 1,z = 1, wsem = 1; void reader() { while(true){ semWait(x); readcount ++ ; if(readcount == 1) semWait(wsem); semSignal(x); READUNIT();//读数据 semWait(x); readcount --; if(readcount == 0) semSignal(wsem); semSignal(x); } } void writer() { while(true){ semWait(z);//自己加的,不过这样降低了写操作的效率,但满足了以上2点。去除z信号后,就只满足第1点,可以自己分析分析 semWait(wsem); WRITEUNIT();//写数据 semSignal(wsem); semSignal(z); } }
程序中semWait 就是指信号量P 操作, semSignal 就是指V
首先明白一点 如果某一信号初始值为1 ,且在一个函数中是P,V操作是成对出现 ,那么这个信号量就是用来起互斥作用!
信号量x ,是用来保证readCount 自加自减操作和if条件语句操作的原子性。
来分析下为什么这个程序是读优先呢?
1.考虑下这种情况:如果读者已经获得临界区的访问权,那么当读者连续不断时(即中间间隔小),也就是说当一个进程读完前,另一个进程也进入到了临界区。 此时的话,任一时间在临界区中的写进程者会大于一 。 即使来了写进程,也只能有一个写者阻塞在wsem信号中,其余全阻塞在z信号中。。。直到某一时刻,无读者在临界区时,才有机会写临界区。
2.在考虑一种情况:写进程已经获得了临界区的访问权,且写进程也很密集。 此时读进程能不能优先得到访问权而不用等到写进程全部访问完呢?
答案是能。 写进程很多,那么一次又只能有一个写进程访问临界区。则其余的写进程都会在z信号中阻塞,排队且。 如果读进程也想访问了,读进程就会在wsem信号中阻塞排队即只有读进程会在wsem中阻塞排队。 注意:当此时的写进程一旦完成访问临界区WRITEUNIT . 下一句semSignal(wsem) , 好, 此时阻塞在wsem队列中的读进程就抢得到临界区的访问权。。
综上所述:在读者优先的程序中:写进程只有等待无读者访问临界区的时刻,才能得到访问权 ; 读进程在任意时候都可以得到访问权。
阻塞在wsem队列中最多只有一个写者 ,其余的写者阻塞在z信号中。 wsem队列中当然最多可能有有限个写者(因为写者能有很短的时候内得到访问权)
//写者优先
/*program readersandwriters*/ //写者优先 int readcount , writecount; semaphore x = 1, y = 1, z = 1, wsem = 1 , rsem = 1; void reader() { while(true){ semWait(z);//z信号用来保证阻塞在rsem信号中排队的读者至多只有一个。其余的阻塞在z上。 semWait(rsem); semWait(x);//保证下面3句操作的原子性 readcount ++; if(readcount == i) semWait(wsem); semSignal(x); semSignal(rsem);//写者抢占访问权的时机! semSignal(z); READUNIT(); semWait(x); readcount --; if(readcount == 0) semSignal(wsem); semSignal(x); } } void writer() { while(true){ semWait(y); writecount ++; if(writecount == 1) semWait(rsem);//第一个写者阻塞地方 semSignal(y); semWait(wsem); WRITEUNIT(); semSignal(wsem); semWait(y); writecount --; if(writecount == 0) semSignal(rsem); semSignal(y); } }
同前面一样, y是用来保护写者中对writecount操作的原子性。
1.当读者获得了访问临界区的权利时,且读者进程访问的很密集时(即很多读者都需要访问),写者如何抢得访问权。
当读者获得访问权时即有一个进程正在执行READUINT操作时。和上一个读者优先程序中的写者差不多,如果没有写者,那么读者就能一个接一个到达临界区访问。但是因为READUINT操作前由于有z信号和rsem信号的互斥作用。使得读者一个只有一个通过这一段代码,其余的者阻塞在z信号中。进入临界区时是依次进入的(但出来不一定是先进先出) 。 一旦此时来了一个写者,他就会阻塞在rsem信号中。等会此时的读者刚一执行完semSignal(rsem)时,那么写者就得到rsem信号可以继续执行了。然后写者就只用等待读者中已经进入临界区的出来就能执行了。
2.当写者获得临界区的访问权时,读者只能等到临界区空闲时才能得到临界区访问权。
因为当写者获得临界区时,所有的读者都会阻塞在z信号和rsem信号中。 而只有最后一个写者访问完临界区时,才会semSignal(rsem), 使得阻塞在rsem中唯一的读者获得临界区访问权。
z信号的作用是 当读者获得权限时, 此时来的写者不用等待他前面所有的读者都访问完才访问 。 因为z信号使得在rsem信号队列中至多只有一个读者阻塞
转载注明出处
相关文章推荐
- (转)很有借鉴意义!读者写者问题--使用信号量的读者优先与写者优先程序分析
- 读者写者问题--使用信号量的读者优先与写者优先程序分析
- 很有借鉴意义!读者写者问题--使用信号量的读者优先与写者优先程序分析
- 使用信号量解决读者写者问题--写者优先
- 使用信号量解决读者写者问题--写者优先
- 使用信号量解决读者写者问题--读者优先
- 使用信号量解决读者写者问题--读者优先
- 有名信号量实现读者-写者问题(读者优先)
- 基于信号量与P/V操作同步机制的读者/写者问题的设计与实现 (写者优先)
- 基于信号量与P/V操作同步机制的读者/写者问题的设计与实现 (写者优先)
- 读者写者问题(读者优先、写者优先、公平竞争)
- 读者写者问题(写者优先)的信号量及PV操作解决方案
- 用信号量解决读者写者问题
- William Stallings 《操作系统内核和设计原理》书中Linux下C语言实现读者写者问题(写者优先)代码
- 用信号量解决读者写者问题
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 读者写者问题之写者优先(java)
- 用信号量解决读者写者问题
- 读者-写者问题 写者优先与公平竞争
- 用信号量解决读者写者问题