Linux下进程与线程的区别

(多)进程

进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程。当你运行一个程序,你就启动了一个进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。
进程一般由程序数据集合进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。
进程具有的特征:
动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
并发性:任何进程都可以同其他进程一起并发执行;
独立性:进程是系统进行资源分配和调度的一个独立单位;
结构性:进程由程序、数据和进程控制块三部分组成。

在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多进程,也称多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。

多进程编程时,子进程除代码段与父进程共享外,其余部分完全是父进程的一个副本,子进程的所以资源都继承父进程,也就是说二者不共享地址空间。两个是单独的空间,继承以后就没有交集了,子进程单独运行(采用写时复制技术)。

多进程优点:

  1. 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
  2. 通过增加CPU,就可以容易扩充性能;
  3. 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
  4. 每个子进程都有4GB地址空间和相关资源,总体能够达到的性能上限非常大。

多进程缺点:

  1. 逻辑控制复杂,需要和主程序交互;
  2. 需要跨进程边界,如果有数据量传送,需要通过各种IPC处理。
  3. 密集运算多进程调度开销比较大;

最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题

(多)线程

线程是进程的一条执行路径,线程在Unix系统下,通常被称为轻量级的进程。
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。

多线程编程时,线程运行在进程当中,多线程共享进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但在同一进程的多个线程中,有各自的调用栈、寄存器环境(register context)、本地存储(thread-local storage)。并且在一个子线程出错或者退出时,一定不能调用return(exit),因为会导致进程结束,应调用pthread_exit()退出线程。

多线程优点:

  1. 无需跨进程边界;

  2. 程序逻辑和控制方式简单;

  3. 所有线程可以直接共享内存和变量等;

  4. 线程方式消耗的总资源比进程方式好;

  5. 响应度高:如果对一个交互程序采用多线程,那么即使其部分阻塞或执行较冗长的操作,该程序仍能继续执行,从而增加了对用户的响应程度。如:多线程Web浏览器在用一个线程装入图像时,能通过另-一个线程与用户交互。

  6. 多处理器体系结构的利用: 能充分使用多处理器体系结构,
    以便每个进程能并行运行在不同的处理器上。不管有多少CPU,单线程进程只能运行在一个CPU上。在多CPU上使用多线程加强了并发功能。

多线程缺点:

  1. 每个线程与主程序共用地址空间,受限于4GB地址空间;
  2. 线程之间的同步和加锁控制比较麻烦;
  3. 一个线程的崩溃影响到整个程序的稳定性;
  4. 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如在Linux环境下,每个线程私有空间大约是2M,因此运行1500个左右的线程数就已经极限了(当然线程的私用空间大小可以改变);
  5. 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

用一张表格说明它们区别

Linux下进程与线程的区别_第1张图片

参考:
https://blog.csdn.net/luoweifu/article/details/46595285

https://blog.csdn.net/ljlstart/article/details/51092846

https://www.php.cn/faq/416853.html

你可能感兴趣的:(Unix环境编程,多线程,多进程)