返回顶部

OS复习资料

1.引论

操作系统的知识

概念

  • 用户与计算机硬件系统之间的接口(API/GUI)

    ​ • 即:OS处于用户与计算机硬件系统之间,用户通过OS 来使用计算机系统。

  • 系统资源的管理者(处理机、存储器、I/O设备等)
    处理机管理是用于分配和控制处理机
    存储器管理是负责内存的分配与回收
    I/O设备管理是负责I/O设备的分配(回收)与操纵
    文件管理是用于实现文件的存取、共享和保护

  • 实现对计算机资源的抽象(OS是扩充机/虚拟机)

操作系统的主要功能

  • 处理机管理或者进程管理都可以

    • 进程(线程)控制、进程(线程)同步、进程通信、进程(线程)调度
  • 存储管理

  • 设备管理

  • 文件系统

  • 作业控制(不是主要功能?):作业调度、作业控制

现代操作系统的基本特征

  • 并发执行
  • 资源共享:互斥共享(打印机、变量) • 同时访问(宏观)
  • 虚拟化管理:多道程序中的CPU、SPOOLING(外围设备同时联机操作)、虚拟存储
  • 异步性

操作系统的基本类型

 批处理系统  分时系统  实时系统  混合型

操作系统结构

 模块接口  有序分层法  虚拟机  微内核结构  机制与策略分开

操作系统的发展

1.批处理系统

  • 批处理:
    • 把用户提交的作业成批送入计算机,由作业调度程序自动选择作业运行
  • 目的:
    • 缩短作业之间的交接时间
    • 减少处理机的空闲等待,提高系统效率

1)联机批处理系统

由CPU直接控制作业流和输入/输出(I/O)设备。监督程序以作业流形式监控每个作业的运行。

在主机与输入机之间增加一个存储设备——磁带,在运行于主机上的监督程序的自动控制下,计算机可自动完成:

  • 成批地把输入机上的用户作业读入磁带,依次把磁带上的用户作业读入主机内存并执行,然后把计算结果向输出机输出

  • 完成了上一批作业后,监督程序又从输入机上输入另一批作业,保存在磁带上,并按上述步骤重复处理。

  • 优点

    • 监督程序不停地处理各个作业,从而实现了作业到作业的自动转接,减少了作业建立时间和手工操作时间,有效克服了人机矛盾,提高了计算机的利用率。
  • 不足

    • 在作业输入和结果输出时,主机的高速CPU仍处于空闲状态,即等待慢速的输入/输出设备完成工作:此时主机处于“忙等”状态。

2)脱机批处理系统

​ 引入了脱机I/O技术,这种方式的显著特征是:增加一台不与主机直接相连而专门用于与输入/输出设备打交道的卫星机

  • 优势
    • 主机不直接与慢速的输入/输出设备打交道,而是与速度相对较快的磁带机发生关系,有效缓解了主机与设备的矛盾。主机与卫星机可并行工作,二者分工明确,可以发挥主机的高速计算能力。
  • 不足
    • 每次主机内存中仅存放一道作业,每当它运行期间发出输入/输出(I/O)请求后,高速的CPU便处于等待低速的I/O完成状态,致使CPU空闲。

批处理系统是为解决人机矛盾以及CPU和I/O设备之间的速度差异而发展起来的。它的出现改进了CPU和外设的使用效率,但仍存在着许多缺陷:

  • 卫星机与主机之间的磁带装卸仍需人工完成,操作员需要监督机器的状态信息;
  • 系统没有任何保护自身的措施

3)多道批处理系统

​ 允许多个程序同时进入内存并运行,共享系统中的各种硬、软件资源

提高了整个系统的资源利用率和系统吞吐量

多道程序运行时的特点多道、宏观上并行、微观上串行

多道批处理系统(简称批处理系统):

特征:多道、成批(在系统运行过程中,不允许用户与其作业发生交互作用,即:作业一旦进入系统,用户就不能直接干预其作业的运行)

不足:不能提供交互作用能力

2.分时系统

  • 分时系统中,多个用户分享使用同一台计算机,多个程序分时共享硬件和软件资源
  • 分时技术把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。
  • 为什么使用分时系统:
    • 批处理系统一次执行一个程序,I/O过程CPU空转
    • 为进一步提高CPU利用率,支持多用户、多进程

两种典型的分时系统:

  • Multics/Unix (1968/1970)
  • IBM VM 360/370 (1966/1972)

特征:

  • 多路性:微观上看是各用户轮流使用计算机;宏观上看是各用户并行工作
  • 交互性:分时系统又被称为交互式系统。
  • 独立性:系统保证各用户程序运行的完整性
  • 及时性:系统可对用户的输入及时作出响应。分时系统性能的主要指标之一是响应时间,它是指:从终端发出命令到系统予以应答所需的时间

影响响应时间的因素:系统开销  用户数目  时间片  对换信息量  采用可重入代码  引入虚存减少对换

操作系统的网络化

分两类,分别是网络操作系统和分布式操作系统

计算机网络和网络操作系统

网络操作系统

在传统单机OS上加单独软件层,主要提供联网功能和资源的远程访问,实现多机互联

分布式系统

分布式操作系统

多台机器统一管理形成单一系统,相比网络操作系统,对 用户和应用高度透明

透明体现在

  1. 数据透明:用户无需了解文件存储位置
  2. 执行透明:用户无需关心程序运行位置
  3. 保护透明:统一的身份管理和安全机制

分布式系统

分布式系统是一个一体化的系统,在整个系统中有一个全局的操作系统称为分布式操作系统,负责全系统的资源分配和调度、任务划分、信息传输、控制协调等工作,并为用户提供一个统一的界面和标准的接口

计算机网络是分布式系统的物理基础

分布式系统和计算机网络的区别:前者具有多机合作和健壮性

实时系统

“实时”二字的含义是指计算机对于外来信息能够及时进行处理,并在被控对象允许的时间范围内作出快速反应。实时系统对响应时间的要求比分时系统更高,一般要求响应时间为秒级、毫秒级甚至微秒级

实时系统的特点:

  • 及时响应
  • 高可靠性和安全性。实时系统必须首先保证高可靠和安全性,而系统的效率则置于次要地位。
  • 系统的整体性强
  • 交互会话活动较弱
  • 专用系统
  • 种类:实时信息处理、实时控制

操作系统的基本实现机制

操作系统的工作模式

  • 内核态/管态
  • 用户态/目态

在操作系统中,为控制和实现系统调用的机制称为陷入或异常处理机制,相应的由于系统调用而引起处理器中断的机器指令称为访管指令(supervisor)或陷入指令(trap)。

  • 系统调用需要触发trap指令

异常(exception)处理机制: 陷阱(也叫陷入trap)和中断(interrupt)

  • 异步异常(Asynchronous Exceptions)
    • 中断是异步异常,可能随时发生,与处理器正在执行的内容无关。
    • 中断主要由I/O设备、处理器时钟或定时器产生,可以被启用或禁用。
    • 软件和硬件都可以产生中断。
  • 同步异常(Synchronous exceptions)
    • 它是某一特定指令执行的结果。在相同条件下 ,异常可以重现。例如内存访问错误、调试指令以及被零 除
    • 系统调用也视作同步异常,或trap
image-20220504165014236

考点积累

  1. 常考知识点
  • 中断发生时,由硬件保护并更新程序指令计数器PC,而不是由软件完成,主要是因为:

    • 一次中断过程分为中断进入和中断处理过程。
    • 在中断进入过程中,首先保存PC、PS值,然后从中断向量地址中得到了PC、PS值放入寄存器
    • 软件的中断处理过程是先保存现场信息和参数传递,再执行中断处理程序,最后恢复和退出中断。
    • 简要地说,一次中断,两次保护现场。
    • 分布保护现场的原因是,进入软件的中断处理后,PC、PS寄存器里被填上了新内容。因此,PC、PS的保护只能由硬件完成
  • 系统调用是操作系统向用户提供的程序接口,用户编织程序时,调用系统调用命令,该命令经过编译后,形成若干参数和访管trap指令

    • 在操作系统中,为控制和实现系统调用的机制称为陷入或异常处理机制,相应的由于系统调用而引起处理器中断的机器指令称为访管指令(supervisor)或陷入指令(trap)。
  • 操作系统提供两类接口:

    • 一类是命令接口,它提供一组键盘和鼠标命令,供用户操作计算机。
    • 一类是程序接口,它提供一组系统调用,供程序访问操作系统的资源。
  • 响应时间是分时系统的重要指标,它是用户发生终端命令到系统做出响应的时间间隔。响应时间与CPU的处理速度,分时系统中联机终端用户数时间片的长短密切相关。

  • 实时系统要求系统响应快、安全保密、高可靠性有限的交互能力。相对来说,对系统资源的利用率不需要太强求。

  • 计算机系统指令分为特权指令和非特权指令:特权指令在核心态下运行,非特权指令在用户态下运行。

    • 触发trap指令用户态下运行的一条指令。
  • 通用寄存器清零,一般不需要切换到内核态执行。

  • 多道程序设计的特点是多道、宏观上并行、微观上串行

  • 操作系统是计算机系统中的一个核心系统软件,它管理和控制计算机系统中的硬件和软件资源

  • 允许多个用户以交互式使用计算机的操作系统称为分时系统

  • 允许多个用户将多个作业提交给计算机集中处理的的操作系统称为批处理系统

  • 计算机系统能及时处理过程控制数据并做出响应的操作系统称为实时系统

  • 对操作系统的总体设计目标来说,批处理操作系统应注重提高计算机的效率,尽量增加系统的平均吞吐量,分时系统应保证用户所能忍受的响应时间,而实时系统则应在保证及时响应和处理有关时间的前提下,再考虑系统资源的利用率

  • 为了实现多道程序设计,计算机系统在硬件方面必须提供两种支持,它们是通道和中断技术

  • 批处理系统的基本特征是“批量”,它把提高作业的吞吐量作为主要设计目标,同时也兼顾作业的周转时间

  • 单道批处理系统是在解决人机矛盾CPU和I/O设备之间速度不匹配矛盾中发展起来的。

  • 如果一个操作系统兼有批处理、分时处理和实时处理三者或其中两者的功能,这样的操作系统称为通用操作系统

  • 在分时和批处理系统中引入了“前台”和“后台”作业的概念,其目的是为了提高CPU的利用率

  • 分时系统的主要特征有三个,多路性、交互性、独立性。(及时性)

  • 分时系统与实时系统的主要区别是及时性和高可靠性

  • 在逐级控制下进行的输入/输出操作称为联机输入/输出操作。

  • 并发共享是操作系统的两个最基本的特征,两者之间互为存在条件。

  • 批处理系统不允许用户随时干预自己程序的运行。

  • 程序由用户态切换到核心态,会用到访管指令;访管指令是在用户态使用的,所以不可能是特权指令

image-20220504170220815

2.启动

操作系统的启动称为boot

bootloader

引导加载程序是系统加电后运行的第一段软件代码,称为Bootloader,是在操作系统内核运行之前运行的一段小程序
BootLoader是Booter和Loader的合写:
• 前者要初始化系统硬件使之运行起来,至少是部分运行起来;
• 后者将操作系统映像加载到内存中,并跳转到操作系统的代码运行。
实现严重依赖于具体硬件
MIPS处理器大多用于嵌入式系统,嵌入式系统常用U-boot作为OS启动装载程序,U-Boot,全称 Universal Boot Loader;X86处理器通常采用LILO和GRUB。

计算机的启动过程(MIPS)

分为stage1和stage2两大部分
依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现
stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性
本文使用32位,程序地址空间(4G)划分为四个区域。
kuseg(2G):用户态可用的地址,在有MMU的机器里,这些地址将一概被MMU作转换,除非MMU的设置被建立好,否则这2G的地址是不可用的

kseg0:将他们的最高位清零,cache映射,即可映射到物理地址段512M
即本来地址为1000(前四位)-1010,去掉最高位,即可对应kuseg的0-512M。对于有MMU的系统,操作系统核心会存放在这个区域

kesg1:将高三位清零可映射到相应的物理地址上,与kseg0映射地址一样,但不是cache映射。**他是唯一在系统重启时能正常工作的地址空间**
即本来地址为1010(前四位)-1100,去掉最高位,即可对应kuseg的0-512M

kseg2:这块区域只能在核心态下使用并且要经过MMU的转化,有时会看到该区域被分为kseg2和kseg3,意在强调低半部分(kseg2)可供运行在管理态的程序使用

内核应该放在kseg0或者kesg1

MIPS ROM/Flash启动地址:
MIPS上电启动时,由于OS尚未接管系统,不能采用TLB、 Cache机制。从MIPS的初始内存划分可知,kseg1是唯一的在系统重启时能正常工作的内存映射地址空间
MIPS的启动入口地址是0xBFC00000,通过将最高3位清零(&0x1fffffff)的方法,将ROM所在的地址区映射到物理内存的低端512M(0x00000000 - 0x1FFFFFFF)空间
因此,kseg1是唯一的在系统重启时能正常工作的内存映射地址空间,这也是为什么重新启动时的入口向量是(0xBFC00000)会在这个区域。这个向量对应的物理地址是0x1FC00000。

MIPS下Linux系统引导过程

Linux启动第一阶段Head.s:
	Bootloader将 Linux 内核映像拷贝到 RAM 中某个空闲地址处,然后一般有个内存移动操作,将内核移到指定的物理地址处。即内核取得控制权后执行的第一条指令的地址。
	linux 内核启动的第一个阶段从 /arch/mips/kernel/head.s文件开始的。而此处正是
内核入口函数kernel_entry(),该函数是体系结构相关的汇编语言,它首先初始化内核堆栈段,为创建系统中的第一个进程进行准备,接着用一段循环将内核映像的未初始化数据段清零,最后跳转到 /init/main.c中的 start_kernel()初始化硬件平台相关的代码
Linux启动第二阶段start_kerne:

BIOS

BIOS(Basic Input/Output System)是基本输入输出系统的简称。BIOS 能为电脑提供最低级、最直 接的硬件控制与支持,是联系最底层的硬件系统和软件系统的桥梁。为了在关机后使 BIOS 不会丢失,早 期的 BIOS 存储在 ROM 中,并且其大小不会超过 64KB;而目前的 BIOS 大多有 1MB 到 2MB,所以会被存储在 闪存(Flash Memory)中。

MIPS启动

本文使用32位,程序地址空间(4G)划分为四个区域。
kuseg(2G):用户态可用的地址
kseg0:将他们的最高位清零,cache映射,即可映射到物理地址段512M
kesg1:将高三位清零可映射到相应的物理地址上,与kseg0映射地址一样,但不是cache映射。**他是唯一在系统重启时能正常工作的地址空间**
kseg2:这块区域只能在核心态下使用并且要经过MWU的转化

内核应该放在kseg0或者kesg1

MIPS启动时,由于OS未接管系统,所以cache和tlb,因此内核只能在kseg1上

3.1内存管理

存储管理基础

存储器硬件

RAM:易失性

  • 静态存储器(SRAM):读写速度快,生产成本高, 多用于容量较小的高速缓冲存储器
  • 动态存储器(DRAM):读写速度较慢,集成度高 ,生产成本低,多用于容量较大的主存储器

ROM、Flash、Disk:非易失性

存储器的功能:保存数据,存储器的发展方向是高速、大容量和小体积。

存储组织

在存储技术和CPU寻址技术许可的范围 内组织合理的存储结构。其依据是访问速度匹配关 系、容量要求和价格

  • 例如:“寄存器-内存-外存”结构和“寄存器-缓存内存-外存”结构
  • 典型的层次式存储组织:访问速度越来越慢,容量 越来越大,价格越来越便宜
  • 最佳状态应是各层次的存储器都处于均衡的繁忙状 态(如:缓存命中率正好使主存读写保持繁忙)
image-20220615090402252

目标

存储管理的基石:

  • 地址独立:程序发出的地址与物理地 址无关
  • 地址保护:一个程序不能访问另一个 程序的地址空间

存储管理要解决的问题:分配和回收

程序的装入和链接

ELF(Executable and Linkable Format) 可执行文件

一个程序本质上都是由 bss段、data段、text段三个组成的。

  • bss段:(bss segment)

    • 用来存放程序中未初始化的全局变量的一块内存区域。
    • bss段属于静态内存分配
  • data段:数据段(data segment)

    • 用来存放程序中已初始化的全局变量的一块内存区域。
    • 数据段属于静态内存分配
  • text段:代码段(code segment/text segment)

    • 用来存放程序执行代码的一块内存区域。
    • 这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写)。
    • 在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
  • text和data段都在可执行文件中,由系统从可执行文件中加载,而bss段不在可执行文件中,由系统初始化。

一个装入内存的可执行程序,除了bss、data和text段外,还需构建一个栈(stack)和一个堆(heap)。

  • 栈(stack):存放、交换临时数据的内存区
    • 用户存放程序局部变量的内存区域,(但不包括static声明的变量,static意味着在数据段中存放变量)。
    • 保存/恢复调用现场。在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。
  • 堆(heap):存放进程运行中动态分配的内存段

生成可执行文件的过程

  • 编译:.c -> .o:生成了一种叫做目标文件(Object File)的中间文件(或者说临时文件)。目标文件和可执行文件的格式是相同的,都是二进制文件。
  • 链接:.o -> exe和系统组件(比如标准库、动态链接库等)结合起来
  • 装入:重定位:Relocation:将之前未填写的地址填写的过程

