操作系统中各进程执行过程中,会有着同步和互斥的关系,本文详细讲解进程之间的各种关系,了解生产消费者模型。
一、互斥和同步
进程的同步与互斥是学习 PV 操作的前提。
同步和互斥往往在实际问题中共存,而不是反义词。
同步的反义词是异步。
互斥的反义词是共享。
接下来详细学习互斥和同步的概念。
1.1 互斥
在同一时刻,只允许某一个进程去使用资源,即同一个资源只能服务一个进程。
一个进程正在访问临界资源,另一个访问该资源的进程就必须等待,这就是互斥。
就比如公司的门禁就是一个资源,单位时间内只允许一位员工刷卡,其他人需要做等待。
这个门禁就是互斥资源,也成为临界资源。
员工 B 需要等到员工 A 刷完卡后,才能刷卡签到,如下图所示。
互斥的概念就是多个资源使用者在使用同一个资源时的关系。
为什么要用互斥的概念,就是为了防止多进程共享资源时,发生并发性问题。
比如一台打印机,被多个进程同时调用,如果没有互斥现象,各进程可以随时使用打印机,会造成打印结果错乱。所以打印机系统将打印资源统一化管理,每次只允许一个进程操作打印机,等到该进程使用完毕后,再根据排队顺序交给某个等待的进程。互斥关系是一种间接制约关系。
1.2 同步
同步的概念,是在异步环境下,一组并发进程因直接制约,互相等待、互相通信,使得进程按照一定速度执行的过程,这个进程也成为合作进程,合作进程互相发送的数据叫消息。
比如员工张三和李四在同一个宿舍,张三选择坐公交车上班,李四选择自驾上班,但他们约定 8 点到达公司。
李四在某些时刻要等待张三,和张三距离太远了就要等他,因为如果不等,可能会出现李四到了张三没到的情况。这就是同步的过程。
同步的概念就是多个对象在处理某件事情时,有速度匹配的要求,速度快的要及时等待速度慢的,这就是同步的过程。
比如一段 Java 代码,在输入、编译、执行这三个工序作为三个进程并发执行,这三个进程存在相互合作的关系,也就是说必须先输入完成后才能进行编辑、先编译完成后才能执行。所以这三个进程的执行受到限制,必须要保证先后顺序才能完成整体的功能,这种关系也叫做同步关系,它是一种直接制约关系。
二、消费者模型
在多线程的系统中,生产者就是造出数据的线程,消费者就是消费数据的线程。
如果生产者造数据很快但消费者处理很慢,会造成服务器内存爆满,或硬盘不够的情况。
如果生产者造数据很慢但消费者处理很快,会造成消费者进程资源浪费。
所以就衍生出生产消费者模型。
生产消费者模型是一个典型的多线程并发协作模型,在分布式系统中很常见。
- 生产者:用于生产数据,并把生产的数据放入缓冲区这个队列中。
- 缓冲区:用于存放生产者数据。
- 消费者:用于从缓冲区队列中取出数据,然后消费。
简单来讲,生产消费者模型的运行流程如下图所示:
根据缓冲区的数量,生产消费者模型可分为单缓冲区消费者模型和多缓冲区消费者模型。
2.1 单缓冲区的消费者模型
对于单缓冲区的消费者模型,盒子只有一个空间,同个时间片只允许一个人放入或者取出资源,不能同时进行多个操作,所以这个盒子就是互斥资源。
当生产者将一个资源放入盒子后,需要等待消费者取出盒子中的资源,然后生产者才能再次放入,这就是同步的过程(即停下来等别人的过程)。
2.2 多缓冲区的消费者模型
多缓冲区的消费者模型也是类似,大盒子只允许一个人放入或者取出资源,不能同时进行多个操作,所以这个大盒子就是互斥资源。
当大盒子的资源放满后,生产者还是需要等待消费者取出任意多个后,才能继续放入,这就是同步的过程。
三、总结
本文讲解了操作系统中各进程之间同步和互斥的关系,同步就是各进程会相互制约,相互等待以完成整体的任务,异步就是在单位时间内只能由一个进程访问资源。还有学习了生产者消费者模型的原理,生产消费者模型在高并发的系统中较为常见,所以需要学习它的原理,来妥善解决商业项目中的并发数据可能存在的隐患。