Linux下进程与线程的区别
多进程
进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程。当你运行一个程序,你就启动了一个进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。
进程一般由程序
、数据集合
和进程控制块
三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。进程具有的特征:
动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
并发性:任何进程都可以同其他进程一起并发执行;
独立性:进程是系统进行资源分配和调度的一个独立单位;
结构性:进程由程序、数据和进程控制块三部分组成。
在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多进程
,也称多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。
多进程编程
时,子进程除代码段与父进程共享外,其余部分完全是父进程的一个副本,子进程的所以资源都继承父进程,也就是说二者不共享地址空间。两个是单独的空间,继承以后就没有交集了,子进程单独运行(采用写时复制技术)。
多进程优点:
- 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
- 通过增加CPU,就可以容易扩充性能;
- 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
- 每个子进程都有4GB地址空间和相关资源,总体能够达到的性能上限非常大。
多进程缺点:
- 逻辑控制复杂,需要和主程序交互;
- 需要跨进程边界,如果有数据量传送,需要通过各种IPC处理。
- 密集运算多进程调度开销比较大;
最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题
多线程
线程是进程的一条执行路径,线程在Unix系统下,通常被称为轻量级的进程。
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
一个标准的线程
由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。
多线程编程
时,线程运行在进程当中,多线程共享进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但在同一进程的多个线程中,有各自的调用栈、寄存器环境(register context)、本地存储(thread-local storage)。并且在一个子线程出错或者退出时,一定不能调用return(exit),因为会导致进程结束,应调用pthread_exit()退出线程。
多线程优点:
- 无需跨进程边界;
- 程序逻辑和控制方式简单;
- 所有线程可以直接共享内存和变量等;
- 线程方式消耗的总资源比进程方式好;
多线程缺点:
- 每个线程与主程序共用地址空间,受限于4GB地址空间;
- 线程之间的同步和加锁控制比较麻烦;
- 一个线程的崩溃影响到整个程序的稳定性;
- 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如在Linux环境下,每个线程私有空间大约是2M,因此运行1500个左右的线程数就已经极限了(当然线程的私用空间大小可以改变);
- 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。
用一张表格说明它们区别
参考:
https://blog.****.net/luoweifu/article/details/46595285