操作系統中的信號量的作用
1. 操作系統引入信號量的目的
目的是為了實現進程間的同步和互斥。
主要是實現進程間的同步。
所謂同步,就是讀者寫著。有寫著寫了n個數據。讀者才能讀取n個數據。這n就是信號量。所以是為了同步。
2. 信號量的物理意義
信號量(Semaphore),有時被稱為信號燈,是在多線程環境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被並發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。為了完成這個過程,需要創建一個信號量VI,然後將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端。確認這些信號量VI引用的是初始創建的信號量。
以一個停車場的運作為例。簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然後放下車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,打開車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。
在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。
分類
整型信號量(integer semaphore):信號量是整數
記錄型信號量(record semaphore):每個信號量s除一個整數值s.value(計數)外,還有一個進程等待隊列s.L,其中是阻塞在該信號量的各個進程的標識
二進制信號量(binary semaphore):只允許信號量取0或1值
每個信號量至少須記錄兩個信息:信號量的值和等待該信號量的進程隊列。它的類型定義如下:(用類PASCAL語言表述)
semaphore = record
value: integer;
queue: ^PCB;
end;
其中PCB是進程式控制制塊,是操作系統為每個進程建立的數據結構。
s.value>=0時,s.queue為空;
s.value<0時,s.value的絕對值為s.queue中等待進程的個數;
3. 操作系統信號量問題
匹配的wait在pp()線程里
4. 分析信號量機制在系統資源管理過程中的作用
其實很簡單呢,信號量就是一個資源計數器,對信號量有兩個操作來達到互斥,回分別是P和V操作答。一般情況是這樣進行臨界訪問或互斥訪問的:設信號量值為1,當一個進程1運行是,使用資源,進行P操作,即對信號量值減1,也就是資源數少了1個。這是信號量值為0。系統中規定當信號量值為0是,必須等待,知道信號量值不為零才能繼續操作。這時如果進程2想要運行,那麼也必須進行P操作,但是此時信號量為0,所以無法減1,即不能P操作,也就阻塞。這樣就到到了進程1排他訪問。當進程1運行結束後,釋放資源,進行V操作。資源數重新加1,這是信號量的值變為1.這時進程2發現資源數不為0,信號量能進行P操作了,立即執行P操作。信號量值又變為0.次數進程2咱有資源,排他訪問資源。這就是信號量來控制互斥的原理。
5. 操作系統中進程互斥的方式之一,信號量機制,理解不了啊,求大神舉例說明
其實很簡單呢,信號量就是一個資源計數器,對信號量有兩個操作來達到互斥,分別是P和V操作。
一般情況是這樣進行臨界訪問或互斥訪問的:
設信號量值為1,
當一個進程1運行時,使用資源,進行P操作,即對信號量值減1,也就是資源數少了1個。這時信號量值為0。系統中規定當信號量值為0時,必須等待,直到信號量值不為零才能繼續操作。
這時如果進程2想要運行,那麼也必須進行P操作,但是此時信號量為0,所以無法減1,即不能P操作,也就阻塞。這樣就達到了進程1排他訪問。
當進程1運行結束後,釋放資源,進行V操作。資源數重新加1,這時信號量的值變為1.
這時進程2發現資源數不為0,信號量能進行P操作了,立即執行P操作。信號量值又變為0.此時進程2佔有資源,排他訪問資源。
這就是信號量來控制互斥的原理。
希望能幫助到你,如果幫助到你,請採納為意見。
6. 試闡述信號量及其物理意義。
信號量的定義:
信號量(semaphore),有時被稱為信號燈,是在多線程環境下使用的一種設施,
它負責協調各個線程,
以保證它們能夠正確、合理的使用公共資源。
semaphore分為單值和多值兩種,前者只能被一個線程獲得,後者可以被若干個線程獲得。
以一個停車場的運作為例。簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然後放下車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,打開車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。
在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。
抽象的來講,信號量的特性如下:信號量是一個非負整數(車位數),所有通過它的線程/進程(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的線程都將處於等待狀態。在信號量上我們定義兩種操作:
wait(等待)
和
release(釋放)。當一個線程調用wait操作時,它要麼得到資源然後將信號量減一,要麼一直等下去(指放入阻塞隊列),直到信號量大於等於一時。
release(釋放)實際上是在信號量上執行加操作,對應於車輛離開停車場,該操作之所以叫做「釋放」是因為釋放了由信號量守護的資源。
信號量,是可以用來保證兩個或多個關鍵代碼段不被並發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。為了完成這個過程,需要創建一個信號量vi,然後將acquire
semaphore
vi以及release
semaphore
vi分別放置在每個關鍵代碼段的首末端。確認這些信號量vi引用的是初始創建的信號量。
7. 為什麼在操作系統中引入信號量及P、V操作
在操作系統理論中有一個非常重要的概念叫做P,V原語。在我們研究進程間的互斥的時候經常會引入這個概念,將P,V操作方法與加鎖的方法相比較,來解決進程間的互斥問題。實際上,他的應用范圍很廣,他不但可以解決進程管理當中的互斥問題,而且我們還可以利用此方法解決進程同步與進程通信的問題。
[一]P,V原語理論
闡述P,V原語的理論不得不提到的一個人便是赫赫有名的荷蘭科學家E.W.Dijkstra。如果你對這位科學家沒有什麼印象的話,提起解決圖論中最短路徑問題的Dijkstra演算法應當是我們再熟悉不過的了。P,V原語的概念以及P,V操作當中需要使用到的信號量的概念都是由他在1965年提出的。
信號量是最早出現的用來解決進程同步與互斥問題的機制,包括一個稱為信號量的變數及對它進行的兩個原語操作。信號量為一個整數,我們設這個信號量為:sem。很顯然,我們規定在sem大於等於零的時候代表可供並發進程使用的資源實體數,sem小於零的時候,表示正在等待使用臨界區的進程的個數。根據這個原則,在給信號量附初值的時候,我們顯然就要設初值大於零。
p操作和v操作是不可中斷的程序段,稱為原語。P,V原語中P是荷蘭語的Passeren,相當於英文的pass, V是荷蘭語的Verhoog,相當於英文中的incremnet。
P原語操作的動作是:
(1) sem減1;
(2) 若sem減1後仍大於或等於零,則進程繼續執行;
(3) 若sem減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉進程調度。
V原語操作的動作是:
(1) sem加1;
(2) 若相加結果大於零,則進程繼續執行;
(3) 若相加結果小於或等於零,則從該信號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。
需要提醒大家一點就是P,V操作對於每一個進程來說,都只能進行一次。而且必須成對使用。且在P,V願語執行期間不允許有中斷的發生。
對於具體的實現,方法非常多,可以用硬體實現,也可以用軟體實現。我們採用如下的定義:
procere p(var s:samephore);
{
s.value=s.value-1;
if (s.value<0) asleep(s.queue);
}
procere v(var s:samephore);
{
s.value=s.value+1;
if (s.value<=0) wakeup(s.queue);
}
其中用到兩個標准過程:
asleep(s.queue);執行此操作的進程式控制制塊進入s.queue尾部,進程變成等待狀態
wakeup(s.queue);將s.queue頭進程喚醒插入就緒隊列
對於這個過程,s.value初值為1時,用來實現進程的互斥。
雖軟說信號量機制畢加鎖方法要好得多,但是也不是說它沒有任何的缺陷。由此我們也可以清晰地看到,這種信號量機制必須有公共內存,不能用於分布式操作系統,這是它最大的弱點。
[二]P,V原語的應用
正如我們在文中最開始的時候提到的,P,V原語不但可以解決進程管理當中的互斥問題,而且我們還可以利用此方法解決進程同步與進程通信的問題。
(1)用P V原語實現進程互斥
把臨界區置於P(sem) 和V(sem)之間。當一個進程想要進入臨界區時,它必須先執行P原語操作以將信號量sem減1,在進程完成對臨界區的操作後,它必須執行V原語操作以釋放它所佔用的臨界區。從而就實現了進程的互斥:
具體的過程我們可以簡單的描述如下:
PA:
P(sem)
<S>;
V(sem)
PB:
P(sem)
<S>;
V(sem)
(2) 用P V原語實現進程同步
進程同步問題的解決同樣可以採用這種操作來解決,我們假設兩個進程需要同步進行,一個進程是計算進程,另一個進程是列印進程,那麼這個時候兩個進程的定義可以表示為:
PC(表示計算進程)
A: local buf
repeat
buf=buf
until buf=空
計算
得到計算結果
buf=計算結果
goto A
PP:(表示列印進程)
B: local pri
repeat
pri=buf
until pri!=空
列印buf中的數據
清除buf中的數據
goto B
相應用P,V原語的實現過程為:
PA: deposit(data)
Begin local x
P(bufempty)
按FIFO方式選擇一個空緩沖區buf(x)
buf(x)=data
buf(x)置滿標記
V(buffull)
end
PB:remove(data)
Begin local x
P(buffull)
按FIFO方式選擇一個裝滿
數據的緩沖區buf(x)
data=buf(x)
buf(x)置空標記
V(bufempty)
end
(3)用P V原語實現進程通信
我們以郵箱通信為例說明問題:
郵箱通信滿足的條件是:
<1>;發送進程發送消息的時候,郵箱中至少要有一個空格能存放該消息。
<2>;接收進程接收消息時,郵箱中至少要有一個消息存在。
發送進程和接收進程我們可以進行如下的描述:
Deposit(m)為發送進程,接收進程是remove(m). Fromnum為發送進程的私用信號量,信箱空格數n。mesnum為接收進程的私用信號量,初值為0.
Deposit(m):
Begin local x
P(fromnum)
選擇空格x
將消息m放入空格x中
置格x的標志為滿
V(mesnum)
end
Remove(m)
Begin local x
P(mesnum)
選擇滿格x
把滿格x中的消息取出放m中
置格x標志為空
V(fromnum)
end
8. 操作系統中的進程信號量到底是再說什麼,。。
一、問題描述
生產者-消費者問題是一個經典的進程同步問題,該問題最早由Dijkstra提出,用以演示他提出的信號量機制。
他要求設計在同一個進程地址空間內執行的兩個線程。
生產者線程生產物品,然後將物品放置在一個空緩沖區中供消費者線程消費。
消費者線程從緩沖區中獲得物品,然後釋放緩沖區。
當生產者線程生產物品時,如果沒有空緩沖區可用,那麼生產者線程必須等待消費者線程釋放出一個空緩沖區。
當消費者線程消費物品時,如果沒有滿的緩沖區,那麼消費者線程將被阻塞,直到新的物品被生產出來。
9. 計算機操作系統信號量
首先進程A和進程B都需要使用列印機,這樣列印機就是一個唯一的資源。那麼進程A先申版請那麼就要進行權資源鎖定,對資源進行佔用,這時操作系統就會進行分配一個信號量給進程A和進程B,來評估兩個進程對列印機的使用狀態,如果進程A監控到當前沒有其他進程在使用列印機,那麼則會被分配到列印機資源,並把進程A使用列印機的信號量標記。那麼其他進程監控到當前有進程在使用列印機那麼就會進行等待。
10. 操作系統中的信號量為什麼可以賦值
操作系統中的信號指的是一個相對抽象的概念。信號量 sem 是指在利用 P、V 原語編程時所需要對 sem 進行的賦值操作(加 1 或者減 1 操作)。具體的例子你可以參照操作系統教材上的程序。進程的同步和互斥是操作系統中非常重要的概念。再具體的問題,你就得向教你操作系統的老師請教了。