操作系统原理

第一章:操作系统引论

  1. OS定义: 操作系统是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充,其主要作用是管理硬件设备,提高它们的利用率和系统吞吐量,并为用户和应用程序提供一个简单的接口,以便用户和应用程序使用硬件设备。
  2. 操作系统的作用:
    1. 作为用户与计算机硬件系统之间的接口
    2. 作为计算机系统资源的管理者
    3. 实现了对计算机资源的抽象
  3. 操作系统的基本特性: 并发、共享、虚拟和异步
    • 并发: 指两个或多个事件在同一时间间隔内发生
  4. 操作系统的主要功能:
    1. 处理器管理‌:
      • 进程控制
      • 进程同步
      • 进程通信
      • 调度
    2. 存储器管理‌:
      • 内存分配和回收
      • 内存保护
      • 地址映射
      • 内存扩充
    3. 设备管理‌:
      • 缓冲管理
      • 设备分配
      • 设备处理
    4. 文件管理‌:
      • 文件存储空间管理
      • 目录管理
    5. 接口管理功能:
      • 用户接口
      • 程序接口
    6. 现代操作系统的新功能:
      • 保障系统安全
      • 支持用户通过联网获取服务
      • 可处理多媒体信息

第二章:进程的描述与控制

  1. 程序的并发执行: 一组在逻辑上互相独立的程序或程序段在执行过程中,其执行时间在客观上互相重叠,即一个程序段的执行尚未结束,另一个程序段的执行已经开始的这种执行方式。
    • 特征:
      • 1.间断性
      • 2.失去封闭性
      • 3.不可再现性
  2. 进程的定义: 进程是程序的执行过程,是系统进行资源分配和调度的一个独立单位
    • 特征:
      • 1.动态性
      • 2.并发性
      • 3.独立性
      • 4.异步性
  3. 进程的基本状态与转换:
    • 就绪状态 - 执行状态 - 阻塞状态
      转换关系
  4. 挂起操作和进程状态的转换
    1. 挂起操作的目的:
      1. 终端用户的需要
      2. 父进程的需要
      3. 负荷调节的需要
      4. OS的需要
    2. 引入挂起操作后进程5个基本状态间的转换
      这里
  5. 进程管理中的数据结构:PCB
    1. 作用:
      • 作为独立运行的基本单位的标志
      • 实现间断性运行方式
      • 提供进程管理所需要的信息
      • 提供进程调度所需要的信息
      • 实现与其他进程的同步和通行
    2. 信息:
      • 进程标识符
      • 处理机状态
      • 进程调度信息
      • 进程控制信息
    3. 组织方式:
      • 线性方式
      • 链接方式
      • 索引方式
  6. 进程的创建
    • (1)申请空白PCB
    • (2)为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等
    • (3)初始化PCB
    • (4)如果进程就绪队列能够接纳新进程,就将新进程插入就绪队列
  7. 线程与进程的比较
    • 1.调度的基本单位: 在传统OS中,进程作为独立调度和分派的基本单位,能够独立运行。其在每次被调度时,都需要进行上下文切换,开销较大。
    • 2.并发性: 在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,甚至还允许一个进程中的所有线程都能并发执行。
    • 3.拥有资源: 进程可以拥有资源,并可作为系统中拥有资源的一个基本单位。
    • 4.独立性: 在同一进程中的不同线程之间的独立性,要比不同进程之间的独立性低得多。
    • 5.系统开销: 在创建(撤销)进程时,系统要为它分配(向它回收)TCB和其他资源(如内存空间和I/O设备等)。
    • 6.支持多处理机系统: 在多处理机系统中,对于传统的进程,即单线程进程,不管有多少处理机,该进程只能运行在一个处理机上。

第三章:处理机调度与死锁

  1. 处理机调度算法的目标:
    • (1)资源利用率:
      • C P U 利 用 率 = C P U 有 效 工 作 时 间 C P U 有 效 工 作 时 间 + C U P 空 闲 等 待 时 间 CPU利用率= {CPU有效工作时间 \over CPU有效工作时间+CUP空闲等待时间} CPU=CPU+CUPCPU
    • (2)公平性
    • (3)平衡性
    • (4)策略强制执行
  2. 调度算法:
    • 先来先服务调度算法(FCFS)
    • 短作业优先调度算法(SJF)
    • 优先级调度算法
      • (1)非抢占式优先级调度算法
      • (2)抢占式优先级调度算法
      • 高响应比优先调度算法 (HRRN)
        • 优 先 级 = 等 待 时 间 + 要 求 服 务 时 间 要 求 服 务 时 间 = 响 应 时 间 要 求 服 务 时 间 优先级= {等待时间+要求服务时间 \over 要求服务时间} ={响应时间\over 要求服务时间} =+=
    • 轮转调度算法(RR)
  3. 死锁的定义::如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件发生,那么该组进程是死锁的
  4. 产生死锁的必要条件:
    • (1)互斥条件
    • (2)请求和保持条件
    • (3)不可抢占条件
    • (4)循环等待条件
  5. 死锁的处理方法 :
    • (1)预防死锁
    • (2)避免死锁
    • (3)检测死锁
    • (4)解除死锁
  6. 资源分配图: 资源分配图(Resource Allocation Graph,简称 RAG) 是一种用于描述操作系统中进程与资源之间关系的图形结构。它通常用于 死锁检测 和 资源分配管理,通过图形化的方式表示系统中进程与资源的分配情况.

