进程同步
Posted joezzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程同步相关的知识,希望对你有一定的参考价值。
概念(引入原因)
协调进程间的相互制约关系。
临界资源与临界区
一次仅允许一个进程使用的资源称为临界资源(与共享资源对立,有些资源如私有资源,它只能给一个进程使用,不存在临界问题),访问临界资源的那段代码称为临界区。
进程间相互制约关系
同步
直接制约关系,进程A通过缓冲区向进程B提供数据;当缓冲区空时,进程B不能获得数据而阻塞,一旦进程A将数据送入缓冲区,进程B被唤醒;反之,缓冲区满时,进程A被阻塞,仅当进程B取走数据时,才唤醒进程A。
互斥
间接制约关系,进程A进入临界区访问临界资源,此时进程B必须等待,当进程A退出临界区,进程B才能进入临界区访问临界资源。
信号量
概念
用来解决进程同步的一种机制,像是一把钥匙,进程要运行,需要先拿到这把钥匙,通俗点来讲就是在允许的信号量下,进程才能够执行
允许的两个操作
down操作(P操作):将信号量的值值减1;当信号量等于0时,再次down操作会让之后的进程进入等待(阻塞态)
void wait(semaphore S) { --S.value; if (S.value<0) { add this process to S.L;//进程链表L,记录所有等待该资源的进程 block(S.L); } }
up操作(V操作):将信号量的值加1;特别的,对一个有进程在其上等待的信号量执行一次up操作后,唤醒在其上等待的其中一个进程进入就绪态
void signal(semaphore S) { ++S.value; if (S.value<=0) { remove a process P to S.L;//进程链表L,记录所有等待该资源的进程 wakeup(P); } }
信号值所代表的含义
当信号量S大于0时表示可用的临界资源数,当等于0时,表示刚好用完;
当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目;
举例:有两个某类资源,四个进程A、B、C、D要用该类资源;
最开始S=2,当A进入,S=1,当B进入,S=0,表明该类资源刚好用完;
当C进入时S=-1,表明有一个进程被阻塞了,D进入,S=-2,表明有两个进程被阻塞了;
当A用完该类资源时,进行V操作,S=-1,释放该类资源,因为S<=0,表明有进程阻塞在该类资源上,于是唤醒C,C进入就绪态,C发现有一个资源可以用,然后直接转换到运行态,使用该资源;
当B用完该类资源时,进行V操作,S=-0,释放该类资源,因为S<=0,表明有进程阻塞在该类资源上,于是唤醒D,D进入就绪态,D发现有一个资源可以用,然后直接转换到运行态,使用该资源;
信号量初值与其作用
1.如果初值为0,用来实现同步
2.如果初值为1,用来实现互斥访问
3.如果初值为N(N一般大于1),用来限制并发数目
以上是关于进程同步的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段
[工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls(代码片段