链接过程的本质:合并相同的“节”

image-20220504172305332

可执行文件的内存映像

image-20220504172334609

程序的装载和运行

  • 装载前的工作:

    • shell调用 fork() 系统调用,创建出一个子进程。
  • 装载工作:

    • 子进程调用 execve() 加载program(即要执行的程序)
    • 加载器在加载程序的时候只需要看ELF文件中和segment相关的信息即可。
  • 细节

    • 一个segment在文件中的大小是小于等于其在内存中的大小。
    • 如果segment在文件中的大小小于在内存中的大小,那么在载入内存时通过补零使其达到其在内存中应有的大小

重定位时链接地址的计算

image-20220615090951620

程序的装载和运行

  • shell调用fork()系统调用,创建出一个子进程
  • 子进程调用execve()加载program

注意

  • 一个segment在文件中的大小是小于等于其在 内存中的大小
  • 如果在文件中的大小小于在内存中的大小, 那么在载入内存时通过补零使其达到其在内 存中应有的大小

程序的装载流程

  • 读取ELF头部的魔数(Magic Number),以确认该文件确实 是ELF文件
    • ELF文件的头四个字节依次为’0x7f’、’E’、‘L’、 ‘F’
  • 找到段表项
  • 对于每个段表项解析出各个段应当被加载的虚地址,在 文件中的偏移,以及在内存中的大小和在文件中的大小
  • 对于每一个段,根据其在内存中的大小,为其分配足够 的物理页,并映射到指定的虚地址上。再将文件中的内 容拷贝到内存中。
  • 若ELF中记录的段在内存中的大小大于在文件中的大小 ,则多出来的部分用0进行填充
  • 设置进程控制块中的PC为ELF文件中记载的入口地址。
  • 控制权交给进程开始执行

存储管理的功能

  • 存储器由内存和外存组成。
  • 所谓内存空间,是由存储单元(字节或字)组成的一堆连续的地址空间。

1.存储的分配和回收:是存储管理的主要内容

  • 记住每个存储区域的状态。位图表示法、链表表示法
  • 完成分配、回收。

2. 存储保护

存储保护通常需要有硬件支持,并由软件配合实现,常用的存储保护方法有:

  • 地址越界保护。
  • 权限保护

3.地址转换:可执行文件生成中的链接技术、程 序加载时的重定位技术,进程运行时硬件和软件的地址变换技术和机构

地址空间:逻辑地址的集合

存储空间:物理地址或绝对地址

  • 把逻辑地址转换成绝对地址的工作称为“地址重定位”或“地址映射“,又称”地址转换“。
  • 按照重定位的时机,可分为静态重定位动态重定位
  • 静态重定位:在程序执行之前无需硬件支持、重定位后无法移动
  • 动态重定位:在程序执行过程中

4.存储共享

存储共享不仅能使多道程序动态地共享内存,提高内存利用率,还能共享内存中某个区域的信息,包括:代码共享和数据共享

5.存储器扩充

存储扩充是指利用存储管理软件为进程提供一个比实际内存更大的逻辑存储空间,即虚拟存储管理技术

存储管理

缺点:

  • 存在着较为严重的碎片问题,虽然可以通过紧凑技术解决,但浪费了处理及时间;
  • 此外,分区管理不能为用户提供“虚存”,即不能实现对内存的“扩充”
  • 分区管理要求运行程序一次全部装入内存之后,才能开始运行。这样,内存中可能包含一些实际不适用的信息。

存储分配的三种方式

  • 直接指定方式
  • 静态分配
  • 动态分配

单道程序的内存管理

  • 整个内存里只有两个程序:一个用户程序和操作系统
  • 操作系统所占的空间是固定的
  • 因此可以将用户程序永远加载到同一个地址,即用户程序永远从同一个地方开始运行。
  • 方法:
    • 静态地址翻译:即在程序运行之前就计算出所有物理地址。
    • 静态翻译工作可以由加载器实现
  • 地址独立?YES. 因为用户无需知道物理内存的相关知识。
  • 地址保护?YES. 因为没有其它用户程序
  • 优点:执行过程中无需任何地址翻译工作,程序运行速 度快
  • 缺点:
    • 比物理内存大的程序无法加载,因而无法运行
    • 造成资源浪费(小程序会造成空间浪费;I/O时间 长会造成计算资源浪费)

多道程序的内存管理(分区式分配)

空间的分配:分区式分配

适用于多道程序系统和分时系统

把内存分为一些大小相等或不等的分区

1. 固定式分区

固定分区是指系统先把内存划分为若干个固定大小的连续分区。一旦划分好,在系统运行期间便不再重新划分。

  • 分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象)。
  • 分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区

采用的数据结构:

  • 分区表,记录分区的大小和使用情况

    • 单一队列的分配方式闲置且容量足够大的分区进行加载,可采用共享队列的固定分区

      image-20220504202404738
    • 多队列分配方式由于程序大小和分区大小不一定匹配,给每个分区一个队列,程序按照大小排在相应的队列里

固定式分区的管理

  • 优点:易于实现,开销小。
  • 缺点:内碎片造成浪费;分区总数固定,限制了并发执行的程序数目。

2.可变式分区

在装入程序时划分内存分区

可变式分区的管理:分区的边界可以移动,即分区的大小可变。

  • 优点:没有内碎片。
  • 缺点:有外碎片

为实现可变分区管理,必须解决内存占用情况的记录方式和分配与回收算法两个问题。这就必须跟踪内存的使用,跟踪的办法有两种:位图表示法(分区表)链表表示法(分区链表)

位图表示法

给每个分配单元赋予一个字位,用来记录该分配单元是否闲置。例如,字位取值为0表示单元闲置,取值为1则表示已被占用,这种表示方法就是位图表示法。

  • 空间成本固定:不依赖于内存中的程序数量。
  • 时间成本低:操作简单,直接修改其位图值即可。
  • 没有容错能力:如果一个分配单元为1,不能肯定应该为1还是因错误变成1。

链表表示法

将分配单元按照是否闲置链接起来,这种方法称为链表表示法。如上图所示的的位图所表示的内存分配状态,使用链表来表示的话则会如下图所示

  • 空间成本:取决于程序的数量
  • 时间成本高:链表扫描通常速度较慢,还要进行链表项的插入、删除和修改。
  • 有一定容错能力:因为链表有被占空间和闲置空间的表项,可以相互验证
分区分配操作

记录内存分配情况,一般采用两张表:P表(已分配分区表)和F表(未分配分区表)

每张表的表项为存储控制块MCB

空闲分区控制块按某种次序构成FMCB链表结构。当分区被分配出去以后,前、后向指针无意

image-20220504203757890

分配内存
  • 事先规定 size 是不再切割的剩余分区的大小。
  • 设请求的分区大小为 u.size,空闲分区的大小为 m.size
  • m.size - u.size ≤ size将整个分区分配给请求者
    • 即如果当前分区分配给该作业后,余下的大小非常小(不足以再分配出去了),也即内碎片
  • 否则,从该分区中按请求的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区表/链中。

基于顺序搜索的分配算法

1. 首次适应算法(First Fit):每个空白区按其在存储空间中地址递增的顺序连在一起,在为作业分配存储区域时,从这个空白区域链的始端开始查找,选择第一个足以满足请求的空白块。
	优点:
		• 分配和释放的时间性能较好
		• 较大的空闲分区保留在内存的高端
	缺点:随着低端内存被不断分配,会产生很多小分区,开销会增大。
	
2. 下次适应算法(Next Fit):把存储空间中空白区构成一个循环链,每次为存储请求查找合适的分区时,总是从上次查找结束的地方开始,只要找到一个足够大的空白区,就将它划分后分配出去。
	使存储空间的利用更加均衡,不致使小的空闲区集中在存储区的一端,但这会导致缺乏大的空闲分区。

3. 最佳适应算法(Best Fit):为一个作业选择分区时,总是寻找其大小最接近于作业所要求的存储区域。
4. 最坏适应算法(Worst Fit):为作业选择存储区域时,总是寻找最大的空白区

基于索引搜索的分配算法

基于顺序搜索的动态分区分配算法一般只是适合于 较小的系统,如果系统的分区很多,空闲分区表( 链)可能很大(很长) ,检索速度会比较慢。为了 提高搜索空闲分区的速度,大中型系统采用了基于 索引搜索的动态分区分配算法

快速适应算法,又称为分类搜索法

  • 把空闲分区按容量大小进行分类,经常用到长度的空闲区设立单独的空闲区链表

  • 系统为多个空闲链表设立一张管理索引表。

  • 优点:

    • 查找效率高,仅需要根据程序的长度,寻找到能容纳它的最小空闲区链表,取下第一块进行分配即可。
    • 该算法在分配时,不会对任何分区产生分割,所以能保留大的分区,也不会产生内存碎片
  • 缺点:

    • 分区归还主存时算法复杂,系统开销较大。
    • 在分配空闲分区时是以进程为单位,一个分区只属于一个进程,存在一定的浪费,即空间换时间

移动技术

在运行一段时间后,随着作业的完成以及相应分区的释放,原来的一整块存储区会形成空闲分区和已分配分区相间的局面,即外碎片

解决碎片问题的办法是:

  • 紧凑技术(Compaction),即移动技术:在适当时刻,通过移动作业从把多个分散的小分区拼接成一个大分区的方法称为紧凑(拼接或紧缩) 。
  • 目标:消除外部碎片,使本来分散的多个小空闲分区连成一个大的空闲区。
  • 紧凑时机:找不到足够大的空闲分区且总空闲分区容量可以满足作业要求时
  • 实现支撑动态重定位——作业在内存中的位置发生了变化,这就必须对其地址加以修改或变换
  • 采用移动技术要注意以下问题:
    • 移动技术会增加系统的开销。采用移动技术,需要在内存中进行数据块移动的操作,还要修改内存分配表和进程控制块,增大了系统运行时间。
    • 移动是有条件的。不是任何在内存中的作业都能随时移动。例如,若某个进程正在与外部设备交换信息,那么与该进程有关的数据块就不能移动,必须等到其结束之后。

分区的保护

存储保护是为了防止一个作业有意或无意地破坏操作系统或其它作业。常用的存储保护方法有:

  • 界限寄存器方法
  • 存储保护键方法
    • 给每个存储块分配一个单独的保护键,它相当于一把锁。进入系统的每个作业也赋予一个保护键,它相当于一把钥匙。
    • 当作业运行时,检查钥匙和锁是否匹配,如果不匹配,则系统发出保护性中断信号,停止作业运行

3. 伙伴系统

  • 固定分区方式不够灵活,当进程大小与空闲分区大小不匹配时,内存空间利用率很低。
  • 动态分区方式算法复杂,回收空闲分区时需要进行分区合并等,系统开销较大。
  • 伙伴系统是介于固定分区与可变分区之间的动态分区技术
    • 伙伴:在分配存储块时将一个大的存储块分裂成两个大小相等的小块,这两个小块就称为“伙伴”

覆盖与交换

覆盖与交换技术是在多道程序环境下用 来扩充内存的两种方法

  • 覆盖:把一个程序划分为一系列功能相对独立的程序段,让执行时不要求同时装入内存的程序段组成一组(称为覆盖段) ,共享主存的同一个区域,这种内存扩充技术就是覆盖。

  • 程序段先保存在磁盘上,当有关程序段的前一部分执行结束,把后续程序段调入内存,覆盖前面的程序段(内存“扩大”了) 。

  • 一般要求作业各模块之间有明确的调用结构,程序员要向系统指明覆盖结构,然后由操作系统完成自动覆盖。

  • 缺点:对程序员不透明,增加了程序员的负担。

  • 交换:广义的说,所谓交换就是把暂时不用的某个(或某些)程序及其数据的部分或全部从主存移到辅存中去,以便腾出必要的存储空间;接着把指定程序或数据从辅存读到相应的主存中,并将控制转给它,让其在系统上运行。

覆盖技术 交换技术
覆盖可减少一个程序运行所需的空间 交换可让整个程序暂存于外存中,让出内存空间。
覆盖是由程序员实现的,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。 交换技术不要求程序员给出程序段之间的覆盖结构。
覆盖技术主要对同一个作业或程序进行。 交换换主要在作业或程序间之间进行。

程序、进程和作业

程序、进程和作

  • 程序是静止的,是存放在磁盘上的可执行文件
  • 进程是动态的。
    • 进程包括程序程序处理对象(数据集),是一个程序对某个数据集的执行过程,是分配资源的基本单位
  • 作业是用户需要计算机完成的某项任务,是要求计算机所做工作的集合
作业 进程
一个作业的完成要经过作业提交、作业收容、作业执行和作业完成4个阶段。 而进程是对已提交完毕的程序所执行过程的描述,是资源分配的基本单位。
作业是用户向计算机提交任务的任务实体。在用户向计算机提交作业后,系统将它放入外存中的作业等待队列中等待执行。 而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。任一进程,只要它被创建,总有相应的部分存在于内存中
一个作业可由多个进程组成,且必须至少由一个进程组成 反过来则不成立。
作业的概念主要用在批处理系统中,像UNIX这样的分时系统中就没有作业的概念。 进程的概念则用在几乎所有的多道程序系统中

程序、进程和作业之间的联系

  • 一个作业通常包括程序、数据和操作说明书三个部分。
  • 每一个进程由进程控制块PCB、程序和数据集合组成。这说明程序是进程的一部分,是进程的实体。
  • 因此,一个作业可划分为若干个进程来完成,而每一个进程有其实体——程序和数据集合
  • 程序程序是静止的、进程是动态的

3.2分页式存储管理

基本概念

  • 如果可以把一个逻辑地址连续的程序分散存放到若干不连续的内存区域内,并保证程序的正确执行,则既可充分利用内存空间,又可减少移动带来的开销。这就是页式管理的基本思想。

  • 支持页式管理的硬件部件通常称为MMU(Memory Management Unit)

  • 页:

    • 在分页存储管理系统中,把每个作业的地址空间分成一些大小相等的片,称之为页面(Page)或页;
    • 各页从0开始编号
  • 存储块:

    • 在分页存储管理系统中,把主存的存储空间也分成与页面相同大小的片,这些片称为存储块,或称为页框(Frame)
    • 同样从0开始编号
  • 页表:

    • 为了便于在内存找到进程的每个页面所对应块,分页系统中为每个进程配置一张页表
    • 进程逻辑地址空间中的每一页,在页表中都对应有一个页表项
  • 若页面较小

    • 减少页内碎片和总的内存碎片,有利于提高内存利用率
    • 每个进程页面数增多,使页表长度增加,占用内存较大。
    • 页面换进换出速度将降低
  • 若页面较大

    • 每个进程页面数减少,页表长度减少,占用内存较小。
    • 页面换进换出速度将提高
    • 增加页内碎片,不利于提高内存利用率。
  • 数据结构

    • 进程页表:
      • 每个进程有一个页表,描述该进程占用的物理页面及逻辑排列顺序
      • 逻辑页号(本进程的地址空间)-> 物理页面号(实际内存空间);
    • 物理页面表:
      • 整个系统有一个物理页面表,描述物理内存空间的分配使用状况
      • 数据结构:位示图,空闲页面链表
    • 请求表:
      • 整个系统有一个请求表,描述系统内各个进程页表的位置和大小,用于地址转换,也可以结合到各进程的PCB里。
  • 关于页表

    • 页表存放在内存中,属于进程的现场信息
    • 用途:
      1. 记录进程的内存分配情况
      2. 实现进程运行时的动态重定位。
    • 访问一个数据需访问内存 2 次 (页表一次,内存一次)。
    • 页表的基址及长度由页表寄存器给出。

纯分页系统

  • 在分页存储管理方式中,如果不具备页面对换功能,不支持虚拟存储器功能,这种存储管理方式称为纯分页或基本分页存储管理方式
  • 调度一个作业时,必须把它的所有页一次装到主存的页框内;如果当时页框数不足,则该作业必须等待,系统再调度另外作业。
  • 优点:
    • 没有外碎片每个内碎片不超过页大小
    • 一个程序不必连续存放
    • 便于改变程序占用空间的大小。
  • 缺点:
    • 程序全部装入内存

地址转换

为了实现页式存储管理,系统要提供一对硬件的页表控制寄存器,即页表始址寄存器和页表长度寄存器,另外还需要高速缓冲存储器的支持。

  • 页表始址存储器:用于保存正在运行进程的页表在内存的首地址。
  • 页表长度寄存器:用于保存正在运行进程的页表的长度。
  • 当进程被调度程序选中并投入运行时,系统将其页表首地址和页表长度从PCB中取出并送入这两个寄存器中。+

1)一级页表

  1. 逻辑地址:地址变换机构把相对地址分为页号页内地址两部分

  2. 页表定位:页表寄存器:页表始址 + 页号 × 页表项长度

    • 如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间,产生地址越界中断
  3. 查询页表:读出物理块号

  4. 物理地址:块号 + 块内地址。 (块内地址 = 页内地址

image-20220505144603262

每个进程 仅仅页表就要占用 4 MB 的内存空,解决方法:

  • 动态调入页表: 只将当前需用的部分页表项调入内存, 其余的需用时再调入
  • 多级页表

2)多级页表

  • 多级页表结构中,指令所给出的地址除偏移地址之外的各部分全是各级页表的页表号或页号,而各级页表中记录的全是物理页号,指向下级页表或真正的被访问页

