进程是个啥

一、进程的必要性(为什么需要进程)

讲进程前,我们很有必要来认识一个概念:程序的并发执行,什么?不知道并发是什么鬼,别急嘛,我才刚刚开始,我会慢慢把它讲明白的(好吧,尽我所能讲明白,如果你看了这文章还不明白,那就是在下输了)。

首先,在认识程序的并发执行前,我会先讲另一个东西,总得给配角一些机会嘛,这个配角1号就是程序的顺序执行,这个还不简单,程序按步骤一步两步三步四步望着天,不好意思,是一步两步三步四步执行下去不就是顺序执行么?真的这么简单吗?别怀疑,就是这么简单,但严格上程序的顺序执行应该这么定义:程序分为若干程序段,在各个程序段之间,必须按照某种先后次序顺序执行,仅当前一操作(程序段)执行完,才能执行后续操作(程序段)。在这里细心的人可能会有一个疑问:如果程序是循环的,那还算顺序执行吗?答案是肯定的,比如有一个程序分为程序段123,并按123的顺序循环执行,聪明的人这时应该能知道为啥循环程序是顺序执行了的吧,注意:1要执行的前提是3要执行完,所以不用我解释了吧。

好了,知道了什么是程序的顺序执行后,我们有必要来了解程序顺序执行的特征了,首先,程序的顺序执行拥有顺序性,这个简单,我就不多说了;其次是拥有封闭性,何为封闭性,就是程序执行时,它占有了所有资源,外界对其结果没有影响了,程序的结果只受程序本身影响,这就好比你(程序)付了钱去吃自助,自助餐厅就好像一个封闭空间,里面的东西(资源)你爱怎么吃怎么吃,最终(程序结果)你是扶着墙出来,还是任性什么都不吃就出来,这就看你自己了,外界环境改变不了你(别和我说突发地震);最后,程序的顺序执行还拥有可再现性,就是说不管程序是一口气运行到底,还是走走停停,只要输入不变,它最终的结果都不变,比如1+2+3=6,你先算1+2=3,隔了10年后,你再算3+3它结果还是等于6,或者你一口气把它算出来,它的结果也不会等于7吧。

好了,程序的顺序执行我就讲完了,其实还有个前趋图的知识,那个简单,而且也不会影响我们理解进程,所以我就不讲了,那么接下来我们掌声欢迎配角2号程序的并发执行登场吧。

何为并发执行,举个简单的例子,你用计算器计算1+1=2时,你会经历这三个步骤:1)你输入1+12)计算器计算1+13)屏幕显示结果等于2;好了,问题来了,如果你在计算1+1的同时还想计算1-1,那会怎样?如果程序是顺序执行的话,那不好意思,一定要等到1+1计算完并把结果显示出来后,你才能输入1-1,但如果我们的配角2号出面的话那就不一样了,也许你输入完1+1之后就可以输入1-1了,这就是所谓的并发执行了,这样的程序就是并发程序。但这里有一点要格外注意,计算器要计算1-1时,一定要等1+1计算完并且你已经输入1-1后,它才能执行,前者毕竟是1+1先来的,它还没计算你后者来了却要先计算,插队终归是不好的嘛,而后者就不用多说了,你连输入都没有,叫人家计算个德布劳内(丁丁)。

这里我还要解释一下并发与并行的区别,并发就是前后有两个人同时走出教室,宏观上看起来两人是同时的,但微观上来看,两人还是分前后出去的,严格来说并不是同时;而并行,顾名思义,就是两个人并肩走出教室,是实实在在的同时。显而易见并行是要优于并发的,而且那些说单一处理机上有并行程序都是在在骗鬼,单一处理机其实就等价于教室只有一个可以容纳一个人通过的门,好在,谢天谢地我们目前绝大多数的PC机处理器都是双核的,甚至四核的。

好了接下来,我要讲程序并发执行的特征,这也是为啥我们需要进程的原因,也就是本小节的重点。那么程序并发执行有什么特征呢?