第四章:进程同步

  1. 信号量机制介绍:
    • 1.整型信号量
    • 2.记录型信号量
  2. 信号量的应用:
    • 利用信号量实现进程互斥
    • 利用信号量实现进程同步

第五章:存储器管理

  1. 地址绑定和内存保护:
  • 地址绑定是将程序中的逻辑地址(或称为相对地址)与物理内存中的实际位置之间建立映射的过程。操作系统使用地址绑定来将程序代码和数据从其逻辑地址映射到物理内存地址。地址绑定通常分为几个阶段:

    • 编译时地址绑定(Compile-time Binding):如果程序在编译时已知其在内存中的确切位置,编译器会生成物理地址。这种方式要求程序在运行时不发生地址变化。

    • 加载时地址绑定(Load-time Binding):程序在加载到内存时,操作系统会为其分配一个物理内存地址。编译器生成的地址是逻辑地址,加载器将其转换为物理地址。

    • 运行时地址绑定(Execution-time Binding):在程序运行过程中,程序的逻辑地址可以通过段页管理或其他动态机制映射到物理地址,这种方式最灵活,适合现代操作系统。

  • 逻辑地址(Relative Address)与物理地址(Absolute Address)的关系与转换

    • 逻辑地址(Logical Address):由CPU生成的地址,是程序运行时使用的地址,也称为虚拟地址。在程序的源代码中,这些地址是相对的,是程序内部的地址,不是实际内存的地址。

    • 物理地址(Physical Address):指的是实际物理内存位置的地址,操作系统将程序的逻辑地址转换为物理地址以访问内存。

    • 转换过程:逻辑地址与物理地址的转换通常由内存管理单元(MMU)负责。现代操作系统中通常使用分页(paging)或分段(segmentation)技术来进行地址转换。

      • 分页(Paging):将程序的逻辑地址空间分为固定大小的页,内存被分为固定大小的页框。逻辑地址的页号和页内偏移量被用来进行转换,MMU查找页表,将逻辑页号映射为物理页框号,最终得到物理地址。
      • 分段(Segmentation):程序被分为多个段(如代码段、数据段、堆栈段),每个段有一个基地址和一个偏移量,MMU将段基地址与偏移量结合得到物理地址。

内存保护(Memory Protection)
内存保护是操作系统用来防止进程间的相互干扰及防止程序访问未经授权的内存区域的一种机制。通过内存保护,操作系统可以有效地隔离进程的内存空间,提高系统的安全性和稳定性。

  • 内存保护的目标:保护每个进程的地址空间不被其他进程或系统代码篡改。每个进程的内存区域都可以被标记为只读、可读写、可执行等,以避免非法的内存访问。

  • 实现方式

    1. 权限位(Permission Bits):内存管理单元(MMU)可以为每个内存页面设置不同的访问权限,如读、写、执行等。当程序试图进行未经授权的操作时,MMU会发出异常或中断。

    2. 硬件支持:大多数现代CPU(例如x86架构)支持内存保护特性,例如分段保护、分页保护、虚拟内存等。CPU通过硬件机制来实施保护,防止进程越界访问或访问非法内存。

    3. 虚拟内存:通过虚拟内存,操作系统能够创建一个与物理内存无关的逻辑内存空间。每个进程都认为它拥有一个连续的内存地址空间,而操作系统通过分页技术将这些逻辑地址映射到物理内存或硬盘上,确保进程不会访问到其他进程的内存区域。

  • 例子

    • 如果一个进程试图写入只读的内存区域(如代码段),操作系统会通过触发硬件中断来阻止该操作。
    • 在现代操作系统中,如果一个程序试图访问不属于其地址空间的内存区域,操作系统会抛出"段错误"(Segmentation Fault)等异常,防止程序崩溃或损坏其他进程的内存。

通过内存保护机制,操作系统可以确保不同进程之间的内存隔离,提高系统的安全性和稳定性,同时避免非法内存访问导致的数据损坏或安全漏洞。

  1. 连续分配存储管理方式:

连续分配存储管理方式是一种最简单的内存分配方法,在这种方式下,内存空间被划分为一段连续的区域,每个作业(进程)被分配一块连续的内存空间。该方式的特点是内存管理简单,但容易出现内存碎片。

  • 原理:
    内存是以一个连续的空间形式进行分配的,程序或进程的地址空间是一段连续的内存区域。

  • 几种具体实现:

    • 单一连续分配
      这是最简单的内存分配方式。在单一连续分配中,系统在加载程序时为其分配一块连续的内存空间。这种方式适用于小型系统,但当程序较大或系统有多个进程时,会出现内存利用率低下和碎片问题。

    • 固定分区分配
      内存被分为多个固定大小的分区,每个分区可以独立地分配给不同的作业(进程)。每个作业都可以放入一个分区,但如果作业的大小小于分区大小,会浪费空间;如果作业的大小大于分区大小,则无法分配。此方法的缺点是会产生内存碎片,尤其是“外部碎片”。

    • 动态分区分配
      内存的分配是动态的,根据作业的需要进行分配。系统不会预先设定固定的分区大小,而是根据实际需求动态地分配内存空间。每个进程占据一块大小与其需求相同的内存区域,缺点是容易产生“外部碎片”。

    • 动态重定位分区分配
      在动态分区分配的基础上,加入了重定位技术。操作系统通过将程序加载到不同的物理位置并且在运行时调整其地址来消除外部碎片问题。此技术提高了内存的使用效率,但需要硬件支持,如内存管理单元(MMU)。

  1. 分页存储管理的基本方法:

