进程与线程
目录为什么要引入进程和线程的问题呢?
- 综述
- 进程
- 进程的类型
- 进程的状态
- 进程的组成
- 进程控制块(PCB)
- 程序
- 进程的管理
- 进程队列
- 创建与撤销
- 进程间关系
- 线程
- 线程的结构
- 线程控制块(TCB)
- 线程实现
- 引入多线程
- 线程的结构
- 小结
综述
一项新概念的引入一般都是为了更好的描述或构建一个新的体系。进程与线程也不外乎如此。
进程是在多道程序系统中引入,但直到目前为止,进程的定义也未能完全统一。而线程则出现的较晚,但却是弥补了进程的一些缺陷,所以线程又名轻进程。
进程
关于进程这一概念的解释有很多种,但这些解释都具有同一个特性——强调程序的执行,即进程所具有的一种动态特性,这是进程与程序间本质上的差异。
进程与程序的区别:
- 程序是静态的,进程是动态的。
- 程序可通过存储介质长期保存,进程具有生命周期。
- 程序和进程是一对多的关系,而进程和程序确只能是一对一。
关于进程,我们做出如下讨论。
进程的类型
- 系统进程:也称守护进程,一个系统进程所完成的任务是相对独立和具体的,其优先级高于用户进程。
- 用户进程:在操作系统之上运行的所有应用程序都称为用户进程。
无论是系统进程还是用户进程,都具有:
并发性,动态性,独立性,交互性,异步性,结构性等几大特性。
注意:进程是调度的基本单位
进程的状态
基本状态有三种:
- 运行态(Run):进程占有处理器资源,正在运行。
- 就绪态(Ready):进程等待处理器资源,已具备运行条件。
- 等待态(Wait):不具备运行条件。
进程状态转换:
运行->就绪:剥夺进程所占有的处理器资源(也可能是进程正常执行结束)。
运行->等待:等待某事件的发生。
就绪->运行:分配进程处理器资源。
就绪->等待:不存在。
等待->就绪:进程所等待的事件以发生,当前正在等待处理器资源。
等待->运行:不存在。
NOTE:
非抢占式调度,不存在运行->就绪的状态转换。
处理器调度算法对于进程的状态转换具有直接的影响,如上所述即为一种情况。
进程的组成
进程控制块(PCB)
进程控制块是标志进程存在的数据结构(对用户透明),在其中包含系统对进程管理所需要的全部信息。
PCB中所包含的信息数量与系统规模,功能成正相关关系。
建立进程->建立PCB
撤销PCB->撤销进程
程序
- 代码:不采用绝对地址,采用相对地址。
- 数据:一般包含静态变量,动态堆(保存动态变量)以及动态栈。
进程的管理
进程队列
- 就绪队列:根据调度算法确定,一般来说,整个系统就只有一个。
- 等待队列:与事件个数对等,即每个等待事件有一个等待队列。
- 运行队列:与处理器个数有关,每个CPU有一个。
创建与撤销
- 创建:
- 建立一个进程控制块
- 初始化该进程控制块
- 为该进程分配存储空间
- 加载所要执行的程序
- 将进程控制块送入就绪队列
由父进程创建的子进程是其全盘复制,即子进程除了进程号与父进程不一致外,其他均相同。
- 撤销:
- 撤销进程的内存分配
- 撤销进程控制块
- 通知父进程
进程的撤销的原因可以是正常执行结束,也可以是进程执行是发生错误而结束。
进程间关系
逻辑关系:
- 相关进程: 具有逻辑联系
- 无关进程:无任何逻辑联系
相互作用:
- 直接相互作用: 不需要第三方而发生相互作用
只能发生在相关进程之间。
- 间接相互作用: 需要第三方才能发生作用
线程
线程与进程相类似,所以又成线程为轻进程,但线程是进程内的一个相对独立的执行流,即一个线程包含多个线程。
进程内的多个线程执行同一程序中相同或不同代码段,共享数据区和堆。
进程是资源的分配单位,线程是CPU的调度单位。
线程的结构
线程控制块(TCB)
TCB中内容较少,因为大多数内容是记录在进程中。
线程的实现方式决定TCB的归属。
TCB归属:操作系统空间,用户进程空间。
线程实现
-
核心级别线程(KLT)
- 并发行好
- 真正并行
- 系统开销大
- 进程状态不具有实际意义
-
用户级别线程(ULT)
- 灵活
- 实现效率高
- 不能实现并行
-
混合线程
引入多线程
当一个应用中进程间的功能有所重叠(如具有相同的代码和数据),此时如果采用多进程的方式,那么对于系统来说,系统开销是非常巨大的。
所以多线程的引入成为了必需:
- 同一进程的多个线程间可共享内存,合作完成某项功能。
- 同一进程的多个线程间切换速度快。
- 提高处理器与设备之间的并行性。
- 多处理器环境下,多线程可并行执行(不同进程)。
只有当同一进程中的多个线程具有相同代码和数据,或者这些线程之间是合作(执行代码不同部分)的,或者是同构(执行相同代码)。才可以采用多线程处理模式。
小结
程序是进程的组成部分,进程是为了执行对应的程序而存在的,如此可知没有程序,进程也失去了讨论的意义。
而没了进程,线程也就不复存在了。