在说明进程之前引入几个概念,本文向你诠释,并行,并发,同步,异步,阻塞,非阻塞,进程等概念~
如果不理解这几个概念,在学习进程过程中时刻都在给自己预设障碍,所以我痛定思痛,先了解进程工作原理
概念1:单道程序与多道程序
不在赘述单道程序的工作原理,我来讲一个生活的小例子,让你明白单道程序大概是个什么概念,当然以下只是个假设,你假设你的生活场景就是如此单纯,我只是用生活中的场景去模拟计算机程序计算运行的指令单纯性,你不能把个人观点切实的搬进现实生活
单道程序
假设你在餐厅吃饭,你点了两道菜,我们分别叫菜A和菜B,但是这个餐厅有个奇葩规定,顾客必须吃第一道菜,并且厨师检查后才能吃第二道菜(单道程序),至于你吃了几口,吃的时候是用什么工具,都是你自己的事情,但是切记,菜A是西红柿炒鸡蛋,你只能吃西红柿鸡蛋,你不可能吃出土豆,厨师只关注它给你菜,你处理菜后再给他的过程,理解程序任务就是,厨师做菜并检查菜的处理结果(程序计算),而你吃饭的过程叫做I/O,理解这个很重要
厨师(CPU)在做菜A(程序计算)的时候,你(I/O)在等待菜A,你吃菜A的时候(I/O处理计算数据)厨师在等待,你吃完了,厨师检查吃的结果,然后厨师在做菜B,重复以上步骤,假设厨师做一道菜是2分钟,你吃一道菜是10分钟,厨师检查是1分钟,总之你要知道你吃饭的速度是远远低于厨师的做饭和检查速度的,你吃一顿饭下来的时间是,菜A+菜B
多道程序
单道程序极大的浪费了厨师的时间和你的时间,于是乎有了新的规定,做完菜A,可以直接做菜B,你先吃好哪道菜,就检查哪道菜,如果你的菜A是炖肉,那即便菜A还没做完也可以去做菜B,这样就大大的减少了厨师的做菜时间和效率
重要理解1:菜A和菜B是单独的两道菜,拥有自己的制作工序和方法
2: 菜A和菜B都在做的过程中,但都没做完
3: 两道菜在交替的做(串行),但都轮流的使用一个规定流程
进程
每道菜制作过程中叫做进程,每道菜里面至少需要一个食材(线程)PS:每个食材都有自己的生长模式,仅为概念转换,不要硬搬理解在其他概念解释模式内
每道菜的制作方法的菜谱和材料你可以理解为程序逻辑文件,只是让你可以这么理解
菜谱A有西红柿炒鸡蛋,菜谱B是土豆炒肉,在彼此两道菜的进程运行中,都是单独内存隔离存放的,菜A的不会影响菜B
进程是每道菜在做的过程中叫进程,不然他永远是放在内存里的一些,食材和制作方法,调料,这些东西你可以理解为程序文件,堆栈,数据区域,文本区域等等。。
进程动态性:一道菜有开始制作就有结束,进程是暂时的
进程并发性:不管有几道菜都可以同时去做
进程独立性:每道菜制作方式都不会影响其他的菜
进程异步性:可以参见上面的多道程序概念
进程调度
先来先服务:厨师最简单的行为模式就是先来先服务的调度算法,这个算法生产菜的过程中,也可以用于开始制作菜的先后,对厨师来说,非常有利于厨师长时间繁忙作业,但不利于准备吃饭的你长时间作业
优先调度:短作业,如果厨师在做饭时你突然想吃一个水果,想喝一瓶水,这是优先级最高的,这会打断厨师的作业进程,从而让厨师及时的处理正在进程中的菜,但他同样也占用了厨师(CPU)的处理时间,切记厨师必须知道拿一个水果和一瓶水的时间,如果让厨师拿一个水果得从几里地开外的农田里去采摘,这明显是不符合逻辑的,多级反馈队列调度是可以忽略这个问题,你就了解优先调度即可
时间片:餐厅有如下菜需要厨师去做,菜A,菜B一直到菜n,餐厅要求每道菜制作时间是有规定的,菜A制作1分钟,超过1分钟没做完的,菜A的剩余工序会排列在菜B之后等待处理没,菜B做完了,菜A剩下的时间还是超过1分钟,那就分到菜C之后(详细的大家自己百度)
多级反馈队列调度
菜A到菜n每道菜的制作时间不同,需要对菜的简易程度去做排列,用时越短的菜,优先级越高
菜A做完了,去做菜B,以此类推做到菜X,突然说菜A需要加盐,这个时候终止菜X,为菜A加盐,而菜X重新放在菜X队列末尾,这个解释有点牵强附会,只能勉强可以这么理解
并发与并行
理解了以上的概念之后这个就很好理解了
并发是指一个厨师按照多道技术去处理菜A和菜B,都占用了厨师的时间和单独计算流程,同时给你端到餐桌上,但对于你来说,你觉得两道菜是同时完成的
并行是指两个厨师(cpu)分别处理菜A和菜B,每个厨师都可以用多道技术去做菜C到菜n
如果四个厨师六道菜,厨师A做菜A,厨B做菜B以此类推,四个厨师分别做这菜A,B,C,D,如果厨A在处理菜A的过程中需要等待一会,理解为程序中input、sleep、文件输入输出、recv、accept等,这个时候厨A就会去做菜E,当菜A的等待时间完成之后,菜A可能交给任何一个厨师去做
同步/异步/阻塞/非阻塞
在了解其他概念之前,我们首先要了解进程的几个状态。在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞
同步
你去餐厅吃饭排队,你必须等待你前面的人都拿到餐走后你才能往前走一步这就是同步机制
所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列
。要么成功都成功,失败都失败,两个任务的状态可以保持一致。其实就是一个程序结束才执行另外一个程序,串行的,不一定两个程序就有依赖关系
异步
你去餐厅吃饭排队,你领取了一个取餐号码,你去到一边打游戏,打电话或者干其他的事情,你只需要后厨通知你的餐做好了去取即可
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了
。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它
是不可靠的
任务序列
从以上例子可以看出,同步机制是阻塞的,异步机制是非阻塞的
但异步可以被阻塞吗?答案是肯定的,如果你排队领到了取餐号码,但不允许你做其他任何事,你只能等待后厨通知你的餐做好了,这也是一种被设定阻塞,但一般没这么干的,你只要知道异步也可以被阻塞即可
进程的创建与结束(了解就行)
此段了解就行,进程本身就是暂时的,但是你要知道他可以随时被中断,打开,和结束即可
厨师可以用多道技术处理多道菜,但每个顾客的口味不同,他做出的菜根据不同顾客口味去添加食材的配料,厨师做了茄子盖饭,顾客希望加肉末,然后厨师对徒弟说,你去切做肉沫,然后徒弟就去做茄子肉沫盖饭,这就是子进程(解释比较牵强),但徒弟的进程,不会影响厨师的进程,他们只是共用厨房里面的一些食材和配料
进程的结束
正常结束:做菜过程中,觉得老板太抠门,不特么做了,(自愿结束)
出错结束:做菜的时候把糖给当成盐给放了(自愿结束)
严重错误:做菜的时候错误操作煤气,厨房炸了(非自愿)
被其他进程杀掉:厨师A跟厨师B有恩怨,厨师B正在做饭,厨师A拿起刀就把厨师B给干掉了,厨师B被动结束(非自愿)