分页存储管理是现代操作系统中常用的一种内存管理方式,它将内存划分为固定大小的页(page),将程序也划分为大小相等的页块(通常是4KB),通过页表将虚拟地址与物理地址进行映射。

  • 基本方法

    • 分页:将程序的逻辑地址空间和物理内存空间都划分为固定大小的块。程序的每个逻辑页面可以被加载到任何物理页面中,这样避免了传统连续分配带来的内存碎片问题。

    • 页表:分页的核心结构是页表,它保存了每个逻辑页与物理页之间的映射关系。CPU通过页表来查询每个逻辑地址对应的物理地址。

    • 虚拟内存:分页允许程序使用比物理内存更大的虚拟内存。操作系统通过分页技术将程序的虚拟地址空间映射到物理内存的不同部分或硬盘上,从而实现虚拟内存的管理。

  • 优点

    • 避免外部碎片:分页技术不再需要整个程序连续的内存空间,极大减少了外部碎片。
    • 支持虚拟内存:通过将不常用的页调出到磁盘,支持进程使用比物理内存更多的内存空间。
  1. 地址变换机构:

地址变换机构是指通过硬件(通常是内存管理单元,MMU)来将程序的逻辑地址转换为物理地址的机制。这个过程在现代操作系统中通常依赖分页或分段技术。

  • 基本原理

    • 逻辑地址(虚拟地址):是程序生成的地址,程序员看到的地址,操作系统需要将其映射到实际的物理内存中。
    • 物理地址:是计算机物理内存中的实际地址,是硬件访问的地址。
  • 地址转换过程

    1. 分页:通过页表将逻辑地址中的页号转换为物理内存中的页框号,然后将页内的偏移量加上去,得到物理地址。
    2. 分段:通过段表将逻辑地址中的段号转换为物理内存中的段基地址,然后加上偏移量,得到物理地址。
  • 硬件支持

    • 内存管理单元(MMU):MMU硬件设备用于执行地址转换的过程,在处理器与内存之间进行地址映射,通常支持分页和分段两种机制。

    • TLB(Translation Lookaside Buffer):为了提高地址转换的效率,现代CPU会使用TLB缓存最近的地址映射,减少每次地址转换的时间。

  1. 分段系统的基本原理:

分段系统(Segmentation)是一种内存管理方式,将程序的逻辑地址空间划分为若干个不同的段。每个段都有一个基地址和一个长度,表示该段的起始位置和长度,程序在运行时通过段表来访问相应的段。

  • 基本原理

    • 逻辑地址:分为段号和段内偏移量。逻辑地址表示的是程序中的段和段内的具体位置。

    • 段表:每个进程有一个段表,段表存储了该进程各个段的基地址和段长度。段号用于确定段表中的哪个条目,偏移量用于访问段内具体位置。

  • 特点

    • 灵活性:分段机制提供了更高的灵活性,因为每个段可以有不同的大小,可以更合理地反映程序的结构(如代码段、数据段、栈段等)。

    • 支持动态增长:分段机制使得程序可以动态地分配不同大小的内存区域,这有助于程序在运行时灵活地管理内存。

    • 外部碎片:与分页相比,分段可能会产生外部碎片问题,因为每个段的大小不固定,导致内存中可能出现无法使用的小空闲块。

  • 优点

    • 便于程序的模块化和动态扩展。
    • 每个段可以独立保护,提高了安全性。
  • 缺点

    • 可能产生外部碎片。
    • 需要管理多个段表,增加了操作系统的复杂度。

第六章:虚拟存储器

  1. 请求页表机制:
页号物理块号状态位P访问字段A修改位M外存地址

第七章:输入\输出系统

  1. I/O 设备的控制方式:

    • 使用轮询的可编程 I/O 方式
    • 使用中断的可编程 I/O 方式
    • 直接存储器访问(DMA)方式
    • I/O 通道方式
  2. 磁盘的访问时间:

  3. 寻道时间 ( T s T_s Ts):由磁头移动到目标磁道的时间,通常为硬盘规格提供。

  4. 平均旋转延迟时间 ( T τ T_τ Tτ):与磁盘转速(RPM)相关,通常是磁盘旋转周期的一半。

    • T t = 1 2 × 60 RPM T_t=\frac{1}{2}\times\frac{60}{\text{RPM}} Tt=21×RPM60

  1. 传输时间 ( T t T_t Tt):由数据量和磁盘的传输速率决定,计算公式为 T t = D R T_t = \frac{D}{R} Tt=RD
    • D为传输的数据量
    • R为数据传输速率

磁盘的 总访问时间 是这三者的和,计算公式为:

T total = T s + T τ + T t T_{\text{total}} = T_s + T_{\tau} + T_t Ttotal=Ts+Tτ+Tt

