线程和进程的关系之比喻

线程和进程的关系,或者两者之间的异同,往往会是许多公司的面试题之一,即使不是,也会是很多面试官的口头问题之一。

对操作系统的了解不够深入的人,往往不知道该怎么描述这二者的区别与联系,最简单方式莫过于背书:进程是操作系统分配资源的最小单元,是资源的所有者,而线程是操作系统任务调度的最小单元,一个进程可以包含多个线程,至少需要一个线程。听起来似乎头头是道,其实再深入一些就会捉襟见肘,比如,知道什么是 TLS 吗?TLS 是属于进程的资源还是属于线程的资源,为什么,如此等等。很少有人能给出令我满意的回答。我一直以为,这和没有能够彻底理解进程和线程的本质有关。

我们拿生活中最常见的事物来做个类比,这是我在前阵子偶然想到的,不知道是不是第一个这样做比方的,如有雷同前贤之处,实属巧合。我们可以把进程比作为公司,把线程比作公司的员工。

一、如果我们单纯把资金作为资源的话,我们可以看出,公司是所有资金的拥有者,恰如进程是所有资源的所有者一样。员工要开展工作,需要和公司申请经费,而线程若想正确执行,也需要有足够的资源(最常见的就是内存)。在资本市场上,公司也可以算是最小运作单元了吧,就像我们认为进程是系统分配内存的最小单元一样。

二、一个公司的业务开展,至少需要一个员工的工作,这一情况,恰好类似于一个进程内如果没有线程,则不会发生任何功效。进一步说,事实上,没有任何线程是不可能成功创建出一个进程的,而成立一家没有任何员工的公司貌似也不太可能吧(总有个法人吧)。一个公司显然常常不止一名员工,相应地,很多进程都往往有超过一个的线程。所有线程都执行结束的进程会自然终止,好比所有员工统统离开的公司也必然关张。在日常的工作中,主线程的结束往往会导致整个进程结束而不管其他线程是否在工作状态,相应地,一个公司的老板消失也通常会导致公司直接垮掉,我们这里不妨把老板比喻成主线程。

三、有时需要预先准备一组线程来做一类事情,任务到来时找一个相对空闲的线程来执行,这个技术叫做线程池。对应到我们例子中,可以认为这是一个部门。当然,由于线程池中的线程通常是执行相似的/相同的工作,我们这个部门最好是比喻成房产公司的销售部。去过售楼处的肯定都见过,没人的时候,那些穿着性感制服的空闲售楼线程都坐在位置上喝茶嗑瓜子聊天,当有人踏入大门时,就会有一个迎上来执行向你介绍楼盘的工作。如果楼盘销售过于火爆,那制服线程就会出现全忙的现象,客户难免需要排队等待。

最后提一下 TLS,这个东西的全名叫线程局部存储(Thread Local Storage)。个人感觉这个很像部门和公司申请的活动经费,实际上是公司的,但却只有本部门可以支配。但这个比喻会打破之前我一直采用的把线程比作单个员工的说法,所以没有正式列入上述正规编制,如果有心思敏捷者,不妨帮助完善此类比系统。

谢谢观赏,如有建议和意见,请不吝提出。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注