操作系统

一. 计算机系统概述

1. 基本概念和特征

操作系统是指控制和管理整个计算机系统的硬件和软件资源
合理组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合

并行是指两个或多个事件在同一时刻发生,并发是指两个或多个事件在同一时间间隔发生
单处理器微观上只能分时并发运行,多处理器可以并行

  • 并发:处理和调度多个程序同时执行,并发性通过分时实现
  • 共享:互斥共享临界资源、同时(分时)访问共享资源
  • 虚拟:物理实体变成若干逻辑上对应物,例如虚拟处理器、虚拟内存、虚拟外部设备,采用时分和空分复用技术
  • 异步:进程的执行并不是一贯到底,而是走走停停

操作系统的目标和功能:计算机系统资源的管理者,用户与计算机硬件系统之间的接口(系统调用--内核态)

  • 处理机管理(进程管理):进程控制、进程同步、进程通信、死锁处理、处理机调度
  • 存储器管理:内存的分配与回收、地址映射、内存保护与共享和内存扩充
  • 文件管理:文件存储空间的管理、目录管理及文件读写管理和保护
  • 设备管理:缓冲管理、设备分配、设备处理和虚拟设备

2. 发展和分类

题型:计算CPU利用率、画两进程甘特图
CPU和I/O设备之间速度不匹配的矛盾

  • 单道批处理系统:内存中始终保持一道作业
  • 多道批处理系统(多道程序设计技术):允许同时进入内存,并交替使用CPU
  • 分时操作系统:时间片轮流分配给联机作业
  • 实时操作系统:紧急任务不需要时间片排队
    发展过程:手工-脱机-批处理-多道批处理-分时操作系统-实时操作系统-网络操作系统-分布式操作系统-个人计算机

3. 运行环境

CPU执行内核程序和用户程序
CPU状态分为内核态和用户态,在内核态中使用特权指令执行如I/O指令、置中断指令、存储内存保护的寄存器、送程序状态字到寄存器

  • 时钟管理:第一功能是计时,在分时操作系统中通过时钟中断进行进程的切换
  • 中断机制:目的是为了提高CPU利用率,键鼠输入、进程管理调度、系统功能调用、设备驱动、文件访问都要依赖于中断机制
  • 原语:最接近硬件的不可分割动作(出于安全)
  • 数据结构:作业控制块、进程控制块(PCB)、设备控制块、链表、消息队列、缓冲区、空闲区登记表、内存分配表等

4. 中断和异常

发生中断或异常时,用户态的CPU会进入核心态,本质上是占有权的释放(中断是唯一途径),通过硬件完成
中断(外中断):CPU执行指令以外的事件,如设备的I/O、时钟中断、访管中断
异常(内中断):也称陷入,CPU内部事件引起的,如地址越界、算数溢出、缺页、非法操作码(故障处理后结束原程序)

中断处理过程
硬件完成——关中断、保存断点(程序计数器PC)、中断服务程序寻址(入口地址入PC)
中断程序完成——保存现场和屏蔽字(程序状态寄存器)、开中断、执行中断服务程序、关中断、恢复现场、开中断、中断返回

5. 系统调用

凡是与资源有关的操作,都必须通过系统调用的方式向操作系统提出服务请求
用户程序执行陷入指令(访管指令)发起系统调用,此时会产生一个自愿中断事件,CPU由用户态进入核心态
目的是为了保护系统的稳定性和安全性,防止用户随机更改或访问重要的系统资源

时钟管理、地址映射、中断系统都需要硬件支持,通道是一种硬件技术
多道程序技术依赖于中断和通道
通道一旦被启动就独立于CPU运行,因而做到了输入、输出与CPU并行工作
CPU启动通道后,便可以执行其他计算工作,而无需等待I/O,通道工作结束后发出中断请求,这时先处理中断,然后继续原来的工作

二. 进程管理

1. 进程和线程

1.1 进程的概念

为了更好的控制多个程序的并发执行,实现并发和共享,引入进程
进程映射(进程实体):程序段(多个进程可以运行同一程序)、相关数据段、PCB
进程映像是静态的、进程是动态的
PCB是进程存在的唯一标志
进程是资源分配和调度的独立单位,例如处理机的时间片

1.2 进程控制块结构

