《操作系统概念》知识点期末复习整理

对应《操作系统概念》第7版以及《王道论坛操作系统》

另外附上三个 HTML 思维导图(操作系统概述、进程、调度)

网盘链接:https://pan.baidu.com/s/1w3wxqH1ug9g4FjkteQ5aYg
提取码:l9e1

1 操作系统综述

  • 一个完整的计算机系统是由硬件系统和软件系统组成

  • 操作系统是控制和管理计算机硬件和软件的资源,合理对各作业进行调度,以及方便用户使用程序的集合

  • 进程是一个运行的程序实例,由程序、数据、PCB组成,是系统资源分配的基本单位,进程间需要同步互斥是因为进程间会相互制约

  • 从用户视角看,操作系统是使用计算机硬件的接口

    从系统角度看,操作系统是资源分配器和控制程序

  • 存储层次结构,随着层次结构下移,每一个位的存储价格通常降低,而访问时间通常增加

  • 用户与操作系统界面

    • 命令行或命令中断
    • 图形用户界面
    • 注意:系统调用不是,用户是间接的使用系统调用的。系统调用接口也不是系统调用
  • 微内核:便于扩充操作系统;便于移植;有更好的安全性。但是系统功能总开销增加导致了系统性能下降

  • 虚拟机:提供对系统资源的完全保护;解决系统兼容性问题的方法之一;其上开发不影响主机

1.1 向操作系统传递参数的三种方法
  • 通过寄存器来传递参数:最简单
  • 通过在内存中的块和表,将块的地址通过寄存器来传递:寄存器不够的时候
  • 通过放在程序或压入栈中,并通过操作系统弹出:不限制传递参数的数量或长度
1.2 中断

事件的发生通常通过软件、硬件中断

硬件可随时通过系统总线向CPU发出信号

软件通过系统调用也能触发中断。陷阱是软件中断

中断必须将控制转移到中断处理程序

1.3 双重模式操作
  • 用户模式(目态)
  • 特权模式(管态)
1.4 特权指令

用户只有通过计算机系统提供的访管指令才能实现由目态转为管态,进而调用这些功能程序的目的

访管指令是非特权指令,功能是产生一个软中断,促使中央处理机由目态转为管态,也是操作系统唯一不能执行的非特权指令

1.5 多处理器的优点

增加吞吐量、节省钱、增加可靠性

1.6 多道程序设计

用过组织作业使CPU总有一个作业可以执行,从而提高了CPU的利用率。宏观上并行,微观上串行

2 线程

从 Linux 内核的角度来说,它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。线程创建的时候,加上了 CLONE_VM 标记,这样 线程的内存描述符 将直接指向 父进程的内存描述符。

系统调度的最小单位,与属于同一进程的其他线程共享代码段、数据段(全局变量)、堆区和其他操作系统资源。

通过pthread_create(&tid,&attr,func,argv)CreatThread(null,0,func,argv,0,&tid)可以创建线程,pthread_join(&tid,NULL)WaitForSingleObject(handle,infinit)可以等待线程完成,pthread_exit(0)CloseHandle退出

2.1 多线程编程的优点

响应度高、资源共享、经济(创建和切换线程更经济,进程就比较昂贵),在多CPU上加强了并发功能

2.2 多线程模型
  • 多对一:实现简单,开销小,效率高,但一个阻塞全阻塞
  • 一对一:创建内核线程开销大,且限制了线程个数
  • 多对多:多路复用了许多用户线程到同样数量或更小数量的内核线程上,可以创建更多线程,并且一个线程阻塞可以调度另一个线程执行
2.3 线程库:为程序员提供创建和管理线程的API
  • 内核级线程库
    由操作系统直接支持

  • 用户级线程库
    没有内核支持

2.4 线程池

在进程开始时创建一定数量的线程,并放入到池中以等待工作。当服务器收到请求时会唤醒池中一个线程,一旦线程完成服务,它会返回到池中继续等待

