程序的同步(中)

2021-10-04 23:01:48 字數 1296 閱讀 7189

*包含程序同步關係,互斥關係

一.硬體同步機制

二.訊號量機制

1.整形訊號量(基礎,因為有缺點所以轉為記錄性訊號量)

2.記錄型訊號量(重要)

3.and型訊號量(會用,等待資源多時用)

4.訊號量集(了解)

三.管程機制

11.1 訊號量s:

int s;

只可以在初始化時賦值和p,v操作時改值

初始值是非負,整數:0,1,2,3,4-----------------

表示資源數目

必須賦初值

缺點:while(s<0); 這是乙個忙等,表示在wait(s)裡,所以如果s一直小於零,就一直cpu空迴圈,做不到程序釋放處理機的讓權等待操作2

2.1定義訊號量時用型別semaphore

2.2需要資源數目記錄變數和各個阻塞佇列(申請某個資源得不到後進入等待那個資源的阻塞佇列)的指標變數——結構體

2.3wait操作裡,資源數減了1之後再判斷這個申請資源的程序進不進阻塞佇列(block原語)(若原來s<=0,現在s<0),申請不到資源的程序就進入了阻塞佇列就做到了讓權等待,讓出了處理機

signal操作裡,釋放了資源之後再判斷要不要有喚醒操作(wakeup原語)(若原來s<0,現在s<=0就執行喚醒操作,因為要保證原來阻塞佇列裡有程序),釋放乙個可用資源

*系統裡的資源

*阻塞佇列裡面的程序被喚醒之後進入就緒佇列

2.4 s=1時可以作為互斥訊號量,>1時可以作為資源訊號量

*要說明s代表什麼,初始值為幾

33.1程序需要訪問多個共享資源才可以正常執行

所以要設定兩個訊號量

共享資料必須作為臨界資源,只可以被乙個程序使用。

3.2為了解決的問題:兩個程序會產生死鎖——都進入了阻塞佇列沒有程序把它喚醒,除非外力作用。

3.3 swait:程序只有在所需的資源都》=1時才可以執行,否則進入等待第乙個<1的資源的阻塞佇列。短路特性。

ssignal同時釋放多個資源

所以會有好多程序從阻塞佇列被喚醒到就緒佇列

一 .程序互斥

二.前驅關係

等什麼資源?

1.互斥訊號量——初值=1

2.資源訊號量——初值》1

在**等?在哪個語句等?

wait()放在**?等什麼資源?

為其他程序考慮

signal

做完了通知其他程序

釋放資源

程序的同步

解決多個程序同時訪問同乙個資源的時候出現資料破壞的問題 首先找到臨界區 臨界區 一段 對共享的資料進行訪問 然後對臨界區進行保護 加鎖 應該滿足三個條件 硬體方法有以上兩種,下面僅介紹第一種,這種操作是基於硬體的原子指令 執行過程中不能被中斷 實現的。testandset 就是原子操作 臨界區要設定...

Symbian中的執行緒 程序及同步

全域性記憶體塊 跨越多個程序直接訪問的記憶體塊。建立自己的全域性記憶體塊可以通過rchunk api類 rchunk chk lit kchunkname,my globla chunk tint rc chk.createglobal kchunkname,0x1000,0x5000 其中crea...

GeekOS 中的程序同步方法

geekos採用了兩種同步方法用來保護臨界區 0.關中斷 1.互斥量 void init screen void begin int atomic 用於禁止中斷,end int atomic ifag 允許中斷。這裡使用了ifag標誌記錄下進入進入臨界區之前的中斷狀態,在end int atomic...