郝亞洲 李文敏
計算機操作系統(tǒng)原理課程是計算機科學與技術及相關專業(yè)的核心課程,歷來為計算機及信息學科所重視。操作系統(tǒng)原理課程中重要的一環(huán)就是進程間的通信問題。而“讀者-寫者”問題更是進程間通信的經(jīng)典,學好它不僅可使學生鞏固理論學習的概念、原理、設計及算法,同時也可培養(yǎng)軟件開發(fā)所應有的系統(tǒng)結(jié)構(gòu)設計和軟件工程素養(yǎng)。
操作系統(tǒng);文件系統(tǒng);功能調(diào)用
1.問題的提出及論文的目的
在Windows7環(huán)境下,創(chuàng)建一個控制臺進程,此進程包含n個線程。用這n個線程來表示n個讀者或?qū)懻?。每個線程按相應測試數(shù)據(jù)文件的要求進行讀寫操作。用信號量機制分別實現(xiàn)讀者優(yōu)先和寫者優(yōu)先問題。
通過分析并實現(xiàn)經(jīng)典的“讀者-寫者”問題,鞏固對線程及其同步機制的學習效果,加深對相關基本概念的理解,并讓讀者了解如何將基本原理和實際設計有機的結(jié)合。
2.設計思路
可以將所有讀者和所有寫者分別存于一個讀者等待隊列和一個寫者等待隊列中,每當讀允許時,就從讀者隊列中釋放一個或多個讀者線程進行讀操作;每當寫允許時,就從寫者隊列中釋放一個寫者線程進行寫操作。
讀者優(yōu)先。讀者優(yōu)先指的是除非有寫者在寫文件,否則讀者不需要等待。所以可以用一個整數(shù)變量Read count記錄當前的讀者數(shù)目,用于確定是否需要釋放正在等待的寫者進程(當Read count=0時,表明所有的讀者讀完,需要釋放寫者等待隊列中的一個寫者)。每當一個讀者開始讀文件時,必須修改Read count變量。因此需要一個互斥對象mutex來實現(xiàn)對全局變量Read count修改時的互斥。
另外,為了實現(xiàn)讀-寫互斥,需要增加一個臨界區(qū)對象Write。當寫者發(fā)出寫請求時,必須申請臨界區(qū)對象的所有權(quán)。通過這種方法,可以實現(xiàn)讀-寫互斥,當Read count=1時(即第一個讀者到來時),讀者線程也必須申請臨界區(qū)對象的所有權(quán)。
當讀者擁有臨界區(qū)的所有權(quán)時,寫者阻塞在臨界區(qū)對象Write上。當寫者擁有臨界區(qū)的所有權(quán)時,第一個讀者判斷完”Read count==1”后阻塞在Write上,其余的讀者由于等待對Read count的判斷,阻塞在mutex上。
寫者優(yōu)先。寫者優(yōu)先與讀者優(yōu)先相類似。不同之處在于一旦一個寫者到來,它應該盡快對文件進行寫操作,如果有一個寫者在等待,則新到來的讀者不允許進行讀操作。為此應當填加一個整形變量Write count,用于記錄正在等待的寫者的數(shù)目,當Write count=0時,才可以釋放等待的讀者線程隊列。
為了對全局變量Write count實現(xiàn)互斥,必須增加一個互斥對象mutex3。
為了實現(xiàn)寫者優(yōu)先,應當填加一個臨界區(qū)對象read,當有寫者在寫文件或等待時,讀者必須阻塞在read上。
讀者線程除了要對全局變量Read count實現(xiàn)操作上的互斥外,還必須有一個互斥對象對阻塞read這一過程實現(xiàn)互斥。這兩個互斥對象分別命名為mutex1,mutex2。
以上內(nèi)容很清楚的講述了進程間通信之經(jīng)典問題—“讀者-寫著”問題的本質(zhì),并且提出了實現(xiàn)的方法,可以幫助讀者學好操作系統(tǒng)這門核心的計算機專業(yè)課程。
[1]湯子瀛.計算機操作系統(tǒng)[M].西安:西安電子科技大學出版社,2011.08
[2]特南鮑姆.現(xiàn)代操作系統(tǒng)[M].北京:機械工業(yè)出版社,2002.01
[3]William Stalling.操作系統(tǒng):精髓與設計原理[M].北京:電子工業(yè)出版社,2006.03