优点

  • 用现有的线程处理请求要比重新创建一个新线程快
  • 限制了可用的线程数量,更可靠
  • 将执行和创建线程分离
2.5 LWP轻量级进程

这是在用户和内核线程之间设置的一种数据结构。对于用户级线程,LWP表现为一种应用程序可以调用用户线程来运行的虚拟处理器。每个LWP与内核线程相连,该内核线程被OS调度到CPU运行

3 进程

进程不可以无限创建,进程句柄是DWORD类型,那么理论上进程数量最多就是 2 32 2^{32} 232 次方,在达到 2 32 2^{32} 232 次方之前,受计算机资源限制。

一个进程也不可以包含无限个线程。在 linux 中与线程栈大小有关,调整线程栈大小可以增加/减少创建的线程数.

  • 通过命令 ulimit -s 或者 ulimit -a 可以查看默认栈大小
  • 通过命令 ulimit -s+ 参数,临时修改线程栈大小

进程是一个活动的实体。提交到系统的作业还没有被投入运行前,这些作业放在辅助存储器中,形成后备作业队列

  • 操作系统管理进程:创建、删除、挂起、唤醒进程,进程通信,死锁处理
3.1 调度准则
  • CPU使用率 = 运行时间 / 总时间
  • 吞吐量 = 完成了几个任务 / 总时间,即每单位时间内完成的任务数
  • 周转时间 = 完成时间 - 提交时间
  • 等待时间 = 在就绪队列 和 等待队列中的时间
  • 响应时间:交互系统希望这个要小,响应比 = 等待时间 / 需要CPU的时间
3.2 调度程序

分派程序:CPU调度把控制交给调度的进程,需要切换上下文,切换到用户模式,跳转到合适的位置执行

  • 长期调度:外存→内存

  • 短期调度(CPU调度/进程调度):内存→CPU

    • 先来先服务 FCFS

      • 优点:公平,不会导致饥饿

      • 缺点:对长作业有利,短作业不利(护航效果)

    • 短作业优先 SJF (抢占/非抢占)

      • 优点:如果所有作业”同时“到达后备作业队列,那么采用短作业优先的作业调度算法总会获得最小的平均周转时间和最小的平均等待时间

      • 缺点:不公平,会饿死,对短作业有利,长作业不利

      由于SJF需要知道下一个CPU区间的长度,所以难以实现。一般用近似SJF调度

      下一个CPU区间可预测为 以前CPU区间的指数平均

      τ ( n + 1 ) = α t ( n ) + ( 1 − α ) τ ( n ) τ(n+1) = αt(n)+(1-α)τ(n) τ(n+1)=αt(n)+(1α)τ(n) ,线性插值,τ是预测,t是实际,α可以看做是近期实际区间的重要性(书上说的α表示最近历史的重要性,τ存储了过去历史)。

    • 优先级调度 (抢占/非抢占)

      • 优点:区分任务紧急程度
      • 缺点:低优先级进程会饿死

      老化技术:逐渐增加在系统中等待很长时间的进程的优先级

    • 时间片轮转 RR

      • 优点:专门为分时系统设计的,公平,响应快,不会饥饿
      • 缺点:进程频繁切换开销大,平均等待时间长

      如果时间片太大,变成FCFS;如果时间片太小开销又很大

    • 多级队列
      一个进程永久地被分配到一个队列。每个队列有自己的调度算法。队列间也要有调度算法,通常采用优先级抢占调度。每个队列与更底层的队列比有更高的优先级。另一种是每个队列有一定的时间片。

      最常用的模型例如RR调度前台交互队列,FCFS调度后台批处理队列。

    • 多级反馈队列

      • 优点:开销小
      • 缺点:不够灵活

      FCFS+RR+SJF,允许进程在队列间移动。如果进程使用过多的CPU时间会转移到低优先级的队列;在较低优先级队列中等待时间过长的进程会被转移到更高优先级的队列。这种形式的老化阻止饥饿发生

    注意:如果所有作业”同时“到达后备作业队列,那么采用短作业优先的作业调度算法总会获得最小的平均周转时间

  • 中期调度:将进程从内存中移出,从而降低多道程序设计程度。之后进程能被重新调入内存,并从中断处执行(交换)

