OS 李治軍 L16 程序同步與訊號量

2022-08-10 23:54:33 字數 1194 閱讀 5929

引例:多程序合作要溝通好。

總不能售票員還在賣票的時候就開車。

在停車的時候,司機在等售票員的乙個訊號,這樣他才可以開車。

在開車的時候,售票員也在等司機的乙個訊號,這樣他才可以開門。

形成一種合理有序向前推進的工作。

程序同步的核心:等!等訊號!

但是,只發訊號還是解決不了全部問題。

如果框滿了,來了兩個生產者sleep在這裡,然後來了乙個消費者,發出框沒滿的訊號量。

然後你怎麼喚醒別的程序呢?如果一起喚醒,那就會有衝突,如果只喚醒乙個,那其他人就一直sleep在那裡。

所以不僅要記錄框裡面東西的數量,所以還需要記錄更全面的資訊,綜合成為最終的訊號量。

下面就設計乙個量,來解決上面的問題。

再引入sem記錄,等的人數,sem=-1表示有乙個人sleep

來了兩個sleep的人,就sem=-2了。

然後來了個消費者,消費完了乙個東西,發現sem=-2,有兩個程序在等待,就在阻塞佇列裡喚醒乙個人,然後sem=-1。

然後又消費了乙個東西,再喚醒乙個人,令sem=0了。

所以合理的方法是使用訊號來進行喚醒,而不是僅僅是counter,counter只能表示當前資源容量,但不能表示等待的程序數目。

如果消費者又消費了乙個東西,就令sem=1。

這時候再來乙個生產者,就sem=0,不需要等待。

所以,訊號量就是表明當前緩衝區容量(帶符號的)

實現:資料結構中包含量、以及當前資源個數。

s函式的寫法:發現還欠著貨,就喚醒別人。這裡沒有做佇列的切換。

s(semaphore s)

}}

用訊號量解決生產者消費者問題

這裡引入了乙個mutex進行原子操作,防止沒寫完、讀完就被別人打擾。

16 程序同步與死鎖 程序同步與訊號量

司機 while true 售票員 while true 印表機按照列印佇列執行列印,當列印佇列中有 6個列印任務,2個程序同時新增列印任務,列印佇列的第7個任務是哪個,需要協調 小結 程序有自己的執行條件,有時執行 有時等待,執行完 可能也要 發出訊號,讓等待該訊號的其他程序執行 程序同步 就是 ...

OS筆記 16 程序同步篇 訊號量機制

1.訊號量的定義 除初始化外,僅能由同步原語對其進行操作的整型變數。2.訊號量的分類 整型訊號量 記錄型訊號量 and型訊號量 訊號量集 按照用途分類,又可分為兩大類 二元訊號量 用作互斥變數,初值為1 一般訊號量 用於一般同步,初值為共享資源的初始數量 1.整型訊號量的定義 除初始化外,僅能通過兩...

OS 李治軍 L17 訊號量臨界區保護

共同修改乙個變數,可能會發生問題。這種情況稱為race condition,不是程式設計的問題,是系統排程的問題。解決問題的直觀想法 給訊號量上鎖。乙個程式在操作訊號量的時候,確保訊號量不能被別人修改。我們定義臨界區 一次只允許乙個程序進入的該程序的那一段 其他地方叫剩餘區 原則互斥 有空讓進,有位...