进程和线程一直是计算机当中十分重要的两个概念。作为操作系统当中十分重要的模块,两者虽然名称相近且联系紧密,但各自含义和实际作用却有着许多不同的地方。
进程 process
进程是一种由操作系统提供出的抽象概念,它是操作系统对一个正在运行的程序的一种抽象。简单来说,一个跑起来的程序就是进程,反之则不是。引入这个概念最主要的目的是为了解决“并发编程”这样的问题。作为一个重要的软件资源,进程是操作系统资源分配的基本单位,由操作系统内核负责管理。
管理(描述+组织)
- 描述:使用C语言结构体来描述进程属性,讲清楚相关属性特征。用来描述进程的这个结构体,叫做PCB(进程控制块)。
- 组织:通过双向链表,将多个PCB串到一起(非单纯双向链表)。
创建一个进程,本质上就是创建一个PCB结构体对象,将这个结构体插入链表当中;销毁一个进程,本质上就是在链表上将PCB结点删除。任务管理器查看进程列表,本质上就是遍历PCB链表。
PCB(进程控制块)当中的进程特征
1.pid:进程的身份标识符(有唯一的数字)
2.内存指针:指向说明自己的内存(硬件资源)
3.文件描述符表:硬盘文件等其他资源(硬件资源)
4.进程调度相关属性:
进程的状态:就绪状态;运行状态;阻塞状态(如线程进行密集的IO操作,读写数据)。
优先级:进程的调度并非一碗水端平。
上下文:就是CPU当中各个寄存器的值,本质上就是存档内容(寄存器:CPU内置的存储数据的模块,保存程序运行过程中的中间结果)
操作系统在进行进程切换时,需要把进程执行的“中间状态”记录并保存,下次在CPU上运行时,就可以恢复上次的状态继续运行。
保存上下文就是将CPU当中寄存器的值,记录保存进内存(PCB)中;恢复上下文就是把内存中这些寄存器的值恢复回去。
记账信息:操作系统统计每个进程在CPU上占用的时间和执行的指令数目,以此来决定下一阶段如何调度。
线程 thread
线程是操作系统调度执行的基本单位,一个线程就是一个 "执行流"。线程存在于进程当中,又被称为“轻量级进程”。进程有多个线程后,每个线程是独立在CPU上进行调度的。线程和进程均可以实现并发编程,但线程比进程更加轻量化。单个进程可以包含一个线程,也可以包含多个线程(不能没有)(一对多的关系)。同一个进程中的多个线程之间,共用了进程的同一份资源(主要为内存和文件描述符表)。一个线程是通过一个PCB进行描述的,一个进程中对应的也就是一个或多个PCB了。
进程与线程的联系与区别
联系
- 进程是包含线程的。每个进程至少有一个线程存在,即主线程。
- 进程和进程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间。
- 由于同一进程的各线程间共享内存和文件资源,可以不通过内核进行直接通信。
区别
- 创建线程比创建进程更快;销毁线程比销毁进程更快;调度线程比调度进程更快。
- 进程专门负责资源分配,线程负责调度相关内容。进程是系统分配资源的最小单位,线程是系统调度的最小单位。
- 进程有自己的内存地址空间,线程只独享指令流执行的必要资源,如寄存器和栈。
线程的优点
- 线程的创建、切换及终止效率更高。
- 线程占用的资源要比进程少很多。
- 能充分利用多处理器的可并行数量。
- 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务。
- 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现。
- I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。
希望能给到大家帮助,便于更好的理解这两个概念。