1. 程式人生 > >Linux同步與相互排斥應用(零):基礎概念

Linux同步與相互排斥應用(零):基礎概念

使用 line 關系 並發執行 來看 文章 必須 生產者 而且

【版權聲明:尊重原創,轉載請保留出處:blog.csdn.net/shallnet 或 .../gentleliu,文章僅供學習交流,請勿用於商業用途】 當操作系統進入多道批處理系統時代以後。一個系統中就存在多個任務,每一個任務都依照一定的算法進行調度來使用內存、cpu等共享資源。

當當中一個任務等待其它資源時,該任務能夠臨時睡眠,操作系統調度另外任務繼續運行額,這樣能夠使系統資源得到最大化利用。而無需像曾經單道批處理系統那樣僅僅有當一個任務完畢之後才運行下一個任務。

可是由此也引入了多任務並發的問題。

並發就是多個任務同一時候運行,在如今的一般大型應用系統中,一個功能基本有多個任務共同完畢,每一個任務相互協調。互相配合以及交換信息。如此一來,我們須要考慮並發任務的同步與相互排斥了。 所謂同步,就是一件事情須要依照先後順序去完畢,當一個任務和還有一個任務通信時,任務A獲取還有一個任務B的信息,當任務B未返回信息時,任務A持續等待,直到B返回信息回來,A再繼續運行。

異步是和同步相對的一個概念,就是任務A向B請求信息時。不必等待B信息的返回,A請求完畢之後直接做下一件事情。 所謂相互排斥就是某些資源在某一時刻僅僅能由一個任務占有。在某資源被任務A占有的情況下。其它須要占有該資源的任務B必須等待,任務A使用完該資源後釋放後任務B才幹使用該資源。一般這種資源被稱作臨界資源,有的時候一段程序不同意並發運行。這段程序被稱作臨界區。
要解決同步相互排斥問題。 最基本的是理清楚活動者之間的同步關系, 還有某些問題中變量的相互排斥問題。我們來看看生產者消費者問題。生產者消費者問題是一個經典的進程同步問題。它描寫敘述的是: 有一群生產者進程在生產產品, 並將此產品提供給消費者進程去消費。為使生產者進程和消費者進程能並發執行, 在它們之間設置有個緩沖區的緩沖池。 生產者進程可將它所生產的產品放入一個緩沖區中,消費者進程可從一個緩沖區取得一個產品消費。雖然全部的生產者進程和消費者進程都是以異步的方式執行的。但它們之間必須保持同步。即不同意消費者進程到一個空緩沖區去取產品, 也不同意生產者進程向一個已裝滿產品的緩沖區投放產品。

我們這樣來描寫敘述這個問題, 假如緩沖池中有n個緩沖區。每一個緩沖區存放一個消息,生產者和消費者進程(或線程)對緩沖區相互排斥的訪問。僅僅要緩沖池未滿,生產者可將消息送入緩沖池;僅僅要緩沖池未空,消費者可從緩沖池取走一個消息。 此時生產者和消費者須要保持同步。當緩沖池為空時,生產者通知消費者不要再來取數據。當不為空時,通知消費者能夠來取數據。
在linux中,實現同步與相互排斥的方法有非常多,比方信號量等,線程還有專用的線程相互排斥鎖以及條件變量。本系列文章將對各種實現同步相互排斥的方法進行分析以及給出演示樣例,而且大多演示樣例都基於生產者消費者模型來闡述。

Linux同步與相互排斥應用(零):基礎概念