目录
1、一个信号量对应一种资源
2、信号量的值 = 该种资源的剩余数量(信号量值小于0,说明此时有进程在等待这种资源)
3、P(S):申请一个资源S,如果资源不够就阻塞等待
4、V(S):释放一个资源S,如果有进程在等待该资源,则唤醒一个进程
实现步骤:
注意事项:
/*记录型信号量的定义*/
typedef struct
{
int value; //剩余资源数
struct process *L; //等待队列
}semaphore;
/*信号量机制实现互斥*/
semaphore mutex = 1; //初始化信号量
P1()
{
...
P(mutex); //使用临界资源前需要加锁
临界区代码段...
V(mutex); //使用临界区资源后需要解锁
...
}
P2()
{
...
P(mutex); //使用临界资源前需要加锁
临界区代码段...
V(mutex); //使用临界区资源后需要解锁
...
}
进程同步:令各并发进程按要求有序的推进(让本来异步并发的进程互相配合,有序推进)
异步性的体现:若分配给P1进程的时间片只允许该进程执行完自己的代码1和代码2,然后就要为P2进程分配时间片,若该时间片只允许该进程执行完自己的代码4,然后就要为P1进程分配......,这就导致代码段的执行顺序是未知的
实现步骤:
(前V后P)
/*信号量机制实现同步*/
semaphore S = 0; //初始化同步信号量,初始值为0
P1()
{
代码1:
代码2;
V(S); //释放资源
代码3;
}
P2()
{
P(S);
代码4:
代码5;
代码6;
}
关于如何保证“代码4(后操作)一定是在代码2(前操作)之后执行”的解释:
~over~