并发编程基础底层原理学习(二)
进程
进程就是应用程序在内存中分配的空间,也就是正在运行的程序,各个进程之间互不干扰。同时进程保存着程序每一个时刻运行的状态。进程的两个基本元素是程序代码和与代码关联的数据集。进程执行的任意时刻包含了以下元素:
- 标识符:与进程相关的唯一标识符,用来区分其他线程
- 状态:若进程正在执行,则进程处于运行态
- 优先级:相对于其他进程的优先顺序
- 程序计数器:程序中即将执行下一条指令的地址
- 内存指针:包括程序代码和进程相关数据的指针
- 上下文数据:进程执行时处理器的寄存器中的数据
线程
现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个线程里可以创建多个线程。进程中拥有一个或多个线程,在线程中有一个程序计数器,用来记录接着要执行哪一条指令。线程拥有寄存器,用来保存线程当前的工作变量,线程还拥有一个堆栈,用来记录执行历史,其中每一帧保存了已调用但是还没有从中返回的过程。
上图展示了线程在运行的生命周期中6种不同的状态,在给定的一个时刻,线程只能处于其中的一个状态。
进程和线程的区别
进程是一个独立的运行环境,而线程是在进程中执行的一个任务。他们两个本质的区别是是否单独占有内存地址空间及其它系统资源(比如I/O):
- 进程单独占有一定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不干扰;而线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。
- 进程单独占有一定的内存地址空间,一个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性高;一个线程崩溃可能影响整个程序的稳定性,可靠性较低。
- 进程单独占有一定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及页调度,开销较大;线程只需要保存寄存器和栈信息,开销较小。