作業系統之訊號量機制詳解

2021-10-01 21:51:14 字數 2114 閱讀 4023

使用者程序可以通過使用乙個變數(可以是乙個整數,也可以是更為複雜的記錄型變數),可以用乙個訊號量來表示系統中某種資源的數量。比如:系統中只有一台印表機,就i可以設定乙個初值為1的訊號量。

原語是一種特殊的程式段,其執行只能一氣呵成,不可被中斷。原語是由關中斷/開中斷指令實現的。

wait(s)原語和signal(s)原語,可以把原語理解成我們自己寫的函式,函式名分別為wait和signal,括號裡的訊號量s其實就是函式呼叫時傳入的乙個引數。

wait和signal原語簡稱p、v操作(來自荷蘭語proberen和verhogen)。

/**

例如:作業系統中只有一台印表機。。。。

**/int s=1;

//wait原語相當於"進入區"

void wait(int s)

//signal原語相當於"退出區"

void signal(int s)

typedef

struct

semaphore;

/**某程序要申請資源時,通過wait原語申請**/

void

wait

(semaphore s)

}/**某程序使用完資源後,通過signal原語釋放資源**/

void

signal

(semphore s)

}

步驟

分析併發程序的關鍵活動,劃定臨界區

設定互斥訊號量mutex在臨界區之前執行p(mutex)

在臨界區之後執行v(mutex)

例項

semaphore mutex=1;

p1()p2

()

注意

訊號量機制實現同步

程序同步:要讓各併發程序按要求有序地推進。

步驟

分析什麼地方需要實現"同步關係",即必須保證"一前一後"執行的兩個操作(或兩句**)。

設定同步訊號量s,初始為0。

在"前操作"後執行v(s)。

在"後操作"前執行p(s)。

例項:保證**4執行在**1和**2之後。

semaphore s=0;

p1()p2

()

上述**,若先執行到v(s)操作,則s++後s=1。之後當執行到p(s)操作時,由於s=1,表示有可用資源,會執行s–,s的值變為0,p2程序不會執行block原語,而是繼續往下執行**4。

若先執行到p(s)操作,由於s=0,s–後s=-1,表示此時沒有可用資源,因此p操作中會執行block原語,主動請求阻塞。之後當執行完**2,繼而執行v(s)操作,s++,使s變回0,由於此時有程序在該訊號量對應的阻塞佇列中,因此會在v操作中執行wakeup原語,喚醒p2程序進入就緒對列。

訊號量機制實現前驅關係

步驟

要為每一對前驅關係各設定乙個同步變數

在"前操作"之後對相對應的同步變數執行v操作

在「後操作」之前對相對應同步變數執行p操作

前驅關係本質上是更複雜的同步問題。

生產者、消費者共享乙個初始為空、大小為n的緩衝區。

只有緩衝區沒滿時,生產者才可以把產品放入緩衝區,否則必須等待。

只有緩衝區不為空時,消費者才可以從緩衝區取出產品,否則必須等待。

semaphore mutex=1;

semaphore empty=n;

semaphore full=0;

void

producer()

void

customer()

作業系統之 訊號量機制

訊號量機制是一種卓越成效的程序同步工具,訊號量機制已經被廣泛的使用於單處理機,和多處理系統的計算機網路中。訊號量s 是乙個整數,s大於等於零代表可供併發程序使用的資源實體數,當 s小於零時則表示正在等待使用臨界區的程序數,整型訊號量 整型訊號量定義乙個用於表示資源數目的整型量數目s 但是僅能通過兩個...

作業系統之訊號量機制

使用者程序可以使用作業系統提供的原語來操作訊號量,以實現程序的互斥和同步 原語是一塊不可中斷的程式段,由關中斷實現 這對原語是wait signal 又稱為p v操作 訊號量可分為整形訊號量記錄型訊號量 程序的互斥需要遵守 四個原則,空則讓進,忙則等待,有限等待,讓全等待 由圖可以看出,在進行p操作...

作業系統 訊號量機制

用乙個整數型的變數作為訊號量,用來表示股系統中某種資源的數量。與普通整數變數的區別 對訊號量的操作只有三種,初始化,p操作,v操作。p操作 相當於wait原語,進入區 v操作 signal原語,相當於退出區。大體實現 wait 方法一氣呵成,避免併發導致的問題。但是不滿足 讓權等待原則 程序會處於忙...