操作系统(二十六)读者写者问题
2.3.9 讀者寫者問題
? 讀者寫者問題是十分經(jīng)典的進(jìn)程同步的問題,問題描述如下:讀進(jìn)程與寫進(jìn)程共享文件,但是寫進(jìn)程必須與其他進(jìn)程互斥發(fā)生。
根據(jù)以上的題目要求我們可以得出一些互斥關(guān)系:寫進(jìn)程與寫進(jìn)程互斥,讀進(jìn)程與寫進(jìn)程互斥
??我們可以設(shè)置一個(gè)互斥信號量rw來實(shí)現(xiàn)對互斥信號的共享訪問
semaphore rw=1; //用于實(shí)現(xiàn)對共享文件的互斥訪問writer (){while(1){P(rw); //寫之前“加鎖”寫文件…V(rw); //寫完了“解鎖”} }reader (){ while(1){P(rw); //讀之前“加鎖”讀文件…V(rw); //讀完了“解鎖”} }? 但是這樣簡單的上鎖解鎖會導(dǎo)致讀文件不能同時(shí)進(jìn)行,就像我們進(jìn)房間,打開門之后接著關(guān)上了門,后面的人當(dāng)然沒辦法繼續(xù)進(jìn)來了。按照日常經(jīng)驗(yàn),開門應(yīng)該有第一個(gè)人完成而關(guān)門應(yīng)該有最后一個(gè)人完成,于是我們再次引入count計(jì)數(shù)器,記錄正在讀的進(jìn)程數(shù)。
semaphore rw=1; //用于實(shí)現(xiàn)對共享文件的互斥訪問 int count = 0; //記錄當(dāng)前有幾個(gè)讀進(jìn)程在訪問文件 semaphore mutex = 1;//用于保證對count變量的互斥訪問writer (){while(1){P(rw); //寫之前“加鎖”寫文件…V(rw); //寫完了“解鎖”} }reader (){while(1){if(count==0) //由第一個(gè)讀進(jìn)程負(fù)責(zé)P(rw); //讀之前“加鎖”count++; //訪問文件的讀進(jìn)程數(shù)+1讀文件…count--; //訪問文件的讀進(jìn)程數(shù)-1if(count==0) //由最后一個(gè)讀進(jìn)程負(fù)責(zé)V(rw); //讀完了“解鎖”} }? 這樣做我們又會發(fā)現(xiàn)問題,如果兩個(gè)讀進(jìn)程同時(shí)在count++前訪問的話,P(rw)會這執(zhí)行兩次,那么第二個(gè)讀進(jìn)程會被阻塞。這是由于對count的檢查以及賦值沒有一氣呵成(缺乏原子性)所以我們需要再來一個(gè)變量mutex實(shí)現(xiàn)對count互斥訪問。
semaphore rw=1; //用于實(shí)現(xiàn)對共享文件的互斥訪問 int count = 0; //記錄當(dāng)前有幾個(gè)讀進(jìn)程在訪問文件 semaphore mutex = 1;//用于保證對count變量的互斥訪問writer (){while(1){P(rw); //寫之前“加鎖”寫文件…V(rw); //寫完了“解鎖”} }reader (){while(1){P(mutex); //各讀進(jìn)程互斥訪問countif(count==0) //由第一個(gè)讀進(jìn)程負(fù)責(zé)P(rw); //讀之前“加鎖”count++; //訪問文件的讀進(jìn)程數(shù)+1V(mutex);讀文件…P(mutex); //各讀進(jìn)程互斥訪問countcount--; //訪問文件的讀進(jìn)程數(shù)-1if(count==0) //由最后一個(gè)讀進(jìn)程負(fù)責(zé)V(rw); //讀完了“解鎖”V(mutex);} }? 但是按照上述的代碼來執(zhí)行的話,寫進(jìn)程的操作總會被讀進(jìn)程的到來而阻塞,可能會導(dǎo)致讀進(jìn)程饑餓,我們再來添加一個(gè)互斥信號量w來實(shí)現(xiàn)公平讀寫(先來先服務(wù))
semaphore rw=1; //用于實(shí)現(xiàn)對共享文件的互斥訪問 int count = 0; //記錄當(dāng)前有幾個(gè)讀進(jìn)程在訪問文件 semaphore mutex = 1; //用于保證對count變量的互斥訪問 semaphore w = 1; //用于實(shí)現(xiàn)公平writer (){while(1){P(w);P(rw);寫文件…V(rw);V(w);} }reader (){while(1){P(w);P(mutex);if(count==0)P(rw);count++;V(mutex);V(w);讀文件…P(mutex);count--;if(count==0)V(rw);V(mutex);} }??讀者-寫者問題其核心思想在于設(shè)置了一個(gè)計(jì)數(shù)器 count 用來記錄當(dāng)前正在訪問共享文件的讀進(jìn)程數(shù)。我們可以用count 的值來判斷當(dāng)前進(jìn)入的進(jìn)程是否是第一個(gè)/最后一個(gè)讀進(jìn)程,從而做出不同的處理。
? 另外,對 count 變量的檢查和賦值不能一氣呵成導(dǎo)致了一些錯(cuò)誤,如果需要實(shí)現(xiàn)“一氣呵成”,自然應(yīng)該想到用互斥信號量。
總結(jié)
以上是生活随笔為你收集整理的操作系统(二十六)读者写者问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021中国餐饮营销力白皮书
- 下一篇: 操作系统(二十七)管程