3.3 调度算法评估

为了最大化CPU使用率 和 吞吐量

  • 确定模型:分析评估法、确定模型法;排队模型;模拟;实现
3.4 上下文切换

进程的上下文用PCB表示

先保存P1的PCB,然后执行系统调用或中断,加载P2的PCB执行;再通过系统调用或中断,保存P2的PCB,加载P1的PCB回到开始中断处继续执行P1

3.5 创建子进程
  • 父进程必须在其子进程之间功分配资源或共享资源
  • 系统调用fork()CreateProcess()可以创建子进程,fork创建的子进程是父进程的复制,但是父子进程中的变量的独立的,二者并发执行
3.6 通信模型
  • 消息传递模型:进程通过彼此间交换消息来交换信息。直接或间接的通过一个“信箱”来交换信息

    • 交换少量数据比较有用,也更容易实现,通常通过系统调用来实现,因此需要内核介入
    • 直接通信:send()、receive()原语,需要明确指出接受者/发送者
    • 间接通信:通过信箱或端口来发送和接收
  • 共享内存模型:建立起一块供协作进程共享的内存区域

    • 不需要内核帮助,速度比消息传递快

    • 生产者消费者
      in==out表示缓冲区空;(in+1)%bufsize==out表示缓冲区满。

3.7 临界区

进程访问临界资源的那段代码

3.8 互斥同步
  • 进入区,临界区,退出区,剩余区

  • 临界区必须满足三个要求:互斥;前进(能进入的时候就能够进入);有限等待(不能一直阻塞)

  • Peterson算法(基于软件)

    • 两个进程在临界区与剩余区交替执行;
    • 共享两个数据项,一个是turn:表示谁可以进入;一个是bool flag[2]:表示谁想进入;
    • 孔融让梨,最终的turn值决定了哪个进程可以进入临界区
  • TestAndSet()(基于硬件)优点:实现简单,适用于多CPU;缺点:不满足有限等待

  • 信号量机制:wait()/P()signal()/V()操作。一般缓冲区就要两个信号量,一个是空数量,一个是满数量

  • 某套装服装厂有甲、乙两个制作室和一个配套室。两个制作室分别生产上衣裤子,每制作一件上衣或裤子后制作室工人都要分别把它们送到配套室的衣架F1裤架F2上,衣架F1上存放上衣,裤架F2上存放裤子,衣架最多能放50件上衣,裤架最多能放50条裤子。配套室工人每次从架上取一件上衣和一条裤子,然后将它们配成套装,并进行包装。为防止操作出错, 甲制作室工人及配套室工人对衣架F1的存取动作应互斥进行,乙制作室工人及配套室工人对裤架F2的存取动作应互斥进行。用P、V原语进行正确管理,分别描述甲制作室工人、乙制作室工人以及配套室工人的工作过程
    image-20200620182643029

  1. 设互斥信号量mutex1mutex2控制进程对衣架和裤架的互斥操作

    设同步信号量empty1empty2分别表示衣架和裤架的空位数,full1表示衣架上的衣服数,full2表示裤架上的裤子数

  2. 初始化 mutex1=1,mutex2=1,empty1=50,empty2=50,full1=0,full2=0
    image-20200620182602976

  • 在一个盒子里,混装了数量相等的黑白围棋子。现在利用自动分拣系统把黑子、白子分开,设分拣系统有两个进程 P1 和 P2,其中进程P1拣白子;进程P2拣黑子。规定每个进程一次拣一子,当一个进程在拣时不允许另一个进程去拣,当一个进程拣了一子时,必须让另一个进程去拣。试写出进程P1和P2能够正确并发执行的程序
    image-20200620185107714

  • 有一个仓库,可存放 X、Y 两种产品,仓库的存储空间足够大,但要求:

    (1)每次只能存入一种产品X或Y

    (2)满足-N < X产品数量-Y产品数量 < M。其中 N 和 M 是正整数,试用信号量与 P、V 操作实现产品 X 与 Y 的入库过程

    设互斥信号量mutex=1;同步信号量sx=M-1,sy=N-1
    image-20200620191522714