PCB创建后常驻内存
调度进程后,根据PCB保留的处理机信息恢复现场,并根据程序和数据的内存始址找到程序和数据
进程实现同步、通信或访问文件时,也需访问PCB,结束运行时,在PCB中保留断点的处理机环境
系统唯有通过PCB才能感知到进程的存在
各种状态(就绪、阻塞)的进程通过链接和索引的方式组织在一起

1.3 进程的状态和切换

进程的状态:运行态、就绪态、阻塞态、创建态、结束态
就绪态仅缺少处理机,获得处理机后转为运行态,时间片到又转为就绪
阻塞态只能由运行态转换而成(主动),比如等待I/O,当I/O操作结束,阻塞态转为就绪态(被动)

1.4 进程控制
  • 进程的创建:用户登录、作业调度、系统提供服务、应用请求都会引起进程的创建
    分配唯一进程标识号并申请PCB——>分配内存空间(不足阻塞)——>初始化PCB——>放入就绪队列
  • 进程的终止:正常结束、异常结束、外界干预
  • 进程的阻塞和唤醒:主动阻塞进等待队列,转让处理机资源,期待事件发生后进就绪队列
  • 进程切换:切换进程,进程环境信息也将发生改变,更新PCB(处理机模式切换不用改变环境,中断时只需保存CPU现场)
    父进程创建子进程后,二者并发执行(主程序调用主程序,主程序暂停在调用点)
1.5 进程通信

PV操作是低级通信方式
高级方式分为以下三类

  • 共享存储:通过直接访问的共享空间进行同步互斥的信息交换
  • 消息传递:通过中间的缓冲队列(信箱)进行消息的传递
  • 管道通信(半双工):管道实际上是一个固定大小的缓冲区,天然具有同步、互斥功能
    因为每个进程都有独立的地址空间,所以要通过内核进行通信,严格限制每个进程访问权限
1.6 线程

线程是基本的CPU执行单元
可以共享进程的全部资源(本身不拥有资源),由线程ID、程序计数器、寄存器和堆栈组成
引入线程后,进程作为除CPU外的系统资源的分配单元,线程作为处理机的分配单元
线程同样可以并发执行,同一进程内的线程切换开销很小、同步和通信非常容易实现

  • 用户级线程:所有工作由应用程序完成,内核意识不到线程存在
  • 内核级线程:线程管理由内核完成
  • 多线程模型:多对一模型(并发度不高)、一对一模型(开销大)、多对多模型

2. 处理机调度

进程数量多于处理机个数,需要采取一定的策略进行处理机资源的分配
调度的层次

  • 作业调度(高级调度):外存的作业调入内存中,分配资源创建相应的进程并挂到就绪队列
  • 内存调度(中级调度):阻塞队列的进程调到外存中等待(挂起态),具备条件且内存空闲时,再调回内存并修改为就绪态
  • 进程调度(低级调度):从就绪队列中选出一个进程分配处理机

非剥夺调度方式(非抢占方式):适用批处理系统,不适用分时系统和实时系统
剥夺调度方式(抢占方式):优先权、短进程优先、时间片原则(提高吞吐率和响应效率)
调度的基本原则:CPU利用率、系统吞吐率、周转时间、等待时间、响应时间

  1. 先来先服务调度算法(FCFS):每次从就绪队列选择最先进入队列的进程,是不可剥夺算法
    利于长作业,不利于短作业,利于CPU繁忙作业,不利于I/O繁忙作业
  2. 短作业优先调度算法(SJF):从内存(就绪队列)中选择时间最短的作业(进程),直至运行结束或阻塞
    对长作业不利,容易导致饥饿,但平均等待和周转时间最少
  3. 优先级调度算法:每次选择优先级最高的进程(作业)
  4. 高响应比优先调度算法:每次作业调度,先计算响应比,然后选择响应比最高的作业投入运行
    等待时间相同等价于短作业优先,服务时间相同等价于先来先服务,同时兼顾长作业克服了饥饿
    \(响应比=\frac{等待时间+服务时间}{服务时间}\)
  5. 时间片轮转调度算法:适用分时系统,时间片足够大退化成先来先服务
  6. 多级反馈队列调度算法:时间片轮转调度和优先级调度的综合
    设置多个就绪队列,赋予不同优先级(逐渐降低),赋予队列不同的时间片(逐渐增加)

