用PV操作解决进程之间的同步互斥问题
No1, 进程同步的概念:
在多道程序环境下,并发执行的进程之间存在在不同的相互制约关系,for example, 计算1-1*1的式子,系统有会产生两个进程,一个是加法进程一个是乘法进程。但是为了让计算结果正确,要让乘法进程先于加法进程运算,但在实际操作中存在异步性,我们无法确保乘法运算先于加法执行。因此必须要制定一定的机制进行约束
同步亦称为直接制约关系,指为完成某种任务而建立的多个进程,而这些进程需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系,源于相互合作。
互斥称为间接制约关系,指当一个进程进入临界区使用临界资源时,另一个进程必须等待占用临界资源的进程退出后才被允许去访问此临界资源。
No2,经典同步问题
1, 生产者-消费者问题。
description:一组生产者进程和一组消费者进程共享一个初始为空、大小为N的缓冲区,只有缓冲区没满时,生产者才能把消息放到缓冲区,否则必须等待。只有缓冲区不空时,消费者才能从中取出消息,否者必须等待。由于缓冲区是一个临界资源,它只允许一个生产者放入消息或一个消费者取出消息。
analysis:①生产者与消费者对缓冲区是互斥访问,同时又是一个相互协作的过程,只有生产者放入消费者才能取出。②整理思路,两个进程存在互斥和同步的关系,需要解决互斥和同步PV操作的位置。③信号量设置,将mutex作为互斥信号量,用于控制互斥访问缓冲区,信号量初值为1,设置信号量full用于记录当前缓冲区“满”缓冲区数,初值为0,设置信号量empty用于记录“空”缓冲区数。初值为n。
semaphore mutex=1;
semaphore empty=n;
semaphore full=0
producer(){
while(1){
produce an item in nextp;
p(empty); //获取缓冲区单位
p(mutex); //进入临界区
add nextp to buffer;
v(mutex); //离开临界区并释放互斥信号量
v(full); //满缓冲区数加1
}
}
consumer() {
while(1) {
p(full); //获取满缓冲单元
p(mutex); //进入临界区
remove an item from buffer;
v(mutex); //离开临界区,释放互斥信号量
v(empty); //空缓冲区数加1
consume the item;
}
}
上一篇: elasticsearch(二)
下一篇: 操作系统互斥的七种算法
推荐阅读