进程与线程
进程的概念
多道程序环境下:多个程序并发执行,他们将会失去封闭性,具有间断性和不可再现性。
为了更好地描述和控制程序的并发执行,实现操作系统的共享和并发的基本特征,引入进程的概念。
进程控制块(PCB)
为了能够使得并发的程序包含数据能够正常地运行,而设计的一种数据结构。
进程控制块是进程存在的唯一标识!!
进程的特征
进程的状态和转换
通常进程有5种状态,前3种为基本的状态:
- 运行态
进程在处理机上运行
- 就绪态
进程已经获得除处理机之外的所有资源,获得处理机后即可立即运行。
- 阻塞态
进程等待某一个事件而暂停运行,处理机空闲仍然不能运行,因为资源没有获取
- 创建态
进程正在被创建,尚未进入到就绪态
创建进程的步骤:
- 申请空白的PCB
- 向PCB写入控制和管理进程的信息
- 系统为该进程分配资源
- 将该进程,PCB加入到就绪队列中,进入就绪状态
- 结束态
进程撤销,PCB回收
就绪态和阻塞态:
就绪态是除去处理机以外的其他资源都已经具备,得到处理机就可以立即执行;阻塞态为除去处理机外还有其他的资源尚未满足,即使现在得到处理机资源(处理机空闲)仍然不能够立即执行。
简单的三态转化
具有新建和终止状态的进程转化
进程的控制
在操作系统中,一般将控制进程的程序称为 原语
。其在执行过程中,不允许中断,具有原子性。
Linux的进程状态
转换图示
进程控制块(Process Control Block,PCB)
- 描述进程状态、资源和与相关进程关系的数据结构
- PCB是进程的标志,操作系统通过管理PCB管理进程
- 创建进程时创建PCB;进程撤销后PCB同时撤销
进程 = 程序 + PCB
PCB的数据结构
-
name (ID ) :进程名称(标识符)
-
status :状态
-
next :指向下一个PCB的指针
-
start addr :程序地址
-
priority :优先级
-
cpu status :现场保留区(堆栈)
-
comm_info :进程通信
-
process family :家族
-
own_resource :资源
进程控制
在进程生存的全期间,对进程的全部行为进行控制
有以下四个典型的控制行为:
进程创建
功能: 创建一个基友唯一指定标识ID的进程
创建流程:
创建的伪代码:
Create(Si,Mi,Pi){
p = get_new_pcb();
pid = get_new_pid();
p->ID = pid;
p->CPU_State = Si;//CPU的状态
p->Memory = Mi;//内存
p->Priority = Pi;//优先级
p->Status.Type = "Ready";//进程状态
p->Status.List = RL;//进程队列:RL:Ready List
.....
Insert(RL,p);//插入队列中
Scheduler();//调度程序
}
进程撤销
用于撤销一个指定的进程,收回进程所占有的资源,撤销该进程的PCB
撤销的时机/事件
- 正常结束
- 异常结束
- 外界干预
撤销的参数只需要ID即可。
撤销流程
进程阻塞
用于停止进程的执行,变为阻塞
阻塞的时机/事件
进程阻塞需要的参数
-
阻塞原因
本来阻塞一个进程不需要原因,但是为了方便进程的管理,我们按照阻塞的原因构建不同的阻塞队列,这样一来,对于一个特定的阻塞队列,我们采用统一策略去对待他们。
进程阻塞的流程
进程唤醒
功能:唤醒处于阻塞队列中的进程
引起进程唤醒的时机/事件
他与进程阻塞的时机/事件刚好对应。
唤醒流程
进程通信
进程通信指的是进程之间的信息交换。
从管道读取数据时一个一次性操作,数据一旦被读取,数据将从管道中移除。
管道采用半双工通信,即某一时刻只允许单向传输(要么一端写,要么一端读,不能同时进行既读又写)
线程概念和多线程模型
线程基本概念
轻量级进程,是基本的CPU执行单元,也是程序执行流的最小单位。线程是进程中的一个实体,是被系统独立调度多喝分派的基本单位,线程自己不拥有资源,他和进程中的其他线程共享进程的资源。
线程的切换开销较进程小,可以更好地是多道程序的并发执行,提高资源利用率和系统的吞吐量,这是引入线程的原因。
线程的实现方式
线程的实现分为两类:
- 用户级线程
- 内核级线程
用户级线程
是指不需要内核支持而在用户程序中实现的线程,它的内核的切换是由用户态程序自己控制内核的切换,不需要内核的干涉。但是它不能像内核级线程一样更好的运用多核CPU。
优点:
(1) 线程的调度不需要内核直接参与,控制简单。
(2) 可以在不支持线程的操作系统中实现。
(3) 同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起,可以节约更多的系统资源。
缺点:
(1) 一个用户级线程的阻塞将会引起整个进程的阻塞。
(2) 用户级线程不能利用系统的多重处理,仅有一个用户级线程可以被执行。
内核级线程
切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态。可以很好的运用多核CPU,就像Windows电脑的四核八线程,双核四线程一样。
优点:
(1)当有多个处理机时,一个进程的多个线程可以同时执行。
(2) 由于内核级线程只有很小的数据结构和堆栈,切换速度快,当然它本身也可以用多线程技术实现,提高系统的运行速率。
缺点:
(1) 线程在用户态的运行,而线程的调度和管理在内核实现,在控制权从一个线程传送到另一个线程需要用户态到内核态再到用户态的模式切换,比较占用系统资源。(就是必须要受到内核的监控)
关联性
(1) 它们之间的差别在于性能。
(2) 内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。
(3) 用户级线程的创建、撤消和调度不需要OS内核的支持。
(4) 用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。
(5) 在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。
(6) 用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。
用户级线程的实现方式
内核级线程的实现方式
组合实现方式
在一些系统中,使用组合方式的多线程实现, 线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行. 一个应用程序中的多个用户级线程被映射到一些(小于或等于用户级线程的数目)内核级线程上。
下图说明了用户级与内核级的组合实现方式, 在这种模型中,每个内核级线程有一个可以轮流使用的用户级线程集合