4 死锁

产生死锁的四个必要条件:死锁→4个条件,没有4个条件→不死锁

互斥、占有并等待、非抢占、循环等待

4.1 资源分配图

Pi→Rj 申请边, Rj→Pi 分配边;

如果图中没有环,一定没死锁。如果有环,且每个资源只有一个实例,说明有死锁,环上的进程就是死锁进程

4.2 处理死锁的方法
  • 预防死锁:破坏四个必要条件中的一个

    • 互斥:不能改变
    • 占有并等待:在申请资源时必须一次性分配所有资源,否则不能接受请求(缺点是资源利用率低,可能发生饥饿)
    • 非抢占:如果当前进程的请求不能满足,它就要释放已有的资源
    • 循环等待:将系统中的资源编号,进程按编号排序,由小到大请求资源
  • 避免死锁:用某种方法防止系统进入不安全状态,确定当前申请是允许还是延迟。如果存在一个安全序列就是安全状态。

    • 死锁→不安全;安全→不死锁

    • 只有一个资源实例:资源分配图算法
      Pi→Rj (虚线)需求边,变成实线的时候就是真正的发出请求。当需求边变成申请边且不会有环时才允许申请。

    • 有多个资源实例:银行家算法

      • 安全算法
        就是要找到一个安全序列

      • 资源请求算法

        1. 先验证请求数量是否小于 Need
        2. 再验证请求数量书否小于 Available
        3. 假定系统分配给了它,验证当前是否存在安全序列,存在则可以接受请求
  • 死锁检测并恢复

    • 等待图:所有资源只有一个实例,删除所有资源点,合并适当边得到等待图。如果等待图中有环就是死锁

    • 多个资源实例,死锁检测算法(和资源请求算法差不多,前面用的是Need,后面用的是Request)

      多了个请求矩阵,然后找到一种可以满足所有请求的安全序列,有的话他就是安全的。没有的话可能死锁

    • 恢复:终止死锁进程;资源抢占,回滚到未死锁的状态

  • 忽略死锁:如果死锁了就重启,这种方法很便宜

5 内存

5.1 内存的保护

基地址寄存器 和 界限地址寄存器,防止越界

保护位:标明可读可写或只可读

有效-无效位:有效表明页在进程的逻辑地址范围内;无效就是超出了范围

5.2 MMU

从虚拟地址(CPU生成)到物理地址(内存看到的)的映射是由内存管理单元(MMU)的硬件设备来完成的

5.3 高速缓存
  • 寄存器和存储器之间存储器,用于备份主存中常用的数据,提高访内速度,缓和内存和CPU速度不匹配的问题
  • CPU与缓存是“字”为传输单位;内存与缓存是“块”为传输单位
