互斥
概念:對於臨界資源區,同一時刻只能有乙個執行緒來訪問,其他執行緒被阻止進入臨界資源區。
同步
概念:併發執行緒在一些關鍵點上可能需要互相等待與互通訊息,這種相互等待與互通訊息稱為執行緒同步。
那麼問題來了,作業系統是如何實現互斥與同步的?
主要的方法有2種:鎖和訊號量其中,鎖和訊號量都能實現執行緒間的互斥,而訊號量的功能更加強大,不但能實現執行緒間的互斥,還能實現程序間的同步。
鎖:
我們對想進入臨界資源區的執行緒,必須先執行加鎖操作,若加鎖操作順利通過,則進入臨界資源區,在完成對臨界資源區的訪問後進行解鎖,釋放臨界資源。
鎖的分類:
忙等待鎖:也稱為自旋鎖,這是最簡單的一種鎖,當執行緒獲取不到鎖時,執行緒就會一直while迴圈,不做任何事情。
無等待鎖:獲取不到鎖時,不用自旋,把當前執行緒放到鎖的等待佇列,執行排程程式,把cpu讓給其他執行緒執行。
訊號量:
訊號量是作業系統提供的一種協調共享資源訪問的方法,我們通常用訊號量表示資源的數量,對應的變數是乙個整型(sem)變數。此外,用p操作和v操作來控制訊號量。
p操作:將sem減1,相減後,如果sem<0,則執行緒進入阻塞等待,否則繼續,表明p操作可能會阻塞。
v操作:將sem加1,相加後,如果sem<=0,喚醒乙個等待的執行緒,表明v操作不會阻塞。
p操作是用在進入臨界區之前,v操作是用在離開臨界區之後,p、v操作必須成對出現。
那麼訊號量是如何實現臨界區互斥訪問?
共享資源設定乙個互斥訊號量s初值為1,表示該臨界資源未被占用。
當乙個執行緒要進入臨界區時,必須先對互斥訊號量進行p操作,執行p操作之後s的值變為0,表示臨界資源空閒,可分配給該執行緒。此時第二個執行緒想要進入臨界區,也應該先執行p操作s值為-1,意味著臨界資源已被占用,第二個執行緒被阻塞。直到第乙個執行緒釋放臨界資源執行v操作s值為0,才喚醒第二個執行緒並進入臨界區,等完成訪問並執行v操作,此時s值為1。
對於兩個併發執行緒,互斥訊號量的取值有1,0,-1三個值,分別表示:
如果互斥訊號量為1,表示沒有執行緒進入臨界區。
如果互斥訊號量為0,表示有乙個執行緒進入臨界區。
如果互斥訊號量為-1,表示有乙個執行緒進入臨界區,另乙個執行緒等待進入。
那麼訊號量是如何實現事件同步?
生產者-消費者問題:
描述:生產者生產資料後放在緩衝區中,消費者從緩衝區取出資料處理,任何時刻,只能有乙個生產者和消費者可以訪問緩衝區。
分析:任何時刻只能有乙個執行緒訪問緩衝區,需要互斥
緩衝區空時,消費者必須等待生產者生成資料,緩衝區滿時,生產者必須等待消費者從緩衝區取出資料,說明生產者和消費者需要同步。
哲學家就餐問題(經典同步問題):
問題描述:
有五個哲學家,他們的生活方式是交替地進行思考和進餐。他們共用一張圓桌,分別坐在五張椅子上。在圓桌上有五個碗和五支叉子,平時乙個哲學家進行思考,飢餓時便試圖取用其左、右最靠近他的叉子,只有在他拿到兩支叉子時才能進餐。進餐完畢,放下叉子又繼續思考。
方案一:當哲學家餓了就去拿叉子,有叉子直接用,沒有叉子就等待其他哲學家放回叉子。
缺點:極限情況下,5位哲學家同時拿起了左邊的叉子,桌子上沒有叉子了,同時也沒有人能夠拿到他們右邊的叉子,就會導致了死鎖的發生。
缺點:5把叉子理論上可以有兩個哲學家同時進餐,從效率上講,這不是最好的解決方案。
方案三:讓偶數編號的哲學家先拿左邊的叉子再拿右邊的叉子,奇數編號的哲學家先拿右邊的叉子後拿左邊的叉子。這樣不會出現死鎖,且兩個哲學家可以同時就餐。
方案四:用乙個記錄每一位哲學家在進餐、思考還是飢餓狀態(試圖拿起叉子),當乙個哲學家只有在兩個鄰居都沒有進餐時,才可以進入進餐狀態。這樣也不會出現死鎖,也可以使兩個哲學家同時進餐。
讀者-寫者問題(資料庫訪問模型):
描述:讀-讀:同一時刻,允許多個讀者同時讀。
讀-寫:沒有寫者時才能讀,沒有讀者時寫者才能寫。
寫-寫:沒有其他寫者時,寫者才能寫。
策略:讀者、寫者優先順序相同。
寫者、讀者互斥訪問。
只能乙個寫者訪問臨界區。
可以有多個讀者同時訪問臨界區。
多執行緒的作業系統
在支援多執行緒的作業系統中,假設程序p建立了若干個執行緒,那麼 47 是不能被其他執行緒共享的。47 a.該程序的 段 b.該程序中開啟的檔案 c.該程序的全域性變數 d.該程序中線程的棧指標 答案 d 解析 同一程序間的執行緒共享的資源包括 1 堆 由於堆是在程序空間中開闢出來的,所以它是理所當然...
作業系統 多程序 多執行緒
對比維度 多程序多執行緒 結論資料共享 資料共享複雜,需要用ipc 共享程序資料,資料共享簡單 多程序 多執行緒 資料同步 資料是分開的,同步簡單 因為共享程序資料,同步複雜 多程序 多執行緒 記憶體 cpu 占用記憶體多,切換複雜,cpu利用率低 占用記憶體少,切換簡單,cpu利用率高 多程序 多...
多執行緒(李森作業系統)
hw9 互斥量 mutex是用來保護資源的。cond是用來通知喚醒的一種機制,如a等待b的輸出結果,a可呼叫pthread cond wait來等待,b輸出結果後可以通知a,告訴他b的工作已經結束,a可以繼續執行了。b呼叫thread cond signal or pthread cond broa...