一、訊號量
1、訊號量(semaphore):是作業系統提供的一種協調共享資源訪問的方法
①訊號是一種抽象資料結構
乙個整型int(sem),可進行兩個原子操作
p() sem–,如果sem<0,等待,否則繼續,類似lock_acquire
v() sem++,如果sem<=0,說明當前有等著的,喚醒掛在訊號量上的程序,可以是乙個,可以是多個
②訊號量的特性
訊號量是被保護的整數變數。初始化完成後,只能通過p()v()操作修改;由作業系統保證,pv操作時原子操作。
p()可能阻塞,v()不會阻塞
2、訊號量的實現
二、訊號量使用
1、訊號量分兩種型別:
①二進位制訊號量:約等於鎖,取值0 or 1
②資源訊號量:資源數目任何非負值
可以用在兩個方面,互斥或者條件同步(排程約束—–乙個執行緒等待另乙個執行緒的事情發生)
③用二進位制訊號量實現鎖的互斥
mutex= new semaphore(0) //設定乙個訊號量初值為0
mutex->p();
…critical section…
mutex->v();
④必須成對使用p()和v()操作
p()操作保證互斥訪問臨界資源
v()操作在使用後釋放臨界資源
p()v()操作不能次序錯誤、重複或遺漏
2、訊號量實現
class semaphore
//p()操作
semaphore::p()
}//v()操作
semaphore::v()
}
存在問題:
3、生產者—消費者問題
生產者——>緩衝區——>消費者
①問題描述:乙個或多個生產者在生成資料後放在乙個緩衝區裡;單個消費者從緩衝區取出資料處理;任何時刻只能有乙個生產者或消費者可訪問緩衝區
②問題分析:任何時刻只能有乙個執行緒操作緩衝區(互斥訪問);緩衝區空時,消費者必須等待生產者(條件同步);緩衝區滿時,生產者必須等待消費者(條件同步)
③訊號量描述各個約束
二進位制訊號量mutex
資源訊號量fullbuffers
資源訊號量emptybuffers
ⅰ、初始化:
class boundedbuffer
ⅱ、如果buffer不空,則full/empty設別的值
boundedbuffer::deposit(c)
boundedbuffer::remove(c)
//p&v可以換順序嗎?可以。
三、管程
1、管程monitor
①、定義:包含了一系列的共享變數,以及針對這些變數的操作的函式的組合/模組 包含了:乙個鎖,指定臨界區,確保互斥性;0或者多個條件變數,根據條件的個數決定,等待/通知訊號量,併發訪問共享資料
②、條件變數(condition variab)
ⅰ、條件變數是管程內的等待機制:進入管程的執行緒因資源被占用而進入等待狀態;每個條件變數表示一種等待原因,對應乙個等待佇列;
ⅱ、wait() 操作:將自己阻塞在等待佇列中,喚醒乙個等待者或釋放管程的互斥訪問;
ⅲ、signal()操作:將自己佇列中的乙個執行緒喚醒;如果等待隊列為空,則等同空操作;
↑ schedule選擇下乙個process區執行
呼叫管程解決消費者生產者問題
count記錄了當前buffer的資料個數
先在前後加鎖,因為要保證只有乙個執行緒在臨界區 lock在等待/睡眠的時候通過;lock->acquire()管程進入和lock->release()管程釋放;notfull.wait(&lock)釋放鎖。喚醒後獲得鎖。
2、管程條件變數的釋放處理方式
作業系統OS筆記目錄(清華大學)
不得不說想自學學作業系統,清華大學慕課是個不錯的選擇,但難度比較大,特別是想把慕課的實驗部分內容也完成的話。不過如果能把它的實驗部分也完成的話,相信你會對作業系統有個新的認識,在以後的接觸有關計算機方面的內容都很有幫助。如果有打算考清華專業課912研究生的也可以參考下我的筆記 有些我的總結,比較水,...
清華大學作業系統(二)
定義系統呼叫 於應用程式 應用程式主動向作業系統發出服務請求 異常 於不良的應用程式 非法指令或者壞的處理狀態 中斷 於外設 來自不同的硬體裝置的計時器或者是網路中斷 為什麼使用系統呼叫 處理時間 響應硬體 1 將內部 外部事件設定為中斷標記 2 中斷事件的id 軟體 作業系統 異常 異常標號 殺死...
作業系統筆記 清華大學陳渝
分頁page 記憶體塊大小固定 幀 頁表 page frame 解決頁表過大 最不常用演算法 least frequently used,lfu 將訪問次數最少的資料換出 belady現象,分配更多物理記憶體,缺頁反而更多的現象,如fifo 全域性頁面置換演算法 抖動 thrashing 記憶體嚴重...