操作系统笔记

1 进程通信和进程调度

  • FCFS 先来先服务

  • SJF 短作业优先

  • HRRN 高响应比优先算法

  • RR 时间片轮转

  • 优先级算法

  • 多级反馈队列算法

2 进程同步、进程互斥的概念

3 进程互斥的软件算法

  • 单标志法

  • 双标志先检查法

  • 双标志后检查法

  • Peterson算法

4 进程互斥的硬件实现方式

  • 中断关闭方式

  • TestAndSet指令-原子操作函数,是由操作系统决定的,硬件实现的原语。

  • Swap指令,原子操作函数,是由操作系统决定的,硬件实现的原语。

5 信号量机制

5.1 整数型信号量pv操作

  • 以上其实有点问题,但不影响理解,wait和signal是原子操作。

  • pv操作又称wait,signal原语。 主要是操作进程中对进程控制的信息量的加减控制。

  • wait用法: wait(num),num是目标参数,wait的作用是使其(信息量)减一。 如果信息量>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。而不是像上面图片里面的while循环,已经是原子了,没有新建的循环;即该原子操作内部会有while,不用另写。该图只是为了方便理解。

  • signal用法: signal(num),num是目标参数,signal的作用是使其(信息量)加一。 如果信息量>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

  • 例题:桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放 橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用PV操作实现他们 之间的同步机制。

  • 分析设计四个信号量mutex,empty、apple、orange;

    mutex表示:爸爸、妈妈、儿子和女儿进程对盘子的互斥使用;

    empty表示:盘子是否为空;

    apple表示:是否可以取苹果;

    orange表示:是否可以取桔子。

  •  1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    semaphore empty=1,mutex=1,apple=0,orange=0;  //为四个信号量赋初值
    void father(){
         do{
               wait(empty);    //等待盘子为空
               wait(mutex);    //等待获取对盘子的操作
                爸爸向盘中放一个苹果;
               signal(mutex);   //释放对盘子的操作
               signal(apple);   //通知女儿可以来盘子中取苹果
        }while(TRUE);
    }
    void mather(){               //与父亲进程雷同
         do{
               wait(empty);
               wait(mutex);
                妈妈向盘中放一个桔子;
               signal(mutex);
               signal(orange);
        }while(TRUE);
    }
    void son(){                        
         do{
               wait(orange);       //判断盘子中是否有桔子
               wait(mutex);        //等待获取对盘子的操作
                儿子取出盘中的桔子;
               signal(mutex);      //释放对盘子的操作
               signal(empty);      //盘子空了,可以继续放水果了
        }while(TRUE);
    }
    void daugther(){               //与儿子进程雷同
         do{
               wait(apple);
               wait(mutex);
                女儿取出盘中的苹果;
               signal(mutex);
               signal(empty);
        }while(TRUE);
    }
    void main() {               //四个并发进程的同步执行
    	cobegin
    	   father();mather();son();daugther();
    	coend
    }
    

5.2 记录型信号量

5.3 信号量机制实现互斥

5.4 信号量机制实现进程同步

  • 原因

  • 步骤——先v后p

5.5 信号量机制实现前驱关系

  • 先p后v

5.6 总结

5.7 生产者和消费者问题

  • 如何写

  • 能否改变p、v操作的顺序——不能!

5.8 多生产者-多消费者问题

  • 问题描述

  • 分析

  • 思考:能不能舍去mutex互斥量

  • 可以,因为盘子的数量为1,天然互斥。但是,如果盘子的数量为2的话。。。就不可以了。

  • 分析方法——从事件的方向分析

5.9 吸烟者问题

  • 关于要不要设置mutex互斥变量——不用,因为缓冲区最多一个变量

5.10 读写文件

  • 分析

  • 实现

  • 但上述代码存在问题:只要读进程远远不断,那么写进程就会一直等待,直到饥饿。因为默认读进程是优先的。

  • 改进方式,增加一个互斥量,改为写进程优先。

5.11 哲学家进餐问题

  • 上述第三种方法的准确描述是——每次仅可以允许一个哲学家拿起筷子。因为即使这个哲学家左右两边的筷子都可用,也有可能阻塞。虽然这种方法并发性不高,但是有效避免了操作死锁问题。

6. 管程

  • 一种实现互斥和同步的机制。

  • 用管程实现生产者-消费者问题——类似c++的条件变量和mutex

7. 死锁

7.1. 死锁的预防

7.2. 死锁的避免

  • 安全序列和死锁的关系

银行家算法

  • 因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。——避免死锁

7.3. 死锁的检测

7.4. 死锁的解除

