信号量
1、信号量和P、V原语
信号量和P、V原语由迪杰斯特拉提出
互斥:P、V在同一个进程中
同步:P、V在不同进程中
信号量值含义:
(1)S>0: S表示可用资源的个数。
(2)S=0:表示无可用资源,无等待进程。
(3)S<0: |S|表示等待队列中进程个数。
P原语:
P(s)
{
s.value = s.value--;
if(s.value < 0)
{
//该进程状态置为等待状态
//将该进程的PCB插入相应的等待队列s.queue末尾
}
}
V原语:
V(s)
{
s.value = s.value++;
if(s.value <= 0)
{
//唤醒相应等待队列s.queue中等待的一个进程
//改变其状态为就绪态,并将其插入就绪队列
}
}
2、信号量集函数
//(1)semget函数
// 功能:用来创建和访问一个信号量集
//原型:
int semget(key_t key,int nsems,int semflg);
//参数: key:信号集的名字
// nsems:信号集中信号量的个数
// semflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
//返回值:成功返回0,失败返回-1
//(2)shmctl函数
// 功能:用于控制信号量集
//原型:
int semctl(int semid,int semnum,int cmd, ...);
//参数: semid:由semget返回的信号集标识码
// semnum:信号集中信号量的个数
// cmd:将要采取的动作(有三个可取值)
// 最后一个参数根据不同而不同
//返回值:成功返回0,失败返回-1
//(3)semop函数
//功能:用来创建和访问一个信号量集
//原型:
int semop(int semid,struct sembuf* sops,unsigned nsops);
//参数:
// semid:是该信号