3. 进程同步

进程是并发执行的,不同进程之间存在相互制约关系,所以引入进程同步的概念
临界资源:一次只允许一个进程使用的资源
同步(直接制约关系):公共信号量初值为0,两进程之间合作
互斥(间接制约关系):公共信号量初值为1,两进程之间竞争

软件实现方法

  • 单标志法:设置一个公共整型turn,两进程必须交替进入临界区,否则死锁
  • 双标志法先检查:进入临界区后,锁住对方,缺点是可能会同时进入临界区(并发)
  • 双标志法后检查:先锁住对方,再进入临界区,缺点是会同时谦让导致饥饿(并发)
  • Peterson's Algorithm:针对双标志后检查的优化,再设置一个公共turn进行谦让(后修改的谦让)

硬件实现方法

  • 中断屏蔽法:进入临界区后关中断,防止进程切换
  • 硬件指令法(TestAndSet):原子操作修改公共变量,不会被并发所影响,无法被中断

信号量机制(本质上是通过无法被中断的资源分配语句来实现并发程序的资源共享)
通过两个标准原语wait(S)、signal(S)访问,也可记为P操作(消耗资源),V操作(释放资源)

  • 整型信号量:定义一个代表资源数的整型量S,未遵循让权等待
  • 记录型信号量:除代表资源数的value外,再增加进程链表,符合让权等待原则
    利用信号量实现同步(0)、互斥(1)、前驱关系(多同步)
    信号量应用题

管程
代表共享数据的数据结构和对共享数据实时操作的一组过程组成的资源管理程序
管程把共享数据的操作封装起来,每次仅允许一个进程进入管程(互斥)
条件变量(同步):仅实现排队等待功能,不反应剩余资源数量(数据结构记录)
x.wait:资源不够在条件变量x上阻塞等待
x.signal:唤醒一个阻塞进程

4. 死锁

