进程与线程之间的区别

我们在讨论进程与线程的区别之前,首先我们要清楚进程与线程的概念。

 什么是进程?

进程是并发执行程序在执行过程中资源分配和管理的基本单位(资源分配的最小单位),是指令+数据+资源的一个集合。进程可以理解为程序的一次实例化,应用程序一旦执行,就是一个进程。每个进程都有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段。

什么是线程?

线程是进程内部的一条执行序列(执行流),是进程的最小执行单位,一个进程可以有多个线程,但是最少要有一个线程体现在代码里面就是我们最少要有一个main()函数,这些线程由多线程控制机制来控制。

我们在解决实际问题时,通常会遇到要实现几个工作的并发执行,在解决这个问题时,我们就会面临这样的状况:究竟是在一个进程里面用多个线程来完成工作呢,还是用多个进程来解决问题,这样我们就需要了解进程与线程的区别来根据实际情况安排了。

进程与线程又在哪些方面有区别呢?

1.个体单位

简而言之,进程是资源分配的单位,线程是CPU调度的单位。

如果这样说不便于理解的话,我们不妨将进程看做一个生产车间,线程看做车间里面的若干个生产线其中的一个,我们需要完成的server看作生产部门,那么对于我们要完成的server,需要由好几个车间里的若干个生产线完成,资源的分配自然是按车间来分配,每个车间都有自己的任务量,根据任务有自己拿到的资源,这些资源一般情况下供自己车间使用,正如我们进程之间的资源不共享一样,所以说,进程是资源的分配单位。而生产线就是完成server的一条条流程,是完成server的独立的最小的单位,工作时是给每个线程分配具体的工作内容,每个车间内的资源是共享的,生产线可以根据自己的工作能力来获取资源,所以说线程是CPU调度的单位。

2.切换效率

线程的切换效率比进程高。

线程之所以切换效率高于进程,是由于线程的切换是指令之间的切换,即从一段执行序列(程序)切换到另一段执行序列(程序),而内存映射表不变;但是进程的切换包括指令的切换和内存(映射表)的切换(资源的切换),这相对于线程切换来说,效率就会降低很多。

3.地址空间:同一进程的所有线程共享本进程的地址空间,而不同的进程之间的地址空间是独立的。

扫描二维码关注公众号,回复: 4830508 查看本文章

4.资源拥有: 同一进程的所有线程共享本进程的资源,如内存,CPU,IO等。进程之间的资源是独立的,无法共享。

5.执行过程:每一个进程可以说就是一个可执行的应用程序,每一个独立的进程都有一个程序执行的入口,顺序执行序列。但是线程不能够独立执行,必须依存在应用程序中,由程序的多线程控制机制进行控制。

6.安全性:因为同一进程的所以线程共享此线程的资源,因此当一个线程发生崩溃时,此进程也会发生崩溃。 但是各个进程之间的资源是独立的,因此当一个进程崩溃时,不会影响其他进程。因此进程比线程健壮。

7.进程之间相互独立,不存在数据安全问题,相对于线程而言,创建时,开辟的资源多,CPU调度慢,如果多进程要进行通讯,必须借助特定的手段(信号,信号量,共享内存,管道,消息队列)。

如何考虑进程与线程的选择

从以上我们提到的6点区别来看,我们可以从以下几个方面考虑:

1.如果需要频繁创建销毁的优先用线程

因为进程的创建、销毁和切换都是比较复杂的,速度也很慢,但是线程的创建、销毁和切换都较为简单,速度很快

2.如果需要进行大量计算的优先使用线程

大量计算,多指算法和图像处理,这些操作就是要耗费很多CPU,切换相当的频繁了,这种情况下线程是最合适的,因为它的切换速度相当快。

3.强相关的处理用线程,弱相关的处理用进程

什么叫强相关、弱相关?理论上很难定义,给大家说个简单的例子理解一下吧。

一个项目需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,这是考虑到进程之间数据共享比较复杂,而进程的调试比较简单;“消息解码”、“业务处理”可以分线程设计,这是考虑到相关性强的业务之间数据共享容易。

猜你喜欢

转载自blog.csdn.net/pretysunshine/article/details/83475370