解決多個程序同時訪問同乙個資源的時候出現資料破壞的問題
首先找到臨界區
臨界區:一段**對共享的資料進行訪問
然後對臨界區進行保護
加鎖
應該滿足三個條件:
硬體方法有以上兩種,下面僅介紹第一種,這種操作是基於硬體的原子指令(執行過程中不能被中斷)實現的。testandset()就是原子操作
臨界區要設定的恰到好處,不能太小,防止資料保護不可靠;也不能太大,影響程式的並行執行(原因是當臨界區太大的時候,會將一些不需要保護的內容也也起保護,那麼當乙個程序在訪問臨界區中的資料時,其他程序就不能夠訪問)。
是ipc(程序間通訊)的一種策略,但也很好的解決了程序同步的問題
訊號量的兩種基本操作:
1. wait()操作
2. signal()操作
wait和signal是原子操作
訊號量有乙個特點就是可以控制進入臨界區的執行緒數(counting semaphore),上圖中mutex變數的數值就代表執行緒數。
從上述可以看出,當乙個程序在等待臨界區的時候,是乙個死迴圈,所以為了解決這種情況,採用以下方法,改進訊號量的定義:
struct process 指標將所有正在等待的程序串聯起來,將其置於阻塞態,等臨界區釋放的時候,再將其置於就緒態。
以下為實現方法:
block();//將程序阻塞
wakeup();將程序喚醒
程序同步的問題:
各種問題的解決方法
producer-consumer pronblem(生產者消費者問題):
生產者寫資料,消費者取資料,生產者們或消費者們同時操作都會對資料產生影響。也就是說同一時刻只能有乙個生產者和乙個消費者進行操作。
readers and readers peoblems(讀者寫者問題):
讀者同時讀不會對資料產生影響,寫者會。也就是說同一時刻只能有乙個寫者可以對資料進行操作,而讀者則無限制。
dining-philosophers problems(哲學家就餐問題):
管程管程時一種更高階的對臨界區進行保護的方法,實現於語言層面,而不是系統呼叫層面。
部分作業系統對實現程序同步的方法
先介紹兩個概念
迴旋鎖:等待鎖的時候(wait)不斷迴圈判斷自適應就是先迴旋,如果一段時間後還等不到鎖,那麼就非迴旋進入阻塞態;因為如果等待的時間很短,那麼進入阻塞態等待的話就得不償失了非迴旋鎖:等待鎖的時候處於阻塞狀態
linux
程序 執行緒的同步
int pthread mutex init pthread mutex t restrict mutex,const pthread mutexattr t restrict arr int pthread mutex destroy pthread mutex t mutex int pthre...
程序的同步(中)
包含程序同步關係,互斥關係 一.硬體同步機制 二.訊號量機制 1.整形訊號量 基礎,因為有缺點所以轉為記錄性訊號量 2.記錄型訊號量 重要 3.and型訊號量 會用,等待資源多時用 4.訊號量集 了解 三.管程機制 11.1 訊號量s int s 只可以在初始化時賦值和p,v操作時改值 初始值是非負...
程序間的同步
為什麼需要程序間同步 通訊 資料傳輸 程序間資料傳輸 資源共享 程序間資源共享 通知事件 程序間相互傳遞訊息 程序控制 有些程序希望完全控制另乙個程序的執行 如debug程序 此時控制程序希望能夠攔截另乙個程序的所有陷入和異常,並能夠及時知道它的狀態改變。程序間的同步原則 空閒讓進 資源無占用,允許...