天天看點

生産者-消費者資料同步問題

用生産者—消費者問題實作資料同步通信資料同步通信過程實際上等同于生産者—消費者問題( Producer-Consumer Problem) . 生産者—消費者問題是一個著名的程序同步問題,它描述的是: 用一群生産者程序生産消息,并用此消息提供給消費者程序消費. 為使生産者程序和消費者程序能并發執行,在它們之間設定一個具有N 個緩沖區的緩沖池,生産者程序可将它所生産的消息投入一個緩沖區中,消費者程序可從一個緩沖區中取得一個消息消費. 盡管所有的生産者程序和消費者程序都是以異步方式進行,但它們之間必須保持同步,即不允許消費者程序到一個空緩沖區中去取消息,也不允許生産者程序到一個已裝有消息但該消息未被取走的緩沖區中投放新消息. 采用共享資料的方法簡化了資料交換,但在多程序資料通信過程中卻可能發生錯誤,使資料内容被破壞. 為解決問題,可利用信号量的互斥性加以同步保護,獲得對緩沖區(資料) 的獨占通路,見圖4.
生産者-消費者資料同步問題
圖4 圖4 中,假設緩沖池包含10 個緩沖區,一個任務通過調用BufReq ( ) 可以從緩沖區管理器中獲得一個緩沖區,用BufRel ( ) 釋放該緩沖區到緩沖區管理器中. 緩沖區管理器共有10 個信号量,當所有的信号量都被使用時,再申請緩沖區的任務将被挂起,直到有信号量可以使用為止. 當一個帶有緩沖區的任務完成後,它将調用BufRel ( ) 把緩沖區還給緩沖區管理器. 本文采用計數器信号量來管理緩沖區,與其它信号量相比,計數器信号量的特點在于,它可以保持對信号量釋放次數的追蹤. 信号量每次釋放,計數器加1 ,每次擷取,計數器減1. 當計數器為0 時,試圖擷取該信号量的任務被阻塞. 在中斷服務程式中,可以将資料寫入緩沖區,然後再釋放信号量. 由于它保持對信号量釋放次數的追蹤功能,如果任務暫時無法讀取資料,資料也不會被丢棄.
<b>從上面原理,可以這樣信号量的數值,其意義是共享資源的數目</b>。

繼續閱讀