有一家游乐园,它叫Program
本文是在看了阮一峰先生的《进程与线程的一个简单解释》之后按照个人理解写的一篇关于阐述程序、进程和线程关系的故事Demo,在内容上不是很严谨,请多包涵。
在某个不知名郊区,一个叫程序员的大富翁买下了一大片土地,建造了一座很大很大的游乐园,给它起了个名字:Program。
这里写图片描述游乐园(Program)很大很大,有很多很多个游乐项目,每个游乐项目都有很多个工作人员在参与工作
这里写图片描述程先生自己负责统计游乐园(Program)的营收。他在想,有一些游乐项目并不常年使用,比如清凉游泳池,是只在夏天开放的,比如某些节日专属的游乐项目,如果在计算成本的时候要总是把这些不运营的项目也统计起来就太麻烦了,于是聪明的程先生想到了一个万全的解决方案。他拍手道:“对啊!我可以把当天运营的项目和当天不运营的项目分开来啊!这样我只要统计当天运营的项目的成本就行啦!”他觉得自己这个想法巧妙极了,于是乎决定给当天投入运营的项目起一个轰轰烈烈的名字,他反复翻阅了维科英汉汉英词典,最后发现Process这个单词看起来了不起极了,从此游乐园(Program)里的运营项目就有了一个新名字:Process。
这里写图片描述于是乎Process和Program的概念就清晰了,Program就是游乐园本身,它包含了游乐园所有的游乐项目,它是一个静态的概念。而Process是被投入运营的游乐项目,是动态的。游乐园里某一个游乐项目从早上8点开始投入运营,到晚上9点结束运营,为一个Process。9点过后游乐项目停止运营了便不能算一个Process了。也就是说Process是Program的一次执行,写进硬盘里的程序自然是静态的,通过启动程序调动里面的进程,此时的进程是动态的,可以被Start,也可以被Destroy。**
这里写图片描述每个运营项目(Process)都是独立的,各自占有一片地方,每个运营项目(Process)也有好多好多工人(Thread),有负责维护运营这个游乐设施的,有负责每天接待客人的。可是为什么程先生要请那么多的工人呢?像维护游乐设施的,请一个维护全部的游乐设施不就行了吗?当然每个人都会这么想,程先生也不是傻子,他请这么多员工的原因是:X国是个极度贫困落后的国家,在这里劳动力是极为廉价的,并且十分人性化,只有当劳动的时候才会向老板要求一点面包和金钱。也就是说,线程是进程的子单位,也是程序执行流的基本单位。线程有轻量级的优点,每次start仅仅向系统请求支持运行的一点点必不可少的资源。**
这里写图片描述在这种贫穷落后的国家里当然不可能建立起高科技的游乐设施啦。因此这里的游乐设施可是远近闻名的纯人工的哦。像摩天轮这种小型的游乐项目比较简单,只要一个工人(Thread)在下面不停地推动它转圈;像旋转魔盘也比较简单,只要一个壮一点的工人(Thread)在魔盘下拉着绳子转圈跑;像海盗船这样的大项目就麻烦了,需要两个工人(Thread)配合着从两边来回交替地拖拽海盗船。游乐园(Program)每天都沉浸在这样的汗水和欢声笑语中。
这里写图片描述游乐园(Program)实在是太大了,为了方便管理,程先生开始把每个游乐项目当作一个独立的单位,在每个游乐项目里有这个项目的工人们用的厕所,休息用的房间等等。富翁规定,每个工人(Thread)只能在自己的工作区域内活动,并享有这片区域的资源。即同一个进程里的线程共享着这个进程的资源。线程之间通信是不需要通过调用内核的。**
这里写图片描述刚开始工人们住得并不舒服,因为当工人A进去厕所大便的时候工人B也跑了进来,拉了一坨屎在工人A的裤子上;当休息室睡满了之后,工人B还大摇大摆地走进来,压在工人A的身上睡了过去。后来工人A被工人B压死了,程先生意识到问题的重要性,于是善良的程先生决定买一些锁来供工人们使用。由于线程共用同一片内存空间,就会出现多个线程读写同一片内存空间这种问题。为了解决这个问题提出了锁的概念。**
这里写图片描述他给厕所加了一把锁,然后跟工人们说道:”这把锁是我花重金买来的,叫做Mutex(互斥锁),以后你们要养成上厕所关门的好习惯,其他人如果看到厕所被锁起来就说明里面有人,这时候千万不要强行拆门,乖乖在门口等。“
这里写图片描述然后程先生指着挂在休息室门上的几把钥匙,说道:”这个可不一样,这个叫Semaphore(信号量),以后你们谁进去休息了,就取一把钥匙,当你看到门上的钥匙被取光了,说明里面已经没有位置啦。那你们就乖乖在门口等就好啦“
这里写图片描述在程先生的整治下,游乐园(Program)越来越井然有序,也不再发生有人被大便活埋,或者睡觉的时候被莫名的压死的事故了。
这里写图片描述每天游乐项目运营起来的时候就有工人(Thread)加入工作,这些工人们都被人们所熟知,但其实在游乐园(Program)中,有一类人是不被人们知道的,他们被称作Daemon。他们就像守护神一样守护着这个游乐项目里的所有人,为他们提供便利。比如说,偷偷摸摸地捡一下垃圾啊,偷偷摸摸地递一些资料啊什么的。这里阐述的是守护线程的概念。守护线程是特殊的线程,在后台为其他线程提供资源等,如Java的垃圾回收机制。**
这里写图片描述就这样,程先生的游乐园(Program)每天都在欣欣向荣,在这片贫困落后的国度俨然是一处靓丽的风景线。