共同修改乙個變數,可能會發生問題。
這種情況稱為race condition,不是程式設計的問題,是系統排程的問題。
解決問題的直觀想法:給訊號量上鎖。乙個程式在操作訊號量的時候,確保訊號量不能被別人修改。
我們定義臨界區:一次只允許乙個程序進入的該程序的那一段**。其他地方叫剩餘區
原則互斥
有空讓進,有位子就讓進入
有限等待,遲早能進去
方法:一、輪換法
也叫作值日法,輪到誰,誰進去。
但是有問題哦,p0完成後,必須要等待p1再進去一次,p0才能再進去一次。就是沒輪到我值日?我才不進去。
二、標記法
想進去,先打個標記,如果發現別人留了標記,我就先等著。出來了就撕掉自己貼的標籤。
不滿足有空讓進,可能出現的情況:p0留了標記然後切到p1,p1又留了條子,然後一直等p1,切回p0,p0也得等著,形成死鎖。
總之就是,只維護乙個全域性變數,導致整體的靈活性不夠;維護兩個全域性變數,導致有可能出現死鎖。
三、非對稱標記
帶名字的便條+讓乙個人更加勤勞一些,乙個人要一直盯著有沒有貨,一直沒貨就自己上。
peterson演算法
融合標記和輪轉方法。輪到我了,我就進去。如果裡面沒有人,我也進去。就不會發生兩個星際玩家一直蹲在外面等對方出來,也不會出現沒輪到我值日我也不進去的情況。
現在把問題擴充套件到多程序,為麵包店演算法,借鑑取號。
如何輪**每個程序獲得乙個序號,序號小的進入
如何標記:程序離開時序號為,不為0的序號即標記。
但有點太複雜了,這是一種軟體方法。
第二種方法是硬體方法,思路為阻止排程,而中斷才能發生排程,所以可以關中斷,保證原子操作。
什麼情況有問題?多cpu!中斷線在cpu上,每個cpu只能管自己的cpu。只能在小系統上做。
第三種方法是硬體方法,硬體原子指令法。用mutex來保護empty,那誰來保護mutex?所以要保證乙個修改訊號量的原子指令,即用乙個硬體指令實現整數賦值。
ps.話說好像乙個賦值語句就是原子的吧?所以mutex應該不用保護?重點是要保護那種,需要被一大段語句操作的資源8?
OS 李治軍 L16 程序同步與訊號量
引例 多程序合作要溝通好。總不能售票員還在賣票的時候就開車。在停車的時候,司機在等售票員的乙個訊號,這樣他才可以開車。在開車的時候,售票員也在等司機的乙個訊號,這樣他才可以開門。形成一種合理有序向前推進的工作。程序同步的核心 等!等訊號!但是,只發訊號還是解決不了全部問題。如果框滿了,來了兩個生產者...
OS 李治軍 L25 記憶體換出
有換入就應該有換出!等價交換!必須要選擇乙個頁換出,選擇哪一頁淘汰emm?下面介紹淘汰演算法。一 fifo 先來的先走。二 min 記憶體當中,將來最久沒有使用過的page滾蛋。效果很好,但是我們做不到,我們不知道將來會有什麼東西過來。三 lru 用過去的歷史 我來,選最近最長一段時間沒有使用過的頁...
OS 李治軍 L28 生磁碟的使用
磁碟具有更複雜的結構,在作業系統內有著更為複雜的抽象層次,這裡的生 raw 是讓disk跑起來的意思。可以將磁碟的結構理解為多個原片疊起來的柱面,我們用以下的引數取描述乙個磁碟 理論上,我們要操控乙個磁碟,就要對其控制器發出指令,控制磁頭的電機,使磁頭移動到相應的軌道上去 找到乙個柱面 然後開始旋轉...