5.4 内存分配方式
  • 单一连续分配

    • 只适合单道处理系统,大作业无法在小内存运行,资源浪费,有内部碎片
    • 为解决大作业无法在小内存运行,提出了:
      • 覆盖技术:允许一个作业的若干程序使用同一个存储区。将程序分为多个段,常用的放在内存(固定区),不常用的需要时才加入内存(覆盖区),覆盖结构必须由程序员声明。(注意:范围是用一进程)
      • 交换技术(中级调度):进程可以暂时从内存换出到备份存储。但是交换的代价比较大,通常只有空闲内存低于某个阈值的时候才交换;或者只交换进程的部分,以降低交换时间。(注意:范围是不同进程间的)
  • 固定分区分配/多分区分配

    • 分区可以相等也可以不等,每个分区只能有一个进程

    • 稍微提高了资源利用率,可用静态重定位,无外部碎片,有内部碎片

    • 大作业无法在小内存运行

  • 可变分区分配/动态分区分配

    • 进程多大就分配多大(按块为单位分配)

    • 需要用动态重定位,基本消除内部碎片,但有外部碎片,外部碎片可以通过“紧凑(动态重定位)”来解决,但是很昂贵

      • 注意:静态重定位是软件完成,动态重定位是硬件完成(动态加载不需要OS的特别支持)
    • 大作业无法在小内存运行

    • 动态存储分配算法

      首次适应(快、开销小)、最佳适应(很多外部碎片,因为要维护列表顺序所以开销大)、最差适应(导致没有大分区)、循环首次适应(开销小)

  • 分页

    • “块”是分配单位
    • 逻辑地址=(页号,页内偏移);物理地址=页号*页大小+页内偏移
    • 作业可以不连续存储,结合虚存情况下,且大作业可以在小内存运行
    • 避免了外部碎片和紧缩,但有内部碎片
    • 硬件支持
      • 页表包含基地址
      • 页表指针存在PCB
      • PTBR页表基地址寄存器:页表基地址和页表长度
      • TLB快表,是页表的高速缓存,命中只需要一次访内
    • EAT有效内存访问时间 = (x+y)×α + (x+2y)×(1-α),αTLB命中率,x访问TLB,y访内
    • 倒置页表整个系统只有一张,由进程pid标识:(进程id,页码,偏移);减少了内存占用,但是搜索变慢了
  • 分段

    • 目的是为了更好地满足用户需求
    • 逻辑地址=(段号,段内地址);物理地址=段的起始地址+段内偏移
    • 硬件支持:段表,包含段基址和段界限(偏移要小于段界限)
  • 段页式:(段号,页号,页内地址),至少三次访内

6 虚拟内存

允许将一个执行的作业不完全放在内存中,主要优点就是程序可以比物理内存大。再者,将用户所理解的逻辑内存和物理内存分开,使得程序员不必担心内存空间不够。

并发性是虚存的基本要求。利用了局部性原理。

注意,实时系统由于对延迟的严格要求,不使用虚存技术。

6.1 请求调页
  • 当所访问的信息不在内存时(缺页错误是内中断,一种故障),由OS负责将所需信息从外存调入内存。

  • 页表:外存地址,帧号,有效无效位,修改位,保护位

  • 有效访问时间 = (1-p)×内存访问时间 + p×缺页错误需要的时间,p是页错误率

6.2 写时复制

允许父子进程共享相同的页面,如果任何一个进程要修改共享页面,就创建一个副本给他修改。

6.3 页面置换算法

请求调页且内存空间不够时,需要选择牺牲页换出。如果增加了多道程度,可能会导致过渡分配内存。

  • FIFO(没有考虑页使用的频率,性能较差,有belady异常);

  • OPT 最优页面置换,置换未来最久不使用的页面(理想化,无法实现)

  • LRU,置换过去最长时间没有使用的页(利用了局部性原理,实现困难,开销大,需要硬件辅助)

    • 计数器,记住的是页面最后一次被引用的时间,置换计数器最小的(考虑时钟溢出);
    • 堆栈:最近最少使用的页面总是在堆栈的底部。
  • 近似 LRU,增加一个引用位,初始由 OS 来清 0,引用时由硬件置位 1

    • 额外引用位算法

      保留一个 8 位字节,包含着最近 8 个周期内页面使用的情况,数字越大表明越为最近使用

    • 第二次机会算法/时钟算法

      利用循环队列,找到一个引用位为 0 的页面,扫描过程中会把访问为清 0。

    • 增强型第二次机会算法

      利用(引用位,修改位),最多进行四次扫描可以选择一页牺牲,过程如下:

      1. (0,0) 不修改
      2. (0,1) 把扫描过的帧的引用位都置0
      3. (0,0) 不修改
      4. (0,1) 一定可以找到,然后把它替换
  • 基于计数的页面置换算法(不常用)

    • LFU 最不经常使用,置换具有最小计数的页面
    • MFU 最经常使用,置换具有最大计数的页面

