进程同步
定义:在异步环境下的一组并发进程因直接制约而互相发送消息、互相合作、互相等待,使得各进程按一定得速度执行的过程
- 制约关系形式:
①间接相互系统(互斥关系);
②直接相互制约关系(同步关系)
临界资源:进程使用时需采用互斥方式
进程同步问题
访问临界区资源循环代码:
while(TRUE){
进入区
临界区;
退出区
剩余区;
}
生产者-消费者问题:
n间仓库,一个向仓库生产货物、一个消费仓库的货物
(并发但是互斥抢资源(仓库))
int in = 0, out = 0, count = 0;
item buffer[n];
生产者程序
void producer() {
while(1){
produce an item in nextp;
...
while(counter==n);//注意:该处是分号,空循环
buffer[in]=nextp;//放货物
in=(in+1)%n;
counter++;
}
};
消费者程序
void consumer() {
while(1){
while(counter==0);
nextc=buffer[out];//取货物
out=(out+1)%n
counter--;
consumer the item nextc;
...
}
};
counter体现互斥,不能同时,一先一后
5-8行代码、3-6行代码是临界区
信号量机制
① 整型信号量
原子操作:wait(S)
和signal(S)
操作,也称P操作
和V操作
eg:S = 1
//进入区
wait(S){
while(S<=0);
S--;
}
//退出区(还原,给下一个(进入区)判断)
signal(S){
S++;
}
① 记录型信号量
typedef struct{
int value;
struct process_control_block *list;
} semaphore;
P操作
和V操作
描述为:
wait(semaphore *S){//结构体指针
S->value--;
if(S->value<0) block(S->list)//阻塞
}
signal(semaphore *S){
S->value++;
if(S->value<=0) wakeup(S->list)//唤醒(<=0说明被阻塞了)
}