8. 内存的基础概念

8.1 逻辑地址和物理地址

8.2 逻辑地址转为绝对地址的三种装入方式

  • 1.绝对装入

  • 2.静态重定位

  • 3.动态重定位

8.3 链接的三种方式

  • 1.静态链接

  • 2.装入时动态链接

  • 3.运行时动态链接

8.4 总结

9. 内存的管理

  • 内存管理的四大内容

1. 内存的空间的分配与回收

2. 从逻辑上对内存空间进行扩展

3. 地址转换

4. 内存保护

5. 总结

10. 内存扩展=>内存覆盖与交换技术

  • 目的:为了进行内存空间的扩充

10.1 覆盖技术

  • 因此,覆盖技术现在已经不怎么使用了。

10.2 交换技术

10.3 总结

11. 内存的分配与回收

11.1 概述

11.2 连续分配管理方式

(1)单一连续分配

(2)固定分区分配

  • 如何记录分区信息

(3)动态分区分配

  • 要解决三个问题。

  • 1.选择什么数据结构记录分配信息

  • 2.如何选择合适的分区

  • 3.如何分配和如何回收各分区

  • 分配要注意起始地址和内存大小的更改;回收会遇到四种情况,重点是相邻的内存需要合并。

  • 总结

(4)四种动态分区分配算法

11.3 非连续分配管理方式

(1)基本分页存储管理

(2)基本分段存储管理

  • 什么是分段

  • 什么是段表

  • 如何实现地址变换

  • 分段和分页管理的对比

  • 分段更适合信息共享

  • 分页不易于实现信息的共享

  • 总结

(3)段页式管理

  • 分页和分段的优缺点分析

  • 段页式的逻辑地址机构

  • 注意段页式管理的段表和基本段储存管理的段表有所区别,但是页表区别不大!

  • 如何实现逻辑地址转换为物理地址

  • 总结

12. 虚拟内存

12.1 概述

  • 目的:为了对内存空间进行扩充。

  • 为什么需要虚拟内存

  • 例如之前的GTA游戏需要60G,4G内存明显不能完全放入,然鹅其实只需要放入当前的场景内存游戏即可运行。

  • 虚拟内存的提出基于局部性原理

    • 时间局部性
    • 空间局部性
  • 你访问这段代码,访问相邻代码的可能性更大。

  • 操作系统实现虚拟内存,需实现以下两个功能

    • 请求调页/ 请求调段
    • 页面置换/ 段置换

12.2 请求分页管理方式

  • 页面置换

  • 请求调页

  • 缺页中断是内中断。引入了缺页中断才能进行请求调页和页面置换。

  • 总结

12.3 页面置换算法

(1) 最佳置换算法 OPT

  • 但在程序运行中,最佳置换算法是无法实现的,因为不知道运行后期需要访问的内存块。

(2) 先进先出置换算法 FIFO

(3) 最近最久未使用置换算法 LRU

  • least recently used LRU。
  • LRU算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大。这也是最接近最佳置换算法的实用算法。

(4) 时钟置换算法 CLOCK

  • 替换的时候把链表的队首指针放到替换页面的下一个指针处。
  • 类似时钟转圈的过程。
  • 改进型的时钟置换算法。
    • 第一优先级:最近没访问且没修改。
    • 第二优先级:最近没访问,但修改过。
    • 第三优先级:最近访问过,但没修改。
    • 第四优先级:最近访问过,且修改过。

(5) 总结

12.4 页面分配策略

  • 驻留集:一般小于进程的总大小。

  • 何时调入页面

  • 何处调入页面

  • 工作集的作用:根据工作集的大小,设置驻留集的大小,减少颠簸现象。

13. 内存映射文件

  • 内存映射文件:方便程序员访问文件
  • 传统的文件访问方式。
  • 内存映射文件访问方式

14. 文件管理

14.1 简介

14.2 文件的逻辑结构

  • 对于可变长记录文件,利用索引表减少随机存取的时间复杂度。这也叫做索引文件。

  • 索引顺序文件:减少空间复杂度,折中提高时间复杂度。

14.3 文件目录

  • 关于文件控制块 FCB
  • 由文件控制块的有序集合,组成了目录。
  • 关于目录结构
  • 索引结点:提高查找文件名的效率。减少空间进而减少启动磁盘次数。

