オペレーティングシステム:読み取り書き込み問題
データファイルまたはレコードは、複数のプロセスで共有することができます。
「リーダー・プロセス、」他のプロセスのための読み取り専用プロセス「ライター・プロセス。」
これは、複数のオブジェクトが同時に共有オブジェクトを読み取ることができ、同じ共有オブジェクトにリーダライタプロセスと他のプロセスを許可しません。
セマフォの使用記録は、問題のリーダーやライターを解決します
ミューテックスwmutexは:、読み取りまたは書き込みリーダライタプロセス間の相互排除を実現します
変数readcount整数:読み取り中のプロセスの数を表します。
長い読み取り処理におけるリーダーがあるほど、あなたはどちらの作家の書き込み処理することができるので。
したがって、readcount = 0、すなわち、読み出しのプロセスには、リーダ、リーダのみ必要としない場合にのみ実行されるのを待つ(wmutex)動作
待機(wmutex)操作が成功すると、読者のプロセスがreadercount + 1の操作を行い、それに応じて、読むことができるようになります。
同様に、ときにのみreadcount-1の値を操作を行った後、リーダ・プロセスは、プロセスがライターを書き込むように、信号(wmutex)操作を実行する必要が、0であります
ミューテックスrmutex:読者アクセスreadcount間の相互排他
要約:
wmutex:ミューテックスセマフォ読み書き。
rmutex:信号の量は、アクセスreadcountの相互排除を読まれます
読者の優先順位は、飢餓ライターの原因となります。(そこに書き込みファイルにライターである、またはしない限り、読者は待つ必要がないことを読者の優先手段)
semaphore wmutex=1;//读写互斥,写写互斥
semaphore rmutex=1;读间访问readcount互斥
int readcount=0;读者进程数
reader{
while(true){
wait(rmutex);获取读间访问readcount互斥信号量
if(readcount==0)如果之前没有读进程,则先获取读写互斥信号量,对readcount加1,
wait(wmutex);
++readcount;
signal(rmutex);readcount加1操作完后释放读间访问readcount互斥信号量,开始读
read;
wait(rmutex);读完后,对readcount操作加锁,执行readcount减1操作
--readcount;
if(readcount==0)没有读进程后,就释放读写互斥锁
signal(wmutex);
signal(rmutex);
}
}
writer{
while(true){
wait(wmutex);
write;
ignal(wmutex);
}
}