操作系统中一些零散的知识点

第一章 操作系统概述

  1. 操作系统本质上是一个软件,有一堆(内核)代码
  2. Windows是单用户多任务操作系统;UNIX是多用户多任务操作系统(mac和Linux都是基于Unix的)。这些系统都是分时操作系统(操作系统分为无操作系统、批处理操作系统、分时操作系统、实时操作系统、其他)
    • 单用户多任务操作系统:只允许一个用户上机,但允许用户把程序分为若干个任务,使它们并发执行)
    • 多用户多任务操作系统:允许多个用户通过各自的终端,使用同一台机器,共享主机系统中的各种资源,而每个用户程序又可进一步分为几个任务,使它们能并发执行,从而进一步提高资源利用率和系统吞吐量
  3. 几种常见的特权指令:
    • 输入输出指令(IO指令)(一组指令,不是一条具体的指令)
    • 开/关中断指令
    • 修改PSW的指令(PSW里就有是否允许中断)
    • 置时钟指令
    • 广义指令
  4. 常见的非特权指令
    • 取数、存数指令(数据传送指令)
    • 读时钟指令
    • 加减乘除等算术运算指令
    • 寄存器清零指令
    • 压栈/弹栈指令(push/pop)
    • 跳转指令(转移指令),如jmp指令
    • trap指令
    • 设置断点指令(程序里就可以直接设置断点)
  5. 访管指令(trap指令)不是特权指令。访管指令=陷入指令=trap指令,该指令触发一个异常,进行系统调用。访管指令仅在用户态下使用,操作系统不需要使用访管指令
  6. “广义指令”:指一系列机器指令的封装,指“系统调用”。系统调用是在用户态下发出的,系统调用的处理是在核心态下执行的。
    如果某句代码需要执行系统调用,因为这条系统调用背后其实包含了很多条机器指令,因此称为广义指令(指令序列的封装)。
    因此,“广义指令的执行”即“系统调用的处理”只能在核心态下执行。
  7. 取数指令和存数指令的原理(都是非特权指令):
    int a=0, n=1;
    a = b;
    
    首先,定义的变量a和b存放在内存中的不同地方。a=b这个动作背后,硬件是这么做的:CPU首先会执行一条取数指令,把b的值取到CPU内部的一个寄存器中,然后再执行一条存数指令,把寄存器中的值存放在内存中的a所在的地址中。
    因此这个取数存数指令是用户程序经常出现的指令,属于非特权指令。
    类似的,寄存器清零指令(指普通的通用寄存器)也是非常常见的非特权指令
  8. 系统调用:操作系统会将一些影响大、权限大的功能封装在系统调用中,使得系统更稳定、安全,防止用户进行非法的越权操作。 而系统调用也会有一些坏处,比如系统调用过程需要用户态与核心态的切换,会降低效率。因此在一些专业性较强、实时性要求较高的操作系统中,可以不提供系统调用,以换取效率。如NASA使用的VxWorks系统(用于火箭、卫星)
  9. 无中断,无并发
  10. 用户程序在用户态下要使用特权指令引起的中断属于软件中断(或内中断、软中断)。内中断包括陷入(用户程序为请求操作系统的某个服务所故意引发的中断,称为访管中断)、故障(由错误条件引起的,内核程序修复好后将CPU使用权还给应用程序,如缺页故障)、终止(由致命错误引起,内核程序无法修复,直接终止应用程序。如整数除0、非法使用特权指令)
  11. 一些需要特殊硬件支持的操作系统功能:
    • 时钟管理:需要硬件定时器,定期发出时钟脉冲
    • 中断系统:中断向量地址形成部件,将中断信号映射为中断向量
    • 地址映射;地址变换相关的硬件机构,如页表寄存器、TLB等
  12. 进程调度是操作系统完成的,是软件+一些基本的硬件(通用寄存器等)完成的
  13. “从用户态到核心态的转换”是由硬件完成的,是通过中断机制实现的;“从核心态到用户态到转换”是由操作系统程序执行后完成的
  14. 操作系统的内核功能(内核:与硬件紧密相关的模块、各种常用设备的驱动程序、运行频率较高的模块一般都安排在OS内核中,常驻内存。运行在内核态/管态/系统态):
    • 支撑功能(用于支撑各种模块的工作)
      • 中断处理:如缺页处理程序(处理缺页中断)、时钟中断处理程序
      • 时钟管理
      • 原语操作
    • 资源管理功能
      • 进程管理:如进程调度程序
      • 存储器管理
      • 设备管理
  15. 对于程序状态字寄存器PSW中的值,中断处理一定会保存其内容,而子程序调用一定不会保存其内容(二者的进行都需要压栈以保护现场)。
    • 因为子程序调用所引起的对PSW的修改(用户程序是不能修改PSW的,而例如一些运算指令所引起的PSW中运算标志位的修改,是由硬件自动完成的,不是用户主动,而是硬件自动),是用户程序的预期行为,并不像中断处理那样是预料外的、且能够影响程序执行的事情。因此得出以上结论
  16. 存储保护错:操作系统把主存分为系统区和用户区,系统区中的内存单元普通用户是无法访问的。若某一个用户程序的指令尝试强行访问系统区的内存单元,这时候就会发生“存储保护错”。因此可推出,“存储保护错”也是属于异常(内中断),是来自CPU的内部,与当前执行的指令有关。
  17. 内存保护(存储保护)的实现:是通过CPU硬件对在用户态下产生的物理地址与寄存器的地址进行比较来完成的。即判断“基地址 ≤ \le 物理地址 < \lt <(基地址+界限地址)”是否成立。当在用户态下执行的程序试图访问OS内存或其他用户内存时,就会陷入OS内核,而OS内核则会将其作为致命错误来处理。这种方案可以防止用户程序无意或故意修改OS以及其他用户的代码或数据。
    加载基地址寄存器和界限寄存器时必须使用特权指令,由于特权指令只能在内核态下执行,因此只有OS内核才可以加载基地址寄存器和界限寄存器。这种方案允许OS内核修改这两个寄存器的值,而不允许用户程序修改它们