第八章:文件管理

  1. 文件目录:
    1. 实现“按名存取”,即用户只须向系统提供所须访问文件的名字,便能快速准确地找到指定文件在外存中的存储位置。这是目录管理中最基本的功能,也是文件系统向用户提供的最基本的服务。
    2. 提高对目录的检索速度,通过合理地组织目录结构,可加快对目录的检索速度,从而提高对文件的存取速度。这是在设计一个大、中型文件系统时所追求的主要目标。
    3. 文件共享,在多用户系统中,应允许多个用户共享一个文件。这样,只须在外存中保留一份该文件的副本供不同用户使用即可,如此便可节省大量的存储空间,同时还可以方便用户使用和提高文件利用率。
    4. 允许文件重名,系统应允许不同用户对不同文件采用相同的名字,以便用户按照自己的习惯给文件命名和使用文件。
  2. 树形目录:
    树形目录
  3. 路径名和当前目录:
    • 路径名(path name): 在树形目录中,从根目录到任何数据文件都只有一条唯一的通路。
    • 当前目录(工作目录): 从当前目录开始到数据文件为止所构成的路径名称为相对路径名(relative path name),而把从树根开始的路径名称为绝对路径名(absolute path name)

第九章:磁盘存储器管理

廉价磁盘冗余阵列(RAID)原理

RAID(Redundant Array of Independent Disks),即冗余独立磁盘阵列,是通过将多个物理硬盘组合成一个逻辑硬盘的方式,以提高数据存储的性能、容量、可靠性等。RAID 最初被提出时,主要目的是降低硬盘故障对数据存储的影响,并提升系统性能。

RAID 的基本原理

RAID 的核心思想是将多个硬盘通过硬件或软件方式连接起来,形成一个“阵列”,然后将数据按一定的规则分配到多个硬盘上。这样,不仅能够提高存储容量和性能,还能通过冗余存储技术提供容错能力,以防某个硬盘发生故障时,数据不丢失。

RAID 可以实现以下几个目标:

  • 提高性能:通过将数据并行存储或读取,提高磁盘的I/O性能。
  • 数据冗余:使用冗余机制,在磁盘发生故障时保护数据。
  • 提升存储容量:将多个硬盘的容量聚合在一起,提供更大的存储空间。

RAID 分级(RAID Level)原理

RAID 根据不同的需求和实现方式,定义了多个不同的层次或级别。常见的 RAID 分级包括 RAID 0、RAID 1、RAID 5、RAID 10 等。每种 RAID 级别有其特定的特点,分别满足不同的性能、冗余和容量需求。

RAID 0:条带化(Striping)
  • 原理:RAID 0 将数据分割成块(条带),并将这些块并行地存储在多个硬盘中。这样可以大大提高读取和写入的速度,因为多个硬盘可以同时进行数据读写。
  • 优点:提高性能,增加存储空间(没有冗余,所有硬盘的容量都可以使用)。
  • 缺点:没有冗余,任何硬盘发生故障都会导致数据丢失。
  • 适用场景:需要高性能、非关键性数据存储的场景,如临时数据存储、视频编辑等。
RAID 1:镜像(Mirroring)
  • 原理:RAID 1 将相同的数据写入两个硬盘中,因此,每个硬盘都有相同的数据副本,称为“镜像”。如果一个硬盘发生故障,可以从另一个硬盘恢复数据。
  • 优点:提供数据冗余,容错能力强。如果一个硬盘故障,数据不会丢失。
  • 缺点:存储效率低,因为每个硬盘存储相同的数据,实际可用存储容量是总容量的一半。
  • 适用场景:需要高度可靠性和数据冗余的小型服务器、关键数据存储。
RAID 5:带奇偶校验的条带化(Striping with Parity)
  • 原理:RAID 5 在多个硬盘中将数据分割成条带,并且使用奇偶校验来实现冗余存储。奇偶校验数据分布在所有硬盘上,所以每个硬盘上既存储数据也存储校验信息。当某个硬盘故障时,可以通过其他硬盘的校验数据恢复丢失的数据。
  • 优点:提供数据冗余并具有较高的存储效率。容忍一个硬盘故障,恢复起来较为简单。
  • 缺点:写性能较低,因为每次写入时都需要更新奇偶校验数据。
  • 适用场景:大多数需要平衡性能、容量和冗余的应用,如数据库、文件服务器。
RAID 6:双重奇偶校验(Striping with Double Parity)
  • 原理:RAID 6 类似于 RAID 5,但它使用双重奇偶校验,每个数据条带的冗余信息被分散到多个硬盘上。因此,它能够容忍 两个硬盘的故障,并且依然能够恢复数据。
  • 优点:比 RAID 5 更加可靠,可以容忍两个硬盘的同时故障。
  • 缺点:写性能比 RAID 5 更差,因为需要计算和更新两个奇偶校验值。存储效率较低。
  • 适用场景:需要高可靠性的大型存储系统,如企业级数据中心。
RAID 10(RAID 1+0):镜像 + 条带化
  • 原理:RAID 10 是 RAID 1 和 RAID 0 的结合体。它先通过 RAID 1 将数据镜像,然后在这些镜像的硬盘上进行 RAID 0 条带化操作。这样既能保证数据冗余,又能提升性能。
  • 优点:提供高性能和高可靠性,可以容忍一个硬盘在每个镜像组内的故障。
  • 缺点:存储效率低,实际可用容量是总容量的 50%。
  • 适用场景:需要高性能、高冗余的应用,如高负载的数据库系统。
RAID 2、RAID 3、RAID 4

这些较少使用的 RAID 级别分别使用不同的奇偶校验机制。RAID 2 和 RAID 3 使用专门的磁盘存储校验位,而 RAID 4 使用集中式奇偶校验。它们较少应用,因为其他级别(如 RAID 5)提供更好的性能和冗余。


RAID 分级的特点总结

