我经常困扰于如何给一个不了解计算机或没有深入理解计算机工作原理的人解释什么是进程,什么是程序,什么是线程。虽然菜谱的例子非常经典,但是对于一个做饭的外行,我还是不太敢给别人用菜谱去给别人去举例。而我自己还是对于足球比赛比较了解,毕竟自己也组织过小型足球赛。组织足球比赛需要如下步骤
- 写足球比赛策划书草稿
- 修改为所有人都能看懂的策划书
- 租借场地、聘请裁判、安排记分统计员、确定球队参赛信息、确定时间
- 开始进行比赛(突发事件的处理等)
- 中间有裁判判罚、球员比赛、换人、观众助威等多元素组成
比赛结束
而一个程序要能够运行的步骤
编写程序
- 编译、链接为可执行程序
- 通过操作系统申请自己所需要的资源,等待进程调度到自己
- 开始运行程序(异常处理)
- 可能内部有多个线程同时工作
- 程序结束
通过上面可以看出两者还是有一定的相似之处的,下面就进行详细的介绍。
编写足球策划书草稿
而组织足球比赛,第一个就是写足球比赛策划书,这就类似于编写程序。写草稿的时候,我比较习惯用字母来代替事件或食物,比如R代表租借场地(申请内存)、Score代表记分统计员、A队B队表示参赛队伍(常量数组)等。比赛如何进行就相当于写程序的逻辑思路等。很快我的草稿就会完成。
修改足球策划书
而这些对于其它的相关人员,他们看不懂我写的策划书,我就要将代号修改成任何人都能看懂的名称。这就类似于程序编译链接(或解释)的过程,从而就生成一个可用可执行文件。而这个足球比赛策划书就是可以实施的程序。(对,程序是死的,只是放置在磁盘中的01数据,如果没有去运行他,他就一直放在那里,而进程是活的,是运行的,就相当于正在进行的足球比赛,进程就应该理解为正在运行或等待运行的程序)
a process is an instance of a computer program that is being executed
比赛准备阶段
写好策划书,并不是比赛就可以直接开始,如果要启动该策划书,首先就要提上日程。类似于要开始去运行那个编译好的可执行程序。那就进入了比赛的准备阶段,准备租借场地(分配内存空间)、聘请裁判及记分统计员等相关工作人员(申请PCB)、确定比赛的球队及人员情况(输入输出等资源)等。等一切都准备就绪以后,就等待比赛开始的时间(进程调度等待cpu)等。
比赛进行阶段
到了比赛时间,裁判一声哨响(进程获取到运行时间),比赛开始,我们双方22个球员开始不同的行动(多个线程运行),每个球员有自己的球服,位置,教练安排的战术等(线程栈里存的程序计数器、寄存器值等),他们共同在球场上踢球、有裁判等工作人员(共享的资源),其中有个资源比较特殊,那就是足球,每个时刻只能有一个球员掌控着它(互斥共享资源)。从这里可以看出,对于进程而言里面真正运行就是一个个线程。而进程更像一个给线程提供资源的资源供应者。
比赛结束
裁判终止比赛,比赛结束,得到比赛结果,就类似于进程结束,获得输出。当然比赛和进程运行还是有很大差别的,比如每个线程运行都是之前程序中写好的,而我们真正的足球比赛时,不能在策划书中就写好球员要怎么去踢球。
不知道这个比喻是否能更容易让人们去理解,而且本人水平有限,理解有不对的地方望各位海涵。