第二章 进程与线程

  1. 进程由三部分组成:PCB、程序段、数据段。其中PCB存在的意义就是操作系统通过PCB来管理和控制进程,因此管理、控制进程所需的参数都是放在PCB中的
  2. 进程的内存空间组成:
    • 代码区
    • 静态数据区
      • 全局变量
      • 静态变量
    • 动态数据区
      • 堆:malloc申请的内存
      • 栈:函数调用的内存、函数的局部变量
      • 关于堆栈指针:程序通过堆栈的基地址和偏移量来访问其中的数据,而这个基地址就是堆栈指针,不属于代码数据,也不属于与程序逻辑本身相关的数据段,而是保存在PCB中
  3. 引入线程可以减小切换时的时空开销。比如进程切换的话必须切换虚拟地址空间,TLB、Cache中的数据也都作废。而同一进程中的线程都是共享同一地址空间的,因此不需要上面那些东西的作废
  4. 适合于多线程解决的业务场景有:
    • 可以将处理逻辑拆分成多个互不相干的部分:如基于GUI的debugger用不同线程处理用户的输入、计算、跟踪等操作
    • 计算量较大,需要高并发:如利用线程并行地执行矩阵乘法运算、Web服务器利用线程请求HTTP服务
  5. “管道”是一种特殊的共享文件,受到文件系统的管理,为了保证进程之间的通信效率,管道是存在于内存中的,因此会受到内容容量大小的限制。管道空时,读操作阻塞;管道非空时,写操作阻塞。管道的内容只能有一个读进程,但可以有多个写进程
  6. 对设备进行分配一定是分配给某个已存在的进程,而不会导致创建新进程:
    • 某个处于运行态的进程申请设备,若设备忙,进程会变为阻塞态;若设备分配成功,进程变成就绪态
  7. 修改进程优先级的原则(即处理机调度的原则):不能让任何一个进程一直得不到服务,即饥饿。因此,“进程时间片用完”是一个降低进程优先级的合理时机。(不可以是“进程从就绪态转为运行态”,因为此时降低优先级可能导致CPU被抢占)
    • 抢占式优先级调度算法下,当优先级更高的任务到来时,会立刻或等到时钟中断发生后就剥夺当前任务的执行,这是两种不同的策略,称为“立即抢占的优先级调度算法”和“基于时钟中断的抢占式优先级调度算法”
  8. 确定优先级大小的依据通常有:
    • 静态优先级:
      • 系统进程优先级一般高于用户进程优先级
      • 对资源要求少的进程应被赋予较高的优先级
      • 更紧迫的进程应被赋予较高的优先级
      • I/O繁忙型进程应高于CPU繁忙型进程
    • 动态优先级:
      • 在就绪队列中的进程,其优先级应随着等待时间的增长而提高
      • 为防止一个长作业长期垄断处理机,可规定当前进程的优先级随运行时间的推移而下降
      • 若发现一个进程频繁进行I/O操作,可适当提高其优先级
  9. 多级反馈队列调度算法对于交互作业很友好。因为交互作业的执行时间往往都很短,若在第一级队列规定的时间片用完前就完成了,它就会阻塞(等待用户输入),然后等到用户输入完成转为就绪态后,就会回到第一级队列的队尾,而不会降级到第二级队列。
  10. “唤醒”的意思:当被阻塞进程等待的某资源(不包括处理机)可用时,进程将会被唤醒
  11. 请添加图片描述
  12. 时钟中断:用于计时。按一定时钟中断给出中断信号,通过数中断信号发生的次数就知道过了多少时间。时钟中断每发生一次,系统就会修改当前进程在时间片内的剩余时间(否则进程会一直占用处理机)
  13. 基于时间片的进程调度中,时间片的大小选择应考虑:
    在这里插入图片描述
  14. 临界区的访问过程如下图:
    请添加图片描述
    其中,临界区是指进程中用于访问共享资源的那段代码;用于实现互斥的代码段是:进入区+退出区(进入区是上锁,退出区是解锁)
  15. 不可重入代码(各个进程/线程并发执行这段代码执行结果可能相互影响,如让某个共享变量的值-1)是临界资源;反之,可重入代码指各个进程/线程并发执行这段代码,执行结果不会相互影响(如简单的输出“hello”),就不是临界资源
  16. 磁盘不是临界资源,因为多个进程同时向磁盘发出读写请求,磁盘可以都接受,并按照特定的磁盘调度算法处理各个访问磁盘请求
  17. 公用队列属于临界资源,如果多个进程同时往队列中添加元素,会导致出错
  18. 操作系统中,P、V操作是一种“低级进程通信原语”
    • 原语:不可被中断的一小段程序,由“关中断”和“开中断”指令实现。原语属于操作系统内核,只有内核代码可以直接调用“原语”
    • 低级:信息传递量很小。操作系统中只介绍了一种低级通信方式,即信号量、PV操作
    • P、V操作肯定不是系统调用命令,因为用户进程就可以使用系统调用命令,而原语是只有内核代码才能使用的
    • 机器指令:就是一条指令,比如关中断就是一条机器指令,开中断也是一条机器指令。而原语内是“关中断+具体指令+开中断”的,因此P、V操作可以说是“一系列不可被中断的机器序列”
  19. 原语只能运行在内核态(因为有关中断、开中断指令),是操作系统内核的一部分,是从属于操作系统内核的
  20. 请添加图片描述
  21. 管程定义了共享数据结构和各种进程在该数据结构上的全部操作;类定义了数据结构和各种进程在该数据结构上的全部操作(把共享去掉);对普通的程序不需要非得在其中定义数据结构
  22. 互斥信号量的值反映了在同一时刻允许多少个进程进入临界区,因此一般初始值为1,就代表了同一时刻只允许一个进程进入临界区,从而保证了各个进程对临界区访问的互斥性
  23. 同步信号量的初值由用户决定(需要根据资源数)。如生产者消费者问题中,定义了两个同步信号量(empty和full),empty表示缓冲区里的空位,初始值为n,full表示缓冲区里的满位,初始值为0。因此同步问题和互斥问题是不一样的。
  24. 临界资源是一次仅允许一个进程使用的资源,临界区是访问临界资源的那段代码。若一个系统中共有5个并发进程涉及某个相同的变量A,这里A就是临界资源,只有1个,而访问A的代码段,每个进程有1个,共五个,即变量A的相关临界区是由五个临界区构成的
  25. 管程是一段特殊的程序,可以被进程调用,但无法被创建和撤销。管程是一个静态的程序,是语法范围(就好比编程语言中事先定义好了一些语法,程序猿可以选择用和不用,但无法创建或撤销)
  26. 管程中的signal操作和信号量机制中的V操作区别:
    • 管程中的signal操作只是有可能会唤醒一个进程,并不会使条件变量的值改变。且条件变量也是没有值的,不可以量化,只是起到一个队列作用;而V操作会使信号量的值+1
    • 共同点是signal操作和V操作都有可能唤醒一个正在等待的进程
  27. 直接通信和间接通信:
    • 直接通信:通信的每个进程必须明确指定通信的接受者和发送者
      • send(P, msg):向指定的进程P发送msg;receive(Q, msg):向指定的进程Q接收msg
    • 间接通信:不需要指明信息的接收者、发送者。如进程P可以通过系统调用创建一个信箱A
      • send(A, msg):向信箱A发送消息msg;receive(A, msg):从信箱A接收消息msg
  28. 在管程中,实现对条件变量x的互斥访问,和x.wait()没有关系,是由编译器实现的
  29. 多道程序技术(即多道程序并发执行)是伴随着中断功能的出现而出现的,导致CPU不再是只会线性的执行指令序列,而是允许CPU在执行某一个指令序列的时候被中断机制给打断,从而操作系统介入,让CPU换一个指令序列执行。“无中断,不并发”
  30. 在系统的资源分配图中,若出现了环路,则不一定出现了死锁;若没有环路,则肯定没有死锁。因为死锁的四个条件:互斥、不可剥夺、请求和保持、循环等待中的循环等待,说明死锁要发生,则资源分配图中必须出现环路。若每种资源只有一个且出现了环路,说明所有资源都被分配出去了(每个资源都有一个分配边、一个请求边),这种情况下必然出现死锁
  31. 如何判断某段程序的运行是否可能产生死锁:首先死锁的出现一定伴随着阻塞态,只有多个进程阻塞等待其他进程手里的资源,才有可能发生死锁。如果程序里没有P操作,只有简单的运算操作,则不可能会产生死锁。
  32. 如何判断两个并发进程运行程序的结果是否唯一:并发进程运行结果想要相互影响,必然是通过共享变量的作用。所以要找到共享变量,分析共享变量如何影响运行结果即可。
  33. 银行家算法可以避免死锁,而不是预防死锁。避免死锁是避免系统进入不安全状态,预防死锁是预先破坏死锁产生的必要条件(有四个,但只能破坏三个)
  34. 系统处于不安全状态,不一定会发生死锁;但若系统发生了死锁,那系统此时一定是处于不安全状态
  35. “限制用户申请资源的顺序”本质上是破坏循环等待条件,因此属于“死锁预防”。死锁避免限制的不是顺序,而是数量
  36. “死锁避免”需要进程运行所需资源总量信息(如银行家算法需要可用资源矢量、最大需求矩阵、分配矩阵、需求矩阵)
  37. “死锁检测”是应用死锁定理检测系统是否处于死锁状态,不需要进程运行所需资源总量信息,只是需要当前的总量。且死锁检测并不会阻止系统进入死锁状态,而是在系统进入死锁状态时,它能应用死锁定理来检测出当前是否处于死锁状态。如果检测出死锁了,就应用某种死锁解除方式解除死锁
  38. 一共n个进程,处于就绪态的最少为0个进程,最多为n-1个进程
    • 最少0个:死锁了,n个进程全部阻塞
    • 最多n-1个:当就绪态里有至少一个进程时,说明运行态一定有进程
  39. 若要发生死锁,则处于死锁状态的进程应满足:
    • 进程要申请不止一类资源(请求和保持条件)
    • 死锁发生至少有两个进程(循环等待条件)
  40. 进程在操作系统内核程序临界区中不能进行调度与切换;进程处于普通临界区时可以进行处理机调度与切换
    • 其实位于临界区时进行调度和切换并不会引起错误。前者不允许的原因是:内核程序临界区一般是用来访问某种内核数据结构的,如果这种内核中的资源不尽快释放的话,极有可能影响到操作系统内核的其他管理工作,所以要赶紧搞完,所以才不能切换;而后者属于必须要切换,因为如果不切换的话,比如进程在使用打印机这种普通的临界资源,它又属于慢速的IO设备,那么此时CPU就会一直空等,会大大降低系统的效率
  41. 上下文切换:为允许另一个不同的进程使用处理器,改变处理器内部的状态,并保存当前进程返回时需要的状态
  42. 子进程可以继承父进程所拥有的资源(如父进程所打开的文件和分配到的缓冲区等),子进程被撤销时会将资源归还给父进程,父进程被撤销时也必须同时撤销其所拥有的子进程。
  43. 管道只能采用半双工通信,同一时刻只允许单向传输;通信用的“共享文件”只存在于内存;管道只能有一个读进程,但可以有多个写进程

