posix為可移植的作業系統介面標準,定義了作業系統應該為應用程式提供的介面標準
訊號量機制是我們在作業系統中學到的知識,可以用來解決同步和互斥的問題,它只能被兩個標準的原語wait(s)和signal(s)來訪問,也就是p操作和v操作。訊號量的概念在system v 和posix 中都有,但是它們兩者的具體作用是有區別的。system v版本的訊號量用於實現進程間的通訊,而posix版本的訊號量主要用於實現執行緒之間的通訊,兩者的主要區別在於訊號量和共享記憶體。
區別:system v版本的訊號量是跟隨於核心存在的,它的介面是:semget,semctl,semop
posix版本的訊號量支援無命名的訊號量和有命名的訊號量,效率較高。
(1)有命名的訊號量一般用於程序同步,使用檔案進行關聯,該部分的訊號量是隨著核心而存在的,主要介面有:sem_open,sem_close,sem_unlink.
(2)無命名的訊號量一般用於執行緒的同步,當程序終止時,它也就消亡了,主要介面有:sem_init,sem_destory,sem_wait,sem_post.】
無名訊號量下的通訊機制屬於共享記憶體的情況,可以實現程序中多個執行緒之間的同步與互斥。而命名訊號量通常用於不共享記憶體的情況下。
//有命名的訊號量函式
#include #include #include sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
int sem_close(sem_t *sem);
int sem_unlink(const char *name);
//無命名的訊號量函式
用於實現執行緒間通訊的訊號量函式:
初始化訊號量:
int sem_init(sem_t *sem, int pshared, unsigned int value);
//sem為指向訊號量結構的乙個指標;
//pshared不為0時此訊號量在程序間共享,否則只能為當前程序的所有執行緒共享;
//value給出了訊號量的初始值。
銷毀訊號量:
int sem_destroy(sem_t *sem);
//當我們使用完訊號量後,對其進行銷毀
等待訊號量
int sem_wait(sem_t *sem);
//被用來阻塞當前執行緒直到訊號量sem的值大於0,解除阻塞後將sem的值減一,表明公共資源經使用後減少
發布訊號量:
int sem_post(sem_t *sem);
//用來增加訊號量的值,當有執行緒阻塞在這個訊號量上時,呼叫這個函式會使其中的乙個執行緒不在阻塞,選擇機制同樣是由執行緒的排程策略決定的。
posix互斥鎖(同一時刻只能有乙個程序訪問該資源,一旦訪問後立即上鎖,訪問完進行解鎖,程序間是互斥的)
#include int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *mutexattr);
//互斥鎖初始化, 為未鎖住狀態。
int pthread_mutex_lock(pthread_mutex_t *mutex); //互斥鎖上鎖
int pthread_mutex_trylock(pthread_mutex_t *mutex); //互斥鎖判斷上鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex); //互斥鎖解鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex); //消除互斥鎖
下面使用posix訊號量來實現我們在作業系統課程中學到的知識,生產者和消費者之間的同步和互斥的關係 systemV訊號量 與 Posix訊號量
一 函式上的區別 訊號量有兩種實現 傳統的system v訊號量和新的posix訊號量。它們所提供的函式很容易被區分 對於所有system v訊號量函式,在它們的名字裡面沒有下劃線。例如,應該是semget 而不是sem get 然而,所有的的posix訊號量函式都有乙個下劃線。下面列出了它們提供的...
訊號量機制
1 訊號量的型別定義 訊號量 semaphore 的資料結構為乙個值和乙個 指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量 當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改變。一般來說,訊...
訊號量機制
訊號量機制 整型訊號量 p操作 wait s.value s.value 1 if s.value 0 then block s,l v操作 signal s.value s.value 1 if s.value 0 then wakeup s,l 定義訊號量semaphore代表可用資源實體的數量...