《一》概念:访问临界资源的一个计数器。
当信号量的值 > 0代表临界资源的剩余个数。
当信号量的值 < 0, 代表等待使用临界资源的进程个数
临界资源: 同一时刻只允许一个进程使用的资源。
临界区: 访问临界资源的代码区域
原子操作: 不可再分的, 不可被打断的操作。(在中原子操作之前将中断操作屏蔽掉,操作前后才解开屏蔽)
P,V 操作: P 操作 -1 V 操作 +1
《二》信号量的操作:
获取、 创建:int semget((key_t)key, int nsems, int flag);
key: 用户标识 nsems: 创建的时使用, 指定信号量集中信号个数。 返回值:返回的内核对象的 id。
初始化、释放:int semctl(int semid, int nums, int cmd, /*union semun un*/);
P 操作: 对信号量的值-1
V 操作: 对信号量的值+1
int semop(int semid, struct sembuf buf[], int nops);
struct sembuf
{
int sem_num; // 指定操作的信号量集中的下标
short sem_op; // P 操作: -1, V 操作: 1;
short sem_flg; // IPC_NOWAIT SEM_UNDO
}
《三》信号量的代码测试:
信号量的获取 P V操作以及释放的实现
Sem.c
A进程
B进程