首页 > 系统相关 >操作系统——进程同步互斥分析

操作系统——进程同步互斥分析

时间:2023-01-17 20:44:37浏览次数:47  
标签:同步 PV 操作系统 进程同步 信号量 互斥 死锁 进程

如何实现进程同步

假设有两个代码块S1,S2顺序进行(先S1后S2),在在S1和S2之间设个信号量S,则先V后P

分析:

信号量初始设置为0,先V让它变为1才能在P那里不阻塞进行,如果先P让信号量变为-1则会阻塞

结论:

先V后P

生产者消费者问题:

问题描述:

image-20230117203336060

PV操作分析步骤:

确定进程,确定同步和互斥关系

同步互斥关系:

生产者与消费者对缓冲区进行访问(互斥,设信号量mutex)

当盘子满的时候,先让消费者消耗再生产(同步,设信号量full)

当盘子空的时候,先让生产者生产在消耗(同步,设信号量empty)

理解方法:

对于full信号量,假设full为1,不能再往里放东西了,这个full的对象是生产者,所以生产者先执行,因此生产者V(full);
对于empty信号量,假如empty=1,消费者不能在消费,对象是消费者,故消费者实行V(empty)

解决方法:

image-20220611160753082

PV顺序问题:

实现互斥的P操作一定要放在实现同步的P操作之后,否则会死锁

多生产者消费者问题:

问题描述:

image-20220611171422662

PV操作分析步骤:

确定进程,确定同步和互斥关系

同步互斥关系:

image-20220611160953555

理解方法:

对于apple信号量,假设apple为1,父亲不能再往里放东西了,这个apple的对象是父亲,所以父亲先执行,因此父亲V(apple);

对于orange信号量,假设orange为1,母亲不能再往里放东西了,这个orange的对象是母亲,所以母亲先执行,因此母亲V(orange);

对于plate信号量,假如plate=1,孩子们要先拿水果水果,对象是孩子,故孩子实行V(plate)

解决方法:

image-20220611161520386

PV顺序问题和一些要点:

实现互斥的P操作一定要放在实现同步的P操作之后,否则会死锁

当缓冲区为1时,不用互斥量(不过以防万一还是可以加上)

吸烟者问题:

问题描述:

image-20220611171446567

PV操作分析步骤:

确定进程,确定同步和互斥关系

同步互斥关系:

image-20220611162248612

解决方法:

image-20220611162327923

PV顺序问题和一些要点:

实现互斥的P操作一定要放在实现同步的P操作之后,否则会死锁

当缓冲区为1时,不用互斥量(不过以防万一还是可以加上)

读者,写者问题:

问题描述:

image-20220611171513429

PV操作分析步骤:

确定进程,确定同步和互斥关系

同步互斥关系:

image-20220611163844034

解决方法:

方法1:(设置一个互斥量rw,让写进程与读进程互斥访问缓冲区)

image-20220611163925533

方法1问题所在:

假设有两个进程同时读,在第一个进程还未让count++,第二个读进程来临,发现count为0,想上锁,但是因为依旧上过锁了发生阻塞。

方法一问题分析:

对于count变量的检查和赋值没有一气呵成,所以对count的访问也需要时互斥的

方法2:(对count设置一个信号量mutex,实现对count访问互斥)

image-20220611164647849

方法2问题所在:

假设一直持续不断有读文件进程,则rw一直被上锁,当有写文件过来时,无法访问缓冲区,出现“饿死”,

方法2问题分析:

对于写操作没有设置优先级,导致出现饿死

方法3:(设置一个信号量w,让先来的操作无论是写还是读都有优先级)

image-20220611165431950

分析总结:
  • rw信号量实现了读写互斥,以及读进程之间先来的有优先级,且读进程之间不互斥;
  • mutex信号量实现了对count修改的一气呵成;
  • w信号量实现了先来的进程(无论读写)有优先级

哲学家吃饭问题:

问题描述:

image-20220611170636697

PV操作分析步骤:

确定进程,确定同步和互斥关系

同步互斥关系:

image-20220611170606696

解决方法:

方法:

image-20220611170727937

方法问题所在:

假设多个哲学家进程并发执行,有可能同时拿起左边的筷子,然后等待右边的筷子,造成死锁

方法问题分析:

没有对多个并发的程序赋予一定的优先级,导致死锁

方法改善:(设置一个信号量mutex,对先吃饭的哲学家进程赋予优先级)

image-20220611170912934

分析总结:
  • 筷子信号量数组实现了对哲学家对于筷子的互斥关系
  • mutex信号量实现了哲学家进餐的优先级,避免死锁

问题总结

  • 当分析问题时出现有饿死或者死锁关系的时候,再设置一个信号量给进程之间赋予优先级,可能解决
  • 当某些操作不能一气呵成造成一些阻塞现象时,也可以考虑再设置一个信号量实现对操作的一气呵成

标签:同步,PV,操作系统,进程同步,信号量,互斥,死锁,进程
From: https://www.cnblogs.com/Davy-Chen/p/17058659.html

相关文章

  • 操作系统面试题(史上最全、持续更新)
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • keychron K3 键盘和 Windows11 操作系统的笔记本电脑通过蓝牙配对出现问题的解决方案
    最近一直使用良好的keychronk3键盘,忽然出现了一些问题。我用的是Windows11操作系统。keychronk3采用蓝牙模式连接。能够成功配对,但Connected状态只能持续1秒钟,随......
  • 操作系统有意思
    概述操作系统是什么?(不同的视角)进程管理进程,线程,协程进程/线程:操作系统提供的一种并发处理任务的能力。协程:程序员通过高超的代码能力,在代码执行流程中人为的实现多任......
  • pg14安装前操作系统配置【转】
    【转】:https://www.modb.pro/course/149修改hosts文件[root@pg1~]#cat/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4......
  • 循序渐进,学习开发一个RISC-V上的操作系统 5.1答案
    现知道某条RISC-V的机器指令在内存中的值为b3059500,从左往右为从低地址到⾼地址,单位为字节,请将其翻译为对应的汇编指令。解:risc-v是小端模式将这个16进制的数倒......
  • 操作系统底层原理(八万字长文!!)
    本文是操作系统的学习笔记,学习的主要目的是扎实基础,并且对Java的一些底层操作和优化有着更加深刻的理解。本笔记目前主要涉及操作系统的内存管理、trap(系统调用、pagefau......
  • 如何获取操作系统的语言类型
    今天网友问到了这个问题:"比如:我在win2000中文版上运行时可以获取操作系统的语言版本为中文,在win2000英文版上运行时,知道是英文版"这里我写了个函数,方便使用.(只取得简体,繁体,和英......
  • VB6判断操作系统是否运行在安全模式
    PrivateDeclareFunctionGetSystemMetricsLib"user32"(ByValnIndexAsLong)AsLongPrivateConstSM_CLEANBOOT&=67 PublicFunctionIsSystemRunInSafeMode()A......
  • 【Linux操作系统】如何实现Linux中软件安装进度条?
    文章目录​​一.回车与换行​​​​二.缓冲区问题​​​​三.倒计时小程序​​​​四.进度条小程序​​Linux下安装软件时,经常会看到类似上图的进度条,今天带大家用C语言来演......
  • 【Linux操作系统】自动化编译make和Makefile
    文章目录​​一.make/makefile简介​​​​1.什么是make,makefile?​​​​2.为什么要有make/makefile?​​​​二.makefile文件规则​​​​1.基本规则​​​​2.举一个例......