1、有十個進程,互斥使用資源.求信號量S的范圍
有一個就可以了,s=1,因為是互斥嘛,我感覺是
2、多個進程對信號量S進行了5次P操作,2次V操作後,信號量的值是-3.
有3個處於阻塞狀態的進程,信號初始值為1.
3、計算機*作系統中,若P、V*作的信號量S初值為2,當前值為-1,則表示有____個等待進程
有1個等待進程。
信號量(Semaphore),是可以用來保證兩個或多個關鍵代碼段不被並發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。
為了完成這個過程,需要創建一個信號量VI,然後將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端。初值為2,表示初始時有兩個可用的資源。現在為-1,就說明這兩個可用資源已經被佔用了,有一個進程還在等待資源。
(3)vxworks信號量semq擴展資料:
對信號量有4種操作(#include<semaphore.h>):
1、 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);
2、等信號(wait),也可叫做掛起(suspend)int sem_wait(sem_t *sem);
3、給信號(signal)或發信號(post) int sem_post(sem_t *sem);
4、清理(destroy) int sem_destory(sem_t *sem)。
4、什麼是信號量semaphores
He starts trying
5、操作系統信號量問題:若信號量S的初值為m,當前值為-n,則表示有多少個等待進程?
初值為m,表示有m個資源,為0則表示已經沒有了資源,如果當前值為-n,那麼專等待的進程為屬n。
若信號S的初值為3,當前值為-2,則表示有( 2 )個等待進程,當信號量的值小於0時,其絕對值表示系統中因請求該類資源而被阻塞的進程個數。
信號量可以用來保證兩個或多個關鍵代碼段不被並發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。
(5)vxworks信號量semq擴展資料:
信號量是一個非負整數(車位數),所有通過它的線程/進程(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的線程都將處於等待狀態。在信號量上我們定義兩種操作: Wait(等待) 和 Release(釋放)。
當一個線程調用Wait操作時,它要麼得到資源然後將信號量減一,要麼一直等下去(指放入阻塞隊列),直到信號量大於等於一時。Release(釋放)實際上是在信號量上執行加操作,對應於車輛離開停車場,該操作之所以叫做「釋放」是因為釋放了由信號量守護的資源。
6、整型信號量S<=0改為S<0則應該如何修改代碼
就是你這樣改呀,把s<=0改為s<0就可以了。
7、多個進程對信號量S進行了5次 P操作,2次V操作後,現在信號量的值是
阻塞狀態的進程是3個,這個看信號量當前的值就知道了。
信號量的初值是0,每次執行P操作要對信號量的值-1,每次執行V操作要+1,5次P,2次V之後是-3,所以初值是0.
8、操作系統的問題:進程同步原語採用記錄型信號量s共享某個臨界資源。。。。。。
s.value =1時,表示還有一個資源可以分配。
s.value = 0時,表示資源全部分配完畢,也沒有進程內因為等待該資源而被阻塞。容
s.value = -4時,表示2個資源都已經被分配了,還有4個進程等待使用該資源而被阻塞。
9、vxworks信號量計數器值怎麼獲取
一.信號量的概念
是實現任務互斥、同步操作的主要機制。VxWorks提供的信號量經過了高度優化,在所有任務間通信機制中,速度最快。
二.信號量的分類
Binary Semaphores(二進制):完成互斥、同步操作的最佳方式;速度最快,最常用。
Mutual Exclusion Semaphores(互斥):一種特殊的二進制信號量,專門針對互斥操作進行了優化。
Counting Semaphores(計數):類似於二進制信號量,可記錄信號量釋放的次數,可監視同一資源上的多個實例。
三.Binary Semaphores(二進制信號量)
Task經常會等待事件或需獲取資源。查詢(polling)在RealTime系統中原則上不允許,最好採用Pending,等待事件或資源。
狀態圖:
說明:
1.為某個資源調用semBCreate()創建一個binary semaphore 並規定:
SEM_Full (資源可用) SEM_Empty (資源不可用).
2.資源不可用時Task調用semTake()進入Pending直到semaphore被Given
相關函數:
[c-sharp] view plaincopy
SEM_ID semBCreate
(
int options, /* semaphore options */
SEM_B_STATE initialState /* initial semaphore state */
)
STATUS semTake
(
SEM_ID semId, /* 需要獲取的信號量ID */
int timeout /* 超時時間(tick)/no-wait/forever */
)
ISR(中斷服務程序)不能調用semTake()操作!
[c-sharp] view plaincopy
STATUS semGive
(
SEM_ID semId /* 需要釋放的信號量ID */
)
[c-sharp] view plaincopy
semFlush()
應用方向:
1.互斥操作:是指不同任務可以利用信號量互斥地訪問臨界資源。這種互斥的訪問方式比中斷禁止(interrupt disable) 與優先順序鎖定
(preemptive locks)兩種互斥方式具有更加精確的粒度。
互斥操作時初始狀態設為(SEM_FULL)可用。並在同一個Task中成對、順序調用semTake()、semGive()。
2.同步操作:是指一個任務可以利用信號量控制自己的執行進度,使自己同步於一組外部事件。同步操作時初始狀態設為(SEM_EMPTY)不可用。在不同Task中分別單獨調用semTake()、semGive()。
四.Mutual Exclusion Semaphores(互斥信號量)
互斥信號量是一種特殊的二進制信號量,它是針對使用二進制信號量進行互斥操作時存在的一些問題設計的。互斥信號量主要增加了對優先順序倒置、刪除安全以及遞歸訪問的處理。
狀態圖:
相關函數:
[c-sharp] view plaincopy
SEM_ID semMCreate
(
int options /* mutex semaphore options */
)
區別:
1.互斥信號量只能用於互斥操作。
2.只能由已經獲取了互斥信號量的任務去釋放它。
3.中斷服務程序(ISR)不可以釋放(semGive())互斥信號量。
4.互斥信號量不支持semFlush()操作。
應用方向:
1.避免優先順序倒置(Priority Inversion):
在上圖中,task2等待task1的資源,於是處於Pend狀態,這時一個中等優先順序的task進來,並搶佔了task1的CPU,此時的表現是低優先順序task在高優先順序的task2前執行。這種現象就是先級倒置。
使用semId = semMCreate(SEM_Q_PRIORITY | SEM_INVERSION_SAFE);就可以避免倒置。
此時,task1的優先順序提升與task2一樣,至到task2執行完成。
SEM_INVERSION_SAFE不能與SEM_Q_FIFO配對!
2.Deletion Safety(安全刪除)
使用:semId = semMCreate(SEM_Q_FIFO | SEM_DELETE_SAFE);可以實現安全刪除。
其實質是:在Task對互斥信號量執行semTake()操作並成功佔有該信號量之前,隱含執行了taskSafe()操作;在執行semGive()操作之後,隱含執行taskUnsafe()操作。
如果一個任務task1試圖刪除一個已經被保護起來的任務task2,task1則將被阻塞起來,直到task2解除保護(釋放掉具有刪除保護的互斥信號量)才能完成刪除工作。
3.遞歸訪問
[c-sharp] view plaincopy
InitFun()
{
sem_ID = semMCreate(…);
}
funB()
{
semTake(sem_ID, SEM_FOREVER);
/*訪問臨界資源*/
semGive(sem_ID);
}
funA()
{
semTake(sem_ID, SEM_FOREVER);
/*訪問臨界資源*/
funB(); //遞歸訪問, 而不會死鎖
semGive(sem_ID);
}
五.Counting Semaphores(計數信號量)
計數信號量與二進制信號量都可以用於任務之間的同步與互斥。其不同點在於,計數信號量可記錄信號量釋放的次數,可以用來監視某一資源的使用狀況。
10、在整型信號量機制中的wait操作,只要是信號量s小於等於0就會不斷測試什麼
•整型信號量來
–是一個整源型量,通過2個原子操作wait(s)和signal(s)來訪問。
Wait(s):
while s<= 0 do no-op
s:=s-1;
Signal(s): s:=s+1;
在wait原子操作中,當s<= 0時,就立刻循環回去繼續判斷S的值是否小於等於0