• 操作系统--进程的互斥与同步


    进程互斥

    进程互斥:在多个程序中,有两个进程不可以同时进行(例如读,写操作)。
     

    竞争资源(临界资源)

    • 当并发进程竞争使用同一资源时,他们之间就会发生冲突。如果操作系统将资源分配给其中的某一个进程使用,另一个进程就必须等待,直到申请的资源可用时,由操作系统分配给他们。

    • 如果竞争资源的进程太多,这些进程还必须等待在一个队列中,如就绪队列,阻塞队列等。

    • 一种极端的情况是,被阻塞进程永远得不到申请的资源,而死锁。

    采用互斥方式,使用临界资源

    资源的互斥,进程使用上述这类资源的时候,只能有一个进程对资源进行处理。下面是临界区的使用图和注解。

                                               

    进程同步

    多个进程常常需要共同修改某些共享变量,表格,文件数据库等,协作完成一些功能。这个时候,就需要用到进程之间的同步。
    我们把异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。
     
     

    进程同步和互斥的解决方法

    互斥与同步的解决方法--软件方法

    控制p0,p1互斥的进入临界区。

    while循环为进入区应该做的事情。当不符合条件的时候,进行do{nothing}操作。

    使用软件解决方法,有一个公认的比较好的算法,为Dekker算法。下面是Dekker算法介绍。

    Dekker算法介绍:

           

    上面是Dekker算法的伪代码,还有p0进程的执行流程图。

    互斥与同步的解决方法--硬件方法

    硬件方法包括屏蔽中断和专用机器指令。

    屏蔽中断:

    由于进程切换需要依赖中断来实现,如果屏蔽中断,则不会出现进程切换。

    因此,为了实现对临界资源的互斥使用,可以在进程进入临界区之前,屏蔽中断。当进程退出临界区时,打开系统中断。这样就实现了同步和互斥的问题的解决。

    专用机器指令:

    (指令系统是计算机硬件的语言系统,也叫机器语言)

    利用一些专用机器指令也能实现互斥,机器指令在一个指令周期内执行,不会受到其他指令的干扰,也不会被中断。

    下面就是一个使用机器指令的例子:

                 

    (左边为机器指令方法,右边为实现代码)

    互斥与同步的解决方法--信号量

    信号量方法,就是用一个信号量来控制进程之间的使用。(就像是交通中的红路灯(信号量)与汽车之间的关系和作用)

         ​信号量的类型(count):

        ​     互斥信号量:用于申请或者释放资源的使用权,常初始化为1.

        ​    ​ 资源信号量:用于申请或者归还资源,可以初始化为大于1的正整数,表示系统中可用资源的个数。(比如说,我有多个显示屏,那么就可以使用count表示显示屏的个数。)

         信号量的操作:wait和signal(操作系统中,用系统调用的形式来提供wait和signal原语)

    s.conut为为信号量

    wait为申请资源   (优先于signal)

    signal为释放资源 (滞后于wait)

    下面是wait,signal操作的伪代码

            

    信号量的使用例子:


     

    根据上面的信号量,我们可以总结出信号量的物理意义

    互斥与同步的解决方法--管程 

    管程是一种在程序设计级控制进程互斥与同步的机制,具有信号量的功能,且更容易使用和控制。

    管城只要用于面向对象程序设计。

     
    互斥与同步的解决方法--通讯机制
     
    消息一般格式:

     

    消息传递同步操作原语

    两个进程之间的通讯,需要一些操作。我们使用操作系统提供的原语来完成这些操作。

    send原语:发送消息

    receive原语:接受消息,如果没有消息可以接受,那么则等待。

    常用的进程通讯

    1. 基于共享存储区的方法

    2. 邮箱的方式

    分别介绍:

    基于共享存储区的方式:

    通讯的双方是基于共享存储区来通讯的。这个共享数据区属于每个相互通讯的进程的组成部分。然后通讯之间向里面存储数据,提取数据。


    邮箱方式: 

    只要保证邮箱中,只有一个消息,那么就可以实现消息之间的互斥这样,就保证了进程之间的互斥。

  • 相关阅读:
    Opencv-Python 学习
    Python图片处理
    sae flask 微信公众平台开发
    Python 定位字符串
    Python检测IP合法 是否为公网IP
    Python requests 为pfsense 添加Routes
    lua-nginx-module 学习
    CDN 学习笔记
    教程
    2020-2021-1 20209327 《Linux内核原理与分析》第十二周作业
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7487696.html
Copyright © 2020-2023  润新知