3)具有快表的地址变换机构

快表是一种特殊的高速缓冲存储器(Cache) ,内容是页表中的一部分或全部内容

  • TLB只包括也表中的一小部分条目。当CPU产生逻辑地址后,其页号提交给TLB。如果页码不在TLB中(称为TLB失效),那么就需要访问页表,并将页号和帧号增加到TLB中
  • 另外,有的TLB允许有些条目固定下来。通常内核代码的条目是固定下来的
  • 有的TLB在每个TLB条目中还保存地址空间标识码(address-space identifier,ASID)。ASID可用来唯一标识进程,并为进程提供地址空间保护
  • 除了提供地址空间保护外,ASID允许TLB同时包含多个进程的条目。如果TLB不支持独立的ASID,每次选择一个页表时(例如,上下文切换时),TLB就必须被冲刷(flushed)或删除,以确保下一个进程不会使用错误的地址转换

4)哈希页表

  • 处理超过32位地址空间的常用方法是使用哈希页表(hashed page table),并以虚拟页码作为哈希值
  • 哈希页表的每一条目都包括一个链表的元素,这些元素哈希成同一位置(要处理碰撞)。每个元素有3个域:
    1. 虚拟页码
    2. 所映射的帧号
    3. 指向链表中下一个元素的指针
  • 该算法按照如下方式工作:
    • 虚拟地址中的虚拟页号转换为哈希表号,用虚拟页号与链表中的每一个元素的第一个域相比较。
    • 如果匹配,那么相应的帧号(第二个域)就用来形成物理地址,如果不匹配,那么就对链表中的下一个节点进行比较,以寻找一个匹配的页号。

5)反置页表

  • 问题

    • 一般意义上,每个进程都有一个相关页表。该进程所使用的每个页都在页表中有一项。这种页的表示方式比较自然,这是因为进程是通过页的虚拟地址来引用页的。操作系统必须将这种引用转换成物理内存地址。
    • 这种方法的缺点之一是每个页表可能有很多项。这些表可能消耗大量物理内存,却仅用来跟踪物理内存是如何使用的。如每个使用32位逻辑地址的进程其页表长度均为4MB。
  • 反置页表

    • 反置页表不是依据进程的逻辑页号来组织,而是

      依据该进程在内存中的物理页面号来组织

      (即:按物理页面号排列)

      • 其表项的内容是逻辑页号 P 及隶属进程标志符 pid
    • 反置页表的大小只与物理内存的大小相关,与逻辑空间大小和进程数无关。

  • 利用反置页表进行地址变换

    • 进程标志符和页号去检索反置页表。
    • 如果检索完整个页表未找到与之匹配的页表项,表明此页此时尚未调入内存,对于具有请求调页功能的存储器系统产生请求调页中断,若无此功能则表示地址出错。
    • 如果检索到与之匹配的表项,则表项的序号 i 便是该页的物理块号,将该块号与页内地址一起构成物理地址
  • 采用反向页表的系统很难共享内存,因为每个物理帧只对应一个虚拟页条目。

页共享与页保护

  • 页共享:各进程把需要共享的数据/程序的相应页指向相同物理块
  • 页保护:页式存储管理系统提供了两种方式来进行页保护
    • 地址越界保护
    • 在页表中设置保护位(定义操作权限:只读,读写,执行等)
  • 页共享带来的问题
    • 若共享数据与不共享数据划在同一块中,则有些不共享的数据也被共享,不易保密。
    • 实现数据共享的最好方法:分段存储管理

3.3段式内存管理

基本概念

分段地址空间

一个段可定义为一组逻辑信息,每个作业的地址空间是由一些分段构成的(由用户根据逻辑信息的相对完整来划分),每段都有自己的名字(通常是段号),且都是一段连续的地址空间首地址为0

特点

  • 方便编程:
    • 通常一个作业是由多个程序段和数据段组成的,用户一般按逻辑关系对作业分段,并能根据名字来访问程序段和数据段。
  • 信息共享
    • 共享是以信息的逻辑单位为基础的。页是存储信息的物理单位,段却是信息的逻辑单位
    • 页式管理中地址空间是一维的,主程序,子程序都顺序排列,共享公用子程序比较困难,一个共享过程可能需要几十个页面
  • 信息保护
    • 页式管理中,一个页面中可能装有 2 个不同的子程序段的指令代码,不能通过页面共享实现共享一个逻辑上完整的子程序或数据块。
    • 段式管理中,可以以信息的逻辑单位进行保护
  • 动态增长
  • 动态链接:程序运行时才把主程序和要用到的目标程序(程序段)链接起来
  • 分段管理的优缺点
    • 优点:
      • 分段系统易于实现段的共享,对段的保护也十分简单。
    • 缺点:
      • 处理机要为地址变换花费时间,要为表格提供附加的存储空间。
      • 为满足分段的动态增长和减少外零头,要采用拼接手段

地址结构

段表、段表的基址及长度由段表寄存器给出、访问一个字节的数据/指令需访问内存两次 (段表一次,内存一次)。逻辑地址由段内地址组成

image-20220505150332126

注:段号可能越界、段内地址也可能越界

可重入代码

  • 可重入代码(Reentrant Code) 又称为“纯代码”(Pure Code),是一种允许多个进程同时访问的代码。
  • 为使各个进程所执行的代码完全相同,绝对不允许可重入代码在执行中有任何改变。因此,可重入代码是一种不允许任何进程对它进行修改的代码

段页式存储

基本概念

  • 段页式存储管理是分段和分页原理的结合,即先将用户程序分成若干个段(段式) ,并为每一个段赋一个段名,再把每个段分成若干个页(页式) 。
  • 逻辑地址结构段号、段内页号、及页内位移三部分所组成。
  • 读一字节的指令或数据须访问内存三次
  • 每个进程一张段表,每个段一张页表
  • 表含段号、页表始址和页表长度;页表含页号和块号

地址转换过程

PCB 中取出段表始址和段表长度,装入段表寄存器。

利用段表始址与段号得到该段表项在段表中的位置。

利用页表始址与页号得到该页表项在页表中的位置

取出该页的物理块号,与页内地址拼接得到实际的物理地址

X86的段页式地址映射

X86的地址映射机制分为两个部分:

  • 段映射机制,将逻辑地址映射到线性地址;
  • 页映射机制,将线性地址映射到物理地址

3.4虚拟存储管理

局部性原理

  • 指程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。还可以表现为:
    • 时间局部性,即一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
    • 空间局部性,即当前指令和邻近的几条指令,当前访问的数据和邻近的数据都集中在一个较小区域

基本概念

  • 程序装入时,不必将其全部读入到内存,而只需将当前需要执行的部分页或段读入到内存,就可让程序开始执行。
  • 程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页或段入到内存,然后继续执行程序。
  • 另一方面,操作系统将内存中暂时不使用的页或段调出保存在外存上,从而腾出空间存放将要装入的程序以及将要调入的页或段——即具有请求调入和置换功能,只需程序的一部分在内存就可执行。
  • 优点
    • 可在较小的可用内存中执行较大的用户程序;
    • 可在内存中容纳更多程序并发执行;
    • 不必影响编程时的程序结构(与覆盖技术比较)
    • 提供给用户可用的虚拟内存空间通常大于物理内存(real memory)
  • 代价:虚拟存储量的扩大是以牺牲 CPU 处理时间以及内外存 交换时间为代价
  • 限制:虚拟内存的最大容量主要由计算机的地址结构决定。例 如 32 位机器的虚拟存储器的最大容量就是 4GB

特征

  • 离散性物理内存分配的不连续,虚拟地址空间使用的不连续
  • 多次性:作业被分成多次调入内存运行。多次性是虚拟存储器最重要的特征,其它任何存储器不具备这个特征
  • 对换性:允许在作业运行过程中进行换进、换出。可提高内存利用率。
  • 虚拟性:虚拟存储器机制允许程序从逻辑的角度访问存储器,而不考虑物理内存上可用的空间数量。范围大,但占用容量不超过物理内存和外存交换区容量之和
  • 虚拟性以多次性和对换性为基础,多次性和对换性必须以离散分配为基础

与Cache-主存机制的异同

透明性不同:cache的管理完全由硬件完成,对系统程序员和应用程序员均透明;而虚存管理由软件(OS)和硬件共同完成,虚存对实现存储管理的系统程序员不透明,,而只对应用程序员透明。

未命中时的损失不同:由于主存的存取时间是cache的存取时间的5~10倍,而主存的存取速度通常比辅存的存取速度快上千倍,故主存未命中时系统的性能损失要远大于cache未命中时的损失

虚拟存储提供了3个能力:

  1. 给所有进程提供一致的地址空间,每个进程都认为自己是在独占使用单机系统的存储资源;
  2. 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问;
  3. 根据缓存原理,上层存储是下层存储的缓存,虚拟内存把主存作为磁盘的高速缓存,在主存和磁盘之间根据需要来回传送数据,高效地使用了主存;

虚拟存储管理的目标

  • 借鉴覆盖技术:不必把程序的所有内容都放在内存中,因而 能够运行比当前的空闲内存空间还要大的程序。
  • 与覆盖不同:由操作系统自动完成,对程序员是透明的。
  • 借鉴交换技术:能够实现进程在内存与外存之间的交换,因 而获得更多的空闲内存空间
  • 与交换不同只将进程的部分内容(更小的粒度,如分页)在 内存和外存之间进行交换
    • 就是说覆盖和交换换的是进程,而虚存交换的时候一个进程的页面

其他概念

进程的逻辑空间(虚拟空间)这种格式按字节从0开始编址所形成的空间也称为该进程的逻辑地址空间。

虚拟地址空间和虚拟存储空间:一个进程的虚拟地址空间的大小与该进程的虚拟存储空间的大小相同。且都从0开始编址有些书中也将虚拟存储空间称虚拟内存空间

交换分区(交换文件):是一段连续的磁盘空间(按页划分的),并且对用户不可见。它的功能就是在物理内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出物理内存来让别的程序运行。

缺页处理

在实际系统中,用户作业当前用到的页面放在主存中,其他的页面则放在磁盘上。当进程执行过程中需访问的页面不在物理存储器中时,会引发发生缺页中断,进行所需页面调入,步骤如下:

  1. 陷入内核态,保存必要的信息(OS及用户进程状态相关的信息)。(现场保护)
  2. 查找出来发生页面中断的虚拟页面(进程地址空间中的页面)。这个虚拟页面的信息通常会保存在一个硬件寄存器中,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析该指令,通过分析找出发生页面中断的虚拟页面。(页面定位)
  3. 检查虚拟地址的有效性及安全保护位。如果发生保护错误,则杀死该进程。(权限检查)
  4. 查找一个空闲的页框(物理内存中的页面),如果没有空闲页框则需要通过页面置换算法找到一个需要换出的页框。
  5. 如果找的页框中的内容被修改了,则需要将修改的内容保存到磁盘上。(注:此时需要将页框置为忙状态,以防页框被其它进程抢占掉)(旧页面页面写回)
  6. 页框“干净”后,操作系统将保持在磁盘上的页面内容复制到该页框中²。(新页面调入(2))此时会引起一个写磁盘调用,发生上下文切换(在等待磁盘写的过程中让其它进程运行)
  7. 当磁盘中的页面内容全部装入页框后,向操作系统发送一个中断。操作系统更新内存中的页表项,将虚拟页面映射的页框号更新为写入的页框,并将页框标记为正常状态。(更新页表)
  8. 恢复缺页中断发生前的状态,将程序指针重新指向引起缺页中断的指令。(恢复现场)
  9. 程序重新执行引发缺页中断的指令,进行存储访问。(继续执行)

缺页处理过程涉及了用户态和内核态之间的切换虚拟地址和物理地址之间的转换(这个转换过程需要使用MMU和TLB),

调入策略

调入策略决定什么时候将一个页由外存调入内存之中,有两种常用调入策略:

  • 按需调页(demand paging):也称请求调页,只调入发生缺页时所需的页面。
    • 这种调入策略实现简单,但容易产生较多的缺页中断,造成对外存I/O次数多,时间开销大,容易产生抖动现象。
  • 预调页(prepaging):当进程开始时,所有页都在磁盘上,每个页都需要通过页错误来调入内存。在发生缺页需要调入某页时,一次调入该页以及相邻的几个页。
    • 这种策略提高了调页的I/O效率,减少了I/O次数。但由于这是一种基于局部性原理的预测。若调入后的页在以后很少被访问,则造成浪费。
    • 这种方式常在程序装入时使用。

置换策略

先进先出(First-in, First-out,FIFO):性能较差,并且有Belady现象,这种算法仅在按线性顺序访问地址空间时才是最理想的。

  • 在使用FIFO算法作为缺页置换算法时,分配的缺页增多,但缺页率反而提高,这样的异常现象称为belady Anomaly

  • 改进的FIFO算法—Second Chance:每个页面会增加一个访问标志位,用于标识此数据放入缓存队列后是否被再次访问过

    • 例如:是FIFO队列中最旧的页面,且其放入队列后没有被再次访问,则A被立刻淘汰;否则如果放入队列后被访问过,则将A移到FIFO队列头,并且将访问标志位清除。(如果所有的页面都被访问过,则经过一次循环后就会按照FIFO的原则淘汰)
    image-20220505155854664
  • 改进的FIFO算法— Clock,也称最近未使用算法(NRU, Not Recently Used):通过一个环形队列,避免将数据在FIFO队列中移动。

最优置换策略(Optimal,OPT):基本思想:从主存中移出永远不再需要的页面,如无这样的页面存在,则应选择最长时间不需要访问的页面

最近最久未使用(Least Recently Used Replacement,LRU):LRU算法根据数据的历史访问记录来进行淘汰数据,当需要置换一页面时,选择在最近一段时间内最久不用的页面予以淘汰。

  • 实现方法一:
    • 每一页可设计一个标志位,每当访问某一页时,将该页的标志位的值从0变成1。
    • 周期性地检查每一页的标志位,看看哪些页被访问过
  • 实现方法二:
    • 设置一个特殊的栈,保存当前使用的各个页面的页面号
    • 每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶
    • 栈底始终是最近最久未使用页面的页面号

老化算法(AGING):LRU算法开销很大,硬件很难实现。老化算法是LRU的简 化,但性能接近LRU

最不频繁使用(LFU):把最不常用的页面先淘汰。

  • 实现方法:每一页可设计一个计数器,每访问一次后,将该页的计数器加1,然后淘汰计数值最小的页。
image-20220615111117755

工作集与驻留集管理

进程的工作集(working set):当前正在使用的页面的集合
引入工作集的目的是依据进程在过去的一段时间内访问的页面来调整驻留集大小。

进程的驻留集(Resident Set):虚拟存储系统中,每个进程驻留在内存的页面集合,或进程分到的物理页框集合。

进程驻留集管理主要解决的问题是,系统应当为每个活跃进程分配多少个页框。

引入工作集的目的是依据进程在过去的一段时间内访问的页面来调整驻留集大小

页面分配策略

固定分配策略

  • 为每一进程分配固定页数的内存空间,在整个运行期间都不再改变。
  • 如果进程在运行中出现缺页,则只能从该进程的N个页面中选出一个换出,然后再调入一页,以保证分配给该进程的内存空间不变。

可变分配策略

  • 先为每一进程分配一定数量的物理块,操作系统本身也保持一个空闲物理块队列。
  • 如果进程在运行中出现缺页,由系统的空闲物理块队列中取出一物理块分配给该进程;当队列中的物理块用完时,操作系统才从内存中选择一块调出。该块可能是系统中任意一个进程的页。
  • 问题:可变分配要求统计进程的缺页率,增加系统额外 开销。而准确判断进程缺页率的高低,确定缺页 率的阈值是非常困难的。

局部置换:系统在进程自身的驻留集中判断当前是否存在空闲页框,并在其中进行置换。

全局置换策略:在整个内存空间内判断有无空闲页框,并允许从其它进程的驻留集中选择一个页面换 出内存。

抖动问题

  • 随着驻留内存的进程数目增加,或者说进程并发水平(multiprogramming level)的上升,处理器利用率先是上升,然后下降。
  • 这里处理器利用率下降的原因通常称为虚拟存储器发生“抖动”,也就是:每个进程的驻留集不断减小,当驻留集小于工作集后,缺页率急剧上升频繁调页使得调页开销增大。

抖动的消除与预防

  • 局部置换策略:然而这种方法并未消除抖动的发生。(微观层面)
  • 引入工作集算法(微观)
  • 预留部分页面(微观或宏观)
  • 挂起若干进程:为此,可挂起一个或几个进程,以便腾出内存空间供抖动进程使用,从而消除抖动现象。(宏观)

可挂起的进程

  • 优先级最低的进程
  • 缺页进程:因为发生缺页中断的进程处于阻塞状态,暂时不需要竞争处理机的使用权。而且,挂起一个缺页进程时,挂起和激活操作需要的数据交换将消除页替换的开销;
  • 最后一个被激活的进程 :因为为此类进程装入的页面较少。将其挂起的开销较小;
  • 驻留集最小的进程:将该类进程挂起以后,激活所需的开销较小;
  • 最大的进程:挂起最大的进程将获得最多的内存空间,可以满足内存中的进程申请空闲页框的需要,使它们能尽快执行完成