RAID 级别数据冗余容错能力存储效率读写性能适用场景
RAID 0需要高性能、数据冗余不重要的应用
RAID 1小型企业、关键数据存储
RAID 5中等较高较好数据库、大型文件服务器
RAID 6较低较差企业级数据存储、大规模存储系统
RAID 10高性能、大容量需求的应用

总结

RAID(冗余独立磁盘阵列)是一种通过将多个硬盘组成阵列来提升性能、存储容量和冗余可靠性的技术。常见的 RAID 级别包括 RAID 0、RAID 1、RAID 5、RAID 6 和 RAID 10,每种 RAID 级别都有其特定的优点和适用场景。选择合适的 RAID 级别应根据对性能、冗余、存储效率和成本的需求来决定。


计算题

1. 调度算法

知识点:

调度算法是操作系统用来决定哪个进程在何时执行的机制。常见的调度算法有:

  • 先来先服务(FCFS, First-Come, First-Served):按照进程到达的顺序进行调度,简单但可能导致“饥饿现象”和“较长作业延迟”(即长作业占用CPU时间较长)。

  • 最短作业优先(SJF, Shortest Job First):优先调度执行时间最短的作业,但难以预知作业的执行时间,因此有时需要使用“预估”的方式来估计作业的长度。

  • 优先级调度(Priority Scheduling):根据进程的优先级来决定调度顺序。优先级高的进程先执行,但可能会导致低优先级进程饥饿。

  • 轮转调度(RR, Round Robin):每个进程分配一个时间片,时间片用完后切换到下一个进程执行,直到所有进程都执行完。

  • 高响应比优先调度算法(HRRN) :通过计算进程的响应比,平衡了短作业和长作业的公平性,能够避免长期等待的小进程被饿死。它适合于一些需要保证公平性和响应性的系统。

  • 时间片轮转调度算法(RR) :是一种简单而有效的调度算法,特别适用于具有多道程序设计的系统,保证每个进程都能公平地获得 CPU 时间,但可能导致频繁的上下文切换。

1.1 先来先服务(FCFS, First-Come, First-Served)

原理:进程按照到达的顺序进行调度,简单但可能导致“长作业阻塞短作业”现象,即 “饥饿”

特点

  • 非抢占式。
  • 容易导致平均等待时间较长。

例子
假设有 4 个进程(P1, P2, P3, P4),它们的到达时间和执行时间如下:

进程到达时间执行时间
P104
P213
P325
P432

调度过程

  • P1 到达时,开始执行,执行时间为 4ms,完成时间为 4ms。
  • P2 到达时,P1 正在执行,P2 等待,执行时间为 3ms,完成时间为 4 + 3 = 7ms。
  • P3 到达时,P1 和 P2 都已执行,P3 等待,执行时间为 5ms,完成时间为 7 + 5 = 12ms。
  • P4 到达时,P1、P2、P3 已经执行,P4 等待,执行时间为 2ms,完成时间为 12 + 2 = 14ms。

结果

  • 完成时间:P1=4, P2=7, P3=12, P4=14
  • 周转时间:P1=4-0=4, P2=7-1=6, P3=12-2=10, P4=14-3=11
  • 带权周转时间:P1=4/4=1, P2=6/3=2, P3=10/5=2, P4=11/2=5.5
1.2 最短作业优先(SJF, Shortest Job First)

原理:每次选择执行时间最短的进程。分为非抢占式抢占式(即最短剩余时间优先)。

特点

  • 可以最小化平均等待时间。
  • 需要知道每个进程的执行时间。

例子
假设有 4 个进程(P1, P2, P3, P4),它们的到达时间和执行时间如下:

进程到达时间执行时间
P106
P218
P327
P433

调度过程

  • 进程 P1 到达后,它是唯一一个可运行的进程,执行 6ms 后结束。
  • 然后 P4 到达,它的执行时间最短(3ms),所以 P4 执行,执行 3ms 后结束。
  • 接着是 P3,它的执行时间为 7ms。
  • 最后是 P2,它的执行时间最长。

结果

  • 完成时间:P1=6, P4=9, P3=16, P2=24
  • 周转时间:P1=6-0=6, P4=9-3=6, P3=16-2=14, P2=24-1=23
  • 带权周转时间:P1=6/6=1, P4=6/3=2, P3=14/7=2, P2=23/8=2.875
1.3 优先级调度(Priority Scheduling)

原理:每个进程都有一个优先级,调度时选择优先级最高的进程。可以是抢占式非抢占式

特点

  • 如果优先级值越大,表示优先级越高。
  • 有可能导致低优先级进程饥饿。

例子
假设有 4 个进程(P1, P2, P3, P4),它们的优先级如下:

进程到达时间执行时间优先级
P1042
P2131
P3254
P4323

调度过程

  • P1 到达后,执行 4ms。
  • P2 到达后,但它的优先级最低,无法抢占 P1。
  • P3 到达后,它的优先级最高,执行 5ms 后结束。
  • P4 到达后,执行 2ms,最后 P2 执行 3ms。

结果

  • 完成时间:P1=4, P3=9, P4=11, P2=14
  • 周转时间:P1=4-0=4, P3=9-2=7, P4=11-3=8, P2=14-1=13
  • 带权周转时间:P1=4/4=1, P3=7/5=1.4, P4=8/2=4, P2=13/3=4.33
1.4 轮转调度(Round Robin, RR)

原理:每个进程分配一个固定大小的时间片(Quantum),进程执行一个时间片后,如果没有完成,则被挂起并轮到下一个进程执行。若进程执行完成,则退出调度。

