很多人看到这个问题的时候,第一个反应肯定是进程是资源分配的基本单元,线程是系统调度的基本单元,但是这只是从概念上来做一个解释,今天我们来仔细分析一下进程和线程的区别。
我们把进程比做一栋房子,那么线程就是房子里面的小房间,我们可以说一栋房子有很多房间,但不能说一个房间有很多栋房子,同理,一个进程可以有很多线程,一个线程只能属于一个进程。
我们再来理解一下进程和线程通信的区别,一栋房子里面的人想和另一栋房子里面的人通信理解为进程通信,一个房间和另一个房间通信理解为线程通信,那么很明显感觉到从这栋房子内部通信的话,会方便很多,因为房子内部的电梯,楼道,楼梯等都是房子内部的公共区域,这里可以理解为进程内部给线程的共享部分。当然,这里我们可能会有疑问,那进程之间就没有共享资源吗,不,进程之间也有,不过仍然以房子为例,房子和房子之间不可能共用电梯,楼道或者过道这类的资源吧,我们理解为公共大马路或者公共娱乐区域。但是我们还是可以明显发现线程之间的通信会比进程之间通信简单很多,所以线程之间切换的开销也要比进程之间开销小很多。所以在面试中,面试官一般会问你进程通信的方式,而不会问你线程之间通信的方式。线程之间通信一般用全局变量,文件句柄和锁,了解这几个就行了。而进程通信就比较复杂了,管道,消息队列,共享内存,信号,信号量,socket等等(有时间会做一个进程间通信的分享)。
资源分配和资源调度的差异?一个房间它使用的是房子的地址,如果他不给房子分配地址,那房间也就没有了,所以资源分配的时候是以进程为单位。在系统调度的时候,会指定某一栋房子的某一个房间去完成某个事情。
线程调度和进程调度相比节省了哪些资源?这应该算是一个比较深的问题,我们都知道,计算机的执行是一条指令一条指令的执行,分为数据和指令两种,会把数据从一片空间放到一个缓存当中,每一次我们要去找一个房间的时候,我们不会直接去房间找人,我们会先看看最近又联系过这栋房子没有,或者说房间附近的人,如果我访问的两个进程的地址空间很近,那么这两个房间的数据都在缓存当中,我访问两个房间的数据不需要进行地址切换,所以线程节省的是地址切换这部分的资源。如果一个线程是需要切换到另一个进程的线程,那这种线程切换和进程切换就没啥区别了。
既然线程之间切换开销比较小,那我们写程序的时候只用线程不用其他进程行不行?这里就涉及到程序健壮性和安全性的问题,如果今天又一栋房子着火了,如果我只有这一栋房子,那我岂不是没有地方可以住了。还有,假如只有一栋房子,进进出出的人多了,也容易发生踩踏事故。我们可以给一些安全性要求比较高的任务单独放一个进程,这样安全性就会高很多。
喜欢的话关注一下,我是春哥