基本概念:
临界资源:当一块资源只能够被一个进程访问的时候,这块资源就叫临界资源。
临界区:进程里面访问临界资源的代码叫做临界区。
信号量的本质:计数器,计算描述临界资源的多少。
信号量集函数:
int semget(key_t key,int nsem,int semflg);
key:信号量集的名称
nsems:信号量集的个数
semflg:模式标志
若函数调用成功则返回信号集的标识码,若失败则返回-1
控制信号集函数:
int semctl(int semid,int semnum,int cmd);
semid:信号集标识码
semnum:信号集里面的信号量序号
cmd:将要采取的动作
创建和访问一个信号集:
int semop(int semid,struct sembuf* sops,unsigned nsops);
semid:信号集的标识码
sops:结构体指针
nsops:信号集的个数
sembuf结构体:
struct sembuf{
short sem_num; //信号集的编号
short sem_op;//信号量集一次操作PV时候的值
short sem_flg;//两个取值IPC_NOWAIT或者IPC_UNDO
};
原理:
由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:
P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行
V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.