:::tip 社会发展到今天,电子产品一天也离不开我们的生活。通常程序(APP)是不可以并发运行的,如果并发运行将会因为程序执行速度的不同,结果就不可控制了,但是日常生活中我们常需要程序一起运行,例如我想听歌,还想查看网页,进程概念由此而生。 :::
# 什么是进程
进程的定义,站在不同的角度就会有不同的定义,较为经典的有以下几种。
- 进程是程序的一次执行。
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个基本单位。
在引入了进程实体
概念之后,传统OS中的定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
# 什么进程实体?
进程实体程序段相关数据PCB
由程序段,相关数据段和PCB(进程控制块)组成。
# 进程的特征
进程特征动态性并发性独立性异步性
# 进程的三种基本状态
就绪就绪阻塞阻塞执行执行进程调度进程调度时间片完时间片完I/O请求I/O请求I/O完成I/O完成
假如说是五种状态,就在加入挂起和激活状态就可以了,其实也还是根据上边这个图来的。
# 为什么要引入生产者与消费者关系
举一个例子吧。
|
|
把①和②当做两个进程,当他们两个顺序执行时可以得到的结果是a=5
,b=15
,这个才是正常的。
但是当两者随着运算顺序的不同,得到的结果也相异,有以下三种情况
- 进程①比进程②运算的快的时候
a=5
,b=15
- 当进程①跟进程②同时运行的时候
a=5
,b=6
- 当进程①比进程②运算慢的时候
a=8
,b=6
这还只是两个进程,有三种结果,当程序多的时候,结果的基数也会变得很大,但是我们要的只是正确的那一个,所以我们要防止这种情况出现,生产者与消费者关系就可以很好的解决这样的情况。
# 生产者与消费者关系
生产者和消费者中间还有一个缓冲区,生产者生产完的东西就放在缓冲区里,消费者获取东西也要从缓冲区里面取。但是它们之间必须要有这样的约定,不允许生产者向一个一个已经装满了商品且尚未取走的缓冲池投放产品,不允许消费者从一个空的缓冲池取产品。
缓冲池1缓冲池1缓冲池2缓冲池2缓冲池3缓冲池3生产者生产者22113344消费者消费者
生产者可以选择1或4把生产的产品放进去,消费者可以选择2或3买走商品。
# 程序代码实现
|
|
实现原理,当生产者要生产东西的时候,需要判断是否有消费者正在买东西,如果没有消费者就在找找在缓冲池中还有空的缓冲区不,有就放进去,没有就结束。当消费者要买东西时,需要判断是否有生产者正在生产东西,如果没有进去找一个不是空的买,然后结束。思路流程图如下。
|
|
开始开始生产者/消费者生产者/消费者flag=0?flag=0?flag=1flag=1生产者?生产者?num<n?num<n?num>0?num>0?num=num+1num=num+1flag=0flag=0结束结束num=num-1num=num-1是是否否是是是是否否否否
代码
|
|