江邊望海的技術人生
分享真知
web开发人员必须要理解的基础知识点
什么是多进程,什么是多线程,它们之间的关系是什么?

打个比喻:

单进程单线程:一个人在一个桌子上吃菜。
单进程多线程:多个人在同一个桌子上一起吃菜。
多进程单线程:多个人每个人在自己的桌子上吃菜。

多线程的情况是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢。

所以,多线程的主要问题是对资源争抢与同步方面的问题。

死锁-大家都在等着吃饭,但需要特定条件才能开吃:桌一等着桌二的碗,桌二等着桌三的筷子,桌三呢,等着桌一的勺。于是这三桌就都不能吃饭。

多进程的情况是每个人在自己的桌子上吃菜,但也带来新的问题:坐在两张不同的桌子上,说话不方便。

所以,多进程的主要问题是进程间的通讯问题。


理解同步/异步,阻塞/非阻塞

为了容易理解,转载网上有一个非常流行的例子。

老王爱喝茶,需要煮开水

场景一:老王用水壶煮水,并且站在旁边,不管水开没开,每隔一定时间看看水开了没。——同步阻塞

场景二:老王还是用水壶煮水,不再傻傻的站在那里看水开,跑去客厅看电视,但是还是会每隔一段时间过来看看水开了没有,水没有开就走人。))——同步非阻塞

场景三:老王这次使用高大上的响水壶来煮水,站在旁边,但是不会再每隔一段时间去看水开,而是等水开了,水壶会自动的通知他。——异步阻塞

场景四:老王还是使用响水壶煮水,跑到客厅上网去,等着响水壶自己把水煮熟了以后通知他。——异步非阻塞

同步/异步

可以看出来,同步和异步主要是对老王来说的。假如老王是一个线程。同步就是需要它每隔一段时间来轮询结果,线程去主动请求结果。而异步就是任务处理完成后主动通知现成。简单理解:同步是线程主动请求结果,异步是线程被动接受结果。从效率的解读来看,当然异步的效率更高。

阻塞/非阻塞

阻塞就是说在煮水的过程中,老王不可以去干其他的事情,非阻塞就是在同样的情况下,可以同时去干其他的事情。阻塞和非阻塞是指线程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪时是直接返回还是等待就绪。