进程与线程的横向分析
进程
进程概念:进程标识是pid
狭义的讲:进程就是一个正在执行的程序,每一个正在运行的程序被称作为进程。
广义的讲:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
站在操作系统的角度,pcb是对进程的描述,所以进程就是pcb,cpu调度就是pcb,所以当我们运行一个程序,操作系统就会将程序加载到内存运行,并且创建进程描述符(进程控制块),PCB程序的运行进行描述控制,因此pcb是对进程的描述,所以进程就是pcb,cpu调度就是pcb,在Linux下是task_struct结构体
线程
线程概念:
线程是操作系统能够运行调度的最小单位,但是Linux下没有真正的进程,都是由线程模拟的。所以线程也被成为轻量级进程,如果pcb成为了线程,那么进程就是线程组,一个进程中至少有一个线程,因此线程也是cpu调度的基本单位,也是程序运行时资源分配的基本单位
进程与线程的对比
线程的优势:(因为多个线程共享虚拟地址空间)
- 创建 / 销毁 一个线程成本更低
- 线程之间的调度切换成本更低
- 线程间的通信更加方便
线程的缺点:
- 缺乏访问控制,编码复杂度高,exit退出整个进行
- 稳定性(健壮性)较低,线程的某些错误会导致整个进程的退出,所以在很多大型程序中会使用多进程,以防止线程出问题影响所有进程
区别总结:
1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。
2.进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)
3.进程是资源分配的最小单位,线程是CPU调度的最小单位;
4.系统开销: 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。
5.通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预
6.进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。
7.进程间不会相互影响 ;线程一个线程挂掉将导致整个进程挂掉
8.进程适应于多核、多机分布;线程适用于多核