zoukankan      html  css  js  c++  java
  • 进程互斥与同步

    1、并发(concurrency)和并行(parallellism):

    1. 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
    2. 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
    3. 并行是在一台处理器上“同时”处理多个任务,并发是在多台处理器上同时处理多个任务。

    所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。


    并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。

    并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。


    并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行)。


    当有多个线程在操作时,如果系统只有一个 CPU,则它根本不可能真正同时进行一个以上的线程,它只能把 CPU 运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态.这种方式我们称之为并发(Concurrent)。

    当系统有一个以上 CPU 时,则线程的操作有可能非并发。当一个 CPU 执行一个线程时,另一个 CPU 可以执行另一个线程,两个线程互不抢占 CPU 资源,可以同时进行,这种方式我们称之为并行(Parallel)。


    2、进程之间存在同步和互斥两种关系

    同步是因合作进程之间协调彼此的工作而控制自己的执行速度,即因相互合作,相互等待而产生的制约关系。

    而互斥是进程之间竞争临界资源而禁止两个以上的进程同时进入临界区所发生的制约关系。


    3、进程的互斥实际上是进程同步的一种特殊情况。
    进程互斥是进程间竞争共享资源的使用权,这种竞争没有固定的必然联系,哪个进程竞争到使用权就归那个进程使用,直到不需要使用时再归还;而进程同步则是涉及共享资源的并发进程间有一种必然的联系,当进程必须同步时,即使无进程在使用共享资源时,那么尚未得到同步消息的进程也不能去使用这个资源。

    4、死锁与饥饿

    死锁:
    死锁的产生一定是我们在为了确保同步多线程多进程的时候为临界资源加锁(互斥锁,信号量)造成的。
    因为一但加锁就会有不可剥夺的资源产生,这也是死锁产生的最重要的条件。
    *死锁产生的必要条件:
    互斥(临界资源):一个资源某一时刻只能一个进程占用
    不可抢占(锁的本质):别人用着没用完你不能抢
    占有与请求:占有一个资源时候请求别的资源
    循环:在上述三个条件下,由于运行时间巧合产生死锁A占用a资源申请b阻塞住,B占有b申请a被阻塞住了。


    饥饿:
    是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应
    带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义
    时称该进程被饿死。(两个以上优先级高的线程一直生产消费通过临界资源,一个线程旁边看,忙等待)

    相同点:二者都是由于竞争资源(未解决则会加锁)而引起的。

    不同点:
    *从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却
    可能被饿死;
    *死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限
    没有上界(排队等待或忙式等待);
    *死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测
    是否有进程饿死;
    *死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
    *在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终
    使整个系统陷入死锁并崩溃。


    5、临界区

    即每个进程中访问临界资源的那段程序。(临界资源是一次仅允许一个进程使用的共享资源。)每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。


    P、V 原语

    信号量的值仅能由 P,V 原语操作改变,操作系统利用它的状态对进程和资源进行管理。(P 和 V 分别来自荷兰语 Passeren 和 Verhoog,相当于英文的 pass 和 increment)

    下面是 P、V 原语操作:

    P(sem) {
    sem = sem - 1;
    if (sem < 0) {
        该进程状态置为等待状态
        讲进程的PCB插入相应的等待队列尾部
        sem.queue;
        }
    }

      

    V(sem) {
    sem = sem + 1;
    if (sem < = 0) {
        唤醒相应等待队列 sem.queue 中的一个进程
        改变其状态为就绪状态
        将其插入就绪队列
        }
    }
    1. 信号量的物理含义:
    • sem > 0 表示有 sem 个资源可用
    • sem = 0 表示无资源可用
    • sem < 0 则 | sem | 表示 sem 等待队列中的进程个数
    • P(sem):表示申请一个资源
    • V(sem):表示释放一个资源。信号量的初值应该大于等于0
    1. P、V操作必须成对出现,有一个 P 操作就一定有一个 V 操作
    • 当为互斥操作时,它们同处于同一进程
    • 当为同步操作时,则不在同一进程中出现

    如果 P(sem) 和 P(sem) 两个操作在一起,那么P操作的顺序至关重要,一个同步P操作与一个互斥P操作在一起时同步P操作在互斥P操作前而两个V操作无关紧要。


  • 相关阅读:
    [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程
    [笔记] Ubuntu 18.04源码编译安装OpenCV 4.0流程
    [笔记] Ubuntu 18.04安装Docker CE及nvidia-docker2流程
    [笔记] Ubuntu 18.04安装cuda 10及cudnn 7流程
    [笔记]Win10下编译Tesseract-OCR 4.0
    [笔记]Python中模块互相调用的例子
    [笔记]mosh使用笔记
    [笔记]Delphi 2007写DLL供VC调用实例
    [笔记]Python的调试器pudb简易教程
    [笔记] Ubuntu下编译ffmpeg+openh264+x264
  • 原文地址:https://www.cnblogs.com/lxz6666/p/10757083.html
Copyright © 2011-2022 走看看