第三章 内存管理

  1. 在虚拟内存系统中,虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的,而虚拟内存的实际容量是受到“内存大小+磁盘空间大小”、“地址线位数”共同制约,取二者最小值
  2. 实现虚拟内存管理必须有相应硬件的支持,如:记录当前进程页表始址的页表寄存器、判断逻辑地址是否越界显然也需要硬件实现、以及将页表始址和逻辑地址转换成页表项的地址(即查页表的过程)也是需要硬件完成
  3. 虚拟地址空间VS物理地址空间:
    请添加图片描述
  4. 分段存储管理方法有利于程序的动态链接
  5. 当操作系统对内存的管理采用页式存储管理方法时,所划分的页面大小由什么决定?
    • 硬件层面(CPU架构)决定了可以支持哪些页面大小,而操作系统则在CPU架构支持的页面大小中选定一种页面大小。页面大小一旦选定,则所有的页面都一样大。
  6. 虚拟存储技术是补充内存逻辑空间的技术。内存逻辑空间大小就表现为虚拟地址的位数
  7. 虚拟内存的特征:多次性(进程数据分多次调入内存)、对换性(暂时用不到的数据可以对换到外存)、离散性(进程数据离散存储)、虚拟性
    • 其中,多次性和对换性需要基于非连续分配而实现;虚拟性需要基于多次性和对换性而实现
  8. 页面引用串:即该程序一段时间内需要调用的页号序列,又可称为访问串
  9. 导致LRU算法实现起来耗费高的原因是需要对所有的页进行排序
  10. 抖动和Belady异常:
    • 抖动:当单个进程分配到的内存块少于某个数目时(此数目大概是工作集大小),该进程的页面会频繁地进行换入换出,导致缺页率急剧升高。本质上就是因为进程被分配的页数不够。【所有页面置换策略都有可能引起抖动】
    • Belady异常:给进程分配的页框增加,但缺页率不降反增。【只有FIFO策略会引起Belady异常】
  11. 磁盘由对换区和文件区组成,其中对换区用于辅助实现虚拟内存
    请添加图片描述
  12. 在内存非常满的情况下,CPU访问内存则很有可能发生缺页,就会频繁的在内存与对换区之间执行换入换出,此时CPU的利用率就会很低(会长时间处于等待页面置换的状态)。此时通过增加内存条来增加物理空间容量可以从根本解决问题
  13. 可变分配搭配局部置换的意思:刚开始为每个进程分配一定数量的物理块。发生缺页时只允许从自己的物理块中选出一个换出外存。若进程在运行中频繁缺页,系统会为该进程多分配几个物理块,直至该进程缺页率趋于适量值;若进程在运行中缺页率非常低,则可适当减少分配给该进程的物理块。
  14. 数据结构中说“链表是不连续存储的”,其中这个“不连续”指的是虚拟地址不连续;“数组是顺序存储的”也只是虚拟地址的连续(因为如果同一个数组的元素个数很多,超过了一个页面,那么不同页面的元素,其物理地址就可能不同,因为虽然一个页面中的元素肯定是顺序存储的,但是不同页面在物理地址中不能保证仍是连续的)
  15. 查慢表不可能不命中,但有可能缺页
  16. 页表存在于主存中,但是不可能在Cache中,这是因为地址转换的工作是由操作系统和硬件完成,用户进程是不能够访问页表的,页表是操作系统内核的数据结构。因此页表的内容不可能在Cache中
  17. 虚拟内存=内存+整个磁盘
  18. 内存保护:设置一定的机构来保证进程在未被允许的情况下不能访问分配给其他进程的内存空间,从而实现存储安全。通常的内存保护机构有两种:
    • 一对上下限寄存器:分别记录当前作业的起始地址和尾址。CPU访存时验证访问地址是否处于二者之间
    • 一个重定位寄存器和界地址寄存器(即基址寄存器和限长寄存器):前者记录作业的起始地址,后者记录作业的长度。CPU访存时比较访问地址是否处于起始地址和尾址(尾址=起始地址+长度)之间
  19. 快表TLB和Cache都是由SRAM组成的(内存是DRAM),都是相联存储器,都是集成在CPU芯片中的。
  20. 抖动与工作集:
    • 抖动:即单个进程分配到的内存块少于工作集大小时,该进程的页面会频繁的换入换出,导致缺页率急剧升高。表现为系统多道程序度高到一定程度后,CPU利用率反而开始下降。(是系统层面的,是系统中排队等待页面换入/换出的进程数量增加,从而对磁盘的有效访问时间急剧增加,造成每个进程大部分时间都用于页面换入换出,从而导致处理机利用率急剧下降)
    • 工作集:一段时间间隔内,某一进程实际要访问的页面集合。这段时间称为工作集的“窗口尺寸”( Δ \Delta Δ)。即,工作集是进程在时间间隔 ( t − Δ , t ) (t-\Delta,t) (tΔ,t) 中引用页面的集合
    • 驻留集:即分配给进程的物理页框的集合
    • 抖动的预防方法:
      • 采用局部置换策略:当某进程发生缺页时,只能在分配给它的内存空间内进行置换,而不允许从其他进程的内存空间中去获得新的物理块。这样即使该进程发生了抖动,也不会对其他进程产生影响,于是可把该进程抖动所造成的影响限制在较小的范围内。但是这种策略也会延长其他进程对磁盘的访问时间(因为该进程发生抖动后,会长期处在磁盘I/O的等待队列中,使队列长度增加)
      • 把工作集算法融入处理机调度中:原理就是处理机利用率低下有两种,由此判断是否从外存调新作业进入内存
        • 若当前每个进程在内存中的驻留页面足够多,此时便可从外存调入新的作业,而不会导致缺页率的增加
        • 若当前有些进程的内存页面不足,则应首先为那些缺页率居高的作业增加新的物理块,而不再调入新作业
      • 利用“L=S”准则调节缺页率:L为两次缺页之间的平均时间,S为平均缺页服务时间(即用于置换一个页面所需的时间)。若L远比S大,则说明很少发生缺页;若L比S小,则说明频繁发生缺页。只有二者接近时,磁盘和处理机才都可以达到它们最大的利用率
      • 选择暂停的进程:当多道程序度偏高且已影响到了处理机利用率时,为防止发生抖动,系统必须减少多道程序的数量。
  21. 进程在执行时发生了缺页中断,中断处理完成后,应重新执行被中断的指令
    一般中断发生在前一条指令刚执行结束,中断处理完成返回后应执行下一条指令。但是发生缺页中断时,由于该指令尚未执行完,因此中断处理完成后,应重新执行本条指令。
  22. 关于内存分配方式的宏观整理
    • 连续分配管理方式
      • 单一连续分配:一道用户程序
      • 固定分区分配:内部碎片
      • 动态分区分配:外部碎片、紧凑技术
    • 非连续分配管理方式 :内部碎片(也称页内碎片,很少)
      • 页式存储管理
        • 基本分页存储管理
        • 请求式分页存储管理(虚拟内存管理-虚拟分页存储管理)
          • 固定分配局部置换
          • 可变分配全局置换
          • 可变分配局部置换
      • 段式存储管理
        • 基本分段存储管理
        • 请求式分段存储管理(考纲没有)
      • 段页式管理
        • 基本段页式存储管理
        • 请求式段页式存储管理(考纲没有)
  23. 对于一级页表来说,因为页表是常驻内存的,因此在查询页表时不会产生缺页中断,只有在最终访存(即查完页表访问数据)时有可能缺页
  24. 对于多级页表来说,顶级页表(第一级页表)常驻内存,但第二级、第三级…页表并不常驻内存。因此除了最终访存可能缺页,查二级页表时也有可能缺页
  25. 多级页表可以减少页表所占的连续内存空间,但会增加页表项所占字节数(要增加相应页表项来指向下一级页表)