帧分配算法:平均分配、比例分配

局部分配、全局分配

6.4 抖动

本质原因是分配给进程的内存空间不够。

6.5 防止抖动
  • 工作集模型

    基于局部性假设,是最近使用页面的集合。当总的工作集大小大于可用帧总数将发生抖动,这时OS选择一个进程挂起。工作集策略可以防止抖动的同时还可以保持较高的多道程度

  • 缺页错误频率

    设置缺页错误率的上下限,当页错误率太高就分配多点帧,太低就给它删除一些帧。

  • 缺页错误率曲线中一个峰的开始和下一个峰的开始之间的时间跨度表示从一个工作集到另一个工作集。

6.6 预先调页

试图阻止大量的最初调页。

6.7 页面大小
  • 小页面:局部性好,更小的内部碎片
  • 大页面:最小化 IO 期望时间,最小化缺页错误数量
6.8 提高TLB命中率
  • 增加 TLB 条目,但是昂贵且耗能
  • 增加 TLB 范围(TLB 范围 = 条目数 * 页大小),所以选择增加页面大小或提供多个页面大小。

7 文件概念

内存和磁盘的传输以 块 为单位执行。

7.1 文件目录

一个 FCB 是一个目录项,一个文件一个 FCB,多个 FCB 组成文件目录。系统通过文件目录来管理文件,由文件名查找文件目录项就能找到文件的信息。

FCB 的改进:索引结点

  • 只存放文件名和索引结点的指针,除文件名之外的信息都存在索引结点里。
  • 因为这样一个块可以存放更多目录项,因此提高了文件检索速度
7.2 有结构文件(文件的逻辑结构)
  • 顺序文件
    可变成记录的顺序文件无法实现随机存取,定长记录可以。缺点是不方便增加和删除

  • 索引文件
    索引表本身就是定长顺序文件,方便增加和删除,若按关键字排序的话支持快速检索

  • 索引顺序文件
    以上二者的结合,将记录分组,每组对应一个索引表项

7.3 文件操作

创建文件、写文件、读文件、删除文件、截断文件(条目仍在,但让文件重置为0,并释放它的空间)

7.4 打开文件表

避免频繁搜索目录,提高性能。通常操作系统采用两级内部表:

  1. 每个进程表:每个条目相应地指向整个系统的打开文件表

  2. 整个系统表:包含与进程无关的信息

当有进程打开一个文件,系统表就包含该文件的条目,而进程只需要在其进程打开表中增加一个指向系统表的相应条目的条目即可

每个打开的文件关联以下信息:文件指针§、访问权限§、文件大小(OS)、文件打开计数(OS)、文件的磁盘位置(OS)

7.5 访问方式

顺序访问、直接访问(随机访问)、索引访问

7.6 目录及其操作

一个文件对应一个FCB,一个FCB就是一个目录项,多个FCB组成文件目录

搜索文件、创建文件、删除文件、遍历目录、重命名文件、遍历文件系统

7.7 目录类型
  • 单级目录:整个系统只有一张目录表,实现了按文件名存取,不允许文件同名,难以支持多用户
  • 两级目录:主文件目录(MFD) → 用户文件目录(UFD),不同用户可以有相同的文件名,提高了检索速度,缺点是用户需要合作时受到了隔离,而且不能对自己的文件进行分类
  • 树形目录:每个用户可以创建自己的子目录并相应组织文件,方便地对文件分类,层次结构清晰,缺点是树结构禁止共享文件或目录
  • 无环图目录:允许目录共享子目录和文件,在修改文件时要维护一致性。为共享结点设置一个共享计数器
  • 通用图目录:容易有环,要避免这样的还有三种方法:1.只允许链接文件而不能是目录 2.垃圾收集 3.增加新链接前先检测是否有环