特点

  • 公平,不会导致某个进程长时间不被执行。
  • 时间片过短可能导致频繁上下文切换,时间片过长可能降低系统响应速度。

例子
假设有 4 个进程(P1, P2, P3, P4),它们的执行时间如下,并且时间片为 2ms。

进程到达时间执行时间
P105
P213
P324
P432

调度过程

  • P1 执行 2ms,剩余 3ms。
  • P2 执行 2ms,剩余 1ms。
  • P3 执行 2ms,剩余 2ms。
  • P4 执行 2ms,执行完毕。
  • P1 执行 2ms,剩余 1ms。
  • P2 执行 1ms,执行完毕。
  • P3 执行 2ms,执行完毕。
  • P1 执行最后 1ms,执行完毕。

结果

  • 完成时间:P1=10, P2=7, P3=9, P4=5
  • 周转时间:P1=10-0=10, P2=7-1=6, P3=9-2=7, P4=5-3=2
  • 带权周转时间:P1=10/5=2, P2=6/3=2, P3=7/4=1.75, P4=2/2=1
1. 5 高响应比优先调度算法(HRRN)

原理
高响应比优先调度算法(HRRN)是一个 非抢占式 调度算法。它根据进程的 响应比 来决定进程的执行顺序,响应比是用来衡量进程等待时间和执行时间之间的关系。

响 应 比 = 等待时间 + 服务时间 服务时间 {响应比} = \frac{\text{等待时间} + \text{服务时间}}{\text{服务时间}} =服务时间等待时间+服务时间
其中:

  • 等待时间:进程已经在就绪队列等待的时间。
  • 服务时间:进程需要执行的时间(即执行时间)。

HRRN 通过计算每个进程的响应比,优先调度响应比最大的进程。响应比越大,表示该进程更急需执行。这样可以避免较长时间等待的小进程被饿死,尤其适用于长作业和短作业的混合环境。

假设有 4 个进程 P1, P2, P3, P4,它们的到达时间和执行时间如下:

进程到达时间执行时间
P104
P213
P325
P432

调度过程

  1. P1 到达时,响应比计算:
    响 应 比 = ( 0 − 0 ) + 4 4 = 1 {响应比} = \frac{(0-0) + 4}{4} = 1 =4(00)+4=1
    P1 开始执行,执行 4ms,完成时间为 4ms。

  2. P2 到达时,响应比计算:
    响应比 = ( 4 − 1 ) + 3 3 = 6 3 = 2 \text{响应比} = \frac{(4-1) + 3}{3} = \frac{6}{3} = 2 响应比=3(41)+3=36=2
    P2 开始执行,执行 3ms,完成时间为 7ms。

  3. P3 到达时,响应比计算:
    响应比 = ( 7 − 2 ) + 5 5 = 10 5 = 2 \text{响应比} = \frac{(7-2) + 5}{5} = \frac{10}{5} = 2 响应比=5(72)+5=510=2
    P3 开始执行,执行 5ms,完成时间为 12ms。

  4. P4 到达时,响应比计算:
    响应比 = ( 12 − 3 ) + 2 2 = 11 2 = 5.5 \text{响应比} = \frac{(12-3) + 2}{2} = \frac{11}{2} = 5.5 响应比=2(123)+2=211=5.5
    P4 开始执行,执行 2ms,完成时间为 14ms。

结果

  • 完成时间:P1=4, P2=7, P3=12, P4=14
  • 周转时间:P1=4-0=4, P2=7-1=6, P3=12-2=10, P4=14-3=11
  • 带权周转时间:P1=4/4=1, P2=6/3=2, P3=10/5=2, P4=11/2=5.5

1.6 时间片轮转调度算法(RR)

原理
时间片轮转调度算法(Round Robin, RR)是一种 抢占式 调度算法。它为每个进程分配一个固定的时间片(Quantum),进程执行时间片后如果未完成,则被挂起并重新进入就绪队列等待下一个时间片。

时间片轮转保证了每个进程能公平地获得 CPU 时间,但可能导致频繁的上下文切换。如果时间片过短,可能会引起过多的上下文切换;如果时间片过长,系统响应性可能下降。

例子
假设有 4 个进程 P1, P2, P3, P4,时间片为 2ms,它们的执行时间如下:

进程到达时间执行时间
P105
P213
P324
P432

调度过程

  1. P1 执行 2ms,剩余 3ms。
  2. P2 执行 2ms,剩余 1ms。
  3. P3 执行 2ms,剩余 2ms。
  4. P4 执行 2ms,执行完毕。
  5. P1 执行 2ms,剩余 1ms。
  6. P2 执行 1ms,执行完毕。
  7. P3 执行 2ms,执行完毕。
  8. P1 执行最后 1ms,执行完毕。

结果

  • 完成时间:P1=10, P2=7, P3=9, P4=5
  • 周转时间:P1=10-0=10, P2=7-1=6, P3=9-2=7, P4=5-3=2
  • 带权周转时间:P1=10/5=2, P2=6/3=2, P3=7/4=1.75, P4=2/2=1

2. 逻辑地址与物理地址的转换

在现代操作系统中,为了实现内存保护虚拟化,操作系统通过虚拟内存机制将进程使用的逻辑地址映射到系统的物理地址。这个转换过程可以通过页式管理(Page-based Management)和段式管理(Segment-based Management)两种常见的方式来实现。每种管理方式的逻辑地址转换过程和结构有所不同。

