操作系统(七)、进程和线程
进程管理:
1、进程(PROCESS)管理
1.1 进程的定义:
进程:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
1.2 进程的组成:
一个进程应该包括:
- 程序的代码;
- 程序处理的数据;
- 程序计数器中的值,指示下一条将要运行的指令;
- 一组通用的寄存器的当前值,堆,栈
- 一组系统资源(如打开的文件)
总之,进程包含了正在运行的一个程序的所有状态信息
1.3 进程与程序的联系:
- 程序是产生进程的基础;
- 程序的每次运行构成不同的进程;
- 进程是程序功能的体现;
- 通过多次执行,一个程序可以对应多个进程;通过调用关系,一个进程可以包含多个程序;
程序 = 算法 + 数据结构
1.4 进程与程序的区别:
- 进程是动态的,程序是静止的:程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态;
- 进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可以长久保存;
- 进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(进程状态信息);
1.5 进程与程序的关系实例类比:
1.6 进程的特点:
- 动态性:可以动态地创建,结束进程(进程切换);
- 并发性:进程可以被独立调度并占用处理机运行;并发并行概念区分开;
- 独立性:不同进程地工作不相互影响(不会破环进程执行的正确性,参考内存管理的页表结构,不同的程序会被分配不同的页表,让每个进程在不同的页表中运行,一旦超出地址空间的限制就会触发异常);
- 制约性:因访问共享数据/资源或进程间同步而产生制约;
1.7 进程管理(进程控制块 PCB):
什么是进程控制块(PCB)?
操作系统管理控制进程运行所用的信息集合。操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标识。
PCB含有以下三大类信息:
进程标识信息。如本进程的标识、本进程的产生着标识(父进程标识)、用户标识;
处理机状态信息保存区。保存进程的运行现场信息:
* 用户可见寄存器,用户程序可以使用的数据,地址等寄存器。 * 控制和状态寄存器,如程序计数器(PC),程序状态字(PSW)。 * 栈指针,过程调用/系统调用/中断处理和返回时需要用到它。
进程控制信息。
PCB的组织方式:
2、进程状态(State)
2.1 进程的生命期管理:
进程创建 —— 进程运行 —— 进程等待(进程自身发起) —— 进程唤醒(由其它进程或OS唤醒) —— 进程结束
2.2 进程状态变化模型:
其中进程从 Running —> Ready: 由于内存中有很多进程等待执行,CPU相对较少,为了让每个进程都有机会执行,设置一个时间片让每一个进程都执行一定的时间,然后等待下次被CPU调度。
2.3 进程挂起suspend:
进程挂起是指进程没有占用内存空间,挂起将一个进程从内存转到外存。处在挂起状态的进程映像在硬盘上。
目的是为了更加合理地运用计算机资源。
(1). 挂起状态:
挂起状态包括两类: 阻塞挂起状态(Blocked-suspend):进程在外存并等待某事件的出现;
就绪挂起状态(Ready-suspend):进程在外存,但只要进入内存,即可运行;
(2). 与挂起相关地状态转换:
==挂起【内存 —> 外存】:==
- 阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程;
- 就绪到就绪挂起:当有高优先级阻塞(系统认为很快就绪的)进程和低优先就绪进程时,系统会选择挂起低优先级就绪进程;
- 运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态。
==在外存中的状态:==
- 阻塞挂起到就绪挂起:当有阻塞挂起进程因相关事件出现时,系统会把阻塞挂起进程转换为就绪挂起进程。
==解挂/激活(Active)【外存 —–> 内存】:==把一个进程从外存转换到内存,可能有以下几种情况:
- 就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换;
- 阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为很快出现所等待的事件)进程转换为阻塞进程;
(3). 状态队列:
3、线程(THREAD)
3.1线程的定义:
进程当中的一条执行流程。
进程 = 资源管理 + 线程
从资源组合的角度:进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码段,数据段),打开的文件等各种资源;
从运行的角度:代码在这个资源平台上的一条执行流程(线程),同一个进程的线程共享进程的资源;
3.2 线程的优缺点:
3.3 线程与进程的比较:
进程时资源分配单位,线程时CPU调度的单位;
进程拥有一个完整的资源平台,而线程只独享必不可少的资源,比如寄存器和栈;
线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系。
线程能减少并发执行的时间和空间开销:
- 线程的创建时间比进程短;
- 线程的终止时间比进程短;
- 同一进程内的线程切换时间比进程短;
- 由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核的通信。
3.4 线程的实现:
- 主要有三种线程的实现方式:
用户线程: 在用户空间实现的线程机制,不依赖于操作系统的内核;
内核线程:由操作系统滋生来管理的;
对应的映射关系: 多个用户线程对应一个内核线程、一个用户线程对应一个内核线程、多个用户线程对应多个内核线程。
- 用户线程的优点:
用户线程的缺点:
1. 阻塞性的系统调用如何实现?如果一个线程发起系统调用而阻塞,则整个进程在等待; 2. 当一个线程开始运行后,除非它主动地交出CPU的使用权,否则它所在的进程当中的其它线程都将无法运行。(因为用户态的线程库不具有处理中断的能力,当用户线程触发了中断后,它不能处理当前的问题;而操作系统具有处理异常和中断的能力,除非用户线程主动交出CPU的使用权,否则其它线程不能执行。)
内核线程:
- 进程主要负责资源的调度管理,线程负责CPU的调度和程序的执行。
- 线程的创建、终止和切换都是通过系统调用来完成的,由内核完成,因此开销比较大;线程控制块TCB由PCB管理控制,当然线程的调度主要还是由TCB来完成的。
- 只要发生一次线程的切换、终止、创建就会触发一次系统调用,这就涉及到了用户态和核心态的转变。因此开销比较大。
- 轻量级进程:
3.5上下文切换:
进程共享CPU资源,在不同时候进程需要切换然后让CPU 执行,而CPU与其寄存器紧密相连(比如程序计数器pc[指明进程执行到了什么地方]、栈指针寄存器[知道调度关系和一些局部变量的位置])。
切换的过程:当某一个进程执行时需要进行切换,它会首先将自己的context【各种寄存器信息】保存到PCB中,然后将另一个进程的PCB中的信息恢复到CPU中去,这其中来回的过程就实现了进程的切换。