【软考学习9】进程的同步与互斥、生产消费者模型

简介: 【软考学习9】进程的同步与互斥、生产消费者模型


操作系统中各进程执行过程中,会有着同步和互斥的关系,本文详细讲解进程之间的各种关系,了解生产消费者模型。


一、互斥和同步

进程的同步与互斥是学习 PV 操作的前提。

同步和互斥往往在实际问题中共存,而不是反义词。

同步的反义词是异步

互斥的反义词是共享

接下来详细学习互斥同步的概念。


1.1 互斥

在同一时刻,只允许某一个进程去使用资源,即同一个资源只能服务一个进程

一个进程正在访问临界资源,另一个访问该资源的进程就必须等待,这就是互斥

就比如公司的门禁就是一个资源,单位时间内只允许一位员工刷卡,其他人需要做等待。

这个门禁就是互斥资源,也成为临界资源

员工 B 需要等到员工 A 刷完卡后,才能刷卡签到,如下图所示。

互斥的概念就是多个资源使用者在使用同一个资源时的关系

为什么要用互斥的概念,就是为了防止多进程共享资源时,发生并发性问题

比如一台打印机,被多个进程同时调用,如果没有互斥现象,各进程可以随时使用打印机,会造成打印结果错乱。所以打印机系统将打印资源统一化管理,每次只允许一个进程操作打印机,等到该进程使用完毕后,再根据排队顺序交给某个等待的进程。互斥关系是一种间接制约关系


1.2 同步

同步的概念,是在异步环境下,一组并发进程因直接制约,互相等待、互相通信,使得进程按照一定速度执行的过程,这个进程也成为合作进程,合作进程互相发送的数据叫消息。

比如员工张三和李四在同一个宿舍,张三选择坐公交车上班,李四选择自驾上班,但他们约定 8 点到达公司。

李四在某些时刻要等待张三,和张三距离太远了就要等他,因为如果不等,可能会出现李四到了张三没到的情况。这就是同步的过程。

同步的概念就是多个对象在处理某件事情时,有速度匹配的要求,速度快的要及时等待速度慢的,这就是同步的过程

比如一段 Java 代码,在输入、编译、执行这三个工序作为三个进程并发执行,这三个进程存在相互合作的关系,也就是说必须先输入完成后才能进行编辑、先编译完成后才能执行。所以这三个进程的执行受到限制,必须要保证先后顺序才能完成整体的功能,这种关系也叫做同步关系,它是一种直接制约关系


二、消费者模型

在多线程的系统中,生产者就是造出数据的线程,消费者就是消费数据的线程。

如果生产者造数据很快但消费者处理很慢,会造成服务器内存爆满,或硬盘不够的情况。

如果生产者造数据很慢但消费者处理很快,会造成消费者进程资源浪费。

所以就衍生出生产消费者模型。

生产消费者模型是一个典型的多线程并发协作模型,在分布式系统中很常见。

  • 生产者:用于生产数据,并把生产的数据放入缓冲区这个队列中。
  • 缓冲区:用于存放生产者数据。
  • 消费者:用于从缓冲区队列中取出数据,然后消费。

简单来讲,生产消费者模型的运行流程如下图所示:

根据缓冲区的数量,生产消费者模型可分为单缓冲区消费者模型和多缓冲区消费者模型。


2.1 单缓冲区的消费者模型

对于单缓冲区的消费者模型,盒子只有一个空间,同个时间片只允许一个人放入或者取出资源,不能同时进行多个操作,所以这个盒子就是互斥资源。

当生产者将一个资源放入盒子后,需要等待消费者取出盒子中的资源,然后生产者才能再次放入,这就是同步的过程(即停下来等别人的过程)。


2.2 多缓冲区的消费者模型

多缓冲区的消费者模型也是类似,大盒子只允许一个人放入或者取出资源,不能同时进行多个操作,所以这个大盒子就是互斥资源。

当大盒子的资源放满后,生产者还是需要等待消费者取出任意多个后,才能继续放入,这就是同步的过程


三、总结

本文讲解了操作系统中各进程之间同步和互斥的关系同步就是各进程会相互制约,相互等待以完成整体的任务异步就是在单位时间内只能由一个进程访问资源。还有学习了生产者消费者模型的原理,生产消费者模型在高并发的系统中较为常见,所以需要学习它的原理,来妥善解决商业项目中的并发数据可能存在的隐患。


相关文章
|
20天前
|
Python
多进程同步之文件锁
【10月更文挑战第16天】文件锁是一种常用的多进程同步机制,它可以用于确保多个进程在访问共享资源时的互斥性。在使用文件锁时,需要注意锁的粒度、释放、竞争和性能等问题。通过合理使用文件锁,可以提高多进程程序的正确性和性能
|
5月前
|
算法 数据库
操作系统:经典进程同步问题的高级探讨
操作系统:经典进程同步问题的高级探讨
76 1
|
3月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
3月前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
5月前
|
存储 缓存 NoSQL
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
82 1
|
5月前
|
数据挖掘 调度 开发者
Python并发编程的艺术:掌握线程、进程与协程的同步技巧
并发编程在Python中涵盖线程、进程和协程,用于优化IO操作和响应速度。`threading`模块支持线程,`multiprocessing`处理进程,而`asyncio`则用于协程。线程通过Lock和Condition Objects同步,进程使用Queue和Pipe通信。协程利用异步事件循环避免上下文切换。了解并发模型及同步技术是提升Python应用性能的关键。
125 5
|
4月前
|
Python
在Python中,`multiprocessing`模块提供了一种在多个进程之间共享数据和同步的机制。
在Python中,`multiprocessing`模块提供了一种在多个进程之间共享数据和同步的机制。
|
4月前
|
安全 API Python
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
|
5月前
|
编解码 算法 程序员
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
|
5月前
|
机器学习/深度学习
3 个进程 P1、P2、P3 互斥地使用一个包含 N(N > 0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数,并用 put() 将其送入缓冲区的某一空单元中 ;P2每次用 get
3 个进程 P1、P2、P3 互斥地使用一个包含 N(N > 0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数,并用 put() 将其送入缓冲区的某一空单元中 ;P2每次用 get