1. 页式管理(Paging)

原理

  • 在页式管理中,虚拟地址空间被划分为固定大小的,物理地址空间被划分为大小相同的页框(或页框架)。逻辑地址由两部分组成:
    • 页号(Page Number):表示虚拟地址空间中的页。
    • 页内偏移(Offset):表示该页内的位置。

转换过程

  1. 逻辑地址首先被拆分为页号页内偏移
  2. 操作系统通过一个**页表(Page Table)**将虚拟页号映射到物理页框号。
  3. 最终的物理地址由物理页框号页内偏移组合形成。

公式

  • 逻辑地址 = 页号 + 页内偏移
  • 物理地址 = 物理页框号 + 页内偏移

页表:页表是操作系统维护的一个数据结构,用来存储虚拟页号与物理页框号的映射关系。


例题:页式管理转换

假设:

  • 系统采用4KB的页面大小,即 2 12 2^{12} 212 字节。
  • 逻辑地址:0x00403C57
  • 页表映射:页号 0x004 映射到物理页框 0x100。

步骤

  1. 确定页大小:4KB = 2 12 2^{12} 212 字节,所以页内偏移是由低12位表示的。

  2. 拆分逻辑地址

    • 逻辑地址 0x00403C57 转换为二进制:0000 0000 0100 0000 0011 1100 0101 0111
    • 页号:取逻辑地址的前 20 位,即 0000 0000 0100 0000 00,即页号为 0x004
    • 页内偏移:取逻辑地址的低 12 位,即 0011 1100 0101 0111,即偏移为 0x3C57
  3. 映射到物理地址

    • 页表映射:页号 0x004 映射到物理页框 0x100。
    • 物理地址 = 物理页框号 + 页内偏移 = 0x100000 + 0x3C57 = 0x1003C57。

结论:逻辑地址 0x00403C57 映射到物理地址 0x1003C57


2. 段式管理(Segmentation)

原理

  • 在段式管理中,虚拟地址空间被划分为不同的,每个段可以具有不同的大小,通常对应程序的不同部分,如代码段、数据段、栈段等。逻辑地址由段号段内偏移两部分组成:
    • 段号(Segment Number):指示进程地址空间中的段。
    • 段内偏移(Offset within the Segment):表示段内部的位置。

转换过程

  1. 逻辑地址首先被拆分为段号段内偏移
  2. 操作系统通过一个**段表(Segment Table)**将段号映射到物理内存中的基地址(即段的起始地址)。
  3. 最终的物理地址由段基地址段内偏移组合形成。

公式

  • 逻辑地址 = 段号 + 段内偏移
  • 物理地址 = 段基地址 + 段内偏移

段表:段表是操作系统维护的一个数据结构,用来存储段号与物理内存中的段基地址之间的映射关系。每个条目还会记录段的长度,用于检测越界访问。


例题:段式管理转换

假设:

  • 系统中的段表如下:
    • 段号 0x0:基地址 0x1000,段长 0x5000。
    • 段号 0x1:基地址 0x6000,段长 0x3000。
  • 逻辑地址:段号 0x1,段内偏移 0x2500。

步骤

  1. 拆分逻辑地址
    • 逻辑地址由段号和段内偏移两部分组成。这里给出的逻辑地址是段号 0x1 和段内偏移 0x2500。
  2. 查找段表
    • 段号 0x1 的基地址0x6000
  3. 计算物理地址
    • 物理地址 = 段基地址 + 段内偏移 = 0x6000 + 0x2500 = 0x8500。

结论:逻辑地址 段号 0x1 和偏移 0x2500 映射到物理地址 0x8500


页式与段式管理的比较

特性页式管理段式管理
地址结构逻辑地址 = 页号 + 页内偏移逻辑地址 = 段号 + 段内偏移
内存划分固定大小的页,页内大小固定可变大小的段,段的大小可以不同
内存浪费页表可能会造成一定的内存浪费(因为页大小固定)内存使用更加灵活,可以精确划分不同段
访问方式固定页表映射通过段表查找基地址
适用场景大多应用采用,适合对内存进行分页管理用于需要更灵活内存分配的应用(如C语言的代码段、数据段、堆栈段)

总结

  • 页式管理主要通过固定大小的页来进行内存管理,适合大多数现代操作系统,因为它可以简化内存的管理和分配。
  • 段式管理允许不同的段具有不同的大小,更适合需要灵活内存分配的应用程序。

3. 信号量

知识点

信号量是一种用于进程同步的机制,通常用于管理对共享资源的访问。信号量有二值信号量(值为 0 或 1)和计数信号量(可以有任意非负整数值)。

常见操作

  • P 操作(wait, down):将信号量减 1。如果信号量为 0,进程将被阻塞。
  • V 操作(signal, up):将信号量加 1,如果有阻塞的进程,唤醒一个进程继续执行。
例子

有两个进程 P1 和 P2,信号量 S 初始化为 1。

  1. P1 执行 P 操作,S = 0,P1 进入临界区访问共享资源。
  2. P2 执行 P 操作,但因为 S = 0,P2 被阻塞,无法执行。
  3. P1 执行 V 操作,S = 1,P2 被唤醒,开始执行。

通过信号量控制进程对共享资源的访问,确保资源不会被多个进程同时修改。

4.磁盘访问时间