两个或两个以上进程占有自身资源并请求对方资源时,导致每个进程都无法推进
必要条件(死锁预防

  1. 互斥条件
  2. 不剥夺条件
  3. 请求并等待条件:一次申请完所需全部资源
  4. 循环等待条件:采用顺序资源分配法

死锁避免:防止进入不安全状态
安全性算法:初始安全序列为空,找出Need矩阵小于Available的行,回溯法递归释放资源,直至查找完成或遍历全部空间
银行家算法:发出请求后进行Need检验,再进行Available检验,尝试分配,然后进行安全性算法检验

死锁检测和解除
死锁可用资源分配图来描述:圈(进程)、框中圆(资源个数)、进程->资源(请求边)、资源->进程(分配边)
简化资源分配图可检测死锁状态:找出不阻塞的点进行资源释放
死锁解除:资源剥夺、撤销进程、进程回退

三. 内存管理

1. 内存管理概念

内存管理是为了提高内存利用率

  • 内存空间的分配与回收
  • 地址转换:逻辑地址转换成物理地址
  • 内存空间扩充:虚拟内存技术
  • 存储保护

创建进程前要将程序和数据装入内存
编译——>链接——>装入
静态链接、装入时动态链接、运行时动态链接
绝对装入、可重定位装入(静态重定位)、动态运行时装入(动态重定位)
编译后每个目标模块都从0单元开始编址,链接成一个完整的可执行程序时,依次将个模块相对地址构成同一从0开始的逻辑地址空间
可执行代码装入内存时,必须将逻辑地址转换成物理地址,这个过程称为地址重定位

内存保护:通过界地址寄存器判断地址是否越界(比),再用重定位寄存器进行地址重定位(加)

2. 连续分配

  • 单一连续分配:内存中只有一道程序,有内部碎片
  • 固定分区分配:每个分区只装入一道作业,有内部碎片
  • 动态分区分配:动态建立分区,产生外部碎片,通过紧凑解决
    首次适应(地址最先)、最佳适应(最小)、最坏(最大)适应、邻近适应(循环首次)

3. 非连续分配

程序装入不相邻内存分区,需要额外空间存储它们的索引

3.1 基本分页存储管理(一维)

内存空间划分为大小相等且固定的块,块相对较小,进程在执行时以块为单位逐个申请内存中的块空间(内部碎片较小)
页面大小应是2的整数幂,方便地址转换,页面太小会导致页面数过多,页表过长占用大量内存,太大会使内部碎片增多,降低内存利用率
逻辑地址结构:前一部分页号P,后一部分页内偏移量W,地址长度32位,0~11位为页内地址,则每页大小4KB
页表(在内存中):第一部分页号,第二部分物理内存中的块号(实现页号到物理块号的映射)
页表项长度:根据地址空间页数来计算
逻辑地址转物理地址:进程控制块将页表始址和长度存入页表寄存器(PTR),通过硬件自动完成计算
页号P=A/L,偏移量W=A%L(L为页面大小),找页号对应块号,计算物理地址E = b×L+W
存取一条数据要访问两次内存(页表->内存地址)
快表(TLB):地址变换机构中增设的高速缓冲存储器,相当于替换了内存中页表(慢表),不在快表中则在慢表中找,同时将其存入快表
二级页表:拆分页号,为页表建立索引页表,进程运行时不用将全部页表调入内存

3.2 基本分段存储管理(二维)

从用户和程序员角度设计的,需要显式的给出(段号,段内偏移)
段表:记录段号对应的段长和本段在内存中的始址
地址变换:从逻辑地址中取出段号、段内偏移,判断是否越界,从段表中找始址,与偏移求和得到对应物理地址

3.3 段页式管理方式(二维)

本质上只是把段式存储的中的段进一步拆分成页,原本的段内偏移也就成了页式的逻辑地址
逻辑地址:段号、页号、页内偏移
段表中存储段长和页表起始地址,页表存储页号和对应块号
需要三次访问内存

4. 虚拟内存和请求分页

4.1 虚拟内存概念

虚拟内存使用外存上的空间来扩充内存空间,通过一定的换入/换出,在逻辑上扩充内存
基于局部性原理,将程序的一部分装入内存,其余部分留在外存,访问信息不存在时才将所需从外存调入,这样系统就在逻辑上扩充了内存
虚拟内存的实现建立在离散分配的内存管理方式:请求分页存储管理、请求分段存储管理、请求段页式存储管理
硬件支持:内存外存、页表机制、中断机构、地址变换机构

4.2 请求分页管理

请求分页系统在基本分页的基础上,增加了请求调页功能页面置换功能
页表机制:除页号、块号外,还有状态位(是否调入内存)、访问字段(最近访问情况)、修改位、外存地址
缺页中断机构:缺页中断将进程阻塞,内存有空闲则调入,否则淘汰(修改需要写会外存)再调入,最后修改页表
地址变换机构:检查溢出、检索快表、访问页表、缺页中断申请调页、形成物理地址

4.3 页面置换算法(淘汰页策略)

最佳置换(OPT):淘汰掉未来最长时间内不再被访问页面,获得最低的缺页率(无法实现)
先进先出(FIFO):淘汰驻留时间最久的页面,会出现Belady异常(物理块数增加页故障数不减反增)
最近最久未使用(LRU):淘汰最久未被访问(认为未来也不会访问)
时钟置换(最近未用):每个帧关联一个使用位,初始置为1,扫描置0,替换使用位为0的页

4.4 页面分配策略

驻留集大小(过小页错误率变高,过大进程数减少利用率下降)
固定分配局部置换、可变分配全局置换(留区调入)、可变分配局部置换(动态增减)
调入页面的时机:预调页策略(运行前)、请求调页策略(运行期间,较多I/O开销)
外存分为文件区(离散分配)和对换区(连续分配)
抖动:刚换出的页面马上又换入内存,刚换入的页面马上又换出主存,导致换页时间多于执行时间

工作集:由时间t和工作机窗口大小来确定,局部性好的程序工作集比窗口小很多,物理块数(驻留集)应大于工作集

4.5 地址翻译(结合计组)

根据页面大小编址单位大小计算页内偏移占位,再根据虚拟地址位物理地址位分别计算虚拟页号物理页号
虚拟页号位也表示TLB标识和TLB组索引,根据Cache行大小和组数,计算物理地址各位的含义(标记、索引、偏移)

查找过程:虚拟地址转换成二进制形式(得到TLB组索引和标记)、查TLB(存在则直接拼接偏移量)、查页表(存在直接拼接)
根据物理地址(得到标记、索引、偏移)找Cache、最后找内存

四. 文件管理

1. 文件基础

文件是以计算机硬盘为载体的存储在计算机上的信息集合,用户输入、输出时以文件为基本单位
文件的打开和关闭:首次打开文件时,调用open将文件属性从外存复制到内存打开文件表的表目中,并返回指针给用户
FCB复制到系统范围打开文件表(存储打开该文件进程数量)、单个进程的文件打开表新增条目指向该位置,实际上open先搜索前者
以后对于文件的操作都是通过该指针进行,省略搜索环节,当不再使用时删除这一条目

2. 文件逻辑结构

无结构文件(流式文件)
有结构文件(记录式文件):为查找服务

  1. 顺序文件:对记录进行批量操作,用于磁带存储数据
  2. 索引文件:定长文件直接计算,变长文件通过索引表查找
  3. 索引顺序文件:类似数据结构查找的分块查找,组内无序,组与组之间关键字有序
  4. 直接文件(散列文件)

3. 目录结构

为了实现目录管理,引入文件控制块(FCB),FCB必须连续存放
一个FCB就是一个文件目录项,包含文件名、物理位置、逻辑结构、物理结构、存储控制信息、使用信息等
若将文件名和文件描述信息分开,文件描述信息形成索引节点,目录项由文件名和指向节点指针构成
存放在磁盘上的索引节点称为磁盘索引节点
文件被打开时,磁盘索引节点复制到内存索引节点中

  1. 单级目录结构:不允许重名,不便于文件共享,查找速度慢
  2. 两级目录结构:解决重名问题,但缺乏灵活性
  3. 多级目录结构(树形):方面进行分类,增加了磁盘访问次数
  4. 无环图目录结构:有向无环图,实现文件共享,共享节点需要设置计数器

4. 文件共享

  • 基于索引节点的共享方式
    目录只设置文件名和指向索引节点的指针,索引节点上还应有链接计数器
  • 利用符号链实现文件共享(软链接)
    共享文件时,只是增添了一个链接文件,包含对应文件的路径名,实现间接访问
    网络共享时只用提供网络地址及文件路径即可

5. 文件保护

通过口令保护、加密保护和访问控制等方式实现
最常用的是访问控制,给每个文件和目录增添访问控制列表,以限制访问权限
口令是用户建立文件时提供一个口令赋给FCB,并告诉共享该文件的其他用户,但口令存在系统中不够安全
密码是用户对文件进行加密,访问需要使用密匙

6. 文件系统层次结构

  1. 用户调用接口(系统调用):新建、打开、读写、关闭、删除文件,建立删除目录
  2. 文件目录系统
  3. 存取控制验证模块(文件保护)
  4. 逻辑文件系统与文件信息缓冲区(获得逻辑地址)
  5. 物理文件系统:逻辑记录相对块号转换成物理地址
  6. 辅助分配模块
  7. 设备管理程序模块:分配设备、分配释放读写用缓冲区、磁盘调度、启动释放设备、处理设备中断
7. 文件实现(物理结构)

文件查找:线性查找和散列查找
文件的分配方式(非空闲块的管理)和存储空间管理(空闲块的管理)
文件分配

  1. 连续分配:目录条目包括开始块地址和文件总长度(寻道数和寻道时间最小),适用长度固定文件
  2. 链接分配:目录包括第一块指针和最后一块,不能直接访问
    隐式链接每个盘块都有指向下一盘块指针
    显式链接通过一张文件分配表(FAT),类似静态链表,系统启动读入内存,每个表项存下一块链接地址,FAT还能对空闲块进行管理
  3. 索引分配:每个文件都有索引块(增加存储开销),目录条目包括索引块地址
    对于大文件,采用链接方案、多层索引(类似多级页表)、混合索引

存储空间管理

  1. 空闲表法:建立空闲盘块表,记录所有的连续空闲空间(类似内存连续分配的动态分配,同样采用首次适应、循环首次适应等算法)
  2. 空闲链表法:将所有空闲盘区拉成空闲链,分为空闲盘块链和空闲盘区链
  3. 位示图法:用二进制数表示盘块使用情况,注意盘块号和位示图行列转换
  4. 成组链接法:结合空闲表和空闲链表
8. 磁盘结构

磁道:盘面上的一个同心圆 扇区:磁道根据角度进一步划分而成,存储大小固定 (容易得知内道存储密度更大)
磁盘读写时间:寻找时间(跨磁道时间和启动时间)、旋转延迟时间(转半圈时间)、传输时间(字节数除传输速度)
磁盘调度算法(减少寻找时间)

  1. 先来先服务(FCFS):保证公平
  2. 最短寻找时间(SSTF):贪心选择最近磁道,容易饥饿
  3. 扫描算法(SCAN):也称电梯调度算法,贪心规定了磁头移动方向
  4. 循环扫描算法(C-SCAN):严格从一端到另一端

减少延迟时间:盘面扇区交替编号,同柱面不同扇区错位编号

五. 输入/输出管理

设备控制主要任务是控制设备和内存或处理机之间的数据传输

1. I/O设备

按使用特性:人机交互设备、存储设备、网络通信设备
按传输速率:低速(键盘)、中速(打印机)、高速设备(磁盘)
按信息交换单位:块设备(存储信息的设备)、字符设备(数据输入输出)

2. I/O控制方式(结合计组)

  1. 程序直接控制方式:对读取的每个数据,CPU都要检查,绝大部分时间处于等待I/O中,CPU和I/O只能串行工作
  2. 中断驱动方式:允许I/O设备主动打断CPU,可以并行工作,但每个数据传输要中断并经过CPU,仍会消耗较多CPU时间
  3. DMA方式:I/O设备和内存间开辟数据交换通路,彻底解放CPU(DMA控制器),传输开始和结束才需要中断和CPU参与
  4. 通道控制方式:一个通道可以控制多台设备与内存数据交换

3. I/O的层次结构(可移植性)

  1. 用户层I/O软件:实现用户交互接口
  2. 设备独立性软件:引入逻辑设备和物理设备概念,增加分配灵活性
  3. 设备驱动程序:每类设备配置一个设备驱动程序,接受上层抽象I/O要求
  4. 中断处理程序:进行上下文切换、保存CPU环境
  5. 硬件设备:通常包含电子部件(适配器)和机械部件

4. I/O的核心子系统

子系统提供服务包括I/O调度、缓冲与高速缓存、设备分配与回收、假脱机、设备保护、差错处理
I/O调度:应用程序的系统调用不一定总是最佳选择,需要调度来改善性能,减少平均等待时间(磁盘调度属于I/O调度一种)
磁盘高速缓存:逻辑上属于磁盘,物理上属于内存,存储低速设备的复制数据
缓冲区:位于内存区域(高速与低速的间接访问信道),缓和CPU和I/O设备速度不匹配矛盾,减少中断,提高并行性(必须充满后才能传出)

  • 单缓冲:先把数据写入缓冲区,再让需要数据的设备或处理机取走数据,处理时间为max(C+T)+M,因为T和C可以并行
  • 双缓冲:可以源源不断输入数据,用时max(T,C+M)
  • 循环缓冲:多个缓冲构成环形
  • 缓冲池:包含空队列、输入队列、输出队列

设备分配与回收:充分发挥设备效率,避免造成死锁
独占式使用设备、分时式共享使用设备、SPOOLing(实际上空间换时间,进行I/O批处理)
设备分配的数据结构

  • 设备控制表(DCT):一个设备控制表表征一个设备
  • 控制器控制表(COCT)
  • 通道控制表(CHCT):与控制器控制表是一对多的关系
  • 系统设备表(SDT):整个系统只有一张,记录所有物理设备情况,与设备控制表一对多关系

SPOOLing技术
将独占设备改为共享设备的技术
输入井(模拟输入时的磁盘)和输出井(模拟输出时的磁盘)是在磁盘上开辟的两个存储区域
输入缓冲区(暂存输入设备数据)和输出缓冲区(暂存输出井送来的数据)是内存中开辟的两个区域
输入过程:输入机通过输入缓冲区送到输入井中,CPU需要数据时,从输入井读入内存
输出过程:输出数据先从内存送到输出井,输出设备空闲时,再将输出井通过输出缓冲区送到输出设备
本质上是外存暂存输入输出数据,与低速设备数据交换时要借助缓冲区

posted @ 2022-08-19 22:36  失控D大白兔  阅读(51)  评论(0编辑  收藏  举报