进程线程
进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程。
进程的特点:
- 动态性:可动态的创建或者结束进程
- 并发性:多个进程可以在操作系统的调度下交替执行
- 独立性:不同进程的工作互不影响
- 制约性:因访问共享数据、资源或者进程间同步而产生制约
进程与程序的联系:
- 进程是操作系统处于执行状态程序的抽象
- 程序=文件(静态的可执行文件)
- 进程=执行中的程序=程序+执行状态
- 同一个程序的多次执行过程对应为不同的进程。
- 如命令“ls”的多次执行对应多个进程
- 进程执行需要的资源
- 内存:保存的代码和数据
- CPU:执行指令
- 进程是动态的,程序是静态的
- 程序是有序代码的集合
- 进程是程序的执行,进程有核心态、用户态
- 进程是暂时的,程序是永久的
- 进程是一个状态变化的过程
- 程序可长久保存
- 进程与程序的组成不同
- 进程的组成包括程序、数据和进程控制块
进程控制块PCB
进程控制块是OS管理控制进程运行所用的信息集合。
- OS用PCB描述进程的基本情况以及运行变化的过程。(比如:进程的ID,进程执行的哪一个程序以及它运行变化的过程即进程的状态)
- PCB是进程存在的唯一标志,每个进程都在OS中有一个对应的PCB(一个进程结束了所对应的PCB必然被OS回收)
- 进程创建,生成该进程的PCB;进程终止,回收该进程的PCB;进程的组织管理均通过PCB来实现
进程控制块的内容:
- 进程标识信息
- 处理机现场保存(多个进程交替运行时交替的部分,交替之后被另外的进程使用的部分)
- 进程控制信息
- 进程控制信息
进程状态
- 创建:系统初始化时;用户请求创建一个新进程;正在运行的进程执行力了创建进程的系统调用;
- 创建完成之后进入就绪状态,等待CPU调度;
- CPU调用之后进入运行状态
- 运行的过程有可能会发生阻塞状态:请求并等待系统服务,无法马上完成;启动某种操作,无法马上完成;需要的数据没有到达
- 若发生进程抢占(高优先级进程就绪或者进程执行的当前时间片用完),则由运行状态变为就绪状态
- 进程被唤醒时(被阻塞进程需要的资源可被满足或者被阻塞进程等待的时间到达),会由阻塞状态变为就绪状态
- 进程执行完毕,退出
进程切换:
进程挂起
处于挂起状态的进程映像在磁盘上,目的是减少进程占用的内存。
- 等待挂起:进程在外存等待某事件的出现
- 就绪挂起:进程在外存中,但只要进入内存就可以进入就绪状态
- 等待到等待挂起:没有进程处于就绪状态或者就绪进程需要更多的内存资源
- 就绪到就绪挂起:当有高优先级等待(系统认为会很快就绪的)进程,为了使高优先级进入内存有足够的空间,使低优先级就绪进程兑换到外存中,挂起
- 运行到就绪挂起:对于抢先分时系统,当有高优先级等待的进程因事件出现而进入就绪,而没有足够的内存空间,此时会把正在运行的这个进程抢先,并且把它变成挂起就绪状态
- 等待挂起到就绪挂起:当有等待挂起进程因相关事件出现,会变为就绪挂起
- **:把一个进程从外存转到内存
- 就绪挂起到就绪:就绪挂起的进程优先级比较高
- 等待挂起到等待:当一个进程释放足够的内存,而且等待挂起的进程优先级比较高
线程
每个进程内部的指令执行由一个叫指令指针的寄存器来描述当前这个进程执行到什么地方,但是在实际使用时,我们可能也希望一个进程内部它有更好的并发性,所以引入线程。
进程之间通信通常要通过内核,开销较大。
在进程内部增加一类实体,满足以下特性:
- 实体之间可以并发执行
- 实体之间共享相同的地址空间
线程概念:线程是进程的一部分,描述指令流执行的状态,它是进程中的指令执行流的最小单元,是CPU调度的基本单位。
线程优点:
- 一个进程中可以同时存在多个线程
- 各个线程之间可以并发的执行
- 各个线程之间可以共享地址空间和文件资源
线程的缺点:
- 一个线程崩溃,会导致其所属进程的所有线程崩溃
线程VS进程
- 进程是资源分配单位,线程是CPU调度单位
- 进程拥有一个完整的资源平台,而线程只独享指令流执行的必要资源,如寄存器和栈
- 线程具有就行等待运行三种基本状态和状态间的转换关系
- 线程能减少并发执行的时间和空间开销
- 线程的创建时间比进程短
- 线程的终止时间比进程短
- 同一进程内的线程切换时间比进程短
- 由于同一进程的个线程间共享内存和文件资源,可不通过内核进行直接通信
用户线程:
-
由一组用户级的线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等
- 在操作系统内核里,仍然只有进程控制块来描述处理机的调度的情况,操作系统并不感知应用态有多线程的支持;
- 而多线程的支持,是用户的函数库支持的多线程 。在应用程序内部通过构造相应的线程控制块,来控制一个进程内部多个线程的交替执行和同步
用户线程特征
-
不依赖于操作系统的内核
- 内核不了解用户线程的存在
- 可用于不支持线程的多进程操作系统
-
在用户空间实现的线程机制
- 每个进程有私有的线程控制块列表TCB
- TCB由线程库函数维护
-
同一进程内的用户线程切换速度快
- 无需用户态、核心态直接切换
-
允许每个进程拥有自己的线程调度算法
用户线程的不足:
- 线程发起系统调用而阻塞时,则整个进程进入等待
- 不支持基于线程的处理机抢占
- 除非当前运行线程主动放弃,它所在进程的其他线程无法抢占CPU
- 只能按进程分配CPU时间
- 多个线程进程中,每个线程的时间片较少
内核线程
由内核通过系统调用实现的线程机制,由内核完成线程的创建、终止和管理。
- 进程是资源分配的单位,线程是处理机调度的单位。
- 由内核维护PCB和TCB
- 线程执行系统调用而被阻塞并不影响其他线程
- 线程的创建、终止和切换相对较大
- 通过系统调用内核函数,在内核实现
- 以线程为单位进行CPU时间分配
- 多线程的进程可获得更多CPU时间
轻权进程
内核支持的用户线程。一个进程可有一个或多个轻权进程,每个轻权进程由一个单独的内核线程来支持。
进程切换
又称上下文切换
- 暂停当前运行进程,从运行状态变成其他状态
- 调度另一个进程从就绪状态变成运行状态
进程切换的要求:
- 切换前,保存进程的上下文
- 切换后,恢复进程上下文
- 快速切换
进程生命周期的信息
- 寄存器(PC,SP,…)
- CPU状态
- 内存地址空间
PCB:内核的进程状态记录 - 内核为每个进程维护了对应的进程控制块(PCB)
- 内核将相同状态的进程的PCB放在同一队列
PCB一般会保存什么内容:
- 进程的标识信息:执行的是哪一个可执行文件;进程的ID是多少;它的父进程是谁
- 进程的状态信息:cpu里状态寄存器的相关信息,地址空间的起始位置,第一级页表的起始位置在哪,进程的状态和它是否允许调度等这样一些执行状态的信息
- 进程所占用的资源:那所有分配给他的存储组织成相关的数据结构
- 保护现场用的。在中断和进程切换的时候都需要保护现场(两个进程需要复用的部分),现场的内容都需要保存到PCB中
- 进程在不同的时刻处于不同的状态,这些状态组织成不同的队列,用相关的指针结构描述当前进程到底是在哪一个队列中。