磁盘的访问时间是指从发出磁盘读取或写入请求,到数据准备好被传输所需的时间。访问时间可以分为三个主要部分:寻道时间 (Ts)平均旋转延迟时间 (Tτ)传输时间 (Tt)。这三个时间的计算方法如下:


1. 寻道时间 (Ts)

寻道时间是磁头从当前位置移动到目标磁道的时间。通常,磁盘的寻道时间有两种类型:平均寻道时间最大寻道时间。在实际中,我们通常计算的是平均寻道时间,它是寻道时间的平均值。

计算方法:

  • 平均寻道时间是磁头从一个随机的磁道寻址到另一个磁道的平均时间。
  • 寻道时间一般由硬盘的物理特性决定,包括磁头的移动速度和磁道的密度等。通常,寻道时间通过硬盘制造商提供的技术规格来获取。

例如,某硬盘的平均寻道时间可能是 8 毫秒。如果没有给出具体数据,通常可以通过实验或硬盘规格来获得。


2. 平均旋转延迟时间 (Tτ)

旋转延迟时间是指磁盘的旋转角度所造成的延迟。由于硬盘是以恒定速度旋转的,磁头可能需要等待磁盘旋转到目标数据所在的位置。

计算方法:

  • 假设磁盘的转速为RPM(转每分钟),那么每分钟转数就是RPM,可以通过转速得到每秒的转速(转每秒 RPS)。

    每秒转数 (RPS) = RPM 60 \text{每秒转数 (RPS)} = \frac{\text{RPM}}{60} 每秒转数 (RPS)=60RPM

  • 平均旋转延迟时间通常是磁盘旋转一圈所需时间的一半。因为磁头可能在数据之前或之后的任何地方,所以下来会等待大约半圈的时间。

    计算公式为:

    T τ = 1 2 × 1 RPS = 1 2 × 60 RPM T_{\tau} = \frac{1}{2} \times \frac{1}{\text{RPS}} = \frac{1}{2} \times \frac{60}{\text{RPM}} Tτ=21×RPS1=21×RPM60

例如,若磁盘的转速是 7200 RPM,则:

T τ = 1 2 × 60 7200 = 4.17   毫秒 T_{\tau} = \frac{1}{2} \times \frac{60}{7200} = 4.17 \, \text{毫秒} Tτ=21×720060=4.17毫秒


3. 传输时间 (Tt)

传输时间是指从磁盘将数据从目标位置传输到计算机内存所需的时间。它取决于数据的传输速率和要传输的数据量。

计算方法:

  • 假设磁盘的传输速率是数据传输速率(如 MB/s),要读取或写入的数据量是 D(以 MB 或 GB 计)。

    传输时间的计算公式为:

T t = D 传输速率 = 数据量 传输速率 T_t = \frac{D}{\text{传输速率}} = \frac{\text{数据量}}{\text{传输速率}} Tt=传输速率D=传输速率数据量

例如,如果数据量是 1 MB,传输速率是 100 MB/s,那么:

T t = 1   MB 100   MB/s = 0.01   秒 = 10   毫秒 T_t = \frac{1 \, \text{MB}}{100 \, \text{MB/s}} = 0.01 \, \text{秒} = 10 \, \text{毫秒} Tt=100MB/s1MB=0.01=10毫秒


总访问时间

磁盘的总访问时间 T total T_{\text{total}} Ttotal 是由寻道时间、平均旋转延迟时间和传输时间的总和组成:

T total = T s + T τ + T t T_{\text{total}} = T_s + T_{\tau} + T_t Ttotal=Ts+Tτ+Tt


举个例子

假设有一个磁盘,它的性能参数如下:

  • 寻道时间 (Ts):8 毫秒
  • 转速 (RPM):7200 RPM
  • 数据传输速率:100 MB/s
  • 传输的数据量:1 MB

步骤1:计算平均旋转延迟时间 (Tτ)

转速为 7200 RPM,所以:

T τ = 1 2 × 60 7200 = 4.17   毫秒 T_{\tau} = \frac{1}{2} \times \frac{60}{7200} = 4.17 \, \text{毫秒} Tτ=21×720060=4.17毫秒

步骤2:计算传输时间 (Tt)

数据量为 1 MB,传输速率为 100 MB/s,所以:

T t = 1   MB 100   MB/s = 0.01   秒 = 10   毫秒 T_t = \frac{1 \, \text{MB}}{100 \, \text{MB/s}} = 0.01 \, \text{秒} = 10 \, \text{毫秒} Tt=100MB/s1MB=0.01=10毫秒

步骤3:计算总访问时间 (Ttotal)
T total = T s + T τ + T t = 8   毫秒 + 4.17   毫秒 + 10   毫秒 = 22.17   毫秒 T_{\text{total}} = T_s + T_{\tau} + T_t = 8 \, \text{毫秒} + 4.17 \, \text{毫秒} + 10 \, \text{毫秒} = 22.17 \, \text{毫秒} Ttotal=Ts+Tτ+Tt=8毫秒+4.17毫秒+10毫秒=22.17毫秒

所以该磁盘的总访问时间是 22.17 毫秒


总结

  1. 寻道时间 (Ts):取决于磁盘的设计,通常通过硬盘规格提供。
  2. 平均旋转延迟时间 (Tτ):与磁盘转速(RPM)有关,通常为一圈时间的一半。
  3. 传输时间 (Tt):由数据传输速率和数据量决定。

将这三者相加即可得出磁盘的总访问时间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值