7.8 文件共享
  • 基于索引结点的共享方式(硬链接)
  • 基于符号链的共享方式(软链接)
7.9 分区与安装
  • 生分区:没有文件系统,如数据库、交换分区
  • 熟分区:含有文件系统
  • 根分区:包括操作系统内核和其他系统文件,在启动时安装
7.10 文件空间分配方法
  • 连续分配

    • 支持顺序、随机访问,寻道时间少
    • 缺点:需要预先知道文件的大小,不好扩展,有难以利用的磁盘碎片
  • 链接分配(最基本)

    • 实现简单,磁盘利用率高,方便扩展,没有外部碎片,只支持顺序访问,读入i号逻辑块需要i+1次磁盘IO

    • 缺点:不支持随机访问,指针需要占用一些空间

    • 链接分配的变种:使用文件分配表FAT

      先在FAT中找到要访问的块,再去访问磁盘。一整个磁盘只有一张FAT,常驻内存。这样一来也支持随机访问

  • 索引分配

    • 为每个文件建立一个索引表,存放在索引块,记录了各个文件对应的物理块
    • 支持顺序、随机访问,容易扩展,没有外部碎片,但是索引表要占用一些空间
    • 索引块太小的话采取以下机制
      • 连接方案:将多个索引块链接起来
      • 多层索引
      • 混合索引:即包含直接地址索引、又包含一级间接索引、两级间接索引。
7.11 文件系统的保护

避免物理损坏和非法访问。

  • 物理损坏:把笔记本锁起来;备份
  • 非法访问:控制多个不同的操作类型;根据用户身份控制访问,可以为用户分类型:所有者、组、其他用户;加密码;加口令
7.12 文件系统层次结构

应用程序→逻辑文件系统→文件组织模块→基本文件系统→IO控制→设备

7.13 空闲空间管理
  • 位向量/位示图/位图:用(字号,位号)对应一个盘块,盘块号=字号*字长+位号
  • 链表:将所有空闲磁盘块用链表链接起来
  • 组:(略)
7.14 提升性能
  • 虚拟磁盘:在内存中建立磁盘的映像。
  • 随后释放和预先读取页面

8 磁盘和I/O

8.1 SSD

更可靠,无噪音,防震防摔,耗能低,速度快。但是寿命更短,更贵

8.2 磁盘空闲空间管理方法

位示图、空闲块表、空闲块链

8.3 磁盘调度算法
  • 先来先服务 FCFS:性能差,寻道时间长)
  • 后来先服务 LCFS:提高吞吐量,局部性原理,可能饿死
  • 最短寻道优先 SSTF:与一开始的位置有关,不一定是全局最优的。可能饿死
  • 电梯算法 SCAN:不会饥饿,对各个位置磁道相应频率不平均
  • 单向扫描 C-SCAN:到终点了直接回到开头扫描,为了平均请求的等待时间
  • LOOK 和 C-LOOK:只访问到最远请求处的磁道就返回
8.4 磁盘管理
  • 存储数据之前必须经过低级格式化或物理格式化。然后要进行逻辑格式化就是磁盘分区,创建文件系统,引导程序。手动处理坏块(格式化时发现坏块就标记为不可用);采用备用块来代替坏块:扇区备用或扇区转寄,扇区滑动
8.5 IO子系统包括
  • 一个包括缓冲、高速缓存、假脱机的内存管理部分
  • 通用设备驱动器接口
  • 特定硬件设备的驱动程序
8.6 IO设备

IO 设备一般是由执行 IO 操作的机械部分执行控制 IO 的电子部件组成,为各类设置相应的设备驱动程序,供用户或系统进程调用(设备独立性软件)。

