本文是对王道计算机408操作系统+王道2025操作系统考研复习指导部分的提炼总结,个人心得,包含视频内容和课后习题的提炼.
本人是26届408考生,本文属于考研复习的笔记,会持续更新~
建议搭配视频和指导书食用~ ~ 视频课请看王道计算机考研408操作系统
本文是操作系统第二章 第一节内容
总目录2026考研408 操作系统
第一节: 进程与线程
2.1 进程与线程
2.1.1 进程的概念和特征
- 进程的概念
- 为了多道程序环境下,允许多个程序并发执行为此引入进程概念,以便于更好的描述和控制程序的并发执行
- 从不同的角度看进程有不同的定义
- 进程是一个正在执行程序的实例
- 进程是一个程序及其数据从磁盘加载到内存后,在
CPU
上的执行过程 - 进程是一个具有独立功能的程序在数据集合上运行的过程
- 进程的特征
- 动态性
- 并发性
- 独立性
- 异步性
- 结构性
- 动态性是进程最基本的特征
2.1.2 进程的组成
操作系统是如何区分各个进程的?
- 当进程被创建的时候,操作系统会为这些 进程分配一个唯一的不重复的 “身份证号”—
PID
(进程ID
) - 除此之外操作系统还记录了进程的各种信息比如
UID
(所属用户ID
),给进程分配了哪些资源(多少内存,正在使用哪些IO
设备,正在使用哪些文件) - 还要记录进程的运行情况(
CPU
使用时间,磁盘使用情况,网络流量使用) - 这些信息会统一保存在数据结构
PCB
(进程控制块)当中 - 进程控制块(
PCB
)是进程存在的唯一标识
PCB
的组成- 进程描述信息
- 进程控制和管理信息
- 资源分配清单
- 处理机相关信息
进程描述信息 进程控制和管理信息 资源分配清单 处理机相关信息 进程标识符(PID) 进程当前状态 代码段指针 通用寄存器值 用户标识符(UID) 进程优先级 数据段指针 地址寄存器值 代码运行入口地址 堆栈段指针 控制寄存器值 程序的外存地址 文件描述符指针 状态字 进入内存时间 键盘 CPU占用时间 鼠标 信号量使用
- 一个系统中有多个程序的
PCB
需要将其组织起来以便于进程的调度和管理 - 常用的组织方式:
- 链接方式
- 将同一个状态的
PCB
链接成一个队列,不同状态不同队列,也可以将处于阻塞态的PCB
通过不同的阻塞原因排成多个阻塞队列
- 将同一个状态的
- 索引方式
- 将统一状态的PCB组织在一个索引表中,索引表的表项指向相应的PCB,不同状态对应不同索引表,如就绪索引表和阻塞索引表
- 链接方式
- 程序段
- 程序段就是能被进程调度程序调度到
CPU
执行的程序代码段,程序可以被多个进程共享即多个进程运行同一个程序(比如同时多开几个QQ)
- 程序段就是能被进程调度程序调度到
- 数据段
- 一个进程的数据段可以是进程对应的程序的原始数据,也是程序执行过程中的中间结果和最终结果
- 进程的组成
PCB
- 程序段
- 数据段
PCB
是给操作系统用的数据结构- 程序段和数据段都是给程序自己使用的
PCB
,程序段,数据段三部分构成进程实体(进程映像)- 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
2.1.3 进程的状态与转换
- 创建态
- 进程正在被创建,尚未转到就绪态。
- 就绪态
- 进程获得了除了
CPU
的一切资源,一旦获得CPU
便可以立即运行,系统中处于就绪状态的进程可能有多个,组成就绪队列.
- 进程获得了除了
- 运行态
- 进程在
CPU
上运行
- 进程在
- 阻塞态
- 又称为等待态,进程正在等待某一事件而暂停运行
- 终止态
- 进程正从系统中消失,原因可能是正常结束或者其他原因.
注意:
- 不能由阻塞态直接转成运行态
- 不能就绪态直接转变成阻塞态
- 运行态转变成阻塞态是进程主动请求的结果
- 阻塞态转变成就绪态是一种被动行为
- 在单核
CPU
的情况下系统中最多只有一个进程处于运行态
2.1.4 进程的控制
进程控制的主要功能是对系统中所有的进程进行有效的管理,实现的就是进程状态的转换,在操作系统中,一般将进程控制用的程序称为原语
如何实现原语 “原子性”?
- 使用关中断和开中断这两个特权指令实现
- 当使用了关中断指令之后
CPU
就不会例行检查关中断指令了
父进程和子进程的关系和特点
- 允许一个进程创建另一个进程
- 此时创建新进程的进程称为父进程
- 被创建的进程称为子进程
- 子进程可以继承父进程所拥有的资源
- 当子进程撤销的时候,将资源还给父进程
- 撤销父进程,子进程也会撤销
进程的创建
- 创建原语
- 申请空白
PCB
- 为新进程分配一个唯一的进程标识号,并申请一个空白
PCB
(PCB是有限的)若PCB
申请失败,则创建失败
- 为新进程分配一个唯一的进程标识号,并申请一个空白
- 为新进程分配所需的资源
- 如内存,文件,
IO
设备和CPU
时间等,这些资源可以从操作系统获得或仅从父进程获得 - 如果资源不足并不是创建失败,而是处于创建态等待系统资源
- 如内存,文件,
- 初始化
PCB
- 将
PCB
插入就绪队列
- 申请空白
- 引起进程创建的事件
- 用户登录
- 分时系统中,用户登录成功,系统会为其建立一个新的进程
- 作业调度
- 多道批处理系统中,有新的作业放入内存,会为其建立一个新的进程
- 提供服务
- 用户向操作系统提出某些请求,会新建一个进程处理该请求
- 应用请求
- 由用户进程主动请求创建一个进程
- 用户登录
进程的终止
- 终止原语
- 根据被终止进程的标识符,从
PCB
集合中找到该进程的PCB
,读取该进程的状态 - 若该进程处于运行态,则立即终止该进程的执行,将
CPU
分配给其他进程 - 若该进程有子进程,则将其所有子进程都终止
- 将该进程所拥有的全部资源归还给父进程或者操作系统
- 删除
PCB
- 根据被终止进程的标识符,从
- 引起进程终止的事件
- 正常结束
- 异常结束
- 外界干预
进程的阻塞和唤醒
- 进程的阻塞
- 阻塞原语
- 找到要阻塞进程对应的
PCB
通过标识号(PID
) - 若该进程为运行态,则保护其现场,将其状态转为阻塞态,停止运行
- 将该
PCB
插入响应时间的等待队列,将CPU
调度给其他进程
- 找到要阻塞进程对应的
- 引起阻塞的事件
- 需要等待系统分配某种资源
- 需要等待相互合作的其他进程完成工作
- 阻塞原语
- 进程的唤醒(阻塞态->就绪态)
- 唤醒原语
- 在事件的等待队列中找到对应
PCB
- 将其从等待队列中移除,并将其状态改为就绪态
- 将该
PCB
插入就绪队列中
- 在事件的等待队列中找到对应
- 引起唤醒-等待的事情发生(因何事阻塞,就该由何事唤醒)
- 唤醒原语
进程的切换(运行态->就绪态,就绪态->运行态)
- 切换原语
- 将进程运行环境信息存到
PCB
中 PCB
移除相应队列- 选择另一个进程执行更新其
PCB
- 根据
PCB
恢复其所需要的运行环境
- 将进程运行环境信息存到
- 引起进程切换的事件
- 当前时间片到了
- 有更高优先级的进程到了
- 当前进程主动阻塞
- 当前进程终止
- 系统内进程用的是同一套
PSW
,PC
,IR
寄存器和通用寄存器 - 一个进程执行时间片结束要下
CPU
的时候需要将其中间结果都保存下来即将进程运行环境信息保存到PCB
中 - 当该进程再次获得
CPU
调度的时候可以通过PCB
进行运行环境恢复
2.1.5 进程的通信
共享存储
- 在通信的进程之间存在一块可直接访问共享空间,通过对这块空间的读写操作实现两个进程之间的信息交换
- 在对共享空间进行读写操作的时候需要使用同步互斥工具(如
PV
操作)对共享空间的读写操作进行控制 - 共享存储有两种方式:
- 基于数据结构的共享,相当于一个特殊的全局变量,特点:限制多,速度慢是一种低级通信方式
- 基于存储区的共享,操作系统划分一块共享存储区,数据形式,存放位置等都由通信进程控制,而不是操作系统,速度快是一种高级通信方式
- 进程空间独立存在,进程运行期间一般不能访问其他进程空间
- 先让两个进程共享空间必须通过特殊的系统调用
- 进程内的线程是自然共享进程空间的
消息传递
- 在消息传递系统中,进程间的数据交换以格式化的消息为单位,进程通过操作系统提供的发送消息和接收消息两个原语进行数据交换
- 直接通信方式
- 发送进程直接将消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接受进程从消息缓冲队列上获得消息
- 间接通信方式
- 发送进程将消息发送到某个中间体(信箱),接受进程从信箱中获得消息,该通信方式广泛应用在计算机网络中
- 若通信的进程之间不存在可直接访问的共享存储空间,则必须利用操作系统提供的消息传递方式实现进程通信
- 这种方式隐藏了通信实现的细节,使通信过程对用户透明,简化了通信程序的设计.是当前应用最广泛的进程间通信机制
- 在微内核操作系统中,微内核与服务器之间的通信就采用了消息传递机制
- 该机制能很好的支持多
CPU
系统,分布式系统,计算机网络,是这些领域最主要的通信工具
管道通信
-
管道是一个特殊的共享文件又名
pipe文件
,其实就是在内存中开辟一个大小固定内存缓冲区域(本质上就是一个循环队列) -
管道只能采用半双工通信,某一时间段内只能实现单向传输,如果要实现双向同时通信需要设置两个管道
-
各个进程要互斥的访问管道(操作系统保证)即当一个进程对管道进行读写操作的时候,其他进程必须等待
-
当管道被写满则写进程会阻塞,直到管道内数据被取走即可唤醒写进程
-
当管道数据读完时,读进程将阻塞,知道写进程写入数据唤醒
-
管道只能由创建进程所访问,当父进程创建一个管道后,子进程会继承父进程的管道,可以实现父子进程的通信
-
从管道读数据是一次性操作,数据一旦被读取,就会释放空间以便写更多数据
-
共享存储需要互斥的访问共享空间,需要通信程序通过操作系统提供的互斥工具自己实现(
PV
操作) -
而管道通信各进程要互斥访问管道,这个是由操作系统负责实现互斥
2.1.6 线程和多线程模型
基本概念,属性以及与进程比较
- 引入进程的目的是更好的使多道程序并发执行,提高资源利用率和系统吞吐量
- 而引入线程的目的则是减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能
- 线程特点
- 线程是轻量级进程,是
CPU
基本的执行单元,也是程序执行流最小的单元 - 由线程
ID
,程序计数器,寄存器集合,堆栈组成,每一个线程都有一个线程ID
,线程控制块(TCB
) - 线程是进程的一个实体,是被系统独立调度和分派的基本单位
- 线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源
- 线程可以与同一个进程的不同线程共享进程所拥有的全部资源
- 一个线程可以创建和撤销另一个线程
- 同一进程中的多个线程可以并发执行,线程也有运行态,就绪态,阻塞态三种基本状态
- 线程是轻量级进程,是
- 引入线程后,线程成为了程序执行流的最小单位,作为
CPU
的分配单元 - 进程只作为除
CPU
以外的系统资源分配单元 - 由于一个进程内有多个线程,若线程的切换发生在同一个进程内部,则需要很少的时空开销
- 由于线程间共享内存地址空间,同一进程的线程间通信甚至无需系统干预
- 不同进程的线程切换会引起进程的切换
线程的实现方式
- 用户级线程
- 特点:
- 早期操作系统只支持进程不支持线程,当时的线程由线程库实现
- 在用户级线程中,有关线程管理的所有工作都是由应用程序在用户态完成的无需操作系统干预
- 优点
- 用户级线程在用户态下即可完成不需要切换到内核态,系统开销小,效率高
- 不同进程可以根据自身需要对自己的线程选择不同的调度算法
- 缺点:
- 系统调用阻塞问题,如果一个线程被阻塞,则整个进程的所有线程都会阻塞
- 不能发挥多
CPU
的优势内核每次分配一个CPU
给一个进程,进程内只有一个线程能执行
- 特点:
- 内核级线程
- 特点
- 线程的管理由操作系统来
- 需要进行操作系统状态转换
- 优点
- 能发挥多
CPU
的优势 - 如果一个进程里的某个线程阻塞,
CPU
还可以调度同一个进程里不同的线程使用CPU
- 内核支持线程具有很小的数据结构和堆栈,线程切换快,开销小
- 内核本身也可以采用多线程技术,提高系统的执行速度和效率
- 能发挥多
- 缺点
- 同一进程的不同线程切换需要操作系统状态转换,系统开销大,这是因为用户进程的线程在用户态运行,但是调度操作和管理线程在内核实现
- 特点
多线程模型
- 多对一模型
- 将多个用户级线程映射到一个内核级线程
- 一对一模型
- 一个用户级线程映射一个内核级线程
- 多对多模型
- 将n个用户级线程映射到m个内核级线程上,要求n>=m
- 特点
- 克服了多对一模型并发度低,一个线程阻塞全进程线程问题
- 克服了一对一模型用户进程占用太多内核级线程,频繁状态转换导致开销太大问题
- 内核级线程是处理机分配的单位
- 内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有当前进程的所有内核级线程中运行的代码逻辑都阻塞时,这个进程才会阻塞
线程的状态和转换
- 执行态,就绪态,阻塞态与进程的状态和转换基本一致
线程的组织与控制
- 与进程类似,系统为每个线程都配置了一个线程控制块(
TCB
)
线程标识符`TID` |
程序计数器PC |
其他寄存器 |
堆栈指针 |
线程运行状态 |
优先级 |
- 线程切换时要保存恢复的内容: 程序计数器
PC
,其他寄存器,堆栈指针 - 同一进程中的所有线程都可以完全共享进程的地址空间和全局变量
- 各个线程都可以访问进程地址空间的每个单元,所以一个线程可以读,可以写甚至能清楚另一个线程的堆栈.
2.1 习题提炼
- 线程的
CPU
现场指的是线程在运行时所需要的一组寄存器的值,它包括程序计数器,状态寄存器,通用寄存器,栈指针等 - 当线程切换的时候操作系统会保存线程的
CPU
现场并恢复下一个线程的CPU
现场 - 线程是
CPU
调度的独立单位,可以独立执行程序 - 线程没有自己独立的地址空间,它共享所属进程的空间
- 同一个进程的线程通信可以直接通过他们共享的存储空间共享,不同进程的线程通信需要使用系统调用函数
- 动态性是进程最重要,最基本的特性,这是与程序的根本区别
- 并发进程中执行速度会影响进程之间的执行顺序和内存冲突问题,从而导致不同的操作结果
- 并发进程之间存在相互制约和竞争,导致每次运行都可能导致不同的结果,所以并发进程的运行结果具有不可再现性
- 进程的优先级分为静态和动态两种,动态优先级根据运行情况而随时调整
- 在单处理系统中,任何时刻都只有一个进程处于运行态
这是错误的
,系统发生死锁时就有可能进程全部处于阻塞态而CPU
空闲 - 一个进程可以顺序地执行一个或多个程序,但不能同时执行多个程序
- 程序封闭性是指进程执行的结果只取决于进程本身,不受外界影响,也就是说进程在执行的过程中不论是走走停停还是不停顿执行,进程的执行速度都不会改变他的执行结果
- 进程并发失去封闭性后,不同执行速度下执行结果不同
- C语言编写的程序在使用内存时一般分为三个段,分别是正文段(代码和赋值数据段),数据堆段,数据栈段,二进制代码和常量存放在正文段,动态分配的存储区在数据堆段,临时使用的变量在数据栈段,全局赋值变量在正文赋值数据段
- 互斥信号量是一种用于实现进程同步和互斥的工具,他不是进程本身的属性,互斥信号量通常存储在内核或者共享内存中而不是存储在
PCB
中 - 整个系统只有一个键盘,键盘输入是人操作,速度比较慢,完全可以用一个线程来处理整个系统的键盘输入
- 在内核级线程中,同一进程中线程切换,需要从用户态到核心态进行,系统开销大
- 创建新进程的主要原因:用户登录,高级调度,系统处理用户程序的请求,用户程序的应用请求
- 设备分配是通过在系统中设置相应的数据结构实现的,不需要创建新进程,这是操作系统中IO核心子系统的内容
- 属于进程的资源,同一进程的线程可以共享唯有进程中某线程的栈指针是独享的
- 管道是存储在内存中的,固定大小的缓冲区,管道的大小通常为内存的一页,其大小不受磁盘容量大小的限制
- 一个管道可以有多个读写进程或多个写进程对其进行操作,但是这会增加数据混乱风险,应使用互斥锁或者信号量等同步机制保证每一次只有一个进程对管道进行读或写操作
- 父进程与子进程共享一部分资源,但是不能共享虚拟地址空间,在创建子进程的时候会为子进程分配资源,如虚拟地址空间
- 若系统中没有运行进程,则一定没有就绪进程
- 若系统中既没有运行进程也没有就绪进程,系统中是否一定没有进程? 还可能发生死锁都处于阻塞状态
- 在采用优先级进程调度时,进程中运行的一定时优先级高的进程吗? 优先级高的进程可能正在阻塞所以优先级低的也有可能运行