进程同步

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),用来限制并发数目

以上是关于进程同步的主要内容,如果未能解决你的问题,请参考以下文章

进程线程同步异步

互斥与同步

OS学习笔记四:同步机制

进程互斥与同步

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

[工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls(代码片段