第四章 文件管理

  1. 物理结构与逻辑结构的区别:文件的逻辑结构是程序猿看到的文件的记录是如何存放的(如文件的记录是用数组存放的,那就是顺序文件,若程序猿使用链表实现的,就是链式文件;而对于操作系统来说,无论文件的逻辑结构是怎样,操作系统都是看到一整坨数据,它要做的就是咔咔咔几刀把这一整坨数据切成几个块,然后按照文件系统的物理结构,把这些文件块要么顺序分配,要么链接分配,要么索引分配,放到磁盘里面。逻辑结构、逻辑空间分配是程序猿(创建文件的进程)要关心的事,物理结构、物理空间分配是操作系统要关心的事
    • 如在逻辑上,excel创建的文件就是有结构的,txt创建的文件就是流;在操作系统看来它们的物理结构都是一整块东西
  2. 物理结构中的显式链接(带FAT表)原理与数据结构中的静态链表类似
  3. 电脑中不同分区的文件系统的格式可以不同(如C盘和D盘的文件系统可以是不同的),而其文件系统的格式就决定了在这个文件系统中,文件的物理格式应该如何存储。而存储设备的物理性质也决定了可以用什么格式的文件系统
  4. FAT表不会产生缺页。开机时,就会把整个FAT表读入内存,系统运行过程中,FAT表会常驻内存,因此查FAT表不需要读磁盘。系统运行过程中,若要访问某个文件,则首先要找到这个文件的目录项,从目录项中找到文件的起始块号,再根据起始块号查FAT表,从而确认文件的后续那些块放在哪里。
  5. 一个磁盘设置一张FAT表,后来引入“卷”的概念后(即C盘、D盘、E盘,这些就是不同的卷),每个卷都专门划出一个单独区域来存放自己的目录、FAT以及逻辑驱动器字母。现代OS中,一个物理磁盘可划分为多个卷,一个卷也可由多个物理磁盘组成
  6. 文件是按名存取的,只能根据文件的名字去找目录项
  7. UNIX操作系统中,输入/输出设备视为特殊文件。绝大多数的现代操作系统,都会把输入输出设备映射为一个特殊文件,把对不同设备的读写操作都抽象为read和write操作
    • 普通文件是存放在磁盘中
    • 特殊文件只存在于内存里面。所以也可以理解为特殊文件是内存里的某一片区域(内核空间中),只不过是会被视为文件来进行管理。比如要printf hello world,本质上就是把hello world写入到内存中的特殊文件中,然后才显示到显示器中。
  8. 文件目录、目录文件和目录项:目录=文件目录。目录文件是由目录项组成的,每个目录项会对应一个具体文件(这个文件有可能是一个目录文件,也有可能是一个普通文件)。传统一个目录项就是一个FCB;而采用Unix的方法,将文件描述信息从目录项中分离出来,此时目录项只保存文件名和i节点的指针,这种采用“索引节点”的系统中目录项就不是由FCB组成的
    • 索引节点=i节点(即Unix的方式),其方案是:传统方式下,目录由一个个目录项构成,一个目录项包含文件的完整信息,那么目录就会很大;i节点方案是,将目录项拆解后,目录项被大幅缩小,根据i节点的指针到磁盘中找到文件的i节点即可,i节点保存了文件的完整信息。
      • 使用索引节点的好处:使用文件系统时是按名查找目录的,所以是顺序查找。如果目录很大,可能就会顺序地读取多个磁盘块;而若目录项很小,所有的目录项就可以存放在一个磁盘块中,那么只需将一块数据读入内存,就可以找到文件所对应的目录项了,进而保证在根据文件名查找目录的过程中,减少I/O的信息量,减少磁盘I/O的次数。其实和二级索引很像,可以将被缩减的目录项看成是FCB的目录
    • 目录可以理解为一个文件夹,而目录文件是描述这个文件夹中内容的文件。目录文件是FCB的集合,存放的是子目录和数据文件的信息
  9. 操作系统为保证未经文件拥有者授权,任何其他用户不能使用该文件,所提供的方法是文件保护;文件共享是可以节省磁盘的存储空间
  10. 对一个文件的访问,常由用户访问权限和文件(固有)属性(如只读文件)共同限制
  11. 访问控制比加密保护的灵活性更好,加密保护(密钥、加密算法)比访问控制的安全性更高;访问控制机制必须由系统实现,一旦被保护的信息(如硬盘)脱离系统,那么对这些文件的保护就不复存在了,所以访问控制机制的安全性并不高。加密保护机制不需要由系统实现,甚至可以手动实现,比如直接根据算法把原文件映射为一个密文
  12. 为了对文件系统中的文件进行安全管理,任何一个用户在进入系统时都必须进行注册,这一级安全管理是系统级
  13. 文件的逻辑结构:
    • 无结构文件
    • 有结构文件
      • 顺序文件
      • 索引文件
      • 索引顺序文件
  14. 文件的物理结构:
    • 连续分配(连续文件)
    • 链接分配(链接文件)
      • 隐式链接
      • 显式链接
    • 索引分配(索引文件)
  15. 索引文件既有可能指逻辑结构,也有可能指物理结构,要根据题意判断
  16. 逻辑xx:
    • 逻辑地址:(操作系统第三章,块表、慢表)用户编程只需要关心逻辑地址(从0开始)。而逻辑地址到物理地址的映射、转换则由操作系统负责
    • 文件的逻辑结构:用户编程只需要文件的逻辑结构,但这种逻辑结构在物理上是如何存储的则由操作系统设计者针对硬件结构来选择(如磁带介质很难实现链接结构和索引结构)
    • 逻辑设备名:用户程序中要使用某个I/O设备,只需要提供逻辑设备名即可,操作系统负责实现从逻辑设备名到实际物理设备的映射。即使换了一台物理设备,用户程序也不需要改变
  17. 索引文件由逻辑文件(具体文件数据)和索引表组成。(这里的索引文件可推断出是物理结构中的索引分配的文件)
  18. 索引块(物理结构):索引表(记录了文件的各个逻辑块对应的物理块)存放的磁盘块称为索引块(即用于存放索引信息的磁盘块,一级索引表、二级索引表…存放的块);文件数据存放的磁盘块称为数据块;
  19. (逻辑结构)索引表本身是定长记录的顺序文件,因此可以快速早到第i个记录对应的索引项。每条记录对应一个索引项
  20. 逻辑结构的索引表和物理结构的索引表:
    逻辑结构的索引表是给用户自己用的,要找到某一条记录存放的逻辑地址就要查找逻辑结构的索引表;而确定某一个记录的逻辑地址后,要把逻辑地址转换为最终的物理磁盘地址,就需要使用操作系统物理结构层面的索引表。因此两个索引表是在两个阶段使用的东西。逻辑结构的索引表是索引文件各个记录的逻辑地址;物理结构的索引表是索引文件各个逻辑块的物理地址
  21. 建立索引的目的是快速的确定某一条记录的地址,实现随机访问。而这一举动会浪费一定的存储空间(因为增加了索引表的存储)
  22. 用磁带做文件存储介质时,文件只能组织成顺序文件。
    • 这里的“顺序文件”可以推测是指物理结构中的“连续文件”。到底指的是逻辑结构和物理结构要根据题意分析
  23. 直接存取=随机存取。连续分配、索引分配支持随机存取;链接分配不支持随机存取。
  24. 文件的物理结构中,连续结构不利于文件长度动态增长;链接结构、索引结构支持文件的动态增长。索引结构既支持随机访问,又支持文件扩展
  25. 散列结构不可以作为文件的物理结构,只能作为文件的逻辑结构
  26. 记录成组分解技术:不可跨越盘块存储记录(下面的题是隐式链接)
    请添加图片描述
  27. 打开文件表(系统、用户进程)是打开文件和关闭文件时所用到的一种数据结构;位图、空闲盘块链表是用于空闲磁盘块管理的数据结构
  28. 文件访问控制信息应存储在FCB(文件控制块)中
  29. 系统注册表用于存放系统配置信息。在windows中按“Windows+R”,输入“regedit”即可打开系统注册表。如DoubleClickSpeed这个键值记录了鼠标的双击速度。系统注册表描述的是整个系统的信息,而不是各个文件相关的信息
  30. 一个用户进程通过read系统调用读取一个磁盘文件中的数据,其背后会发生什么:
    • read前必须先open。在open系统调用中用户需要提供路径和文件名,系统调用相关的处理程序会根据这些参数找到对应的FCB并调入内存,增加“打开文件表”中的对应表项。这些事情做完后会返回一个文件描述符,实质上就是文件对应的打开文件表中表项的索引值
    • 然后就read,此时就不需要提供文件名了,只需提供文件描述符即可。系统会根据文件描述符查找打开文件表,找到对应的表项(FCB)。若文件本来就已经被调入内存,就返回首指针;如果文件不在内存,则产生缺页中断,缺页中断程序会根据FCB中的地址找到文件在外存中的地址,并将文件内容读入内存中,此时进程处于阻塞态(也可以说成是睡眠等待)。读入内存后将文件的数据缓冲区首指针返回给用户进程
      请添加图片描述
  31. 即“打开”是用“路径、文件名”换取“文件描述符”;Read是用“文件描述符”换取“数据缓冲区首指针”
    • “打开”时系统所做的工作是根据提供的路径和文件名找到文件的目录项并将其读入内存(放到打开文件表里)
    • read时系统所做的工作是根据FCB中的地址找到文件在外存中的地址,并将文件内容读入内存中,然后将文件的数据缓冲区首指针返回给用户进程。若本来文件就在内存中,则直接返回首指针即可
  32. 索引节点的总数不会影响单个文件长度。因为一个文件对应一个索引节点。与索引节点总数相关联的是文件个数
  33. 为支持CD-ROM中视频文件的快速随机播放,播放性能最好的文件数据块组织方式是连续结构
    • CD-ROM即只读光盘,是一种在电脑上使用的光碟。这种光碟只能写入数据一次,信息将永久保存在光碟上,使用时通过光碟驱动器读出信息。因此保存在其中的文件数据不需要修改,所以使用连续结构不会遇到文件拓展很不方便的问题。
    • 且比起索引结构,连续结构的随机访问更快(连续结构可直接计算出想要访问的数据所在的物理地址,而索引结构还需要查索引表,更耗时一点)
  34. 在目录检索的过程中,利用顺序检索法查找完成后,即可得到文件的目录项,这个目录项中有可能就包含文件的物理地址
    • 若文件采用连续分配的物理结构,则目录项中会保存文件的文件名、起始块号、总块数等信息
    • 若文件采用索引分配的物理结构,(FCB分解法)目录项中只包含文件名和索引节点指针,此时查找完成后只能找到文件的inode的存放地址,而并非文件的具体物理存储地址(inode中才会包含文件的物理地址)。如下图的例子中,就是没有使用索引分配的从根目录检索文件,将文件所在目录读入内存后,就可以直接从目录项中读取到文件的外存地址了
      在这里插入图片描述
  35. “当前目录”(相对路径)的工作原理:
    系统把当前工作目录调入内存后,会保存一个指向该目录文件的指针。要相对查找一个文件时,直接从内存中读取当前目录的相关信息即可(不需要将从根目录开始的目录一个个读入内存)。因此设置当前目录的主要目的是加快文件的检索速度。而关于文件的读/写速度,设置当前目录跟它并没有关系
  36. 引入多级目录结构会浪费存储空间(子目录会增加存储空间)、增加系统开销(每查找一次目录,至少需要读磁盘一次)、增加传送时间
  37. 为防止系统故障造成系统内文件受损,常采用备份的方法来保护文件。采用存取控制矩阵并不能对抗系统故障
  38. 一个文件在同一系统中,不同的存储介质上的复制文件应采取不同的物理结构。如一首歌的文件在磁带上只能采用连续存放的物理结构,而在硬盘上就不需要连续存放
  39. 对于一个已打开的文件F,在系统打开文件表中仅有一个表项包含F的属性,而各进程的用户打开文件表中关于F的表项内容不同(比如读写指针、访问权限就可以不同)
    请添加图片描述
  40. 快捷方式即软链接
  41. 虚拟存储与文件系统的关系:外存中有一片交换区,用于存储调入调出的页面数据。对交换区里数据的管理就需要文件系统,因为也属于对磁盘的管理
  42. 文件的存储空间管理实质上是对外存空闲区的组织和管理
  43. FAT表不仅记录了文件分配信息(显式链接),还“兼职”做了空闲块管理:用一个特殊的数据表示此块空闲,如0x0000;用一个特殊的数表示文件结尾,如0xFFFF
  44. 文件目录是由FCB(文件控制块)组成,而索引节点是对FCB的优化。FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项,包含文件的详细信息;而使用索引节点时,只有在找到文件名所对应的目录项时,才会把索引节点调入内存,索引节点包含了文件的详细信息
  45. 空闲盘块链可以看作是隐式链接在空闲块管理中的应用

第五章 I/O管理

  1. 缓冲区在主存中;高速缓存(Cache)在CPU中;Spooling技术中的输入/出井在外存中
  2. 所有单机资源利用率的提升的基本前提都是要有“并发性”。如果没有多个进程的并发,那独占设备和共享设备也没什么区别、内存里只放一个进程的数据也无所谓、交换技术也没有存在的意义。下面是几个提高单机资源利用率的例子
    • Spooling技术:独占设备->共享设备,提高设备利用率
    • 虚拟技术:
      • 虚拟内存:提高内存利用率
      • 虚拟设备:提高设备利用率
    • 交换技术:提高内存、CPU利用率
  3. Spooling是以空间换时间的技术;虚拟存储技术、覆盖与交换技术是以时间换空间的技术;通道技术是以金钱换时间的技术(是搞一个单独的硬件)
  4. “在一个磁盘上设置多个分区”并不能改善磁盘设备的I/O性能。这是因为操作系统是安装在C盘的,而如果将磁盘分区后,按照惯例,将应用程序安装在D盘,实际上是与操作系统所在的C盘相隔较远。而操作系统内的程序肯定是经常被访问到的,因此磁头大部分时间都在C盘所在的磁盘内侧柱面移动,而若此时有频繁访问的应用程序在远离C盘的D盘中存在,就会使得磁头移动的距离过长,从而降低磁盘设备的I/O性能。
    请添加图片描述
  5. 在系统内存中设置磁盘缓冲区的主要目的是减少磁盘I/O次数。
    假设一个文件有10个物理块,若没有设置磁盘缓冲区,则每次I/O只能将1块内容读入内存,读整个文件总共需要10次I/O;若设置了磁盘缓冲区,缓冲区可存储10个物理块的内容,则可通过1次I/O就将文件对应的10个物理块全部读入缓冲区,之后便无需再启动磁盘I/O。
  6. 阻塞I/O:进程在执行驱动程序时可能进入阻塞态
    阻塞I/O和非阻塞I/O的详细介绍见这篇博客
  7. 初始化设备、读写设备的操作都是由驱动程序控制完成的
  8. 光盘、U盘、磁盘都是既可以随机访问,又可以顺序访问的。其中,光盘的原理和磁盘很类似,都是盘面上会有一圈圈存储介质,光盘有个激头,其作用和磁盘的磁头类似,既可以定位一圈,做到随机访问,又可以在一圈上顺序访问。而U盘实际上是ROM,是基于闪存技术,即EEPROM的集成+一个控制单元
  9. 磁盘的延迟时间和传送时间都和磁盘转速有关。前者一般取平均值转半圈的时间,后者根据要读取的扇区和转速算。
    磁盘的启动时间和磁盘驱动器的物理、电气特性有关。
    找道/寻道时间和磁盘调度算法、磁臂移动速度有关。
    磁盘的处理时间指读取出一个扇区后,磁头需要休息一段时间(这是因为一块数据会把磁盘缓冲区充满)。
    磁盘读取数据的上述时间中,影响最大的是
  10. A cluster(簇)is a group of sectors(block) (扇区(块))on a hard disk drive that is addressed as one logical unit by the operating system.
    即物理块=扇区,逻辑块=簇。
    扇区是物理上限制的读/写一次的基本单位;簇是操作系统限制的存储空间分配基本单位。即操作系统给文件分配空间是以簇为单位的
    请添加图片描述
  11. 旋转延迟的大小取决于磁盘空闲空间的分配程序,旋转延迟的大小与文件物理结构有关。这两个本质都一个意思,就是数据在磁盘上的扇区分配不一样,会导致每次读的旋转延迟时间不一样
  12. SSD(固态硬盘)的随机存取速度很快,传统机械硬盘因为要寻道和找扇区,所以随机存取速度慢,但传统机械硬盘的连续存取很快。因此SSD的优势主要体现在随机存取的速度上。
  13. 磁盘的初始化过程
    • 刚出厂时,磁盘只是被划分成一个个磁道,并未被划分成扇区
    • 低级格式化(物理格式化)【扇区相关】:将磁盘的各个磁道划分为扇区,并确定管理扇区所需要的各种数据结构,包括扇区校验码(如奇偶校验、CRC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)
    • 分区:将磁盘进行分区,每个分区由若干柱面组成(即分为我们熟知的C盘、D盘、E盘)
    • 逻辑格式化【文件系统相关】:即创建文件系统,包括创建文件系统的根目录、对保存空闲磁盘块信息的数据结构进行初始化(如位示图、空闲分区表)
  14. 中断发生时,由硬件保护并更新程序计数器(PC),而不是由软件完成,主要是为了保证系统运行可靠、正确,顺便提高了处理速度
  15. 硬件缓冲和软件缓冲:
    • 硬件缓冲:由寄存器等专用的硬件实现
    • 软件缓冲:由操作系统在内存开辟一个空间来实现
  16. 磁臂粘着:有一个或几个进程对某一磁道有较高的访问频率,即这个(些)进程反复请求对某一磁道进行I/O操作,从而垄断了整个磁盘设备。把这一现象称为“磁臂粘着”,在高密度磁盘上容易出现此现象。SSTF、SCAN、CSCAN都可能出现
  17. 磁盘缓冲区(磁盘高速缓存):以前的高速缓存(即cache)是在内存和CPU之间所增设的一个小容量高速存储器,这里是在内存中为磁盘盘块所设置的一个缓冲区,在该缓冲区中保存了某些盘块的副本。当出现一个磁盘访问请求时,由内核先去查看所请求的盘块内容是否已在磁盘高速缓存中,若在,则可从磁盘高速缓存中直接获取,这样就省去了启动磁盘的操作,且可使本次访问速度提高几个数量级;若不在,则需要启动磁盘以将所需要的盘块内容读入,并把读入的盘块内容送到磁盘高速缓存中,以便于以后又需要访问该盘块的内容时直接从磁盘高速缓存中获取。
  18. 提高磁盘I/O速度的方法
    • 磁盘高速缓存
    • 提前读和延迟写
    • 优化物理块的分布:在采用链接分配方式和索引分配方式时,若一个文件分散存储在磁盘的任意位置,过于分散的话,就会增加磁头的移动距离。
    • 虚拟盘:利用内存空间去仿真磁盘,进而形成虚拟盘,也成RAM盘。该盘的设备驱动程序可以接受所有标准的磁盘操作,但这些操作的执行不是在磁盘上而是在内存中执行。但虚拟盘是易失性存储器,一旦系统或电源发生故障,或系统重启,原来保存在虚拟盘中的数据就会丢失,因此虚拟盘常用于存放临时文件。虚拟盘中的内容完全由用户控制,而磁盘高速缓存中的内容则是由OS控制的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值