今天我們來分享一下程序通行(ipc)-實現訊號量。
訊號量的本質是計數器,且程序與程序之間都能夠看到,所以我們用乙個訊號量來衡量臨界資源,通過計數器限制程序對臨界資源進行操作的個數。也就是說訊號量是用來保護臨界資源的,並且因為訊號量是原子的,所以在他能在保護自己的基礎下去保護臨界資源。
本文我們簡單的用父子程序來展示二元訊號量的作用,本文說用的二元訊號量(初始為
1,占用為0)可以起到互斥功能(相當於互斥鎖),來保證同一時刻進入臨界資源的程序只有乙個,避免父子程序(多個程序)同一時間操作臨界資源而導致無法保證實現不同程序之間的同步與互斥。
用父子程序舉例說明同步與互斥被破壞的情況如下:
訊號量需要注意的兩點:
1》任意程序占用資源(訊號量)時,因某些原因(時間片用盡)被暫時剝離,此時程序擁有訊號量(鎖),即會影響其他程序去申請資源(訊號量),此時其他程序被迫等待。
2》任意程序占用資源(訊號量)時,被使用者或其他kill時,由於被kill時程序擁有訊號量(鎖),即會影響其他程序去申請資源(訊號量),此時會造成死鎖。
訊號量缺點:
初始化和建立是否分開的,使用者容易誤操作。
由1》,可以看出訊號量的另乙個缺點,擁有訊號量所在的多程序程式所用時間相對於沒有訊號量約束的同一程序會多一些。
訊號量是隨核心的,除了需要呼叫系統介面去建立訊號量,還需要呼叫系統介面去銷毀訊號量。
最後,介紹關於檢視訊號量和銷毀訊號量的系統命令,截圖如下:
實現訊號量的父子程序**如下:
comm.h
#ifndef _comm_h_
#define _comm_h_
#include#include#include#includeunion semu;
#define pathname "."
#define proj_id 0x6666
int commsem(int flags);
int greatsem();
int getsem();
int initsem(int semid, int nums, int val);
int pvcom(int semid, int which, int _op);
int p(int semid, int which);
int v(int semid, int which);
int destroysem(int semid);
#endif
comm.c
#include"comm.h"
int commsem(int flags)
int semid = semget(keys, 1, flags);
if(semid<0)
return semid;
} int greatsem()
int getsem()
int initsem(int semid, int nums, int val)
return 0;
} int pvcom(int semid, int which, int _op)
} int p(int semid, int which)
int v(int semid, int which)
int destroysem(int semid)
return 0;
}
client.c
#include"comm.h"
#include#includeint main()
else if(id == 0)
}else
pid_t ret = waitpid(id, null, 0);
if(ret>0)
}destroysem(semid);
return 0;
}
makefile
client:client.c comm.c
gcc -o $@ $^
.phony:clean
clean:
rm -f client
執行介面
分享如上!願共同進步。
程序間通訊IPC 訊號量
訊號量 訊號量 主要來實現程序間或執行緒間的同步 也可以實現互斥 訊號量的值 表示資源的可用量。訊號量操作流程 1 建立乙個訊號量集合 param 2 訊號量集合中訊號量的個數 int semid int semget key t key,int nsems,int sem semid semget...
IPC程序間通訊(訊號量)
訊號量是乙個計數器,用於為多個程序提供對共享資料物件的訪問。訊號量和p v原語操作是由dijkstra 迪傑斯特拉 所提出的。執行p操作時,將該程序狀態設定為等待狀態,並把 該程序的pcb插入相應的等待佇列s.queue末尾 執行v操作時,喚醒相應等待佇列s.queue中等待的乙個程序 改變其狀態為...
程序間通訊(IPC)之 訊號量
一.訊號量 在談論訊號量之前,先要提到臨界資源和臨界區的概念,臨界資源是指多個程序訪問但乙個時間段內只允許乙個程序獨佔的資源,而臨界區是指多個程序訪問臨界資源的這一段公共的 訊號量的本質是一種資料操作鎖,也可以說就是乙個計數器,它本身並不能提供對程序間的通訊,而是通過控制某一資源來完成程序間的互斥和...