2.3.6 操作系统之进程同步与互斥经典问题(生产者-消费者问题、多生产者-多消费者问题、吸烟者问题、读者-写者问题、哲学家进餐问题)
生活随笔
收集整理的這篇文章主要介紹了
2.3.6 操作系统之进程同步与互斥经典问题(生产者-消费者问题、多生产者-多消费者问题、吸烟者问题、读者-写者问题、哲学家进餐问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 0.前言
- 1.生產者-消費者問題
- (1)問題描述
- (2)問題分析
- (3)如何實現?
- (4)實現互斥的P操作一定要在實現同步的P操作之后
- (5)知識回顧與重要考點
- 2.多生產者-多消費者問題
- (1)問題描述
- (2)問題分析
- (3)實現方法
- ① 有mutex
- ② 無mutex
- ③ 為什么有mutex和沒有mutex一樣呢?
- ④ 如果有兩個盤子plate
- (4)知識總結與重要考點
- 3.讀者-寫者問題
- (1)問題描述
- (2)問題分析
- (3)實現方法
- ① 給count加mutex互斥訪問
- ② 加一個w實現“讀寫公平法”
- (4)知識回顧與重要考點
- 4.吸煙者問題
- (1)問題描述
- (2)問題分析
- (3)實現方法
- (4)知識回顧與重要考點
- 5.哲學家進餐問題
- (1)問題描述
- (2)問題分析
- (3)如何實現
- (4)知識回顧與重要考點
0.前言
- 同步時,前V后P。
1.生產者-消費者問題
(1)問題描述
- 系統中有一組生產者進程和一組消費者進程,生產者進程每次生產一個產品放入緩沖區,消費者進程每次從緩沖區中取出一個產品并使用。(注: 這里的“產品”理解為某種數據)
- 生產者、消費者共享一個初始為空、大小為n的緩沖區。
- 只有緩沖區沒滿時,生產者才能把產品放入緩沖區,否則必須等待。
- 只有緩沖區不空時,消費者才能從中取出產品,否則必須等待。
- 緩沖區是臨界資源,各進程必須互斥地訪問。
(2)問題分析
- 1)關系分析。生產者和消費者對緩沖區互斥訪問是互斥關系,同時生產者和消費者又是一個相互協作的關系,只有生產者生產之后,消費者才能消費,它們也是同步關系。
- 2)整理思路。根據各進程的操作流程確定P、V操作的大致順序。
生產者每次要消耗(P)一個空閑緩沖區,并生產(V)一個產品。
消費者每次要消耗(P)一個產品,并釋放一個空閑緩沖區(V)。
往緩沖區放入/取走產品需要互斥。 - 3)信號量設置。設置信號量。設置需要的信號量,并根據題目條件確定信號量初值。( 互斥信號量初值一般為1,同步信號量的初始值要看對應資源的初始值是多少)
(3)如何實現?
(4)實現互斥的P操作一定要在實現同步的P操作之后
(5)知識回顧與重要考點
2.多生產者-多消費者問題
(1)問題描述
(2)問題分析
(3)實現方法
① 有mutex
② 無mutex
③ 為什么有mutex和沒有mutex一樣呢?
- 原因在于:本題中的緩沖區大小為1,在任何時刻,apple、 orange、 plate 三個同步信號量中最多只有一個是1。因此在任何時刻,最多只有一個進程的P操作不會被阻塞,并順利地進入臨界區…
④ 如果有兩個盤子plate
(4)知識總結與重要考點
- 總結:在生產者_消費者問題中,如果緩沖區大小為1,那么有可能不需要設置互斥信號量就可以實現互斥訪問緩沖區的功能。當然,這不是絕對的,要具體問題具體分析。
- 建議:在考試中如果來不及仔細分析,可以加上互斥信號量,保證各進程一定會互斥地訪問緩沖區。但需要注意的是,·實現互斥的P操作一定要在實現同步的P操作之后·,否則可能引起·“死鎖”·。
3.讀者-寫者問題
(1)問題描述
(2)問題分析
(3)實現方法
① 給count加mutex互斥訪問
- 這里說一下為什么要加mutex。
- 比如:當count=0時,第一個讀者進程執行到p(rw),rw=0,假設此時時間片到了,切換到第二個讀者進程,第二個進程發現count=0,則執行p(rw),但是此時rw=0,于是第二個進程被堵在p(rw)這里,同理,后面的可能會有多個進程堵在p(rw),只有當第一個進程再次獲得時間片,執行count++,讓count不為0,然后其他進程就可以直接繞過if直接進行count++來訪問文件,但是第三個讀者進程和后面的幾個可能堵在p(rw)的多個讀者進程則必須得等count–為0后才可以再次和寫進程競爭來訪問文件,對count的訪問沒有做到一氣呵成,會導致本來一些進程一直堵在p(rw)。
② 加一個w實現“讀寫公平法”
- 在上面的算法中,讀進程是優先的,即當存在讀進程時,寫操作將被延遲,且只要有 一個讀進程活躍,隨后而來的讀進程都將被允許訪問文件。這樣的方式會導致寫進程可能長時間等待,且存在寫進程“餓死”的情況。
- 若希望寫進程優先,即當有讀進程正在讀共享文件時,有寫進程請求訪問,這時應禁止后續讀進程的請求,等到已在共享文件的讀進程執行完畢,立即讓寫進程執行,只有在無寫進程執行的情況下才允許讀進程再次運行。為此,增加一個信號量并在上面程序的writer()和 reader()函數中各增加一對PV操作,就可以得到寫進程優先的解決程序。
(4)知識回顧與重要考點
4.吸煙者問題
(1)問題描述
(2)問題分析
(3)實現方法
(4)知識回顧與重要考點
5.哲學家進餐問題
(1)問題描述
(2)問題分析
(3)如何實現
(4)知識回顧與重要考點
參考:https://www.bilibili.com/video/BV1YE411D7nH?p=26
總結
以上是生活随笔為你收集整理的2.3.6 操作系统之进程同步与互斥经典问题(生产者-消费者问题、多生产者-多消费者问题、吸烟者问题、读者-写者问题、哲学家进餐问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.2 《数据库系统概论》之关系操作、关
- 下一篇: 3.1 《数据库系统概论》SQL概述及数