进程 线程
现代操作系统(比如Mac OS X,UNIX,Linux,Windows等)均为多用户操作系统。什么是多用户呢?概括一下,就是操作系统可以运行多个任务,我们可以一边用Chrome浏览器浏览网页,一边用网易云音乐听歌,这就是多任务。我们也可以在windows下任务管理器中看到多个正在执行的任务。对于操作系统来说,一个任务就是一个进程,进程内的子任务即为线程。
进程
指一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程
进程的组成
进程包含了正在运行的程序所有状态信息
- 代码
- 数据
- 状态寄存器
- CPU状态CR0
- 指令指针 EIP
- 通用寄存器
- 进程占用的系统资源
- 打开文件
- 已分配内存
进程的特点
- 动态性 可动态创建 、结束进程
- 并发性 进程可以被独立调度并占用CPU运行
- 独立性 进程是资源分配和调度的基本单位,不同进程的工作互不影响
- 制约性 因访问共享数据、资源, 进程间的同步而产生制约
进程与程序的联系
进程是操作系统处于执行状态下的程序的抽象。同一个程序的多次执行过程对应为不同的进程。
程序:对实现预期目的一系列动作的执行过程的描述,由一系列操作指令的序列组成。
程序是进程的组成之一,同一个程序可对应多个不同进程。
- 程序 = 文件(静态可执行文件)
- 进程 = 执行中的程序 = 程序 + 执行状态
进程执行需要的资源
- CPU 执行指令
- 内存 保存代码和数据
进程与程序的区别
- 进程是动态的,程序是静态的。
- 程序是有序代码的集合
- 进程是程序的执行,进程有内核态和用户态
- 进程是暂时的(是一个状态变化的过程,有开始和结束状态) 程序是永久的(可长久保存)
- 进程与程序的组成不同
- 进程的组成包括程序 、数据、 进程控制块
进程控制块
进程控制块 (PCB Process Control Block)为操作系统管理控制进程运行所用的信息集合,由操作系统用于描述进程的基本情况以及运行变化的过程。
PCB 是进程存在的唯一标识
- 每个进程都在操作系统中有一个对应的 PCB
进程控制块信息
- 进程标识信息 (PID)
- 处理机现场保存
- 进程控制信息 (调度优先级)
- 调度和状态信息 (调度进程和处理机使用情况)
- 进程间通信信息
- 存储管理信息 (指向进程映像存储空间数据结构,占用的存储空间用完以后还给操作系统)
- 进程所用资源 (进程使用的系统资源 、打开文件)
- 有关数据结构连接信息 (与PCB相关的进程队列,不同的状态处于不同的进程队列)
进程控制块的组织
链表
同一状态的进程其 PCB 成一链表,多个状态对应多个不同的链表
- 各状态的进程形成不同的链表:就绪链表、阻塞链表
索引表
同一状态的进程归入一个 索引表(由索引指向PCB) 多个状态对应多个不同的索引表
- 各状态的进程形成不同的索引表:就绪索引表、阻塞索引表
进程的生命周期
进程创建 操作系统分配进程所需要的资源,构建 PCB
- 系统初始化时
- 用户请求创建一个新进程
- 正在运行的进程执行了创建进程的系统调用
进程执行
- 进程创建完后 会放入就绪队列,等待CPU调度
- 内核选择一个就绪的进程(调度算法),让它占用处理机并执行
进程等待(阻塞) 只有进程本身才知道何时需要等待某种时间的发生(主动)
- 请求并等待的系统服务,无法马上完成
- 启动某个操作,无法马上完成
- 需要的数据没有到达
进程抢占
- 高优先级进程就绪
- 进程执行时间片用完
进程唤醒 进程唤醒只能由别的进程或操作系统唤醒(被动)
- 被阻塞的进程需要的资源可被满足
- 被阻塞的进程等待的事件到达
进程结束 将进程所占用的资源还给操作系统
- 正常退出
- 错误退出
- 致命错误(强制性的)
- 被其他进程所杀(强制性的)
三状态进程模型
运行状态(Running)
- 进程正在处理机上执行
就绪状态(Ready)
- 进程获得了除处理机之外的所需资源,得到处理机后可运行
- 进程执行的当前时间片用完了,此时进程处于就绪态
等待状态(又称阻塞状态 Blocked)
- 进程正在等待某个事件而暂停的状态
创建状态(New)
- 进程正在被创建,还没到就绪状态前的状态
结束状态(Exit)
- 进程正在从系统中消失时的状态,系统正在回收它所占用的资源
进程在整个生命周期分为三种基本状态,就绪、运行、等待。
进程挂起
处在挂起状态的进程映像在磁盘上,目的是减少进程占用内存
- 等待挂起状态(Blocked-suspend)
- 进程在外存并等待某事件的出现
- 就绪挂起状态(Ready-suspend)
- 进程在外存,但只要进入内存即可运行 (内存空间不够或它的优先级不够高)
- 挂起(Suspend) 把一个进程从内存转到外存
- 等待到等待挂起 没有进程处于就绪状态或就绪状态进程的内存要求无法满足
- 就绪到就绪挂起 当有高优先级等待进程和低优先级就绪进程,系统会认为高优先级的等待进程会很快就绪,就把低优先级的就绪进程挂起,使得高优先级的等待进程被激活后有足够的内存
- 运行到就绪挂起 对抢先式分时系统,当有高优先级等待挂起进程因事件出现而进入就绪状态,然而当前没有足够内存空间,它就会把当前正在运行的这个进程变成就绪挂起状态
- 激活(Activate) 把一个进程从外存转到内存
- 就绪挂起到就绪 没有就绪队列或挂起就绪队列进程优先级高于就绪进程
- 等待挂起到等待 当一个进程释放足够内存,并有高优先级等待挂起进程
内存中的什么内容放到外存中,就算是挂起状态?
进程内核栈被放到外存(ucore中没有挂起状态)
状态队列
由操作系统来维护一组队列,表示系统中所有进程的当前状态
- 不同队列表示不同状态
- 根据进程状态不同 进程PCB加入相应队列
操作系统来维护一组队列,表示系统中所有进程的当前状态,有关管理进程的描述正确的是()
- 就绪态进程维护在进程就绪队列中
- 等待态进程维护在进程等待队列中
- 运行态进程维护在进程运行队列中
- zombie态进程不在任何队列中
线程
在进程内部增加一类实体,满足以下特性:
- 实体之间可以并发运行
- 实体之间共享相同的地址空间
这种实体就是线程。
线程是进程的一部分,描述指令流执行状态。是进程中的指令执行最小单元,是 CPU 调度的基本单位。
线程与进程的关系
进程 资源分配
进程由一组相关资源构成,包括地址空间(代码、数据段)、打开文件等各种资源
线程 处理机调度
线程描述在进程资源环境中的指令流执行状态(现场保护,切换)
线程 = 进程 - 共享资源 = 执行流
线程的优点
- 一个进程中可以有多个线程
- 各个线程之间可并发执行
- 各个线程之间可以共享地址空间和文件等资源
线程的缺点
- 一个线程崩溃会导致其所属进程的所有线程崩溃
线程与进程的比较
- 进程是资源分配单位,线程是CPU调度单位
- 进程拥有一个完整的资源平台,而线程只独享指令流执行的必要资源(保存信息少,切换速度快),如寄存器、栈
- 线程具有就绪、等待 、运行三种基本状态和状态间的状态转换,与进程完全一致。
- 线程能减少并发执行的时间和空间开销
- 一个进程内部线程的创建和结束时间比进程短,且同一进程内的线程切换时间比进程短
- 同一进程的各线程间共享内存和文件资源可不通过内核进行直接通信
线程的三种实现方式
- 用户线程 在用户空间实现
- 内核线程 在内核中实现
- 轻权进程 在内核中实现,支持用户线程,用户线程和内核线程的综合
用户线程
由一组用户级的线程库函数来完成线程的管理,包括线程的创建、终止、同步、调度等
用户线程的特征
不依赖于操作系统内核
- 内核不了解用户线程的存在
- 可用于不支持线程的多进程操作系统
在用户空间实现的线程机制
- 每个进程有私有的线程控制块(TCB) 列表
- TCB由线程库函数维护
同一进程内的用户线程切换速度快
- 无需内核态、用户态的切换
允许每个进程拥有自己的线程调度算法
用户线程的不足
- 线程发起系统调用而阻塞时,则整个进程进入等待
- 不支持基于线程的处理机抢占(除非当前运行线程主动放弃,它所在进程的其他线程无法抢占CPU)
- 线程只能按进程分配 CPU时间(多个线程的进程中 每个线程的时间片少)
内核线程
由内核通过系统调用实现的线程机制,由内核完成线程的创建、终止、管理
内核线程的特征
- 由内核来维护PCB和TCB
- 线程执行系统调用而被阻塞不影响其他线程
- 线程的创建、终止、切换开销大(通过系统调用/内核函数在内核实现,涉及到栈的切换)
- 以线程为单位进行CPU时间分配(多线程的进程可获得更多的CPU时间)
用户线程与内核线程的区别是什么?
用户线程是由函数库在用户态实现的线程机制;
内核线程是由内核通过系统调用实现的线程机制;
区别:
实现方式 | TCB的保存位置 | 运行开销 | 线程阻塞的影响范围 | |
---|---|---|---|---|
内核线程 | 内核系统调用 | 用户空间 | 大 | 整个进程 |
用户线程 | 用户态函数库 | 内核空间 | 小 | 不影响其他线程 |
轻权进程
**内核支持的用户线程 **一个进程可有一个或多个轻量级进程 每个轻权进程由一个单独的内核线程来支持。
用户线程和内核线程的对应关系
- 内核线程(多进程多线程操作系统):一对一
- 用户线程(多进程单线程操作系统):多对一
- 轻权进程:多对多