finish up chapter one
parent
e721c6b83f
commit
277fcb1b8b
|
@ -376,6 +376,92 @@ date: 2022-08-18T15:53:40+08:00
|
||||||
* 广义指令(系统调用)的调用
|
* 广义指令(系统调用)的调用
|
||||||
* 外部中断,缺页
|
* 外部中断,缺页
|
||||||
* 改变处理器状态
|
* 改变处理器状态
|
||||||
* 内核态$/to$用户态 : 发生在中断返回用户程序是,需要一条修改PSW(程序状态字)的特权命令
|
* 内核态$\to$用户态 : 发生在中断返回用户程序是,需要一条修改PSW(程序状态字)的特权命令
|
||||||
* 用户态$/to$内核态 : 发生在中断时,通过硬件完成
|
* 用户态$\to$内核态 : 发生在中断时,通过硬件完成
|
||||||
* 状态区分目的: 保护系统程序
|
* 状态区分目的: 保护系统程序
|
||||||
|
* 内核功能
|
||||||
|
* 时钟管理:实现计时功能
|
||||||
|
* 中断处理:负责实现中断机制
|
||||||
|
* 设备管理:完成设备的请求和释放,以及设备启动等功能
|
||||||
|
* 文件管理:完成文件的读、写、创建和释放等功能
|
||||||
|
* 进程管理:完成进程的创建、撤销、阻塞及唤醒等功能
|
||||||
|
* 进程通信:完成进程间的信息传递或信号传递等功能
|
||||||
|
* 内存管理:完成内存的分配,回收及获取作业占用内存大小及地址等功能
|
||||||
|
* 原语
|
||||||
|
* 一种特殊的程序
|
||||||
|
* 处于操作系统最底层,最接近硬件的部分
|
||||||
|
* 运行具有原子性(只能一气呵成,不可中断)
|
||||||
|
* 运行时间较短,调用频繁
|
||||||
|
* 外中断和内中断
|
||||||
|
* 异常(内中断)
|
||||||
|
* 基本概念
|
||||||
|
* 由CPU内部产生的意外事件
|
||||||
|
* CPU执行一条命令时,由CPU在其内部检测到的,与正在执行指令相关的同步事件
|
||||||
|
* 故障和自陷为异常
|
||||||
|
* 终止异常和外中断属于硬件中断
|
||||||
|
* 分类
|
||||||
|
* 故障:在引起故障的指令启动之后、执行结束前被检测到的异常事件
|
||||||
|
* 指令译码时,出现非法操作码
|
||||||
|
* 取数据时,出现缺页或缺段
|
||||||
|
* 除数为零
|
||||||
|
* 地址越界
|
||||||
|
* 自陷:也称陷阱或陷入,是预先安排的一种异常事件,如同预先设置好的陷阱一样
|
||||||
|
* x86机器中,用于程序调试的断点设置和单步跟踪功能
|
||||||
|
* 系统调用指令
|
||||||
|
* 条件自陷指令
|
||||||
|
* 终止:在执行指令的过程中发生了使计算机无法继续执行的硬件故障,程序无法执行,只能终止
|
||||||
|
* 控制器出错
|
||||||
|
* 存储器校验错
|
||||||
|
* 调出中断服务程序来重启系统
|
||||||
|
* 执行时间
|
||||||
|
* CPU在执行指令时检查是否有异常产生
|
||||||
|
* 不同点(与外中断)
|
||||||
|
* 缺页或溢出等异常事件是特定指令在执行过程中产生的
|
||||||
|
* 异常的检测由CPU自身完成,不需要外部某个信号通知CPU
|
||||||
|
* 中断(外中断)
|
||||||
|
* 基本概念
|
||||||
|
* 由来自CPU外部的设备发出的中断请求(常用于输入输出)
|
||||||
|
* 典型的由外部设备触发的,与当前正在执行的指令无关的异步事件
|
||||||
|
* 外部I/O设备通过特定的中断请求信号线向CPU提出中断请求
|
||||||
|
* CPU每执行一条指令就检查中断请求信号线,若检测到中断请求,则进入中断响应期
|
||||||
|
* 外部中断都是一条指令执行完成后(中断周期)才被检测并处理的
|
||||||
|
* 分类
|
||||||
|
* 可屏蔽中断
|
||||||
|
* 通过可屏蔽中断请求线INTR向CPU发出的中断请求
|
||||||
|
* CPU可通过在中断控制器中设置相应的屏蔽字来屏蔽或不屏蔽它,被屏蔽的中断信号将不被送到CPU
|
||||||
|
* 不可屏蔽中断
|
||||||
|
* 通过不可屏蔽中断请求线NMI向CPU发出的中断请求
|
||||||
|
* 通常为非常紧急的硬件故障
|
||||||
|
* 举例
|
||||||
|
* Cache缺失
|
||||||
|
* I/O中断:键盘输入,打印机缺纸
|
||||||
|
* 时钟中断
|
||||||
|
* I/O中断请求
|
||||||
|
* 执行时间
|
||||||
|
* 每个指令周期末尾,CPU都会检查是否有外中断信号需要处理
|
||||||
|
* 不同点(与内中断)
|
||||||
|
* 不与任何指令相关联,也不阻止任何指令的完成
|
||||||
|
* 系统调用(广义指令)
|
||||||
|
* 定义
|
||||||
|
* 操作系统对应用程序和程序员提供的接口
|
||||||
|
* 系统调用需要触发Trap【也叫陷入/访管指令】
|
||||||
|
* OS通过提供系统调用避免用户程序直接访问外部设备【应用程序通过】
|
||||||
|
* 目的:请求系统服务
|
||||||
|
* 与库函数区别
|
||||||
|
* 库函数
|
||||||
|
* 语言或应用的一部分,可以运行在用户空间中
|
||||||
|
* 许多库函数都会使用系统调用来实现功能
|
||||||
|
* 有的库函数没有使用系统调用
|
||||||
|
* 系统调用
|
||||||
|
* 是操作系统的一部分,是内核为用户提供的程序接口,运行在内核空间
|
||||||
|
* 未使用系统调用的库函数,执行效率通常比系统调用的高【无需完成上下文切换和状态转换】
|
||||||
|
* 功能分类
|
||||||
|
* 设备管理:完成设备的请求或释放+设备启动
|
||||||
|
* 文件管理:完成文件的读、写、创建、删除
|
||||||
|
* 进程控制:完成进程的创建、撤销、阻塞、唤醒
|
||||||
|
* 内存管理:完成内存的分配、回收、获取作业占用内存区大小及始址
|
||||||
|
* 系统调用过程
|
||||||
|
1. 传参
|
||||||
|
2. 陷入指令/Trap/访管【执行系统调用】(发生在用户态)
|
||||||
|
3. 由操作系统内核程序处理系统调用(发生在内核态)
|
||||||
|
4. 返回应用程序
|
|
@ -0,0 +1,263 @@
|
||||||
|
---
|
||||||
|
title: "《操作系统》进程与线程"
|
||||||
|
date: 2023-07-01T15:59:00+08:00
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 线程
|
||||||
|
|
||||||
|
### 常考知识点
|
||||||
|
|
||||||
|
* 交换数据
|
||||||
|
* 进程之间不能直接交换数据,但可以利用OS提供的共享文件(管道),信息传递系统,共享存储区来进行通信
|
||||||
|
* 全局变量是针对一个进程而言的,不同的进程拥有不同的代码和数据段,不能通过全局变量来交换进程间数据
|
||||||
|
* 临界资源一次只能为一个进程所用
|
||||||
|
* 进程的特性
|
||||||
|
* 进程失去封闭性(进程执行的结果之只取决于进程本身)后,不同速度下的执行结果不同
|
||||||
|
* 进程被建立后,随着进程运行的正常或不正常而撤销
|
||||||
|
* 进程不是一个完整的程序
|
||||||
|
* 进程是动态的,程序是静态的
|
||||||
|
* 进程是暂时的,程序是永久的
|
||||||
|
* 进程至少由代码、数据、PCB组成,程序仅需要代码和数据
|
||||||
|
* 一个进程是程序在一个数据集上的一次运行过程;运行于不同的数据集,会形成不同的进程
|
||||||
|
* 进程与进程的关系
|
||||||
|
* 进程与进程之间完全隔离,线程与线程之间没有隔离
|
||||||
|
* 一个进程的状态变化可能引起另一个进程的状态变化
|
||||||
|
* 如大衣呢进程结束后可能改变另一个等待打印机的进程
|
||||||
|
* 各种状态
|
||||||
|
* 死锁的进程位于阻塞态,不可能所有进程都处于就绪态,但可以所有的进程都处于阻塞态(死锁的时候)
|
||||||
|
* 就绪队列进程的多少与处理器的效率无关,只有当就绪队列为空时,CPU进入等待态,CPU效率下降
|
||||||
|
* 进程里的各种信息
|
||||||
|
* 正文段
|
||||||
|
* 存放二进制代码,常量
|
||||||
|
* 全局赋值变量,常量值123
|
||||||
|
* 数据堆段
|
||||||
|
* 动态分配的存储区
|
||||||
|
* malloc动态分配的存储区
|
||||||
|
* 数据栈段
|
||||||
|
* 临时使用变量
|
||||||
|
* 未赋值的局部变量,函数调用实参传递值
|
||||||
|
|
||||||
|
### 进程概念与特征
|
||||||
|
|
||||||
|
* 进程
|
||||||
|
* 定义
|
||||||
|
* 进程是程序的一次执行过程
|
||||||
|
* 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
|
||||||
|
* 进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位
|
||||||
|
* 特征
|
||||||
|
* 动态性
|
||||||
|
* 并发性
|
||||||
|
* 独立性
|
||||||
|
* 异步性
|
||||||
|
* 引入进程原因
|
||||||
|
* 使多道程序并发执行,提高资源利用率和系统吞吐量
|
||||||
|
* 其他考点
|
||||||
|
* 进程实体/进程映像 = PCB+程序段+相关数据段
|
||||||
|
* 进程映像是静态的,进程是动态的,程序是静态的
|
||||||
|
* 进程控制块(PCB)是进程的唯一标志
|
||||||
|
* 系统资源 = 处理机,存储器和其他设备服务于某个进程的时间【系统资源类似于处理机的时间片】
|
||||||
|
|
||||||
|
### 进程的状态与切换
|
||||||
|
|
||||||
|
* 五种状态
|
||||||
|
* 运行态Running 该进程占用CPU
|
||||||
|
* 就绪态Ready 进程获得了除处理机外的一切所需资源,一旦得到处理机就可以立即运行
|
||||||
|
* 阻塞态Blocked 该进程正在等待某一事件发生而暂停运行,即使给他CPU控制权,它也无法运行
|
||||||
|
* 创建态 New 进程正在被创建时的状态
|
||||||
|
* 结束态Exit 进程正在从系统中消失时的状态
|
||||||
|
* 进程转换
|
||||||
|
* 就绪态$\to$运行态
|
||||||
|
* 进程被调度,获得处理机资源(分派处理机时间片)
|
||||||
|
* 运行态$\to$就绪态
|
||||||
|
* 时间片用完后,不得不让出处理机
|
||||||
|
* 可剥夺的OS中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态
|
||||||
|
* 运行态$\to$阻塞态
|
||||||
|
* 进程请求某一资源(外设)的使用和分配时
|
||||||
|
* 等待某一事件的发生时(I/O操作的完成)
|
||||||
|
* 进程以系统调用的方式请求OS提供服务,这个过程系统从用户态转换为核心态
|
||||||
|
* 该过程为主动行为
|
||||||
|
* 阻塞态$\to$就绪态
|
||||||
|
* I/O操作结束或中断结束时
|
||||||
|
* 该过程为被动行为,需要其他相关进程的协助
|
||||||
|
|
||||||
|
|
||||||
|
### 进程的控制结构/数据结构
|
||||||
|
|
||||||
|
* PCB
|
||||||
|
* 进程存在的唯一标识
|
||||||
|
* 一个进程的存在,必然会有一个PCB,如果进程消失了,PCB也会随之消失
|
||||||
|
* PCB包含信息
|
||||||
|
* 进程描述信息
|
||||||
|
* 进程标识符PID:标识各个进程,每个进程都有一个并且唯一的标识符
|
||||||
|
* 用户标识符UID:进程归属的用户,用户标识符主要为共享和保护服务
|
||||||
|
* 进程控制和管理信息
|
||||||
|
* 进程当前状态:如new、ready、running、waiting、blocked等
|
||||||
|
* 进程优先级:进程抢占CPU时的优先级
|
||||||
|
* 资源分配清单
|
||||||
|
* 有关内存地址空间或虚拟地址空间的信息
|
||||||
|
* 所打开文件的列表和所使用的I/O设备信息
|
||||||
|
* CPU相关信息
|
||||||
|
* CPU中各个寄存器的值
|
||||||
|
* 进程被切换时,CPU的状态信息都会被保存在相应的PCB中以便进程重新执行时,从断点处继续执行
|
||||||
|
* 组织PCB
|
||||||
|
* 链接方式
|
||||||
|
* 把统一状态的PCB链成一个队列,不同状态对应不同队列
|
||||||
|
* 把处于阻塞态的进程的PCB,根据阻塞原因,排成多个阻塞队列
|
||||||
|
* 索引方式
|
||||||
|
* 把统一状态的进程组织在一个索引表中
|
||||||
|
* 如就绪索引表,阻塞索引表
|
||||||
|
* 程序段
|
||||||
|
* 能被进程调度程序调度到CPU执行的程序代码段
|
||||||
|
* 程序可以被多个进程共享,即多个进程可以运行同一个程序
|
||||||
|
* 数据段
|
||||||
|
* 可以是进程对应的程序加工处理的原始数据
|
||||||
|
* 可以是程序执行时产生的中间或最终结果
|
||||||
|
|
||||||
|
|
||||||
|
### 进程控制
|
||||||
|
|
||||||
|
* 创建
|
||||||
|
* 定义和过程
|
||||||
|
* 允许一个进程创建另一个进程
|
||||||
|
* 允许子进程继承父进程所拥有的资源
|
||||||
|
* 创建进程的过程:
|
||||||
|
* 申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息,比如进程的唯一标识等
|
||||||
|
* 为该进程分配运行时所必需的资源,如内存资源
|
||||||
|
* 将PCB插入到就绪队列,等待被调度运行
|
||||||
|
* 对应事件
|
||||||
|
* 中断登陆系统,作业调度
|
||||||
|
* 系统提供服务
|
||||||
|
* 用户程序的应用
|
||||||
|
* 设备分配不需要创建进程
|
||||||
|
* 终止
|
||||||
|
* 定义和过程
|
||||||
|
* 有3种终止方式:正常结束,异常结束以及外界干预
|
||||||
|
* 当子进程被终止时,其在父进程处继承的资源应当还给父进程
|
||||||
|
* 当父进程被终止时,该父进程的子进程就变为孤儿进程
|
||||||
|
* 终止进程的过程
|
||||||
|
* 查找需要终止的进程的PCB
|
||||||
|
* 如果处于执行状态,则立即终止该进程的执行,然后将CPU资源分配给其他进程
|
||||||
|
* 如果还有其他子进程,则将该进程的子进程交给1号进程接管
|
||||||
|
* 将该进程所拥有的全部资源都归还给操作系统
|
||||||
|
* 将其从PCB所在队列中删除
|
||||||
|
* 对应事件
|
||||||
|
* 正常结束
|
||||||
|
* 异常结束
|
||||||
|
* 外界干预
|
||||||
|
* 阻塞
|
||||||
|
* 定义和过程
|
||||||
|
* 当进程需要等待某一事件完成时,它可以调用阻塞语句把自己阻塞等待
|
||||||
|
* 一旦被阻塞等待,只能由另一个进程唤醒
|
||||||
|
* 阻塞进程的过程
|
||||||
|
* 找到将要被阻塞进程标识号对应的PCB
|
||||||
|
* 如果该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行
|
||||||
|
* 将该PCB插入到阻塞队列中去
|
||||||
|
* 对应事件
|
||||||
|
* 请求系统资源失败
|
||||||
|
* 等待某种操作的完成
|
||||||
|
* 新数据尚未到达或无新任务可做
|
||||||
|
* 唤醒
|
||||||
|
* 定义和过程
|
||||||
|
* 进程由运行转变为阻塞状态是由于进程必须等待某一事件的完成
|
||||||
|
* 处于阻塞状态的进程是绝对不可能自我唤醒
|
||||||
|
* 如果某进程正在等待I/O事件,需由别的进程发消息给它
|
||||||
|
* 只有当该进程所期待的事件出现时,才由发现者进程用唤醒语句叫醒它
|
||||||
|
* 唤醒进程的过程
|
||||||
|
* 在该事件的阻塞队列中找到相应进程的PCB
|
||||||
|
* 将其从阻塞队列中移出,重置状态为就绪状态
|
||||||
|
* 把该PCB插入到就绪队列中,等待调度程序调度;
|
||||||
|
* 对应事件
|
||||||
|
* 释放I/O设备的进程
|
||||||
|
* 提供数据的进程
|
||||||
|
|
||||||
|
### 进程的通信
|
||||||
|
|
||||||
|
* 定义
|
||||||
|
* 进程通信是指进程之间的信息交换
|
||||||
|
* 低级通信方法
|
||||||
|
* PV操作
|
||||||
|
* 高级通信方法
|
||||||
|
* 共享存储,如共享内存,共享文件系统
|
||||||
|
* 信息传递,需要发送消息和接受消息两个原语
|
||||||
|
* 管道通信
|
||||||
|
* 需要满足的能力 = 互斥+同步+确定对方的存在
|
||||||
|
* 缓冲区只允许一边写入,另一边读出,所以管道只能采用半双工通信
|
||||||
|
* 管道是一种文件,所以两个进程可以通过文件系统交换数据
|
||||||
|
* 共享存储:进程$\leftrightarrows$共享空间$\leftrightarrows$进程
|
||||||
|
* 信息传递:进程$\leftrightarrows$进程
|
||||||
|
* 管道通信:进程$\leftarrow$缓冲区$\leftarrow$进程$\rightarrow$缓冲区$\rightarrow$进程
|
||||||
|
|
||||||
|
|
||||||
|
### 进程的上下文切换
|
||||||
|
|
||||||
|
* 上下文
|
||||||
|
* 上下文是指某一时刻CPU寄存器和PC的内容
|
||||||
|
* 进程上下文切换
|
||||||
|
* 上下文切换时指一个进程切换到另一个进程的过程
|
||||||
|
* 上下文切换的实质
|
||||||
|
* 上下文切换实质是处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程的运行环境产生了实质性的变化
|
||||||
|
* 上下文切换的消耗
|
||||||
|
* 有些处理器提供多个寄存器组,上下文切换指需要简单改变当前寄存器组的指针
|
||||||
|
* 上下文切换的场景
|
||||||
|
* 某个进程时间片耗尽时
|
||||||
|
* 进程在系统资源不足时,要等到资源满足后才可以运行
|
||||||
|
* 进程通过sleep将自己挂起
|
||||||
|
* 由优先级更高的基础运行时
|
||||||
|
* 发送硬件中断时
|
||||||
|
* 上下文切换的流程
|
||||||
|
* 挂起一个进程,保存CPU上下文,包括PC和其他寄存器
|
||||||
|
* 更新PCB信息
|
||||||
|
* 把进程的PCB移到相应的队列
|
||||||
|
* 加载另一个进程执行,更新其PCB
|
||||||
|
* 跳转到新进程PCB中的PC所指向的位置执行
|
||||||
|
* 恢复处理机上下文
|
||||||
|
* 调度和切换的区别
|
||||||
|
* 先有资源的调度,才有进程的切换
|
||||||
|
* 调度:决定资源分配给哪个进程的行为,是一种决策行为
|
||||||
|
* 切换:实际分配的行为,是一种执行行为
|
||||||
|
|
||||||
|
## 线程
|
||||||
|
|
||||||
|
### 常考知识点
|
||||||
|
|
||||||
|
* 关于线程的特征
|
||||||
|
* 线程是处理机调度的基本单位,可以独立执行程序
|
||||||
|
* 没有相同的进程,但是调用在不同进程中的线程可以相同
|
||||||
|
* 关于线程可共享的东西
|
||||||
|
* 线程没有自己独立的地址空间,每个线程只拥有自己的独立的栈空间
|
||||||
|
* 线程之间可以共享进程的资源(如代码段,堆空间,数据段,打开的文件)
|
||||||
|
* 线程之间不能共享虚拟地址空间,线程之间不能共享栈指针
|
||||||
|
* 线程的并行与并发
|
||||||
|
* 同一进程或不同进程内的线程都可以并发执行
|
||||||
|
* 进程之间可以并发但不可以并行,同一进程之间的线程可以并行
|
||||||
|
* 其他
|
||||||
|
* 键盘驱动程序不能体现多线程系统的特点,因为计算机一般只有一个键盘
|
||||||
|
|
||||||
|
|
||||||
|
### 进程与线程的比较
|
||||||
|
|
||||||
|
| |进程 | 线程 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
|是什么的单位|是资源分配的基本单位|是调度的基本单位|
|
||||||
|
|不能共享什么|不能共享虚拟地址空间|不能共享栈指针|
|
||||||
|
|可以共享什么|拥有一个完整的资源平台,每个进程都有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问|某进程中的线程对其他进程不可见,线程共享进程的地址空间和资源,线程自己没有独立的地址空间,只共享必不可少的资源,如寄存器和栈|
|
||||||
|
|进程切换会引起什么|不同进程的线程的切换会引起进程切换|同一进程的线程的切换不会引起进程切换|
|
||||||
|
|创建、终止、切换时间|慢|快|
|
||||||
|
|数据交换效率|低|各线程间共享内存和文件资源,数据交换效率高|
|
||||||
|
|
||||||
|
### 线程的概念与特征
|
||||||
|
|
||||||
|
* 定义
|
||||||
|
* 线程是进程当中的一条执行流程
|
||||||
|
* 线程之间可以并发运行且共享相同的地址空间
|
||||||
|
* 线程自己不拥有系统资源,但可与同属一个进程的程序共享进程所有的资源
|
||||||
|
* 线程同样具有三种基本状态:运行态+阻塞态+就绪态
|
||||||
|
* 为什么引入线程
|
||||||
|
* 减少程序在并发执行过程中所付出的时空开销,提高操作系统的并发能力
|
||||||
|
* 引入线程提高系统并发性原因
|
||||||
|
* 线程可以导致平均每次切换所需开销变少,使更多线程参与并发
|
||||||
|
|
||||||
|
### 线程组成和控制
|
||||||
|
|
||||||
|
*
|
Loading…
Reference in New Issue