3.5页表自映射

页表自映射

如果不采用页表自映射方案,那么映射整个4GB的虚拟空间共需要:4MB+4KB
页表自映射的思想是,把所有的页表(4KB)放到连续的4MB虚拟地址空间中,并且要求这段空间4MB对齐,这样,会有一张页表的内容与页目录的内容完全相同,从而节省了页目录的空间。

页目录基地址:页目录中有一条PDE指向自身物理地址,也就是自映射

构建方法:
    1. 给定一个页表基址PTbase,该基址需4M对齐,即:PTbase =(( PTbase)>> 22)<< 22;不难看出,PTbase的低22位全为0
    2. 页目录表基址PDbase = PTbase |(PTbase)>>10
    3. 自映射目录表项PDEself-mapping = PTbase |(PTbase)>>10| (PTbase)>>20
    
注意:页目录自映射是虚拟空间内的映射,与虚拟地址与物理地址的映射无关!!!

考点

1. 常考知识点

  • 覆盖技术是早期在单一连续区存储管理中使用的扩大存储容量的一种技术。

  • 页式存储管理的特点是不要求作业装入到内存的连续区域,而页式虚拟管理的特点是不要求作业同时全部装入到内存的连续区域。

  • 采用分段式存储管理没有内碎片

    • 在分段式存储管理系统中,为每个段分配一个连续的分区,分区大小等于分段大小,分区内没有内部碎片。
  • 分段存储管理有利于程序的动态链接

    • 动态链接机制是为了各个进程共享动态链接库中的函数,提高了内存利用率。
    • 分段虚拟存储管理中的每个段式按照程序逻辑意义上划分的,如一个函数为一个端,动态链接库中的函数可以作为一个段来管理。相比分页虚拟存储管理,分段机制可节省短标占用的空间。
    • 目前流行的通用操作系统如Windows、Linux操作系统都是使用分页虚拟存储管理方法,当然也使用动态链接技术。
  • 虚拟存储器的最大容量由CPU的地址长度决定。

    • 虽然从实际使用来说,虚拟存储器使得进程可使用内存扩大到内外存容量之和;但是进程的内存寻址还是由计算机的地址结构决定,这就决定了虚拟存储器理论上的最大容量。
    • 比如,64位系统环境下,虚拟内存技术使得进程可用内存空间达264B,但外存显然是达不到这个大小的。
  • 在实现段共享时,共享程序段必须是可重入代码或是“纯代码”。它是一种允许多个进程同时访问的代码,是一种不允许任何进程在执行的过程中对齐进行修改的代码

  • 程序加载时并不一次性将所有程序调入内存,而仅将程序的一部分装入内存,这体现了局部性原理

  • 根据存储管理中内、外碎片的定义。

    • 固定分区管理、页式存储管理、段页式管理有内碎片,没有外碎片。
    • 动态分区管理和段式存储管理有外碎片,没有内碎片。
  • 请求分页系统的页面大小是相同的。

  • 段表长度在分段式存储管理中用作存储保护

  • 在进行地址变换时,系统将逻辑地址截成段号和段内地址两部分,将段号与段表长度进行比较,如果段号大于等于段表寄存器中的段表长度,则访问越界,产生越界中断。

  • 最优(最佳)置换算法产生缺页率最小,但不是实用的页面淘汰算法

  • 在采用请求分页式存储管理的系统中,地址变换过程可能会因为缺页、地址长度越界和越权访问等原因而产生的中断。

  • 分区存储管理不能实现虚拟的原因是分区管理要求运行程序一次性全部装入主存,因而作业地址空间不能超过存储空间。

  • 虚拟存储器通常由主存辅存两级存储系统组成。

  • 静态重定位是由专门设计的重定位装配程序完成的,而动态重定位是靠硬件地址变换机构(即定位寄存器和加法器)来实现的。

  • 在段式存储管理中,段的保护措施通常有越界保护存取控制两种方式。

  • 在可变分区存储管理中,分区的保护通常由界限寄存器存储保护键两种方式。

  • 在存储管理方案中,可用上、下限地址寄存器存储保护的是分区分配

  • 交换技术获得的好处是以牺牲CPU时间为代价的,是一种时间换空间的技术。

  • 在请求分页系统中,页面置换算法常用的是FIFOLRU

  • 段表表目的主要内容包括:段号、段长、段在内存中的起始地址。

  • 页表表目的主要内容包括:页号、块号。

  • 在段式虚拟存储管理系统中,程序所使用的的最大段数以及端的最大长度是由逻辑地址结构决定的。

  • 动态页式系统中的页表项比静态页式系统中页表项增加了存在(中断位)、修改位和外存地址,决定淘汰页是否协会外村的页表项中的依据是修改位

4.进程管理

概述

CPU管理,也称为处理机管理,是操作系统的基本管理功能之一,它所关心的是处理机的分配问题,也就是把CPU(中央处理机)的使用权分给某个程序。CPU管理,也称为处理机管理,是操作系统的基本管理功能之一,它所关心的是处理机的分配问题,也就是把CPU(中央处理机)的使用权分给某个程序

  • 通常把一个正准备进入内存的程序称为作业
  • 当这个作业进入内存后,我们把它称为进程

进程基本概念

并发与并行的区别

  • 并发:在一个时间段内有多个进程执行完了
  • 并行:在同一时刻多个进程执行
  • 因此有一个CPU时一定是并发

程序的顺序执行与特征

  • 顺序性:按照程序结构所指定的次序(可能有分支或循环)
  • 封闭性:独占全部资源,计算机的状态只由于该程序的控制逻辑所决定
  • 可再现性:初始条件相同则结果相同。

程序并发执行时的特征

  • 间断性:并发程序具有“执行---暂停----执 行”这种间断性的活动规律
  • 非封闭性:多个程序共享系统中的资源, 这些资源的状态将由多个程序来改变,致 使程序之间相互影响。
  • 不可再现性:在初始条件相同的情况下, 程序的执行结果依赖于执行的次序

竞争:多个进程在读写一个共享数据时结果依赖于它们执行的相对时间

竞争条件:多个进程并发访问和操作同一数据且执行结果与访问的特定顺序有关

并行性的确定-Bernstein条件

  • R(Si):Si的读子集, 其值在Si中被引用的变量的集合
  • W(Si):Si的写子集, 其值在Si中被改变的变量的集合
  • Bernstein条件:
    • 两个进程S1和S2可并发,当且仅当下列条件同时成 立
    • R(S1) ∩ W(S2) = Φ、W(S1) ∩ R(S2) = Φ、W(S1) ∩ W(S2) = Φ

进程的特征

  • 动态性:进程是程序的一次执行过程。
  • 并发性:多个进程实体同时存在于内存中,能在一段 时间内同时运行
  • 独立性:在传统OS中,进程是独立运行的基本单位
  • 异步性:也叫制约性,进程之间相互制约
  • 结构特征:程序段,数据段,进程控制块PCB
image-20220615165252908

进程的状态和控制

进程控制的主要任务是创建和撤消进程 ,以及实现进程的状态转换。由内核来实现

进程的控制原语:由若干条指令所组成的指令序列,来实 现某个特定的操作功能

  • 指令序列执行是连续的,不可分割
  • 是操作系统核心组成部分
  • 必须在管态(内核态)下执行,且常驻内存

进程的三个基本状态

  • 执行状态:已分配CPU
  • 就绪状态:除了CPU其他条件都有
  • 阻塞状态

进程的组成:程序、数据、PCB

  • 进程控制块PCB(Process Control Block)
    • 作用:• 进程创建、撤消• 进程唯一标志;• 限制系统进程数目。
  • PCB的内容
    • 进程标识符、程序和数据地址、当前状态、现场保护区、同步与同步机制、优先级、资源清单、链接字、其他信息

线程的概念

  • 在进程内部也可以并发,可以实现资源的共享

PCB的组织方式

线性表方式:不论进程的状态如何,将所有的PCB连续地存放在内存的系统区

  • 这种方式适用于系统中进程数目不多的情况

索引表方式:该方式是线性表方式的改进,系统按照进程的状态分别建立就绪索引表、阻塞索引表等。

链接表方式:系统按照进程的状态将进程的PCB组成队列,从而形成就绪队列、阻塞队列、运行队列等

辨析:进程上下文切换 vs 陷入内核

  • 进程上下文切换
    • 通常由调度器执行、保存进程执行断点、切换内存映射
  • 陷入/退出内核
    • CPU状态改变、由中断、异常、Trap指令(系统调用)引起、需要保存执行现场

线程概念

线程:将资源与计算分离,提 高并发效率。

进程包含了两个概念:资源拥有者和可执行单 元。

现代操作系统将资源拥有者称为进程(process, task)

可执行单元称为线程(Thread)

引入线程的目的

  • 减小进程切换的开销、提高进程内的并发程度、共享资源

线程

  • 进程中的一个实体

  • 是一个CPU调度和分 派的单位

  • 基本上不拥有资源, 只有必不可少的少量 资源

  • 可以与其他同进程的 线程共享进程拥有的 所有资源

  • 引入线程的好处

    • 线程比进程轻量:容易创建、撤销
    • 有些应用要求并行实体共享同一个地址空间和所有可用数据的能力
    • 创建一个线程比一个进程快10-100倍
    • 对于存在大量计算和大量I/O处理的应用,大幅度提高性能
    • 在多CPU/多核CPU系统中更有优

线程的实现方式

用户级线程

  • 线程在用户空间、上下文切换比较快
  • 主要功能:创建和销毁线程、线程之间传递消息和数据、调度线程执行、保存和恢复线程上下文
  • 优缺点
    • 线程切换与内核无关、线程的调度由应用决定,容易进行优化、可运行在任何操作系统上,只需要线程库的支持
    • 很多系统调用会引起阻塞,内核会因此而阻塞所有相关的线程。内核只能将处理器分配给进程,即使有多个处理器,也无法实现一个进程中的多个线程的并行执行

内核级线程

  • 优缺点
    • 内核可以在多个处理器上调度一个进程的多个线程实现同步并行执行,阻塞发生在线程级别
    • 一个进程中的线程切换需要内核参与, 线程的切换涉及到两个模式的切换,降低效率

用户级线程和内核级线程的比较

  • 内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知
  • 用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断
  • 在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。
  • 用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序

混合实现方式

  • 线程在用户空间创建和管理
  • 需要实现从用户空间的线程到内核空间线程(轻量级进程)的映射
  • 有些系统同时支持用户线程和内核线程由此产生 了不同的多线程模型,即实现用户级线程和内核级线程的连接方式
    • Many-to-One Model:将多个用户级线程映射到 一个内核级线程,线程管 理在用户空间完成,用户级线程对操作 系统不可见
      • 线程管理是在用户空间进行的,因而效率比较高
      • 当一个线程在使用内核服务时被阻塞,那么整个进程都会被阻塞、多个线程不能并行地运行在多处理机上
    • One-to-one Model
      • 当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强
      • 每创建一个用户级线程都需要创建一个内核级线程与其对应,这样创建线程的开销比较大,会影响到应用程序的性能
    • Many-to-Many Model:将 n 个用户级线程映射到m 个内核级线程上,要求 m <= n。

4.2进程同步

同步和互斥

并发是OS的设计基础,也是所有(如,同步互斥)问题产生的原因。
进程的三个特征:并发、共享、不确定性

竞争:最后结果取决于各个进程对共享数据访问的相对次序。
竞争条件:多个进程并发访问和操作同一数据且执行结果与访问的特定顺序有关。

临界资源和临界区

  • 临界资源:我们将一次仅允许一个进程访问的资源称为临界资源。
  • 临界区:每个进程中访问临界资源的那段代码称为临界区。

进程的同步与互斥

  • 进程互斥(间接制约关系):两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域
  • 进程同步(直接制约关系):系统中各进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性的过程称为进程同步
  • 同步与互斥的区别与联系:互斥是无序访问,同步是有序访问

临界区管理应满足的条件:
没有进程在临界区时,想进入临界区的进程可进入。
任何两个进程都不能同时进入临界区(Mutual Exclusion);
当一个进程运行在它的临界区外面时,不能妨碍其他的进程进入临界区(Progress);
任何一个进程进入临界区的要求应该在有限时间内得到满足(Bounded Waiting)

同步和互斥的原则

  • 空闲让进
    • 临界资源处于空闲状态,允许进程进入临界区
    • 临界区内仅有一个进程执行
  • 忙则等待
    • 临界区有进程正在执行其中的代码,所有其他进程则不可以进入临界区
  • 有限等待
    • 对要求访问临界区的进程,应在保证在有限时间内进入自己的临界区,避免死等
  • 让权等待
    • 当进程不能进入自己的临界区时,应立即释放处理机,避免忙等

基于忙等待的互斥方法

软件

Dekker算法(两个进程):

image-20220504142202410

Peterson算法

image-20220615192405814

N个进程互斥的软件算法

Repeat
    entry section
    critical section
    exit section
    remainder section
Until false

软件方法(两个进程):Dekker算法、Peterson算法

软件方法(n个进程):Lamport面包店算法和Eisenberg算法。
Lamport面包店算法(Lamport Bakery Algorithm):进程进入临界区前先抓取一个号码,然后按号码从小到大的次序依次进入临界区。若多个进程抓到相同的号码则按进程编号依次进入(按字典序排序)。

硬件方法

中断屏蔽:使用“开关中断”指令。

  • 行“关中断”指令,进入临界区操作;
  • 退出临界区之前,执行“开中断”指令。

使用test and set指令

  • TS(test-and-set )是一种不可中断的基本原语(指令)。它会写值到某个内存位置并传回其旧值。在多进程可同时存取内存的情况下,如果一个进程正在执行检查并设置,在它行完成前,其它的进程不可以执行检查并设置。
  • 自旋锁Spinlocks
    • 利用test_and_set硬件原语提供互斥支持
    • 通过对总线的锁定实现对某个内存位置的原子读与 更新

使用swap指令

Swap(对换)指令与TSL指令一样,是不会被中断的原子指令,其功能是交换两个字的内容

几个算法的共性问题

1.忙等待: 浪费CPU时间

2.优先级反转:低优先级进程先进入临界区,高优先级进程一直忙等

基于信号量PV的同步方法

同步中,进程经常需要等待某个条件的发生,如果使用忙等待的解决方案,势必浪费大量CPU时间。
解决方法:将忙等变为阻塞,可使用两条进程间的通信原语:Sleep和Wakeup

  • Sleep原语将引起调用进程的阻塞,直到另外一个进程用
  • Wakeup原语将其唤醒。很明显,wakeup原语的调用需要一个参数——被唤醒的进程ID。

信号量是Dijkstra于1965年提出的一种方法,它使用一个整型变量来累计唤醒次数,称作信号量(semaphore)

  • 信号量是一类特殊的变量,程序对其访问都是原子操作,且只允许对它进行P(信号变量)和V(信号变量)操作。

信号量的定义

  • s为正,则该值等于发P操作后可立即执行的进程的数量;
  • s为0,那么发出P操作后进程被继续执行完;
  • s为负,那么发出P操作后的进程被阻塞,│s│是被阻塞的进程数。
  • q是一个初始状态为空的队列,当有进程被阻塞时就会进入此队列

信号量的分类

  • 二元信号量和一般信号量
    • 二元信号量:取值仅为“0”或“1”,主要用作实现两个进程的互斥
    • 一般信号量:初值为可用物理资源的总数,用于进程间的协作同步问题。
  • 强信号量和弱信号量
    • 强信号量:进程从被阻塞队列释放时采取FIFO
    • 弱信号量:没有规定进程从阻塞队列中移除顺序

信号量的操作:PV操作

  • Dijkstra建议设立两种操作,P(S)和V(S)操作
    • P操作分配资源,V操作释放资源。P操作也称为semWait或Down操作,V操作也称为semSignal或Up操作
  • PV操作属于进程的低级通信
  • 互斥信号量的初值一般为1.

一般信号量的结构

  • 信号量的数据结构,包含:
    • 一个初始值为正的整数: s.count
    • 一个初始为空的队列: s.queue
  • 其上定义了三个原子操作
    • 初始化s
    • 发送信号s: semSignal(s),(V, Up)
    • 接收信号s: semWait(s) ,(P, Down)

