經典程序同步問題

2021-05-23 01:18:58 字數 1489 閱讀 7431

文章出處:http://heikediguo2005.blog.163.com/blog/static/2211971200910254235533/

依據訊號量與程序的關係,我們可把程序中使訊號量分成私用訊號量和公用訊號量。私有訊號量是指只與制約程序和被制約程序有關的訊號量;公用訊號量是指與一組併發程序有關的訊號量。

1. 生產者——消費者問題

生產者——消費者問題(producer-consumer problem)是指若干程序通過有限的共享緩衝區交換資料時的緩衝區資源使用問題。假設「生產者」程序不斷向共享緩衝區寫入資料(即生成資料),而「消費者」程序不斷從共享緩衝區讀出資料(即消費資料);共享緩衝區共有n個;任何時刻只能有乙個程序可對共享緩衝區進行操作。所有生產者和消費者之間要協調,以完成對共享緩衝區的操作。

我們可把共享緩衝區中的n個緩衝塊視為共享資源,生產者寫入資料的緩衝塊成為消費者可用資源,而消費者讀出資料後的緩衝塊成為生產者的可用資源。為此,可設定三個訊號量:full、empty和mutex。其中:full表示有資料的緩衝塊數目,初值是0;empty表示空的緩衝塊數,初值是n;mutex用於訪問緩衝區時的互斥,初值是1。實際上,full和empty間存在如下關係:full+empty = n。

注意:這裡每個程序中各個p操作的次序是重要的。各程序必須先檢查自己對應的資源數在確信有可用資源後再申請對整個緩衝區的互斥操作;否則,先申請對整個緩衝區的互斥操作後申請自己對應的緩衝塊資源,就可能死鎖。出現死鎖的條件是,申請到對整個緩衝區的互斥操作後,才發現自己對應的緩衝塊資源,這時已不能放棄對整個緩衝區的占用。

如果採用and訊號量集,相應的進入區和退出區都很簡單。如生產者的進入區為

swait(empty, mutex),退出區為ssignal(full, mutex)。

2. 讀者——寫者問題

讀者——寫者問題(readers——writers problem)是指多個程序對乙個共享資源進行讀寫操作的問題。假設「讀者」程序可對共享資源進行讀操作,「寫者」程序可對共享資源進行寫操作;任一時刻「寫者」最多隻允許乙個,而「讀者」則允許多個。即對共享資源的讀寫操作限制關係包括:「讀—寫,互斥」、「寫—寫」互斥和「讀—讀」允許。

我們可認為寫者之間、寫者與第乙個讀者之間要對共享資源進行互斥訪問,而後續讀者不需要互斥訪問。為此,可設定兩個訊號量wmutex、rmutex和乙個公共變數rcount。其中,wmutex表示「允許寫」,初值是1;公共變數rcount表示「正在讀」的程序數,初值是0;rmutex表示對rcount的互斥操作,初值是1。

在這個例子中,我們可見到臨界資源訪問過程的巢狀使用。在讀者演算法中,進入區和退出區又分別巢狀了乙個臨界資源訪問過程。

對讀者——寫者問題,也可採用一般「訊號量集」機制來實現。如果我們在前面的讀寫操作限制上再加乙個限制條件:同時讀的「讀者」最多r個。這時,可設定兩個訊號量wmutex和rcount。其中:wmutex表示「允許寫」,初值是  rcount表示「允許讀者數目」的程序數,初值是r。為採用一般「訊號量採集」機制來實現的讀者——寫者演算法。

經典程序同步問題

wait表示為訊號量減一,當訊號量不夠減時 訊號量 0 時 說明當前資源不足,發出資源請求的程序阻塞直到資源可達。signal 表示為訊號量加一,表示釋放了當前訊號量所指代的資源。兩者都是原子操作,不可打斷。生產者不停的向訊息佇列中生產訊息,消費者則不停的從訊息佇列中獲取訊息。當訊息佇列滿時,生產者...

經典程序同步問題

生產者消費者問題 是同步互斥的綜合。乙個生產者程序和乙個消費者程序共享乙個初始為空 大小為n的緩衝區。緩衝區沒滿生產者才能放東西,緩衝區不空消費者才能取東西。設定三個訊號量,mutex表示對緩衝區的互斥訪問,初值為1。empty表示還沒有被訊息佔據的緩衝區大小,初值為n。full表示已經被訊息佔據的...

經典程序同步問題 十

哲學家就餐問題可以這樣表述,假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手...