前几天,参加了几次面试,结果很糟糕。一来是因为没有做准备,二是平时对那些概念也没有太注意,只是看到觉得理所当然是这样,并没有仔细考究!现在发觉这根本就是一种无求知欲的表现,这里决定好好温习一下之前的知识。
背景知识
进程与线程
进程的英文名是 Process,是计算机程序执行后的实例,她包含了程序代码和当前的所有资源。在一般的操作系统中,她可能是由多个线程组成来完成并发[Concurrency]任务,而多个进程应该是完成并行(Parallelism)任务。关于并发与并行下面也会涉及到相关区别。
线程的英文名是 Thread,她是对计算机调度的一个最小粒度,她是包含在一个进程中的,一个进程中的线程是共享一片内存区域,实质上讲他们并不是一个很实体话可东西,比较抽象,需要加上时间的维度才能区别开来。
下面是一张Wiki百科上的图,能够很清晰的表明线程与进程的关系。
线程个人拙见以为进程是与计算机的核数(Processor)有关的,一般地,几核的CPU就应该能产生几个进程。
我简单的打个比方,比如一台计算机是一家公司,不考虑其他的,加入把研发部门比做CPU的话,一个公司一般会只有一个研发部门(假设只研发一款产品)。公司所有的研发工作都是交由这个研发部门负责,可能这个研发部门会有不止一个的研发小组,都可以做同样的一件研发工作,那么计算机中的内核就可以类似于研发小组,他们可以同时的做相同的工作,但如果他们需要同时使用公司的生产线那么这可能就存在问题,下面再来说。如果公司给研发组2放假了,那么他们就可以不用干活轻松的休息,这是公司配发了研发任务应该是由研发组1来完成,如果公司又给了一个任务给研发组1,那么研发组就属于并发状态,他们的做任务就是线程。他们小组的leader开会说,根据公司的章程,咱们接到了两个任务,那我们就按周轮流来做吧。在计算机中这可能就是有操作系统来决定的。假设是每个星期一切换任务,那么周一的时候的工作效率可能会比较低,因为要花费不少时间来做任务的切换工作,收集资料和整理资料,这就是线程切换的开销。
假如任务一需要使用公司的计算机房,任务二也需要,我们从现实的宏观角度来看的话,感觉这完全没有问题,这周机房处理任务一,下周机房处理任务二。但是仔细想想其实是存在问题的,加入我们在周六到交一些数据给机房处理,比如说模型训练,可能在我们交接任务的约定时间周一的时候,他们还没有处理完成,而小组1的又给了他们任务,那么这就存在的资源问题,机房可能会在门口挂上了“任务中,请勿打扰”,所以就有了锁的这个概念,表示现在忙,暂时不能进行访问。
异步回调
我们传统的过程式程序可能就跟比较古板的小组1一样,到期咱就切换任务吗。他们觉得这种方式还是不能把工作效率提高到最高。他们开会就讨论怎么能提高这个效率呢,有个外号蟒蛇的就说呀,他觉得有时候等PCB的测试板实在是比较耗时间,有时候一两天啥事没有,就是干等着板子打出来做测试,这期间也不知道干啥。不过最近有个朋友告诉我一个比较好的工作方法,先做好任务的规划,把哪些可以同时做的事情列出来,以后就按照这个表来做,有空闲就去做其他的事情,等前面做的东西可以继续了,就继续回头做前面的事情。
他们新来外号面条的就说,你们连这个都不懂啊,我一直都是这么干的。
前面蟒蛇提到的问题就是平时经常碰到的阻塞,比如磁盘IO,网络IO这些比较耗时间的操作。他那个朋友(Gevent)教的方法就是异步。
异步回调,就是遇到阻塞时,就去做其他的事情(新的线程),当之前的产生结果了就把那个结果拿回来处理,但是这不是在你原来的形成规划中。
对于上面的例子,蟒蛇可能就对PCB生产线上的人说,他就不在这守着了,做好给个电话,他自己去取就好了,或者陪人送到他办公室。这就是异步的通讯与回调机制,打电话通知他就是告诉他完成的这个消息,他在过来取走;而寄到他办公室,就是直接把执行的结果返回到预定的地方,他会每天都检查一下是否有结果了。
并发
开始说说重点,并发了。记得有个“七天七”系列的书,当然这和国内“X天”系列不一样,这个系列本本算得好书,其中就有一本是《七天七并发》,可惜当时在图书馆找到时,我快毕业了。
有不少编程语言实在语言级别实现的并发,例如,Erlang、Haskell、Scala、Clojure,以及比较年轻的Golang。相信这些都听过,我个人是真的没有去仔细研究过,借这次机会好好看看。
并发模型
- Communicating Sequential Processes
- Actor
网友评论