​ 一个确定的二元组(s, q),其中s是一个具有非负初值的整型变量,q是一个初始状态为空的队列

  • 信号量的分类:
  • ​ 二元信号量:基于管程的同步与互斥
  • ​ 一般信号量:初值为可用物理资源的总数,用于进程间的协作同步问题。
  • ​ 强信号量和弱信号量
  • 信号量的操作:
  • ​ 一个信号量可能被初始化为一个非负整数.
  • ​ P操作:使信号量减1。若值为负,则执行semWait的进程被阻塞。否则进程继续执行。
  • ​ V操作:使信号量加1。若值小于或等于零,则被semWait操作阻塞的进程被解除阻塞。
  • 必须成对出现
  • P.V操作的优缺点:
  • ​ 优点:简单,而且表达能力强(用P.V操作可解决任何同步互斥问题
  • ​ 缺点:不够安全;P.V操作使用不当会出现死锁;遇到复
  • 杂同步互斥问题时实现复杂

基于管程的同步与互斥

基本概念把分散的同类临界区集中起来,并为每个可共享资源设立一个专门的管程来统一管理各进程对该资源的访问。这样既便于系统管理共享资源,又能保证互斥访问。

管程由四部分组成:

  1. 管程的名称
  2. 局部于该管程内部的共享数据,这些数据表示了相应资源的状态;
  3. 局部域该管程内部的若干过程,每个过程完成关于上述数据的某种规定(互斥)操作;
  4. 对局部于管程内部的共享数据的初始化语句。

管程要解决的问题

  • 互斥:管程每次只允许一个进程进入其内(即访问管城内的某个过程),即管程进入是互斥的
  • 同步:通过设置条件变量(CV) 以及在条件变量上实施的 wait 和 signal 操作,它可以使一个进程或线程,当条件不满足/满足的时候在条件变量上等待/唤醒
  • 条件变量:为了区别等待的不同原因,管程引入了 条件变量。不同的条件变量,不同的条件变量,对应不同原因的进程阻塞等待队列,初始时为空。,初始时为空
    • 条件变量与信号量的区别
      • 条件变量的值不可增减(“没有值的”),P-V操作的信号量值可增减(“有值的”)
      • 访问条件变量必须拥有管程的锁

多个进程同时在管程中出现

  • 场景
    • 当一个进入管程的进程执行等待操作时,它应当释放管程的互斥权
    • 当后面进入管程的进程执行唤醒操作时(例如P唤醒Q),管程中便存在两个同时处于活动状态的进程。
  • 三种处理方法:
    • P等待Q执行(Hoare管程)
      • 入口等待队列(entry queue)
      • 紧急等待队列
    • Q等待P继续执行(MESA管程);
    • 规定唤醒操作为管程中最后一个可执行的操作(Hansen管程,并发pascal)

进程间通信的基本方法

低级通信:只能传递状态和整数值(控制信息),包括进程互斥和同步所采用的信号量和管程机制

高级通信:适用于分布式系统,基于共享内存的多处理机系统,单处理机系统,能够传送任意数量的数据,可以解决进程的同步问题和通信问题,主要包括三类:管道、共享内存、消息系统

  • PV

  • 消息传递——两个通信原语(OS系统调用)

    • send (destination, &message)
    • receive(source, &message)
  • 共享内存:同一块物理内存被映射到进程A、B各自的进程地址空间

    • 当多个进程共享同一块内存区域,由于共享内存可以同时读但不能同时写,则需要同步机制约束(互斥锁和信号量都可以)

经典的同步与互斥问题

  • 生产者-消费者问题

    • 同步、互斥
  • 读者-写者问题

    • 互斥
  • 哲学家就餐问题

    • 互斥
  • 睡觉的理发师问题

    • 同步、互斥

4.3调度

基本概念

进程调度亦可称为处理机调度,它的任务是协调和控制各进程对CPU的使用,即按照一定的策略(调度算法),从就绪队列中选择一个进程,并把CPU的控制权交给被选中的进程。

调度的三个类型:高级、中级、低级

  • 高级调度:又称为“宏观调度”、“作业调度”。从用户工作流程的角度,一次提交的若干 个作业,对每个作业进行调度。时间上通常是 分钟、小时或天
  • 中级调度:又称为“内外存交换”。从存储器资源的角度,将进程的部分或全部换出到外存上,将当前所需部分换入到内存。
  • 低级调度:又称为“微观调度”、“进程或线程调度”。从CPU资源的角度,执行的单位。
    • 低级调度又分为:非抢占式、抢占式:时间片原则、优先权原则、短作业(进程)优先

从不同的角度来判断处理机调度算法的性能,如用户的角度、处理机的角度和算法实现的角度。实际的处理机调度算法选择是一个综合的判断结果。

  • 面向用户的调度性能准则
    • 周转时间、平均周转时间、带权平均周转时间
      • 周转时间:作业从提交到完成(得到结果)所经历的时间。
    • 响应时间:用户输入一个请求(如击键)到系统给出首次响应(如屏幕显示)的时间-分时系统
    • 截止时间:开始截止时间和完成截止时间 —— 实时系统
    • 优先级:可以使关键任务达到更好的指标。
    • 公平性:不因作业或进程本身的特性而使上述指标过分恶化。如长作业等待很长时间。
  • 面向系统的调度性能准则
    • 吞吐量:单位时间内所完成的作业数,跟作业本身特性和调度算法都有关系 —— 批处理系统
      • 平均周转时间不是吞吐量的倒数,因为并发执行的作业在时间上可以重叠
    • 处理机利用率:—— 大中型主机
    • 各种资源的均衡利用:如CPU繁忙的作业和I/O繁忙的作业搭配 —— 大中型主机
  • 调度算法本身的调度性能准则
    • 易于实现、执行开销比小

设计调度算法要考虑的问题

设计调度算法要点

进程优先级(数)

  • 优先级和优先数是不同的,优先级表现了进程的重 要性和紧迫性,优先数实际上是一个数值,反映了 某个优先级
  • 静态优先级:进程创建时指定,运行过程中不再改变
  • 动态优先级:进程创建时指定了一个优先级,运行过程中可以动态变化

进程优先级就绪队列的组织

  • 静态优先级排列:创建多个进程后按照不同的优先级进行排列,CPU调度优先级较高的进程进行执行
  • 动态优先级排列:所有进程创建之后都进入到第一级就绪队列,随着进程的运行,可能会降低某些进程的优先级。
    • 如某些进程的时间片用完了,那么就会将其降级

抢占式调度与非抢占式调度

  • 不可抢占式方式:一旦处理器分配给一个进程,它就一直占用处理器,直到该进程自己因调用原语操作或等待I/O等原因而进入阻塞状态,或时间片用完时才让出处理器
  • 抢占式方式:就绪队列中一旦有优先级高于当前运行进程优先级的进程存在时,便立即进行进程调度,把处理器转给优先级高的进程

进程的分类

  • 第一种:
    • I/O Bound(I/O密集型):频繁的进行I/O,通常会花费很多时间等待I/O操作完成
    • CPU bound(CPU密集型):计算量大,需要大量的CPU时间
  • 第二种
    • 批处理进程
      • 无需与用户交互,通常在后台运行
      • 不需要很快的响应
    • 交互式进程
      • 与用户交互频繁,因此要花很多时间等待用户输
      • 响应时间要快
    • 实时进程
      • 有实时要求,不能被低优先级进程阻塞
      • 响应时间要短且要稳定

时间片

批处理系统的调度算法

  • 吞吐量:吞吐量 = 作业数 / 总执行时间},即单位时间内CPU完成的作业数量

  • 周转时间:完成时刻 - 提交时刻

    • 平均周转时间 = 作业周转时间之和 / 作业数
  • 带权周转时间 = 周转时间 / 服务时间(执行时间

    • 平均带权周转时间 = 作业带权周转时间之和 / 作业数
  • 常见调度算法

    • 先来先服务(FCFS:First Come First Serve)
    • 最短作业优先(SJF:Shortest Job First)
    • 最高响应比优先(HRRF:Response Ratio First):每个作业的响应比RP=1 + 已等待时间/要求运行时间。
    • 最短剩余时间优先(FRTF:Shortest Remaining Time First)

交互式系统的调度算法

时间片轮转 RR

  • 时间片轮转(RR:Round Robin)算法主要用于微观调度(进程调度),设计目标是提高资源利用率。其基本思路是通过时间片轮转,提高进程并发性和响应时间特性,从而提高资源利用率。
    • 将系统中所有的就绪进程按照FCFS原则,排成一个队列。
    • 每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。
    • 在一个时间片结束时,发生时钟中断
    • 调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。
    • 进程可以未使用完一个时间片,就出让CPU(如阻塞)

优先级算法:本算法平衡了各进程对响应时间的要求,适用于作业调度和进程调度,可分成抢占式和非抢占式。

  • 静态优先级:创建进程时就确定,直到进程终止前都不改变。
  • 动态优先级:在创建进程时赋予的优先级,在进程运行过程 中可以自动改变

多级队列 MQ

  • 多级队列(MQ:Multi-level Queue),本算法引入多个就绪队列,通过各队列的区别对待,达到一个综合的调度目标。
    • 根据作业或进程的性质或类型的不同,将就绪队列再分为若干个子队列
    • 不同队列可有不同的优先级、时间片长度、调度策略等;在运行过程中还可改变进程所在队列。

多级反馈队列 MFQ

  • 设置多个就绪队列,分别赋予不同的优先级(如逐级降低),队列1的优先级最高。每个队列执行时间片的长度也不同,规定优先级越低则时间片越长(如逐级加倍)。
  • 新进程进入内存后,先投入队列1的末尾,按FCFS算法调度;若按队列1一个时间片未能执行完,则降低投入到队列2的末尾,同样按FCFS算法调度;如此下去,降低到最后的队列,则按“时间片轮转”算法调度直到完成。
  • 仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。
  • 如果进程执行时有新进程进入较高优先级的队列,则抢占执行新进程,并把被抢占的进程投入原队列的末尾
  • 优点:
    • 为提高系统吞吐量和缩短平均周转时间而照顾短进程
    • 为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程
    • 不必估计进程的执行时间,动态调节

实时系统的调度算法

  • 实时系统是一种时间起着主导作用的系统。当外部的一种或多种物理设备给了计算机一个刺激,而计算机必须在一个确定的时间范围内恰当地做出反应。对于这种系统来说,正确的但是迟到的应答往往比没有还要糟糕
  • 实时系统通常将对不同刺激的响应指派给不同的进程(任务),并且每个进程的行为是可提前预测的
  • 静态表调度、单调速率调度、最早截止时间优先算法

多处理机调度

非对称式多处理系统(AMP):指多处理器系统中,各个处理器的地位不同

对称式多处理系统(SMP):指多处理器系统中,各个处理器的地位相同

4.4死锁

基本概念

竞争资源引起死锁

  • 可剥夺资源:是指某进程在获得这类资源后,该 资源可以再被其他进程或系统剥夺。 如CPU, 内存
  • 非可剥夺资源:当系统把这类资源分配给某进程 后,再不能强行收回,只能在进程用完后自行释 放。如磁带机、打印机
  • 临时性资源:这是指由一个进程产生,被另一个 进程使用,短时间后便无用的资源,故也称为消 耗性资源。如消息、中断;

死锁

活锁

饥饿

死锁发生的四个必要条件

  1. 互斥条件:指进程对所分配到的资源进行排它性使用,即 在一段时间内某资源只由一个进程占用。如果此时还有其 它进程请求资源,则请求者只能等待,直至占有资源的进 程用毕释放。
  2. 请求和保持条件:指进程已经保持至少一个资源,但又提 出了新的资源请求,而该资源已被其它进程占有,此时请 求进程阻塞,但又对自己已获得的其它资源保持不放。
  3. 不剥夺条件:指进程已获得的资源,在未使用完之前,不 能被剥夺,只能在使用完时由自己释放。
  4. 环路等待条件:指在发生死锁时,必然存在一个进程—— 资源的环形链,即进程集合{P0,P1,P2,···,Pn}中 的P0正在等待一个P1占用的资源;P1正在等待P2占用的资 源,……,Pn正在等待已被P0占用的资源。

处理死锁的基本方法

允许死锁发生

无所作为:鸵鸟算法

检测与解除死锁

  • 发现死锁:基于进程-资源图的化简
  • 解除死锁:资源剥夺、撤销进程

检测死锁

保存资源的请求和分配信息,利用某种算法对这些信息 加以检查,以判断是否存在死锁。死锁检测算法主要是 检查是否有循环等待

资源分配图/进程-资源图

活锁和饥饿

  • 活锁(livelock):是指任务或者执行者没有被阻塞 ,由于某些条件没有满足,导致一直重复尝试,失 败,尝试,失败。
    • 活锁和死锁的区别在于,处于活锁的实体是在不断的 改变状态,即所谓的“活”, 而处于死锁的实体表 现为等待;活锁有可能自行解开,死锁则不能。避免 活锁的简单方法是采用先来先服务的策略。
  • 饥饿(starvation):某些进程可能由于资源分配策略 的不公平导致长时间等待
image-20220616095618197

不允许死锁发生

死锁预防(静态)

其实就是破坏死锁产生的四个条件

  1. 打破互斥条件
    • 即允许进程同时访问某些资源 。但是,有的资源是不允许被同时访问的,像 打印机等等,这是资源本身的属性。
  2. 打破占有且申请条件
    • 可以实行资源预先分配策略。只有当系统能够满足当前进程的全部资 源需求时,才一次性地将所申请的资源全部分 配给该进程,否则不分配任何资源。由于运行 的进程已占有了它所需的全部资源,所以不会 发生占有资源又申请资源的现象,因此不会发 生死锁
    • 缺点:
      • 进程在执行时是动态的, 不可预测
      • 资源利用率低。
      • 降低进程的并发性
  3. 打破不可剥夺条件
    • 即允许进程强行从占有者 那里夺取某些资源。
    • 缺点:这种预防死锁的方法实现起来困难, 会降低系统性能
  4. 打破循环等待条件
    • 实行资源有序分配策略。即 把资源事先分类编号,按号分配,使进程在申请 ,占用资源时不会形成环路
    • 缺点:
      • 限制了进程对资源的请求,同时给系统中所有资源 合理编号也是件困难事,并增加了系统开销
      • 为了遵循按编号申请的次序,暂不使用的资源也需要提前申请,从而增加了进程对资源的占用时间

避免死锁(动态)

死锁预防是排除死锁的静态策略,开销较大

死锁的避免是排除死锁的动态策略:即分配资源时判断是否会出现死 锁,有则加以避免。如不会死锁,则分配资源

死锁避免不那么严格限制产生死锁的四个必要条件(区别于死锁预防)

安全序列

  • 定义:指系统 中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{P1,P2,..., Pn}就是安全序列
  • 如果存在这样一个安全序列,则系统是安全的; 如果系统不存在这样一个安全序列,则系统是不 安全的。
  • 安全序列{P1,P2,...,Pn}是这样组成的:若对于 每一个进程Pi,它需要的附加资源可以被系统中当 前可用资源加上所有进程Pj当前占有资源之和所满 足,则{P1,P2,...,Pn}为一个安全序列。

安全状态

  • 安全状态:系统存在一个进程执行序列 可顺利完成
  • 不安全状态:不存在可完成的序列
  • 系统进入不安全状态(四个死锁的必要条件同时发生)也未必会产生死锁。当然,产生死锁后, 系统一定处于不安全状态。
image-20220510083807429

银行家算法

  • 一个银行家把他的固定资金(capital)贷给若干顾客。只要不 出现一个顾客借走所有资金后还不够,银行家的资金应是安 全的。银行家需一个算法保证借出去的资金在有限时间内可 收回
  • 为了保证资金的安全,银行家规定:
    • 当一个顾客对资金的最大需求量不超过银行家现有资金时就 可接纳顾客
    • 顾客可以分期贷款,但贷款总数不能超过最大需求量
    • 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷 款
    • 当顾客得到所需的全部资金后,一定能在有限的时间里归还 所有的资金

安全性算法

  • 1设置两个向量
    • 工作向量Work
      • 它表示系统可提供给进程继续运行所需要的各类资 源 的 数 目 , 它 含 有 m 个 元 素 , 执 行 安 全 算 法 开 始 时 , Work:=Available。
    • Finish.
      • 它表示系统是否有足够的资源分配给进程,使之运行完成。 开始时先做Finish[i]:=false;当有足够的资源分配给进程时, 令Finish[i]:=true.
  • 从 进 程 集 合 中 找 到 一 个 能 满 足 下 述 条 件 的 进 程 :
    • Finish[i]=false;
    • Needi ≤Work. 如找到,执行步骤3;否则执 行步骤4。
  • 当进程Pi 获得资源后,可顺利执行,直至完成,并释放出分配给它 的资源,故执行: Work:=Work+Allocation; Finish[i]:=true; Goto step2;
  • 如果所有进程的Finish[i]=true,则表示系统处于安全状态;否 则,系统处于不安全状态。
image-20220510090050011

最大值 已分配 还需要 可用

Max Allocation Need Available

银行家算法的特点

  • 允许互斥、部分分配和不可抢占,可提高资源利用率;
  • 要求事先说明最大资源要求,在现实中很困难;

5.1 IO管理

管理概述

设备的管理的目的和功能

  • 外设管理目的
    • 提高效率:提高I/O访问效率,匹配CPU和多种不同处理速度的外设
    • 方便使用:方便用户使用,对不同类型的设备统一使用方法 ,协调对设备的并发使用
    • 方便控制
  • 外设管理功能
    • 提供设备使用的用户接口:命令接口和编程接口
    • 设备分配和释放:使用设备前,需要分配设备和相应的通道 、控制器
    • 设备的访问和控制:包括并发访问和差错处理。
    • I/O缓冲和调度:目标是提高I/O访问效率。
image-20220512102352159

总线(Bus):接入I/O设备的主要方式

总线带宽 = 频率 x 宽度(Bytes/sec)

I/O管理示意(软件角度)

image-20220512102630850

I/O管理示意(软件角度)

  • 用户进程在运行过程中,提出I/O 请求, 一旦请求被操作系统接受,操作系统则负责完成该请求。

  • 我们把硬件设备抽象为控制器。控制器中包含控制寄存器 、状态寄存器,以及一些数据的寄存器。从操作系统角度,是通过对这些寄存器进行相应的控制,达到控制设备的目的。

  • 在OS中,I/O 设备管理可直接从应用程序或文件系统得到请求,并负责完成这个请求。它具体包括:

    • 逻辑I/O :完成设备无关的操作,如设备分配,设备回收, 数据准备等;

    • 设备驱动程序:负责对设备控制器进行控制(通过读写其 中的寄存器)。

    • 中断服务程序:设备工作结束后负责向 CPU 发中断信号

I/O管理的特点

  • I/O性能经常成为系统性能的瓶颈;
  • 操作系统庞大复杂的主要原因之一:资源多、杂,并发,均来自I/O(速度差异很大 • 控制接口复杂 • 传输单位不同 • 数据表示各异 • 错误条件多样)
  • 与其它功能联系紧密,特别是文件系统

I/O设备的分类

  • 按数据组织分类

    • 块设备以数据块为单位存储、传输信息。传输速 率较高、可寻址(随机读写)
    • 字符设备以字符为单位存储、传输信息。传输速 率低、不可寻址。
  • 按用途分类:存储设备、传输设备、机交互设备

  • 从资源分配角度

    • 独占设备:在一段时间内只能由一个进程使用的设备。通常独占设备的传输速率比较慢,打印机和磁带机都属于典型的独占设备
    • 共享设备:在一段时间内允许多个进程共同使用 的设备。多个进程以交叉 的方式来使用设备。资源利用率较高。硬盘是典型的共享设备。
    • 虚设备:在一类设备上模拟另一类设备

I/O管理的目标和任务

  1. 按照用户请求,控制设备操作,完成I/O设备与内存间的数据交换,最终完成用户的 I/O请求
    • 设备的分配与回收
    • 执行设备驱动程序,实现真正的I/O操作
    • 设备中断处理:处理外部设备的中断
    • 缓冲区管理:管理不同的I/O缓冲区
  2. 建立方便、统一的独立于设备的接口
    • 方便性
    • 统一性:对不同的设备采用统一的操作方式, 即在用户程序中使用逻辑设备。逻辑设备是对 物理设备的抽象,它屏蔽了物理硬件的细节( 设备繁多的物理特性、错误处理、不同I/O过 程的差异)。
  3. 充分利用各种技术提高CPU与设备、设备与设备之间的并行工作能力,充分利用资源(并行性)。由于CPU与I/O间的速度差异很大,应尽可能减少速度差异造成的整体性能开销,尽可能使CPU和设备都处于充分忙碌状态(均衡性)
  4. 保护:设备传送或管理的数据应该是安全的、 不被破坏的、保密的。

硬件组成

处理机操纵设备控制器,提供命令和数据给控制器,由控制器操纵I/O设备,使设备完成I/O传输。

设备控制器

  • 功能
    • 接收和识别CPU命令
    • 数据交换:CPU与控制器、控制器与设备
    • 设备状态的了解和报告
    • 设备地址识别
    • 缓冲区
    • 对设备传来的数据进行差错检测
  • 组成
    • 控制器与CPU接口:数据寄存器、控制寄存器、状态 寄存器,采用内存映射或专门的I/O指令
    • 控制器与设备接口:数据信号、控制信号、状态信号
    • I/O逻辑:用于实现CPU对I/O设备的控制

image-20220512105619030

I/O端口地址

  • I/O端口地址:接口电路中每个寄存器具有唯一的地址,所有I/O端口地址形成I/O端口的地址空间(受OS保护)
  • I/O指令形式与I/O地址是相互关联的,主要有以下形式:
    • 内存映像编址(内存映像I/O模式)控制器的内存/寄存器作为物理内存空间的一部分
      • 优点:
        • 不需要特殊的保护机制来阻止用户进程进行相应的 I/O 操作。操作系统要避免把包含了控制寄存器的那部分地址空间放入用户的虚拟地址空间中。
        • 可以引用内存的每一条指令都可以适用于引用控制寄存器
      • 缺点:不允许对一个控制寄存器的内容进行高速缓存。(如果我们把设备控制寄存器进行了高速缓存,那么第 一次引用的时候就把它 放入了高速缓存。以后再对它的引用都是从高速缓存当中取值,而不会再去对设备 进行相应的检测)
    • I/O独立编址(I/O专用指令)Intel 体系架构in/out 指令
      • 优点:外设不占用内存 的地址空间 ;编程时,易于区分是对内存操作还是对I/O操作
      • 缺点:I/O端口操作的指 令类型少,操作 不灵活

控制方式

  • 程序控制I/O(PIO,Programmed I/O)
  • 中断驱动方式(Interrupt-driven I/O)
  • 直接存储访问方式(DMA, Direct Memory Access)
  • 通道技术(Channel)

程序控制I/O

  • 也称轮询或查询方式I/O,它由CPU代表进程向I/O模块发出指令, 然后进入忙等状态, 直到操作完成之后进程才能够继续执行。
  • image-20220512205314339
  • 工作过程 :①应用程序提出了一个读数据的请求; ② 设备驱动程序检查设备的状态; ③ 如果状态正常,就给设备发出相应的控制命令; ④ 不断地去测试这个设备是否完成了这次执行 过程,实际上就是一个轮询; ⑤ 设备控制器完成操作,把数据送给应用程序 ⑥ 应用程序继续进行相应的处理。

中断驱动

  • 当I/O操作结束后由设备控制器主动地来通知 备驱动程序说这次结束, 而不是设备驱动程序不断地去 轮询看看设备的状态
  • image-20220512205617461
  • 工作过程 ① 用户程序提出I/O请求; ② 设备驱动程序检查设备的状态; ③ 如果设备已经准备好,那么就向设备发出控制命令; ④ 将状态记录在设备状态表中CPU继续其它工作。 ⑤ 设备完成工作后向CPU发中断信号,转入中断处理程序 ; ⑥ 中断处理程序发现这是一个正常地完成了控制命令的 信号后,把结果提交给设备管理程序; ⑦ 设备管理程序会从设备状态表里查询是哪一个请求的 完成; ⑧ 把相应的数据送到 应用程序; ⑨ 通知应用程序可以继续执行

直接内存访问DMA

  • 是由一个专门的控制器来完 成数据从内存 到设备或者是从设备到内存的传输工作。
  • 工作过程
    1. 程序设置DMA控制器中的若干寄存器值(如内存始址,传送字节数),然后发起I/O操作;
    2. DMA控制器完成内存与外设的成批数据交换;
    3. 在操作完成时由DMA控制器向CPU发出中断。
  • image-20220512210037750
  • DMA控制器中的寄存器
    • 命令/状态寄存器(CR),用于接收从CPU发 送来的I/O命令,或有关控制信息,或设备的 状态
    • 内存地址寄存器(MAR),在输入时,它存放 把数据从设备传送到内存的起始目标地址,在 输出时,它存放由内存到设备的内存源地址。
    • 数据寄存器(DR),用于暂存从设备到内存, 或从内存到设备的数据
    • 数据计数器(DC),存放本次CPU要读或写的 字(节)数
  • 优点:CPU只需干预I/O操作的开始和结束,而后续成 批的数据读写则无需CPU控制,适于高速设备。
  • 缺点:数据传送的方向、存放数据的内存地址及传送数 据的长度等都由CPU控制,占用了CPU时间。每个设备占用一个DMA控制器,当设备增加时, 需要增加新的DMA控制器
  • 中断方式与DMA方式的区别
    • 中断方式是在数据缓冲区寄存器填满之后则发出中断;而DMA方式则是在所要求的转送的数据块全部传送结束时才发出中断,从而减少了CPU进行中断处理的次数。
    • 中断控制方式的数据传送是在中断处理时由CPU控制完成的,由于是程序切换,需要保护和恢复现场;而DMA方式下是由DMA控制器控制完成的,在传输过程中不需要CPU干预,DMA控制器直接在主存和I/O设备之间传送数据,只有开始和结束才需要CPU干预。
    • 程序中断方式具有对异常事件的处理能力,而DMA控制方式适用于数据块的传输。

通道技术Channel

  • 与DMA的原理几乎是一样的,通道是一个特殊功能的 处理器,它有自己的指令和程序专门负责数据输入输出的 传输控制。CPU将“传输控制”的功能下放给通道后只负 责“数据处理”功能。这样,通道与CPU分时使用内存, 实现了CPU内部运算与I/O设备的并行工作
  • 基本思想:进一步减少CPU的干预。
  • 通道是一个独立于CPU的专管I/O控制的处理机,它控制设备与内存直接进行数据交换。
  • CPU仅需发出一条I/O指令给通道,说明要执行的I/O操作和要访问的I/O设备,通道接到指令后,就启动相应的通道程序来完成I/O操作,并在操作结束时向CPU发中断信号。
  • 优点:执行一个通道程序可以完成几组I/O操作 ,与DMA相比,减少了CPU干预。
  • 缺点:费用较高
  • 通道种类
    • 字节多路通道:适用于连接打印机、终端等低速或中速的I/O设备。
    • 数组选择通道:以“组方式”工作,每次传送一批数据,传送速率很高,但在一段时间只能为一台设备服务;适用于连接磁盘、磁带等高速设备。
    • 数组多路通道:其实质是:对通道程序采用多道程序设计技术,使得与通道连接的设备可以并行工作

I/O通道与DMA的区别

  • DMA方式下,数据的传送方向、存放数据的内存 起始地址和数据块长度都由CPU控制;而通道是 一个特殊的处理器,有自己的指令和程序,通过 执行通道程序实现对数据传输的控制,所以通道具有更强的独立处理I/O的功能
  • DMA控制器通常只能控制一台或者少数几台同类 设备;而一个通道可同时控制多种设备

软件的组成和分层设计

分层设计思想

  • 把I/O软件组织称多个层次。
  • 每一层都执行OS所需的功能的一个子集,它依赖 于更低一层所执行的更原始的功能,从而隐藏这 些功能的细节;同时又给高一层提供服务。
  • 较低层更多的考虑硬件的特性,并向较高层软件 提供接口
  • 较高层不依赖于硬件,并向用户提供一个友好的 、清晰的、简单的、功能更强的接口。

image-20220512221844589

设备独立性

  • 为了实现设备独立性而引入了逻辑设备和物理设备这两个概念,在应用程序中,使用逻辑设备名称来请求使用某类设备,而系统在 实际执行时,还必须使用物理设备名称
  • 系统需具有将逻辑设备名称转换为某物理设备名称的功能
  • 好处
    • 设备分配时的灵活性
    • 易于实现I/O重定向

为了实现设备的独立性,系统必须设置一张逻辑设备表LUT(Logical Unit Table),用于将应用程序中所使用的逻辑设备名映射为物理设备名。

  • 该表的每个表目中包含了三项,逻辑设备名、物理设备名、设备驱动程序的入口地址。

  • 通过逻辑设备名,系统可以查找LUT,便可找到物理设备和驱动程序

    • image-20220616102738703
  • LUT的设置可以采用两种方式:在整个系统中设置一张LUT、为每个用户设置一张LUT

设备驱动程序

  • 设备密切相关的代码放在设备驱动程序中 ,每个设备驱动程序处理一种设备类型。
  • 设备驱动程序的任务是接收来自与设备无关的上层软件的抽象请求,并执行这个请求。
  • 每一个控制器都设有一个或多个设备寄存器 ,用来存放向设备发送的命令和参数。设备驱动程序负责释放这些命令,并监督它们正确执行。
  • 特点:  I/O进程与设备控制器之间的通信程序  驱动程序与I/O设备的特性紧密相关  与I/O控制方式紧密相关  与硬件紧密相关
  • 组成自动配置和初始化子程序I/O操作子程序中断服务子程序
  • 设备驱动具有的共性:设备驱动是内核的一部分

驱动程序的接口

  • 驱动程序初始化函数:向操作系统登记该驱动程序的接口函数,该初始化函数在系统启动时安装入内核执行
  • 驱动程序卸载函数:申请设备函数,释放设备函数
  • I/O操作函数:调用该子程序是系统调用的结果。
  • 中断处理函数:系统来接收硬件中断,再由系统调用中断服务子程序。

驱动程序与应用程序的区别

  • 应用程序以main开始;驱动程序没有main,它以一个模块初始化函数作为入口。
  • 驱动程序完成初始化之后不再运行,等待系统调用;应用程序从头到尾执行一个任务。
  • 驱动程序不能使用标准C库。

缓冲管理

缓冲技术可提高外设利用率

  • 原因:
    • 匹配CPU与外设的不同处理速度
    • 减少对CPU的中断次数。
    • 提高CPU和I/O设备之间的并行性

缓冲区的管理

  • 单缓冲区

    • 每当用户进程发出一个I/O请求时,操作系统便在主存中为之分配一个缓冲区
    • image-20220616103138616
    • 由于T和C是可以并行的,当T>C时,系统对每一块数据的处理时间为M+T;反之,为M+C。
    • 即系统对每一块数据的处理时间为Max(C,T) + M。
  • 双缓冲区

    • 两个缓冲区,CPU和外设都可以连续处理而无需等待对方,要求CPU和外设速度相近
    • 如果C<T,可使块设备连续输入;如果C>T,则可使CPU不必等待设备输入。
    • 即系统对每一块数据的处理时间可以粗略的认为是Max(C,T) 。
    • image-20220616103337486
  • 环形缓冲区

    • 若CPU和外设的处理速度差较大,双缓冲效果不够理想,因此引入了多缓冲机制。
    • 多个缓冲区,在循环缓冲区中包括多个缓冲区,每个缓冲区的大小相同,作为输入的多缓冲区可分为三种类型,用于装输入数据的空缓冲区R、已装满数据的缓冲区G以及计算进程正在使用的工作缓冲区C
    • 多个指针,作为输入的缓冲区可设置三个指针,用于指示计算进程下一个可用缓冲区G的指针Nextg指示输入进程下次可用的空缓冲区R的指针Nexti、以及用于指示计算进程正在使用的缓冲区C的指针Current
  • 缓冲池

    • 为了提高缓冲区的利用率,引入缓冲池,在池中设置了多个可供若干个进程共享的缓冲区。
    • 空闲缓冲区。
    • 装满输入数据的缓冲区。
    • 装满输出数据的缓冲区
  • 缓冲区可以在收容输入、提取输入、收容输出、提取输出四种工作方式下工作:

    • image-20220616103749256

设备管理

I/O设备分配

由于设备、通道资源的有限性,进程必须首先向设备管理程序提出资源申请,然后由设备分配程序根据相应的分配算法为进程分配资源。

  • 两种常见作法:
    • 在进程间切换使用外设,如键盘和鼠标;
    • 通过一个虚拟设备把外设与应用进程隔开,只由虚拟设备来使用设备

设备分配用数据结构

设备控制表(DCT, Device Control Table):每个设备一张,反映设备的特性、设备和控制器的连接情况

  • image-20220616104016193
  • DCT说明
    • 设备队列队首指针:凡因为请求本设备而未得到满足的进程,其PCB都应按照一定的策略排成一个队,称该队列为设备请求队列或简称设备队列,其队首指针指向队首PCB
    • 设备状态:当设备处于使用状态时,应该设备设置为忙/闲标志置为1;
    • 控制器表指针:该指针指向该设备所连接的控制器的控制表;
    • 重复执行次数:外部设备在传送数据时,较容易发生数据传送错误。在许多系统中,如果发生传送错误,并不立即认为传送失败,而是令它重传,并由系统规定设备在工作中发生错误时应重复执行的次数。

系统设备表(SDT, system device table)

  • 在整个系统中只有一张,它记录被连接到系统中的所有物理设备的情况,并为每个物理设备设一表目项。
  • image-20220616104119393
  • SDT说明
    • DCT指针:指向相应设备的DCT;
    • 设备使用进程标识:正在使用该设备的进程标识;
    • DCT信息:为引用方便而保存的DCT信息,如:设备标识、设备类型等;

控制器控制表(COCT, COntroller Control Table)

  • 每个设备控制器一张,描述I/O控制器的配 置和状态。如DMA控制器所占用的中断号、 DMA数据通道的分配

通道控制表(CHCT, CHannel Control Table):每个通道一张,描述通道工作状态

设备分配时应考虑的因素

  • 设备固有属性:独享、共享、虚拟设备
  • 设备分配算法:先来先服务、优先级高者优先
  • 设备分配中的安全性:死锁问题
    • 安全分配(同步):在设备分配中防止死锁,进程发出I/O请求之后,进入阻塞,直到I/O完成。CPU和I/O串行工作,打破了死锁条件,但是效率低。
    • 不安全分配(异步):设备在分配时不考虑可能产生的死锁,进程发出I/O请求后,仍然继续运行,可继续请求其他I/O设备。需要进行安全性检查,但进程执行效率相对较高

设备分配策略

单(多)通路I/O系统的设备分配

  • 单(多)通路:一个设备对应一(多)个控制器,一个控制器对应一(多)个通道。

    1. 分配设备

      根据物理设备名查找系统设备表SDT,从中找到设备控制器表DCT,如果设备忙,则进入等待队列;否则,计算是否产生死锁,进行分配。

    2. 分配设备控制器

      将设备分配给进程后,在DCT中找到该设备相连的设备控制器表COCT,如果控制器空闲,则分配;否则,进入等待队列。

    3. 分配通道

    4. 从COCT中找到相连的通道控制表CHCT,如果通道空闲,则分配,否则,进入等待队列。

用户空间的I/O软件:SPOOLing技术(重点)

  • 在多道程序系统中,专门利用一道程序(SPOOLing程序)来完成对设备的I/O操作,无需使用外围I/O处理机

  • 也称为虚拟设备技术可把独享设备转变成具有共享特征的虚拟设备,从而提高设备利用率。

  • 基本思想:
    • SPOOLing程序和外设进行数据交换:
      • SPOOLing程序预先从外设读取数据并加以缓冲,在以后需要的时候输入到应用程序;
      • SPOOLing程序接受应用程序的输出数据并加以缓冲,在以后适当的时候输出到外设。
    • 应用程序进行I/O操作时,只是和SPOOLing程序交换数据(从SPOOLing程序的缓冲池中读出数据或把数据送入缓冲池),而不是跟实际的外设进行I/O操作,称为“虚拟I/O”。
  • SPOOLing系统由三部分组成:

    • 输入井和输出井,这是在磁盘上开辟的两个大存储空间。
      • 输入井是模拟脱机输入时的磁盘设备,用于暂存I/O设备输入的数据;
      • 输出井是模拟脱机输出时的磁盘设备,用于暂存用户程序和输出数据。
    • 输入缓冲区和输出缓冲区,缓和CPU与磁盘之间速度不匹配,在内存中开辟的两个缓冲区。
      • 输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井;
      • 输出缓冲区用于暂存从输出井送来的数据,以后再传送给输出设备。
    • 输入进程SPi和输出进程SPo,利用两个进程来模拟脱机I/O时的外围控制机
      • 进程SPi模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井,当CPU需要输入数据时,直接从输入井读入内存
      • 进程SPo模拟脱机输出时的外围控制机,将用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。
  • 特点
    • 高速虚拟I/O操作
      • 一方面,应用程序的虚拟I/O比实际I/O速度提高,缩短应用程序的执行时间。
      • 另一方面,程序的虚拟I/O操作时间和实际I/O操作时间分离开来。
    • 实现对独享设备的共享
      • 由SPOOLing程序提供虚拟设备,可以对独享设备依次共享使用

I/O性能问题

解决I/O性能问题的两个途径:

  • 使CPU利用率尽可能不被I/O降低
    • 可以使用缓冲技术减少或缓解速度差异,同时使用异步I/O使CPU不等待 I/O。
  • 使CPU尽可能摆脱I/O
    • 使用DMA、通道等I/O部件让CPU摆脱I/O操作的影响

I/O操作过程

I/O操作主要分为两个步骤:

  1. 磁盘把数据装载进内核的内存空间
  2. 内核的内存空间的数据copy到用户的内存空间中

有如下五种方式

  1. 阻塞I/O
    • 阻塞I/O是指调用结果返回之前,当前线程会被挂起(线程进入睡眠状态) 。函数只有在得到结果之后,才会返回,才能继续执行。
  2. 非阻塞I/O
    • 进程发起I/O调用,I/O自己知道需过一段时间完成,就立即通知进程进行别的操作,则为非阻塞I/O。
  3. I/O多路复用
    • 工作进程调用一个管理I/O的特殊库函数,此库函数可以接受并管理多个I/O请求,工作进程则可以同时等待多个I/O请求,虽然是阻塞,但是阻塞在多个进程上,可以提高效率。第二阶段依然需要工作进程参与库函数把内核空间数据复制到用户空间,第二阶段依旧阻塞
  4. 事件(信号)驱动I/O
    • 进程发起调用,通过回调函数,内核会记住是哪个进程申请的,一旦第一段完成了,就可以向这个进程发起通知,这样第一段就是非阻塞的,进程不需要盲等了,但是第二段依然是阻塞的
  5. 异步I/O
    • 无论第一第二段,不再向系统调用提出任何反馈,只有数据完全复制到服务进程内存中后,才向服务进程返回ok的信息,其它时间,进程可以随意做自己的事情,直到内核通知ok信息。

image-20220616105135439

6磁盘管理

磁盘工作原理

硬盘诞生前的外存——磁带:只能顺序读取

磁盘结构

基本概念

  • 扇区(sector):盘片被分成许多扇形的区域
  • 磁道(track):盘片上以盘片中心为圆心,不同半径的同心圆。
  • 柱面(cylinder):硬盘中,不同盘片相同半径的 磁道所组成的圆柱。
  • 每个磁盘有两个面,每个面都有一个磁头(head)。
  • image-20220517090053705

image-20220517090258286

扇区512字节来历:本来是600字节,但是有标志服之类

补充:

  • 对于磁盘,每个磁道的扇区数并不是常量。
  • 绝大多数磁盘都有一些缺陷扇区,因此映射必须用磁盘上的其他空闲扇区来替代这些缺陷扇区

注:对于磁盘,每个磁道的扇区数并不是常量。 • 绝大多数磁盘都有一些缺陷扇区,因此映射必须用 磁盘上的其他空闲扇区来替代这些缺陷扇区

磁盘缺陷

  • 硬盘实际扇区数比硬盘标签上标定的大,其中一部份用于存储硬盘的固件(硬盘控制器使用)
  • 一部分是用户存储数据的区域,即工作区,也就是硬盘标定容量的扇区;
  • 剩下的就是保留区,超过在固件里定义的硬盘容量的 那些扇区就称为保留扇区
  • P表:又称为永久缺陷列表,用于记录硬盘生产过程中 产生的缺陷,读到该扇区将直接跳过
  • G表:G表又称为增长缺陷列表,用于记录硬盘使用过程中由于磁介质性能变弱而引起的缺陷,读到坏扇区将转读原保留区

磁盘的组织

主引导扇区(MBR)

分区表(DPT)

分区引导扇区(DBR)

容量及访问时间

主引导扇区(MBR)

  • 硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节 ,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。 MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个 操作系统,不随操作系统的不同而不同,即使 不同,MBR也不会夹带操作系统的性质,具有 公共引导的特性。

  • MBR包含三部分内容

    • 前446字节为启动代码及数据

    • 447-510字节(64个字节)则是分区表(DPT)

      • 分区表由四个分区项组成,每个分区项16字节,记录了启动时需要的分区参数。
    • 最后两个字节AA和55被成为幻数(Magic Number)

      • BIOS读取MBR时会检查是否有这两个幻术,若无则认为该硬盘未分区。
  • image-20220517090939771

由于MBR的限制只能有4个主分区,系统必须装在主分区上面。

硬盘分区有三种:主磁盘分区、扩展磁盘分区、逻辑分区

  • 一个硬盘主分区至少有1个,最多4个
    • 主分区只能有一个是激活的(active),其余为inactive,且操作系统必须装载主分区上面
  • 分出主分区后,其余的部分可以分成扩展分区,扩展分区可以没有,但最多1个;
    • 扩展分区不能直接使用,必须分成若干逻辑分区
  • 主分区+扩展分区总共不能超过4个,所有的逻辑分区都是扩展分区的一部分。

磁盘地址与块号的转换

  • 磁盘地址(CHS):Cylinder,Head,Sector;
  • 块号:又称逻辑块号(LBA),Logic Block Address ,现代磁盘驱动器可以看做一个一维的逻辑块的数 组,逻辑块是最小的传输单位。
  • image-20220517091236556

磁盘访问时间

  • 寻道时间
    • image-20220517091427877
  • 旋转延迟时间
    • image-20220517091540350
  • 传输时间
    • image-20220517091603457
  • 访问时间
    • 访问时间=寻道时间+旋转延迟时间+传输时间,

磁盘调度算法

  • 先来先服务算法(FCFS):按访问请求到达的先后次序服务
  • 最短寻道时间优先算法(SSTF,Shortest Seek Time First)
  • 扫描算法(SCAN):当有访问请求时,磁头按一个方向移动,在移动过程 中对遇到的访问请求进行服务,然后判断该方向上是 否还有访问请求,如果有则继续扫描;否则改变移动 方向,并为经过的访问请求服务,如此反复。
  • 循环扫描算法(CSCAN):移动臂到达最后一个柱面后,立即带动读写 磁头快速返回到0号柱面。
  • image-20220517092456967
  • LOOK和C-LOOK:SCAN与C-SCAN磁头总是严格地遵循从盘面的一端到另一端,显然,磁头移动只需要到达最远端的一个请求即可返回,不需要到达磁盘端点。这种形式的SCAN与C-SCAN算法称为LOOK 和 C-LOOK调度。

磁盘空间的管理

位图

  • image-20220517092612643

空闲表法

  • 将所有空闲块记录在一个表中,即空闲表;
  • 主要记录两项内容:起始块号,块数

空闲链表法:把所有空闲块链成一个表,链会 很长。

成组链接法:把空白物理块分成组,在通过指针把组与组之间链接起来,这种管理空白块的方法称为 成组链接法

  • 成组链接法的优点: 1. 空白块号登记不占用额外空间; 2. 节省时间; 3. 采用后进先出的栈结构思想 。

提高磁盘I/O速度

提高I/O速度的主要途径

  • 选择性能好的磁盘
  • 并行化
  • 采用适当的调度算法
  • 设置磁盘高速缓冲区

磁盘高速缓存

  • 磁盘高速缓存的形式 •

    • 独立缓存(大小固定) :在内存中开辟一个单独的存储空间作为磁盘高速缓存,其大小固定
    • 虚拟内存为缓存(弹性)把所有未利用的内存空间变为一个缓冲池,供请求分页系统和磁盘I/O共享,大小不固定
  • 数据交付:指将磁盘高速缓冲中的数据传送给请求者进程

    • 直接交付(copy开销):直接将高速缓存中的数据copy到请求者进程的内存工作区中。
    • 指针交付(内存管理复杂):只将指向高速缓存中某区域的指针,交付给请求者进程。
  • 置换算法(LRU)

  • 周期性写回 • 周期性地将disk cache中被修改过的内容写回磁盘

优化数据布局

  • 优化物理块的分布:连续摆放
  • 优化索引节点的分布:减少与数据块的距离;与数据块结合

提高磁盘I/O速度的其他方法

  • 提前读:顺序访问时,常采用提前读入下一块到缓冲区中。
  • 延迟写
  • 虚拟盘:利用内存空间去仿真磁盘(RAM盘)

廉价冗余磁盘阵列(RAID)

廉价冗余磁盘阵列(Redundant Arrays of Inexpensive Disks, RAID)

  • 其基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。
  • 根据选择的版本不同,RAID比单颗硬盘有以下一个或多个方面的好处:
    • 增强数据集成度,增强容错功能,增加处理量或容量。
    • 另外,磁盘阵列对于电脑来说,看起来就像一个单独的硬盘或逻辑存储单元

RAID0:无差错控制的带区组

条带化(Stripe)存储,RAID0需要两个以上的磁盘来组成带区组,数据分为数据块保存在不同的驱动器上。

由于数据分布在不同驱动器上,所以数据吞吐率大大提高,驱动器的负载也比较平衡。

  • 理论上说,有N个磁盘组成的RAID0是单个磁盘读写速度的N倍。

RAID0不计算校验码,因而没有冗余校验功能,也没有数据差错控制,因此它并不能算是真正的RAID结构。

image-20220616133352602

RAID1:镜像结构

它是镜象(Mirror)磁盘冗余阵列,将每一数据块重复存入镜像磁盘,以改善磁盘机的可靠性。

  • 镜像盘也称为拷贝盘,相当于一个不断进行备份操作的磁盘。
  • 优势:
    • 当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能
    • 当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据,提供了很高的数据安全性和可用性
  • 缺点:
    • RAID 1的硬盘容量利用率只有50%,是所有RAID级别中最低的,因而单位成本也最高
image-20220616133509580

RAID2:带海明码校验

RAID 2是采用海明码(Hamming Code)纠错冗余的磁盘阵列,将数据位交叉写入几个磁盘中,并利用几个磁盘驱动器进行按位的出错检查,冗余度比RAID1小。

  • 特点:
    • 并行存取,各个驱动器同步工作。
    • 使用海明编码来进行错误检测和纠正,数据传输率高
    • 需要多个磁盘来存放海明校验码信息,冗余磁盘数量与数据磁盘数量的对数成正比。
    • 这种阵列的数据读写操作涉及阵列中的每一个磁盘,影响小文件的传输率,因此它适合大量顺序数据访问
    • 是一种在多磁盘易出错环境中的有效选择,并未被广泛应用,目前还没有商业化产品

image-20220616133547080

RAID3:带奇偶校验的并行传送

  • 基本思想:

    • 将磁盘分组,读写要访问组中所有盘,每组中有一个盘作为校验盘。
    • 简单理解:先将分布在各个数据盘上的一组数据加起来,将和存放在冗余盘上。一旦某一个盘出错,只要将冗余盘上的和减去所有正确盘上的数据,得到的差就是出错的盘上的数据。
  • 特点

    • 它同RAID 2非常类似,都是将数据条块化分布于不同的硬盘上,区别在于RAID 3使用简单的奇偶校验,并用单块磁盘存放奇偶校验信息
    • RAID 3对于大量的连续数据可提供很好的传输率,但对于随机数据来说,奇偶盘会成为写操作的瓶颈。

image-20220616133650875

RAID4:带奇偶校验码的独立磁盘结构

RAID 4也是用一个校验盘,但和RAID 3不一样。RAID 4是以扇区作为数据分段,各磁盘相同位置的分段形成一个校验磁盘分段,放在校验盘。

  • 特点:
    • 冗余代价与RAID3相同
    • 访问数据的方法与RAID3不同
    • 在RAID3中,一次磁盘访问将对磁盘阵列中的所有磁盘进行操作。
    • RAID4出现的原因:希望使用较少的磁盘参与操作,以使磁盘阵列可以并行进行多个数据的磁盘操作

RAID5:分布式奇偶校验的独立磁盘结构

RAID 5 避免了 RAID 4 的瓶颈,校验数据分布式存储,数据条带存储单位为块

RAID 5不单独指定的奇偶盘,而是在所有磁盘上交叉地存取数据及奇偶校验信息。在RAID 5上,读/写指针可同时对阵列设备进行操作,提供了更高的数据流量。

  • 特点
    • RAID 5更适合于小数据块和随机读写的数据
    • RAID 3与RAID 5相比,最主要的区别在于RAID 3每进行一次数据传输就需涉及到所有的阵列盘;而对于RAID 5来说,大部分数据传输只对一块磁盘操作,并可进行并行操作。
    • 在RAID 5中有“写损失”,即每一次写操作将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。
    • 当进行恢复时,如我们需要恢复图中的A0,这里就必须需要B0、C0、D0加0 parity才能计算并得出A0,进行数据恢复。所以当有两块盘坏掉的时候,整个RAID的数据失效。

image-20220616133733971

RAID6:带有两种分布存储的奇偶校验码的独立磁盘结构

两个分布式存储的校验数据,数据条带存储单位为块。

与RAID 5相比,RAID 6增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,即使两块磁盘同时失效也不会影响数据的使用。

  • 特点
    • RAID 6需要分配给奇偶校验信息更大的磁盘空间
    • 写入数据要访问1个数据盘和2个冗余盘,相对于RAID 5有更大的“写损失”,因此“写性能”非常差;
    • 可容忍双盘出错;
    • 存储开销是RAID5的两倍(多一个冗余盘)。
    • 较差的性能和复杂的实施方式使得RAID 6很少得到实际应用
image-20220616133752130

7文件系统

基本概念

硬件资源: 中央处理机、主存储器及各种输入输出设备。

软件资源: 各种系统程序、标准子程序和某些常用的应用 程序

数据存放基本要求

  • 能够存储大量的数据(突破地址空间限制)
  • 长期保存:进程终止以后,数据依然存在
  • 可以共享数据:有些数据可能会被多个不同的进程所访问;
  • 为解决这些问题,人们提出“文件”的概念 ,把数据组织成文件的形式,用文件作为数据的存储和访问单位。

文件的概念

文件是指一组带标识(或符号名)的、在逻辑上有完整意义的信息项的序列。

  • 标识即为文件名
  • 信息项:构成文件内容的基本单位(单个字节,或多个字节),各信息项之间具有顺序关系

文件是一种抽象机制,作为数据的存储和访问单位

  • 可以视为一个单独的连续的逻辑地址空间,其大小即为文件的大小,与进程的地址空间无关。

文件包括两部分内容

  • 文件体:文件本身的内容;
  • 文件说明(文件控制块):文件存储和管理的相关信息,如:文件名、文件类型、文件长度、文件内部标识、文件物理地址、存取权限、创建时间、访问时间等;

可以视为一个单独的连续的逻辑地址空间 ,其大小即为文件的大小,与进程的地址空间无关

从基本构成单位(结构)的角度来看,文件目前主要被分成两种形式

  • 无结构文件(流式):文件被看做是命名了的字符串集合
  • 有结构文件(记录式):文件被看做是命名了的相关记录的集合。文件的组织被分为文件、记录和数据项三级。
    • 记录是一组相关数据项的集合,用于描述一个对象的各种属性,一条记录一般包含多个数据项。(一行)
    • 数据项是描述一个对象的相关字符的集合。(一列)

文件的本质是一组字节序列,源于用户程序对所要输入处理的原始数据和输出结果的“长期”(持久化)保存的需求,并按一定“格式”(规范)呈现。所有“需要长期保存”的文件都按某种组织形式存放(映射)到磁盘中。*

  • 所有的IO设备(字符设备,块设备以及网络设备) 都可以看作为字节序列的载体,因此,所有的IO设 备也可以抽象为文件进行表达。这就是现代OS中“ 一切皆文件”的含义
  • 因此所有的I/O设备,包括磁盘、键盘、鼠标、显示 器都可以看成是文件
  • 所有的I/O设备都是文件这一抽象概念的具体表现

文件管理

早期解决方法:保存在纸带和卡片上,再用纸带机或 卡片机输入到计算机

磁盘存储器和磁带存储器出现,程序和数据才开 始真正被计算机自动管理

文件是通过操作系统来管理

文件管理的需求

  • 用户视角(使用逻辑文件)
    • 关心文件中要使用的数据,不关心具体的存放 形式(和位置)。
    • 关心的是文件系统所提供的对外的用户接口,包括 文件如何命名、如何保护、如何访问(创建、打开 、关闭、读、写等);
  • 操作系统视角(组织和管理物理文件):文件系统

文件系统要完成的任务

  1. 统一管理磁盘空间,实施磁盘空间的分配与回收
  2. 实现文件的按名存取:名字空间--映射-->磁盘空间
  3. 实现文件信息的共享,并提供文件的保护、保密手段
  4. 向用户提供一个方便使用、易于维护的接口,并向用户 提供有关统计信息
  5. 提高文件系统的性能;
  6. 提供与IO系统的统一接口。

文件名

  • 当一个文件被创建时,必须给它指定一个名字 ,用户通过文件名来访问文件
  • 文件名.扩展名

文件分类

程序所处理的数据的种类繁多:如数值数据、字符数据、二进制数据,以及以此为基础的具有各种组织形式的数据。

为方便使用,人们定义了各种类型的文件:

  • 性质和用途: 系统文件、库文件、用户文件
  • 数据形式:源文件、目标文件、可执行文件
  • 保护级别:只读文件、读写文件、执行文件、不保护文件
  • 逻辑结构:有结构文件、无结构文件
  • 物理结构:顺序文件、链接文件、索引文件
  • 保存时间:临时文件、永久文件

文件的逻辑结构:是从用户角度看文件,由用户的访问方式确定的。这 给出了三种逻辑结构,还可以组织成堆、顺序、索引、散 列等结构。第一种是以字节为单位的流式结构,第二种是 一种记录式文件结构,最后一种是树形结构

典型的文件结构、文件存取方式及存储介质

  • 流式文件:构成文件的基本单位是字符。
  • 记录式文件:文件由若干记录组成,可以按记录进 行读写、查找等操作。每条记录有其内部结构
  • 文件存取方式:顺序存取(访问);随机存取:提供读写位置(当前位置)。

文件的操作

  • 对整个文件的操作:打开(open)文件、关闭(close)文件、创建(create)文件、撤销(destroy)文件、复制(copy)文件、文件更名(rename)、文件列表(list)。
  • 对文件记录的操作:检索(find)记录、修改(update)记录、插入(insert)记录、删除(delete)记录。

目录

文件系统通过目录来组织管理文件。

目录的概念

  • 目录是由文件说明索引组成的用于文件检索的特殊文件,目录的内容是文件访问和控制的信息(不包括文件内容):

目录内容

  • 目录的内容是文件属性信息(properties),其中的一部分是用户可获取的
  • 基本信息:文件名、别名的数目
  • 文件类型:可有多种不同的划分方法
  • 地址信息:存放位置、位置长度
  • 访问控制信息:文件所有者(属主)、访问权限(用户访问方式)
  • 使用信息:创建时间;最后一次读访问的时间和用户;最后一次写访问的时间和用户

目录的层次结构

一个目录通常包含有许多目录项,每个目录项可以是一个文件或目录,这样就产生了目录的层次结构,或称为树状目录结构

  • 根节点称为根目录;

  • 一个目录是一个非终结结点;

  • 一个文件是一个终结结点;

  • 单级文件目录

    • 文件目录的每个表目应包含:文件的符号名、物理地址、结构信息、控制信息、管理信息
    • 特点:结构简单、文件多时,目录检索时间长有命名冲突、不便于实现共享。
    • image-20220616135740917
  • 二级文件目录

    • image-20220616135758101
  • 多级文件目录:在较高的目录级,其目录表目为下一级目 录名以及一个指向其 目录的指针;在最后一级目录,这 个指针指向文件的物 理地址

    • 如何访问
      • 绝对路径名:一个文件或目 录的绝对路径名是唯一的
      • 相对路径:结合当前路径进行使用
      • 当前目录(也叫工作目录)
      • 上一级目录
    • 特点:层次清楚、可解决文件重名问题、查找速度快、目录级别太多时,会增加路径检索时间

目录的操作

  • 创建(create)目录项、删除(delete)目录项、打开(opendir)目录项、关闭(closedir)目录项、读(readdir)目录项、更名(rename)目录项、链接(link)目录项、撤销(unlink)目录项

文件系统

文件系统的定义和目的

  • 定义:操作系统中与文件管理有关的那部分软件和被管理的文件以及实施管理所需要的数据结构总体
  • 目的:为系统管理者和用户提供了对文件的透明存取(按名存取)

文件系统的任务目标方便的文件访问、并发文件访问和控制、统一的用户接口、多种文件访问权限、执行效率、差错恢复

文件系统的任务目标

  • 方便的文件访问:以符号名称作为文件标识,便于用户使用;
  • 并发文件访问和控制:在多道程序系统中支持对文件的并发访问和控制;
  • 统一的用户接口:为不同设备提供统一接口,方便用户操作和编程;
  • 多种文件访问权限:在多用户系统中的不同用户对同一文件会有不同的访问权限;
  • 执行效率:存储效率、检索性能、读写性能;
  • 差错恢复:能够验证文件的正确性,并具有一定的差错恢复能力;

文件系统必须解决的几个主要问题

  • 如何有效的分配文件存储器的存储空间
  • 提供合适的存取方法
  • 命名的冲突和文件的共享
  • 文件系统的执行效率
  • 提供与I/O的统一接口

文件系统模型的三个层次

  1. 文件系统的接口(最接近用户的)

    • 命令行接口:这是指的是作为用户和文件系统的交互的接口。用户可以通过键盘终端键入命令,取得文件系统的服务。
    • 程序接口:这是作为用户程序何文件系统的接口。用户程序可以通过系统调用的形式来取得文件系统的服务。
  2. 对象操作管理的软件集合:这是文件管理系统的核心部分

  3. 对象及其属性:文件系统管理的对象有文件、目录、磁盘存储空间

文件系统的实现方法

image-20220523100752202

分区:连续扇区的集合

文件的实现需解决以下两个问题

  • 如何来描述一个文件,如何来记录文件的各种 管理信息?
  • 如何来存放文件,即如何把文件的各个连续的 逻辑块存放在磁盘上的空闲物理块当中?如何 来记录逻辑块与物理块之间的映射关系?

文件的组成和文件控制块

一个文件包含文件体和文件控制块(FCB)两部分。

  • 文件体是文件的正文部分,是用户需要保存和处理的有效信息;
  • 文件控制块用来保存一个文件的文件名、物理位置及其他有关的说明与控制信息。系统利用这些信息可以实现从逻辑记录到物理记录的转换以及其他许多操作。

文件控制块(FCB, File Control Block):

  • 基本信息
    • 文件名:字符串,通常在不同系统中允许不同的最大长度。可以修改。
    • 物理位置;
    • 文件逻辑结构:有/无结构(记录文件,流式文件)
    • 文件物理结构:(如顺序,索引等)
  • 访问控制信息
    • 文件所有者(属主):通常是创建文件的用户,或者改变已有文件的属主;
    • 访问权限(控制各用户可使用的访问方式):如读、写、执行、删除等;
  • 使用信息
    • 创建时间,上一次修改时间,当前使用信息等

文件的结构

文件的逻辑结构是记录在用户或应用程序面前呈现的方式;文件的物理结构是文件管理系统内部采用的、与存储介质的物理特性相适应的形式。

文件的逻辑结构

  • 提高检索效率;便于修改;降低文件存储费用

文件物理结构:文件在存储介质上的存放方式

  • 主要结构:连续结构、索引结构、串联结构

  • 连续(顺序)结构:适用于变化不大的顺序访问的文件物理顺序和逻辑顺序是一致的

    • 顺序结构通常适用于只读、只写、或变化不大的顺序访问的文件,多用于磁带设备。
    image-20220523202538136
  • 串联/链接文件结构:串联文件结构是按顺序由串联的块组成的,即文件的信息按存储介质的物理特性存于若干块中。

    • 每个物理块的最末一个字(或第一个字)作为链接 字,它指出后继块的物理地址。链首指针存放在 该文件目录中。文件的结尾块的指针为“∧”, 表示文件至本块结束
    • 空间利用率高;顺序存取效率高、文件动态扩充和修改容易。
    • 随机存取效率太低。可靠性问题。链接指针占用一定的空间
    • image-20220616150229934
  • 索引结构:一个文件的信息存放在若干个不连续物理块中;系统为每个文件建立一个专用数据结构

    • 索引表就是磁盘块地址数组,其中第i个目录指向文件的第i块
    • 索引表位置:文件目录中,文件的开头等。
      • 这里必须知道每个文件的索引表长度是不一样的,不能存放在FCB中,因此FCB中只记录索引表的地址
    • 索引表大小:固定大小,非固定大小
    • 访问索引文件需要两步操作:
      1. 查文件索引号,由逻辑块号查得物理块号
      2. 由此磁盘物理块号而获得所要求的信息
    • image-20220616150418400
    • 优点:保持了链接结构的优点,又回避了其缺点
    • 缺点: 索引表本身带来了系统开销(内外存空间,存取时间)
    • 索引表的组织
      • 链接模式:一个盘块一个索引表,多个索引表链接起来
      • 多级索引:将一个大文件的所有索引表(二级索引)的地址 放在另一个索引表(一级索引)中
      • 综合模式:直接索引方式与间接索引方式结合

文件物理结构的比较

  • 连续文件:
    • 优点是不需要额外的空间开销,只要在文件目录中指出文件的大小和首块的块号即可,对顺序的访问效率很高,适应于顺序存取。
    • 缺点是动态地增长和缩小系统开销很大;文件创建时要求用户提供文件的大小;存储空间浪费较大。
  • 串联文件:
    • 克服了连续文件的不足之处,但文件的随机访问系统开销较大适用于顺序访问的文件。
    • DOS系统中改造了串联文件的结构,使其克服了串联文件的不足,但增加了系统的危险性。
  • 索引文件:
    • 既适应于顺序存访问,也适应于随机访问,是一种比较好的文件物理结构,但要有用于索引表的空间开销和文件索引的时间开销
    • UNIX系统是使用索引结构成功的例子

![ima

实现目录

目录的主要功能:根据用户给出的ASCII形式的文件名(路径名 ),迅速地定位到相应的文件控制块。

目录的 实现需解决以下三个问题

  • 目录项的内容
  • 长文件名问题
  • 目录的搜索方法

实现方法

  • 直接法:目录项=文件名+FCB(属性信息、 在外存上的存放位置)
  • 间接法:目录项=文件名+FCB的地址(索引 号)。
  • 不管是何种方法,给定一个文件名,即可返回 相应的FCB

长文件名

  • MS-DOS:文件名的最大长度为8个字符,扩展名的 最大长度为3个字符;Unix V7:文件名的最大长度 为14个字符。
  • 但在现代OS中,一般都支持更长的、可变长度的文 件名。实现方法有:
    • 方法1:在目录项中,将文件名的长度固定为255个字符。缺点:浪费空间,很少文件用很长的名字
    • 方法2:每个目录项的长度可变,分为三部分:目录项长度、文件的属性信息(此两项长度固定)、文件名(长度可变)。缺点:文件被删除后,该目录项所占用的空间不太好回收利用
    • 方法3:目录项本身的长度固定,把长度可变的文件 名统一放在目录文件的末尾

符号文件目录的查询技术

  • 顺序查寻法:依次扫描符号文件目录中的表目,将表目中的名字 字段与查找的符号名NAME进行比较
  • Hash方法:利用一 个易于实现的变换函数(即Hash函数),把每个符号名唯一的变换成符号表中的表目索引

便于共享的目录组织:目录共享文件、文件共享目录image-20220524084808156

保护文件的方法

  • 建立副本:把同一个文件保存到多个存储介质上
    • 方法简单、设备费用和系统开销增大
    • 适用于短小且极为重要的文件
  • 定时转储
    • 每隔一定时间把文件转储到其他存储介质上
  • 规定文件的权限:文件的一致性检查
    • 磁盘块的一致性:每个磁盘块设置两个计数器,一个记录 在文件中出现的次数,另一个记录在空闲块中出现的次数 ,最终检查两个计数器是否存在不一致问题
    • 文件的一致性:每个文件设置两个计数器,一个记录其i 节点被引用的次数,另一个记录文件目录中引用它的次数 ,最终检查两个计数器是否存在不一致问题

文件的一致性检查:设计两个计数器,一个记录在文件(索引)中出现的次数,另一个记录在空闲块中出现的次数 ,最终检查两个计数器是否存在不一致问题(文件和目录都是)

文件的存取控制

  • 文件保护机制
  • 存取权限验证步骤

存取控制的实现方案

  • 存取控制矩阵
  • 存取控制表
  • 用户权限表
  • 口令

文件系统的性能问题

在设计文件系统时应尽可能减少磁盘访问次数

提高文件系统性能:块高速缓存

  • 又称为文件缓存、 磁盘高速缓存、缓冲区高速缓存。
  • 内存中为磁盘块设置的一个缓冲区,保存了磁盘中某些块的副本。当对文件系统进行操作的时候
    • 检查所有的读请求,看所需块是否在块高速缓冲中
    • 如果在,则可直接进行读操作;否则,先将数据块 读入块高速缓存,再拷贝到所需的地方
    • 由于访问的局部性原理,当一数据块被读入块高速 缓存以满足一个IO请求时,和可能将来还会再次访 问到这一数据块
  • 组织方式:在块高速缓存中有若干个数据块,首先将这些块使用一个双向链表组织起来,当要访问这个链的时候就将其从此链中拿出来,然后挂接到链尾,而我们对于某个文件使用的块要检查其是否在高速缓存中,所以这里又使用块号进行散列以提高检查速度。
  • 块高速缓存的管理
    • 块高速缓存的置换
      • 此缓存的空间不会很大,当其满时我们需要对其进行置换。对于以后可能会再次使用的块我们将其放在链尾,而对于使用概率很小的块可能就需要将其剔除。
    • 块高速缓存的写入策略
      • 在文件系统中,我们需要考虑该块是否会影响文件系统的一致性(高速缓存中的数据与相应磁盘块中的数据是否一致)

基于日志结构的文件系统

为了提高磁盘的IO速度,需要提高写数据的速度,然而,磁盘的性能主要受到磁头的移动所带来的开销。

LFS:基本思路

  • 背景:大多读操作都可以基于缓存数据来处理,因而无需读取硬盘;从磁盘的角度来看,主要以写操作为主 • 为了提高磁盘的I/O速度,需要提高写数据的速度
  • 基本思路:将磁盘看作一个日志系统: log。日志log是一个数据结构,写操作就是对日志进行追加(append)操作,“文件”总是顺序地添加到磁盘上。
  • 读写操作:每个写操作的执行都会在内存的segment缓冲区加入新的数据 块;当segment写满了之后, 其中的数据会写到磁盘。随着不断的读写操作,由于新的数据块会不断替换文件中原 来的数据块,结果segment会逐渐碎片化
  • 失效恢复:检查点和向前滚动:Checkpoint ,roll-forward
  • 清理:LFS的主要问题就是清理: cleaning,其目的是为了提 供连续的空闲磁盘空。
    • 清理进程对segment进行清理,也就是把没有填充满的 segment进行紧缩,从而腾出更多的空闲空间

操作系统

    通电后加载BIOS
    其实BIOS和Grub的前一部分构成了前述stage 1的工作,而stage 2的工作则是完全在Grub中完成的。
    BIOS加载MBR(stage 1)(master boot record,开机硬盘的第一个扇区)中读取开机信息.(Linux中常说的Grub和Lilo这两种开机管理程序就是被保存在MBR中的。)
    GRUB(GRand Unified Bootloader)是GNU项目的一个多操作系统启动程序。简单的说,就是可以用于在有多个操作系统的机器上, 在刚开机的时候选择一个操作系统进行引导。如果安装过Ubuntu一类的发行版的话, 一开机出现的那个选择系统用的菜单就是GRUB提供的。
	BIOS加载MBR中的Grub代码后就把CPU交给了Grub,Grub的工作就是一步一步的加载自身代码,从而识别文件系统, 然后就能够将文件系统中的内核镜像文件加载到内存中,并将CPU控制权转交给操作系统内核。 这样看来,其实BIOS和Grub的前一部分构成了前述stage 1的工作,而stage 2的工作则是完全在Grub中完成的。
	GXemul支持加载ELF格式内核,所以启动流程被简化为加载内核到内存,之后跳转到内核的入口。启动完毕:)整个启动过程非常简单。
posted @ 2022-06-16 15:19  wpy的小黑屋  阅读(36)  评论(0编辑  收藏  举报