nachos下的執行緒程式設計3 電梯的實現

2021-06-18 02:17:11 字數 2562 閱讀 4724

nachos下的執行緒程式設計

一、    實驗內容

本次實驗的目的在於掌握使用nachos中的執行緒來解決較為複雜的併發問題。實驗內容分三部分:實現事件柵欄原語並進行正確性測試;實現鬧鐘原語並進行正確性測試;利用事件柵欄和鬧鐘原語來解決電梯問題

二、    實驗思路

首先使用semaphore來編寫鎖,相應的介面在synch.h中,對於synch.h,我們只要在類裡面新增某些變數即可。然後對於synch.cc,我們的具體實現要在這裡編寫。只要補全空的建構函式和析構函式即可。特別注意,其中的環境變數要和鎖一起使用,執行緒在sleep之前要釋放鎖,在恢復執行後要重新獲取鎖。編寫完後,在dllist.h中引用synch.h,然後在類中定義鎖,在dllist.cc中新建鎖後就可以使用了。在dllist.cc中,移除節點的時候,如果遇到鍊錶是空的,要listempty->wait(lock),在sortedinsert和sortedremove中,進入函式的時候加鎖lock->acquire(),出去的時候釋放鎖lock->release()。並且,在sortedinsert出去的時候,同樣要發listempty->signal(lock)。在dllist-driver.cc和threadtest.cc中,分別定義乙個外部鎖即可。用thread::sleep實現與上面的思路類似。至於實現乙個執行緒安全的表結構和實現乙個大小受限的緩衝區,有了以上的編寫經驗,然後參照標頭檔案的介面宣告編寫相關函式即可。

三、    實驗結果

ps:本次實驗預設情況下是5個乘客10個樓層

實驗中第乙個引數是:乘客數 第二個引數是樓層數:比如

四、    實驗總結

實驗過程中又不懂的就看nachos中文教程及實驗上的ppt指導主要理解到:

時間柵欄

wait

wait操作的呼叫者在事件柵欄上等待signal的發出。

收到signal後呼叫complete操作表示應答結束。

wait操作的呼叫者與signal操作的呼叫者最終都將同步地通過柵欄

signal的發出者必須等待,並保持事件柵欄處於「signaled」狀態。

直到所有的wait操作的呼叫者都已經應答之後才能通過事件柵欄

然後離開事件柵欄並恢復事件柵欄的初始狀態「unsignaled」

timer類的實現很簡單,當生成出乙個timer類的例項時,就設計了乙個模擬的時鐘中斷。這裡考慮的問題是:怎樣實現定期發生時鐘中斷?

一旦中斷時刻到來,立即進行中斷處理,處理結束後並沒有機會將下乙個時鐘中斷插入到等待處理中斷佇列。

呼叫timerhandler函式,其呼叫timerexpired方法,該方法將新的時鐘中斷插入到等待處理中斷佇列中,然後再呼叫真正的時鐘中斷處理函式。這樣nachos就可以定時的收到時鐘中斷。

處理始終的中斷處理函式在interrupt類當中。

這個函式又加入了乙個了剛才一模一樣的中斷,這樣的話就可以實現每隔一段時間就發乙個類似的中斷,然後再執行中斷處理函式,這個中斷處理函式是在建構函式中賦值的,專門用來處理時鐘中斷

而鬧鐘第一步:  timer = new timer(timerinterrupthandler, 0, randomyield);   在終端等待佇列中新增乙個時鐘中斷,中斷引數就是本物件

第二步    固定時間後固定中斷會自動產生(系統固定時鐘中斷),然後判斷是否就是時鐘中斷,如果是,則通過裡面的中斷引數呼叫時鐘中斷處理函式,中斷處理函式首先是新增乙個時鐘中斷,然後是呼叫中斷的另乙個引數,該引數就是實際中斷處理函式。(也就是timer類裡面的第乙個引數)

第三步 重複第二步

電梯:

對於電梯主要是需要用到前面做過的實驗,主要是事件柵欄(用於人到電梯前時們還沒開則堵塞到向上或向下的柵欄上,在電梯裡面則根據電梯現在在哪,堵塞到相應的樓層的事件柵欄上面等到電梯開門在一起出去,同時最後乙個告訴電梯關門)訊號量(1判斷是否有乘客要用電梯否則把電梯程序堵塞empty訊號量上面去)鬧鐘則是用來限制人到底以多大的頻率使用電梯通過鬧鐘的pause()把自己堵塞到鬧鐘的堵塞佇列知道時間到在將程序通過排程器:scheduler排程到就緒佇列當中(該就緒佇列的具體實現在scheduler類裡面的readylist)則用到了每次只能乙個程序執行改變每層樓上面的等待電梯向上或向下的人數計數等。

通過本次實驗把書上的知識徹底的由抽象到直觀,對書上的訊號量,鎖互斥等概念有個更好的理解。

多執行緒程式設計3

執行緒清理處理函式 void pthread cleanup push void rtn void void arg 設定清理函式 void pthread cleanup pop int execute execute為0,清理函式將不被呼叫 不為0則呼叫 清理函式執行的三種情況 1,呼叫pthr...

Linux下的多執行緒程式設計

執行緒是作業系統能夠進行排程運算的最小單位,它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序可以併發多個執行緒,每條執行緒執行不同的任務。include intpthread create pthread t pthread,const pthread...

Linux下的多執行緒程式設計

如何一次建立多個執行緒 現在對上述的互斥量的實驗程式進行分析 首先在main 函式中建立了兩個執行緒,先執行執行緒1,再執行執行緒2.執行緒1對count加互斥所,此時執行緒2就不能訪問count。只有當沉睡時間過後執行緒1對互斥量解鎖之後,執行緒2才能加鎖修改count的值並訪問,最後解鎖。try...