字符设备:以单个字符为单位,键盘

块设备:磁盘、磁带

8.7 设备控制器
  • 组成:设备控制器与CPU的接口、设备控制器与IO设备的接口、IO逻辑

  • 功能:接收和识别命令、地址识别、数据缓冲区、报告和标识设备状态、差错控制

  • 维护的寄存器:数据寄存器、状态寄存器、控制寄存器

    • 寄存器或有多个,所以需要地址。有两种编址方式:内存映像IO和独立编址
8.8 IO控制方式
  • 轮询
    传送单位:字;数据流向需要经过CPU;会浪费CPU资源,CPU和IO不能很好并行

  • 中断
    传送单位:字;数据流向需要经过CPU;CPU和IO可并行,但频繁的中断会消耗较多的CPU时间

  • DMA
    传送单位:块;数据流向不经过CPU;
    使IO设备直接和内存进行成批数据的快速传输(块数据),减少了中断,CPU和IO并行得到提升

  • 通道
    专门用来管理IO操作的处理机,使CPU彻底从IO中解放出来,CPU只需要进行善后处理和启动即可

8.9 IO层

用户软件→【设备独立性软件→设备驱动程序→中断处理程序】(IO核心子系统)→硬件

  • 设备驱动程序为内核IO子系统隐藏设备控制器之间的差异,简化OS开发人员的工作,有利于硬件制造商
8.10 假脱机技术(SPOOLing):保存设备输出的缓冲区
  • 组成:输入输出井、输入输出缓冲区、输入输出进程、井管理程序
  • 对IO的模拟,提高IO速度,将独占设备改造为共享设备,实现了虚拟设备的功能
8.11 缓冲原因
  • 缓和CPU和IO设备之间速度不匹配的矛盾
  • 减少对CPU的中断频率
  • 协调传输大小不一样数据的设备
  • 支持应用程序IO的复制语义
  • 提高CPU和IO设备之间的并行性
8.12 缓存

保存数据副本的高速内存区域。

8.13 提升性能途径
  • 减少上下文切换的次数

  • 减少数据拷贝次数

  • 通过DMA和通道来为主CPU承担数据拷贝来增加并发性

  • 减少中断频率
    会浪费CPU资源,CPU和IO不能很好并行

  • 中断
    传送单位:字;数据流向需要经过CPU;CPU和IO可并行,但频繁的中断会消耗较多的CPU时间

  • DMA
    传送单位:块;数据流向不经过CPU;
    使IO设备直接和内存进行成批数据的快速传输(块数据),减少了中断,CPU和IO并行得到提升

  • 通道
    专门用来管理IO操作的处理机,使CPU彻底从IO中解放出来,CPU只需要进行善后处理和启动即可

8.9 IO层

用户软件→【设备独立性软件→设备驱动程序→中断处理程序】(IO核心子系统)→硬件

  • 设备驱动程序为内核IO子系统隐藏设备控制器之间的差异,简化OS开发人员的工作,有利于硬件制造商
8.10 假脱机技术(SPOOLing):保存设备输出的缓冲区
  • 组成:输入输出井、输入输出缓冲区、输入输出进程、井管理程序
  • 对IO的模拟,提高IO速度,将独占设备改造为共享设备,实现了虚拟设备的功能
8.11 缓冲原因
  • 缓和CPU和IO设备之间速度不匹配的矛盾
  • 减少对CPU的中断频率
  • 协调传输大小不一样数据的设备
  • 支持应用程序IO的复制语义
  • 提高CPU和IO设备之间的并行性
8.12 缓存

保存数据副本的高速内存区域。

8.13 提升性能途径
  • 减少上下文切换的次数
  • 减少数据拷贝次数
  • 通过DMA和通道来为主CPU承担数据拷贝来增加并发性
  • 减少中断频率
  • 在CPU、总线、IO之间保持均衡
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值