1)间断性,还是前面那个1+11-1的例子,我们前面说过,在程序并发执行时,你输入1+1后,无需等待1+1把剩下的步骤做完,你就可以输入1-1了,但是,我还说过要计算器计算1-1,一定要等1+1计算完并且你已经输入1-1后,它才能执行,所以你可能在输入1-1之后,1-1这个程序就暂停了,等到1+1计算完后,计算器才重新开始运行1-1程序计算1-1,这就是间断性了,程序可能经历“执行-暂停-执行”的过程;

2)失去封闭性,程序并发执行之所以会失去封闭性,是因为多个程序共享系统资源,导致这些资源的状态将由多个程序决定而造成的,不懂?好吧,我又要举例子了,前面讲程序顺序执行的封闭性时,我用到了自助餐的例子,还记得吗?现在我还是用吃饭作为例子,但这次我们不去吃自助了,没钱了,乖乖吃食堂吧,现在饥肠辘辘的你(待执行的程序)来到食堂,真不巧,食堂只开了一个窗口(资源),更不巧的是一个同学(另一个待执行程序)还比你先来,你要咋办?插队?还是打他一顿?好吧,我们都是大学生,只能乖乖等咯,这时封闭性也就失去了,可能你会有疑问了,啥?那程序顺序执行的话,不也是得等那个同学打完饭你才可以去打饭,那程序顺序执行的话,不也是失去封闭性了么?答案当然是否定的,不然我前面不就讲错了,那怎么会这样呢?注意,如果程序是顺序执行的话,那个同学进了食堂你就不能进去了,必须等到他吃完饭出来你才可以进去,而并发执行就是他进去了你也可以进去(微观上你们得分前后进去,记得那个教室的例子吗?),如果有两个打菜窗口的话你们也可以同时(宏观上的同时)打,只不过当打菜窗口只有一个时,你才会失去封闭性,而程序顺序执行之所以不会失去封闭性,是因为食堂只允许一个人存在,根本就不会有人和他竞争打菜窗口,自然也就不会失去封闭性了。

3)不可再现性,程序失去封闭性的同时也可能导致其再失去可再现性,真是惨啊,那么什么是不可再现性呢?是的,我理论基础差,只能借助例子来说明了,假设现在有一个整数n,有两个程序aba执行操作n=n+1b执行操作printf(n);n=0;ab的执行速度是不同的,那么有趣的地方来了,假设n=n+1printf(n)n=0前执行,则n的值先后为n+1n+10,屏幕显示n+1;假设n=n+1printf(n)n=0之间执行,则n的值先后为nn+10,屏幕显示n;假设n=n+1printf(n)n=0之后执行,则n的值先后为n0n+1,屏幕显示n;显然程序已经失去可再现性了,也就说一个程序即使输入相同,其得出的结果也有可能不同,程序原来的结果已经不可以再现了。

并发执行显然有其优于顺序执行的地方,想象一下,如果你电脑的程序是顺序执行的话会怎样吧,假设现在你即想听歌又想下载东西,而你电脑的程序却是顺序执行的,那会怎样呢?那电脑必须等你把歌听完了,才能去下载东西,也就是事情必须一件一件按顺序做,并发就不一样了,电脑可能让你听了0.1秒的歌后,就花0.1秒的时间去下载东西了,然后回过头来,再让你听0.1秒的歌,而你的耳朵是感受不出歌曲中间那0.1秒的间隔的(也有可能你听出来了,但没关系,如果是0.001秒呢?),宏观上你感觉你在听歌的同时电脑又在下载东西,比起顺序执行,这是不是让你爽多了呢?

但显而易见,并发执行也有其缺点,在特征那里就有它明显的缺点了,聪明的你应该能看出来吧,我就不多说了(你不会希望那个n老变来变去吧),那么如何解决这些缺点呢?问得好,讲了那么多就是为了解决这个问题,所以为了解决这个问题我们终于要把我们的主角——进程——请出来了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值