关于进程线程的故事
引子
敲了四年的代码,还在整天写逻辑,在这圈里显得很Low。谁让我没学历,没基础,没关系呢,仅仅是凭着两三个月的培训班就挤进了IT行业已经算是个奇迹了。但是人得有梦想,不然与咸鱼有何分别。于是我报了计算机专业的本科,并且也在努力往程序员进阶发展。这一周已经实践了主从复制和负载均衡,现在还有点小激动。最近参考了多位大牛的帖子总算对进程线程这些以前望而生畏的字眼有个大致的了解。今天我的目标就是把进程线程,协程用通俗的故事来描述出来。为了避免被喷得太狠,本人有必要声明一下。凡是理论的学术知识不可能完全以故事形式解释,只能表达它们的一些共性,如果我写的东西帮到了您,那么我很高兴;如果您发现了我表达有错误请批评指正,我虚心接受。多任务
故事发生在一个小工厂,里面的核心人物有三个:乾隆,和珅,纪晓岚。其中和大人和老纪是负责产品的组装,拆卸工作,老纪负责A类产品,和大人负责B类产品。乾隆爷负责产品的测试,审核发布。在这里面,乾隆爷就是担当的中央处理器也就是CPU的工作,而老纪以及和大人就是计算机中不同的功能。就像一台计算机既要听歌就要看视频,还要写文档,浏览网页等等,所以这是一个多任务共存的状态。多进程并发
同计算机要处理不同的任务一样,老纪和和大人就是两个相互独立的进程。一开始乾隆爷为了操作方便,他会先处理和大人的产品,然后再处理老纪的,相当于windows系统里的批处理,这样子工作起来非常分明。可是明眼人很快看出,当乾隆爷处理和大人的产品时,老纪就得停下干等着,反之和大人就无事可干。于是,乾隆爷大笔一挥,干脆两个人的产品一块处理,也就是并发。其实这时候的并发还不是名副其实的。因为无论乾隆爷处理的多卖力气,在同一时间还是只能审核一样产品。但是,在这个阶段,至少老纪以及和大人已经可以开足马力,放开了工作了,不用再等待。
虽然乾隆爷已经在处理多任务了,但是他的办事能力那是杠杠的。老纪以及和大人的工作效率明显还是跟不上。于是为了增加效益,和大人还有老纪各自开了一条流水线,招了无数个小弟同时工作。每条流水线上的小弟就是线程了。有几个注意点说明一下,1。每条流水线至少有一个干活的,否则就要停掉。也就是说每个进程至少有一个线程2。每个进程下的任意一个线程死掉,整个进程就无法工作。如同,每条流水线上的小弟用的是一套传送设备,一套供电设备,随便哪一个出了问题,整个就完蛋。3,进程死,线程也就死掉了。如同,老纪或和大人作为了小组领导都不干活了,底下的小弟肯定早撂挑子了。多进程单线程单进程多线程多进程多线程
工厂发展到这个阶段,已经有了一定规模。要生产更多类型的产品,除了老纪以及和大人,还有其他的流水线和其他的小弟,也就是更多的进程和线程。老板自然要考虑效率和成本的均衡。所以就出现了几种工作模式,1。多进程单线程,相当于包括老纪以及和大人,还有所有其他工人都各自开通一条流水线,优点是相互不干扰不影响,不管哪一条流水线出现问题都不影响其他的;坏外也很明显,太浪费资源了,需要耗费更多的硬件基础,而且乾隆爷需要针对不同的流水线频繁的切换处理模式,也就是切换进程。2。单进程多线程,所有工人归置到一条流水线上,这样可以最大化节约成本,但是只要有一个小弟出了故障,那将影响全局。3。多进程多线程模式,也就是多条流水线同时工作,并且每条流水线有N个小弟。
计算密集型vs。IO密集型
随着流水线规模的不断扩大,靠乾隆爷一个人完成测试审核显得有些吃力了。因为随着技术革新,设备更新,工人们组装的效率越来越高。不像以前,一个产品从生产到包装发布,主要精力都消耗在组装上面,也就是IO密集型;而现在工人们借助先进的工具可以很轻松的完成组装,反而产品测试审核就需要很多时间,也就是计算密集型。当然,针对不同的产品,这两种现象都有可能发生。
多核cpu
针对乾隆爷精力不够的情况,老板贴心的给他找了帮手,也就是由多名人员共同完成产品测试审核工作,相当于多核cpu,这样就极大提高了效率也减轻了单核的压力。实现了真正的’并发’。
协程
乾隆爷有了帮手,工作效率提升了好几倍。老纪还有和大人自然也得进步,于是他们发现,一条流水线上每个人虽然做相同的工作,整体操作时间相差不多。但是每个人却各有所长,各有不足,比如有的人拧螺丝快,上胶水慢;有的人焊接快,合壳慢。所有,老纪就有了一个天才的想法,由两个人或多个人共同完成同一个产品的组装,比如一个拧螺丝,一个上胶水,一个焊接,三个人共同完成,因为每个步骤工作单一,自然提高了工作效率。这两个人或多个人的组合就是协程。
科技发展到今天定然不会止步,人们的智慧也是无穷的。不管是工厂流水线,还是计算机硬件软件都会有着不断地革新和发展。向那些伟大的前辈们致敬。
故事讲完了,希望您能借我的描述对进程线程有一定理解。