14.4 文件的物理结构->文件分配方式

  • 磁盘块大小和内存块、页面的大小相同。

  • 用户关注的是逻辑地址,而操作系统负责实现从逻辑地址到物理地址的映射,因此关注点在于,如何分配文件实现逻辑到物理的映射。

  • (1)连续分配。

    • 支持随机读取。
    • 外存为磁盘,因为读取方式的要移动刺头,故连续分配的读写时间最快。
  • 连续分配的缺点是:

    • 对文件的拓展的时间开销比较大;
    • 磁盘利用率低,会产生难以利用的磁盘碎片。
  • (2)链接分配

  • 链接分配采用离散分配的方式,可以为文件分配离散的磁盘块,分为隐式链接和显式链接两种方式。

  • 隐式链接,文件的FCB记录文件存放的起始块号和结束块号。只能顺序访问,但方便拓展文件,外存利用率高。

  • 显式链接,多加一个文件分配表 FAT。一个磁盘仅设置一张FAT,开机时,FAT读入内存,并常驻内存。

  • 这里的随机访问指的是只访问一次磁盘,但是访问了n次内存。只是相对隐式链接访问n次磁盘来说,属于随机访问。

  • 现在一般都指的是隐式链接。

  • (3)索引分配

  • 每个文件对应索引块,索引块记录索引表,索引表记录当前文件的数据存放的实际物理块号。

  • 支持随机访问,文件拓展也方便。

  • 如果索引表太多,怎么办。有三种方式解决。

14.5 文件存储空间管理

  • 逻辑卷分为目录区和文件区。

  • (1)空闲表法

  • 适用连续分配的文件分配方式。

  • (2)空闲链表法

  • 空闲盘块是磁盘块,空闲盘区是连续的磁盘块。

  • (3)位示图法

  • (4)成组链接法

  • 超级块分组个数有限,以下为例子。

  • 分配1个空闲块

  • 分配100个空闲块

  • 回收一个磁盘块

  • 回收100个磁盘块

  • (5)总结

14.6 文件的基本操作

  • (1)create系统调用
  • (2)delete系统调用
  • (3)open系统调用
  • (4)close系统调用
  • (5)read系统调用
  • (6)write系统调用
  • (7)总结

14.7 文件共享

  • 软链接类似快捷方式。

14.8 文件保护

  • (1)口令保护
  • (2)加密保护
  • (3)访问控制
  • 每个文件增加一个访问控制表,记录各个用户对该文件的操作权限。
  • (4)总结

14.9 文件系统的层次结构

14.10 文件系统的全局结构

  • (1)磁盘物理格式化
  • 划分扇区,并检测替换坏扇区
  • (2)逻辑格式化
  • (3)文件系统在内存中的结构

14.11 虚拟文件系统

  • 所有虚拟文件系统应运而生
  • 不同的文件系统的数据结构不同,给虚拟文件系统带来麻烦,因此,采用了v-Node。

14.11 文件系统挂载-mounting

15. 设备管理

15.1 关于IO设备

15.2 IO控制器

15.3 IO控制方式

  • (1)程序直接控制方式
  • (2)中断驱动方式
  • (3)DMA(直接存储器存取)方式
  • (4)通道控制方式
  • (5)总结

15.4 IO软件的层次

15.5 IO应用程序接口

15.6 设备驱动程序接口

15.7 IO核心子系统

  • (1)假脱机技术

  • (2)IO调度

  • (3)设备保护

  • (4)设备的分配与回收

  • (1)设备分配时考虑的因素

  • 可以考虑银行家算法避免死锁的发生。

  • (2)静态分配和动态分配

  • (3)设备分配管理中的数据结构

  • (4)设备分配的步骤

  • (5)设备分配步骤的改进

  • (5)缓冲区管理

  • (a)单缓冲

  • (b)双缓冲

  • (c)循环缓冲区

  • (d)缓冲池

  • (e)总结

15.8 磁盘的结构

  • 磁头臂带动磁头移动,读取数据。

15.9 磁盘调度算法

  • 可以看到,延迟时间和传输时间与磁盘转速有关,操作系统无法优化。故只能从寻道时间进行优化,也就是磁盘调度。
  • (1)FCFS 先来先服务算法
  • (2)SSTF 最短寻找时间优先
  • 贪心算法,局部最优
  • (3)SCAN 扫描算法
  • (4)LOOK调度算法
  • (5)C-SCAN 循环扫描算法
  • (6)C-LOOK算法
  • (7)总结

15.10 减少磁盘延迟时间

  • (1)交替编号
  • 针对同一个盘面
  • (2)错位命名
  • 针对不同盘面
  • (3)总结

15.11 磁盘管理

  • (1)磁盘初始化

  • (2)引导块

  • 通过引导块解决自举程序的修改问题。

  • (3)坏块的管理

  • (4)总结

15.12 固态硬盘SSD