【笔记】操作系统概念

概述

导论

操作系统是资源分配器,管理计算机系统中的资源。面对许多甚至冲突的资源请求,操作系统必须决定如何为各个程序和用户分配资源,以便计算机系统能有效而公平地运行。

操作系统是控制程序,管理用户程序的执行以防止计算机资源的错误使用或使用不当。

操作系统的基本目的是执行用户程序并能更好地解决用户问题。

计算机系统由一个或多个CPU和若干设备控制器通过共同的总线相连。

  • 总线提供对共享内存的访问;
  • 每个设备控制器负责一种特定类型的设备;
  • CPU与设备控制器可以并发工作,并竞争内存周期。

计算机在启动时会运行引导程序(bootstrap program),它位于ROM或EEPROM中,它能定位操作系统内核并把它装入内存中。

中断可通过硬件系统总线向CPU发出信号或软件执行系统调用来触发。

中断必须将控制转移到合适的中断处理程序。

中断向量(interrupt vector)可通过唯一设备号来索引,以提供设备的中断处理子程序的地址。

中断体系结构也保存被中断指令的地址。

计算机程序必须在内存中以便执行,内存是处理器可以直接访问的唯一的大容量存储区域。

程序和数据不能永久地驻留在内存中,因为:

  • 内存太小,不能永久地存储所有需要的程序和数据;
  • 内存是易失性存储设备,当掉电时会失去所有内容。

I/O中断驱动适合移动少量数据,DMA(直接内存访问)适合移动大块的数据。

设备控制器能在本地缓冲和内存之间传送一整块数据,而无需CPU干预。

多处理器系统(并行系统)优点:增加吞吐量、规模经济、增加可靠性。

适度退化能力:提供与正常工作的硬件成正比的服务。

容错能力:忍受单个部件的错误并继续操作。

集群系统将多个CPU集中起来完成计算任务。

操作系统要有多道程序处理能力。

多道程序设计通过组织作业使CPU总有一个作业可执行,从而提高CPU的利用率。

  • 操作系统同时将多个任务保存在内存中;
  • 操作系统选择一个位于内存中的作业并开始执行;
  • 当该作业需要等待时,CPU就会切换到另一个作业。

分时系统(多任务)是多道程序设计的延伸,虽然CPU还是通过在作业之间的切换来执行多个作业,但是由于切换频率很高,用户可以在程序运行期间与之进行交互。

共享能提供用户与系统之间的直接通信。

分时操作系统允许许多用户同时共享计算机。

转入到内存并执行的程序通常称为进程

如果多个作业需要调入内存但没有足够的内存,那么系统必须在这些作业中做出选择,这样的决策称为作业调度

如果有多个任务同时需要执行,那么系统必须做出选择,这样的选择称为CPU调度

虚拟内存允许将一个执行的作业不完全放在内存中,将内存抽象成一个庞大且统一的存储数组(逻辑内存),可以使程序可以比物理内存大。

操作系统是由中断驱动的。

事件总是由中断或陷阱引起。

陷阱(或异常)是一种软件中断,源于出错或源于用户程序的一个特别请求。

为了确保操作系统的正常执行,必须区分操作系统代码和用户定义代码的执行,至少需要两种独立的操作模式:用户模式系统模式

用一个模式位来表示当前模式:系统模式(0)和用户模式(1)。

双重模式操作提供了保护操作系统和用户程序不收错误用户程序影响的手段,其实现方法为:将能引起损害的机器指令作为特权指令

通过中断、陷阱或系统调用将控制权返回操作系统。

当系统调用被执行时,硬件会将它作为软件中断。

陷阱如同中断一样,能通过中断向量将控制权转交给操作系统。

操作系统负责下述与进程管理相关的活动:

  • 创建和删除用户进程和系统进程;
  • 挂起和重启进程;
  • 提供进程同步机制;
  • 提供进程通信机制;
  • 提供死锁处理机制。

内存是现在计算机系统的中心。

内存是CPU所能直接寻址和访问的唯一大容量存储器。

如果一个程序要执行,那么它必须先变换成绝对地址并装入内存。

为改善CPU的利用率和计算机对用户的响应速度,通用计算机必须在内存中保留多个程序。

操作系统负责下列有关内存管理的活动:

  • 记录内存的哪部分正在被使用及被谁使用;
  • 当有内存空间时,决定哪些进程可以装入内存;
  • 根据需要分配和释放内存空间。

文件时由其创建者定义的一组相关信息的集合。通常,文件表示程序(源程序和目标程序)和数据。

操作系统负责下列有关文件管理的活动:

  • 创建和删除文件;
  • 创建和删除目录来组织文件;
  • 提供操作文件和目录的原语;
  • 将文件映射到二级存储上;
  • 在稳定存储介质上备份文件。

当需要特定信息时,首先检查它是否在高速缓存中,如果是,可直接使用高速缓存中的信息;否则,使用位于内存中的信息,同时将其赋值到高速缓存中以便下次再用。

操作系统的目的之一在于对用户隐藏具体硬件设备的特性。

I/O子系统包括如下几个部分:

  • 一个包括缓冲、高速缓存和假脱机的内存管理部分;
  • 通用设备驱动器接口;
  • 特定硬件设备的驱动程序。

保护是一种控制进程或用户对计算机系统资源的访问的机制。

安全的主要工作室防止系统不收外部或内部攻击。

网络就是两个或多个系统之间的通信路径。

操作系统结构

有的操作系统在其内核部分包含命令解释程序,其他操作系统将命令解释程序作为一个特殊程序。

在具有多个命令解释程序选择的系统中,解释程序被称为Shell。

命令解释程序的作用是获取并执行用户指令的下一条指令。

从操作系统的角度而言,不用区分用户程序和系统程序。

系统调用(system call)提供了操作系统提供的有效服务界面。

一般应用程序开发人员根据应用程序接口(API)设计程序,根据API编程的好处之一在于程序的可移植性。

通常,每个系统调用一个与其相关的数字,系统调用接口根据这些数字维护一个列表索引。然后,系统调用接口来调用所需的操作系统内核中的系统调用,并返回系统调用状态及其他返回值。

向操作系统传递参数有三种方法:

  • 通过寄存器来传递;
  • 将参数存入内存的块和表中,并将块的地址通过寄存器来传递;
  • 通过程序放在或压入堆栈中,并通过操作系统弹出。

系统调用大致可分为五类:进程控制、文件管理、设备管理、信息维护和通信。

操作系统结构:简单结构、分层法、微内核、模块。

分层法的主要优点在于构造和调试的简单化,每层只能利用较低层的功能和服务。

微内核法将所有非基本部分从内核移走,并将它们实现为系统程序或用户程序,微内核通常包括最小的进程和内存管理以及通信功能。

微内核的主要功能是使客户程序和运行在用户空间的各种服务之间进行通信,通信以消息传递形式提供。

微内核的好处之一在于便于扩充操作系统。

微内核必须忍受由于系统功能总开销的增加而导致系统性能的下降。

模块设计运行内核提供核心服务,也能动态地实现特定的功能。

虚拟机利用了CPU调度和虚拟内存技术。

虚拟机的两种模式:虚拟用户模式和虚拟内核模式,这两种模式都运行在物理用户模式上。

在虚拟机中,不同的系统资源具有完全的保护。

进程管理

进程

批处理系统执行作业,而分时系统使用用户程序或任务。

进程包括程序代码、当前活动、堆栈段、数据段和堆。

进程在执行时会改变状态。每个进程可能处于下列状态之一:

  • 新的:进程正在被创建;
  • 运行:指令正在被执行;
  • 等待:进程等待某个时间的发生;
  • 就绪:进程等待分配处理器;
  • 终止:进程完成执行。

一次只有一个进程在一个处理器上运行,但是多个进程可处于就绪或等待状态。

每个进程在操作系统内用进程控制块(PCB)来表示,它包含许多与一个特定进程相关的信息,比如进程状态、程序计数器、CPU寄存器、CPU调度信息、内存管理信息、记账信息和I/O状态信息。

进程调度选择一个可用的进程到CPU上执行。

进程进入系统时,会被加到作业队列中,该队列包括系统中的所有进程。驻留在内存中就绪的、等待运行的进程保存在就绪队列中。

等待特定I/O设备的进程列表称为设备队列

新进程开始处于就绪队列等待直到被选中执行或者被派遣。当进程分配到CPU并执行时,可能发生下面几种时间中的一种:

  • 进程可能发出一个I/O请求,并被放到I/O队列中;
  • 进程可能创建一个新的子进程,并等待其结束;
  • 进程可能会由于中断而强制释放CPU,并被放回到就绪队列中。

进程选择是由相应的调度程序来执行的。

长期调度程序作业调度程序从大容量存储设备的缓冲池中选择进程,并装入内存以准备执行。

短期调度程序CPU调度程序从准备执行的进程中选择进程,并为之分配CPU。

这两个调度程序的主要差别是它们执行的频率。

短期调度程序必须频繁地为CPU选择新进程。

长期调度程序执行得并不频繁,它控制多道程序设计的度。

绝大多数进程可分为:I/O为主或CPU为主。

中期调度程序将进程从内存中移出,从而降低多道程序设计的度,之后进程能被重新调入内存,并从中断处继续执行。这种方案称为交换。

将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务称为上下文切换。

在创建子进程时,子进程可能从操作系统那里直接获得资源,也可能只从其父进程那里获得资源。

当进程完成执行最后的语句并使用系统调用请求操作系统删除自身时,进程终止。这时,进程可以返回状态值到父进程,所有进程资源都会被操作系统释放。

进程通过适当的系统调用能终止另一个进程。通常,只有被终止进程的父进程才能执行这一系统调用。

父进程终止其子进程的原因有很多,如:

  • 子进程使用了超过它所分配到的一些资源;
  • 分配给子进程的任务已不再需要;
  • 父进程退出,如果父进程终止,那么操作系统不允许子进程继续。

如果一个进程不能影响其他进程或被其他进程所影响,那么该进程是独立的。

如果系统中一个进程能影响其他进程或被其他进程所影响,那么该进程是协作的。与其他进程共享数据的进程为协作进程。

进程协作的理由:信息共享、提高运算速度、模块化、方便。

协作进程需要一种进程间通信机制(IPC)来允许进程互相交换数据与信息。

进程间通信有两种基本模式:共享内存、消息传递。

采用共享内存的进程间通信需要通信进程建立共享内存区域。

消息传递提供一种机制允许进程不必通过共享地址空间来实现通信和同步。

线程

线程是CPU使用的基本单位,它由线程ID、程序计数器、寄存器集合和栈组成,与属于同一进程 的其他线程共享代码段、数据段和其他操作系统资源。

多线程编程的优点:响应度高、资源共享、经济、多处理器体系结构的利用。

用户线程受内核支持,而无须内核管理;而内核线程有操作系统直接支持和管理。

在用户线程和内核线程之间必然存在一种关系,如多对一模型、一对一模型和多对多模型。

线程库为程序员提供创建和管理线程的API。

线程取消是在线程完成之前来终止线程的任务。

线程池的优点:

  • 通常用现有线程处理请求要比等待创建新的线程要快;
  • 线程池限制了在任何时候可用线程的数量,这对那些不能支持大量并发线程的系统非常重要。

CPU调度

进程执行由CPU执行和I/O等待周期组成。

每当CPU空闲时,操作系统就必须从就绪队列中选择一个进程来执行。短期调度程序从内存中选择一个能够执行的进程,并为之分配CPU。

CPU调度决策可在如下4中环境下发生:

  • 放一个进程从运行状态切换到等待状态(I/O请求,或调用wait等待一个子进程的终止);
  • 当一个进程从执行状态切换到就绪状态(出现中断);
  • 当一个进程从等待状态切换到就绪状态(I/O完成);
  • 当一个进程终止。

当调度只能发生在第1和第4两种情况下时,称调度方案是非抢占的;否则称调度方案为抢占的

分派程序(dispatcher)是一个模块,用来将CPU的控制交给由短期调度程序选择的进程。其功能包括:

  • 切换上下文;
  • 切换到用户模式;
  • 跳转到用户程序的合适位置,以重新启动程序。

分派程序停止一个进程而启动另一个所要花的时间称为分派延迟

CPU调度算法准则:CPU使用率、吞吐量、周转时间、等待时间、响应时间。

调度算法:

  • 先到先服务调度(FCFS):先请求CPU的进程先分配到CPU;
  • 最短作业优先调度(SJF):当CPU空闲时,它会赋给具有最短CPU区间的进程;
  • 最短剩余时间优先调度:抢占SJF;
  • 优先级调度饥饿的问题可以通过老化来解决;
  • 轮转法调度(RR):类似于FCFS调度,但是增加了抢占以切换进程。定义了一个较小的时间单元,称为时间片
  • 多级队列调度:将就绪队列分成多个独立队列;
  • 多级反馈队列调度:允许进程在队列之间移动。

多处理器调度:非对称多处理器对称多处理器(SMP)。

进程同步

对于共享数据的一组协作的顺序进程必须提供互斥,一种解决方法是确保在某个时候只能有一个进程或线程可使用代码的临界区

临界区问题必须满足互斥前进有限等待

对于单处理器环境,临界区问题可以通过在修改共享变量时禁止中断出现来解决。

许多现代计算机系统提供了特殊硬件指令以允许能原子地检查和修改字的内容或交换两个字的内容。

计数信号量的值域不受限制,二进制信号量(又称互斥锁)的值只能是0或1。

当每个进程需要使用资源时,需要对该信号量执行wait()操作,减少信号量的计数;当进程需要释放资源时,需要对该信号量执行signal()操作,增加信号量的计数。当信号量的计数为0时,所有资源都被使用。

这里的信号量的主要缺点是要求忙等待(busy waiting),这种类型的信号量称为自旋锁

在具有忙等的信号量的经典定义下,信号量的值不可能为负,但是通过阻塞的实现可能产生负的信号量。如果信号量为负,那么其绝对值就是等待该信号量的进程的个数。

信号量(semaphore)的关键之处在于它们原子地执行。

死锁

在多道程序环境下,多个进程可能竞争一定数量的资源。某个进程申请资源,如果这时资源不可用,那么该进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变其状态,这种情况称为死锁

进程在使用资源前必须申请资源,在使用资源之后必须释放资源,一个进程可能会申请许多资源以便完成其指定的任务。

正常操作模式下,进程要按”申请——使用——释放“的顺序来使用资源。

死锁的必要条件:

  • 互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程使用,如果另一进程申请该资源,那么申请进程必须等到该资源被释放为止;
  • 占有并等待:一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程所占有;
  • 非抢占:资源不能被抢占,即资源只能在进程完成任务后而自动释放;
  • 循环等待:有一组等待进程{P0,P1,…,Pn},P0等待的资源为P1所占有,P1等待的资源为P2所占有,…,Pn-1等待的资源为Pn所占有,Pn等待的资源为P0所占有。

资源分配图:由进程Pi(用圆形表示)、资源Rj(用正方形表示)和箭头组成,Pi→Rj为申请边,Rj→Pi为分配边。如果分配图没有环,那么系统就没有进程死锁。

死锁处理方法:

  • 可使用协议以预防或避免死锁,确保系统不会进入死锁状态;
  • 可允许系统进入死锁状态,然后检测它,并加以恢复;
  • 可忽视这个问题,认为死锁不可能在系统内发生。

死锁预防:只要确保至少一个死锁的必要条件不成立,就能预防死锁发生。

通过使死锁的必要条件不成立的方法来预防死锁的副作用是低设备使用率和系统吞吐率。

如果系统能按某个顺序为每个进程分配资源并能避免死锁,那么系统状态是安全的,该顺序为安全序列

银行家算法需要的数据结构:

  • Available:长度为m的向量,表示每种资源现有实例的数量;
  • Max:n×m矩阵,定义每个进程的最大需求;
  • Allocation:n×m矩阵,定义每个进程现在所分配的各种资源类型的实例数量;
  • Need:n×m矩阵,表示每个进程还需要的剩余的资源。

为了让系统从死锁状态中恢复过来,可以简单地终止一个或多个进程以打破循环等待,也可以从一个或多个死锁进程那里抢占一个或多个资源。

有两种方法通过终止进程以取消死锁,让系统回收分配给被终止进程的所有资源:

  • 终止所有死锁进程;
  • 一次只终止一个进程知道取消死循环为止。

通过资源抢占以取消死锁,逐步从进程中抢占资源给其他进程使用,直到死锁环被打破为止。

如果要求使用抢占来处理死锁,那么需要解决三个问题:选择一个牺牲品、回滚、饥饿。

内存管理

内存

CPU所能直接访问的存储器只有内存和处理器内的寄存器。

CPU内置寄存器通常可以在一个CPU时钟周期内完成访问,而内存访问可能需要多个CPU时钟周期,为了协调速度,可以在CPU与内存之间增加高速缓存。

每个进程需要有独立的内存空间,为此,需要确定进程可访问的合法地址的范围,并确保进程只访问其合法地址。通过两个寄存器即基地址寄存器(base register)和界限地址寄存器(limit register)可以实现这种保护。

内存空间保护的实现,是通过CPU硬件对用户模式下所产生的每一个地址与寄存器的地址进行比较来完成的。

CPU所生成的地址通常称为逻辑地址,而内存单元所看到的地址通常称为物理地址

运行时从虚拟地址到物理地址的映射是由被称为内存管理单元(MMU)的硬件设备来完成的。

为了获得更好的内存空间使用率,可以使用动态加载,一个子程序只有在调用时才被加载,而不用的子程序决不会被加载。

动态链接是将链接延迟到运行时。

进程需要在内存中以便执行,但它可以暂时从内存中交换(swap)到备份存储上,当需要再次执行时再调回到内存中。

这种交换有时称为滚入(roll in)或滚出(roll out)。

通常,一个交换出的进程需要交换回它原来所占有的内存空间。

交换需要备份存储,通常是磁盘。

交换系统的上下文切换时间比较长,为了有效使用CPU,需要每个进程的执行时间比交换时间长。

如果要换出进程,那么必须确保该进程完全处于空闲状态。

采用连续内存分配时,每个进程位于一个连续的内存区域。

最简单的内存分配方法之一就是将内存分为多个固定大小的分区(partition),每个分区只能容纳一个进程。

在可变分区方案里,操作系统有一个表,用于记录哪些内存可用和哪些内存已被占用。

(hole)可以表示一块可用的内存。

通常,一组不同大小的孔分散在内存中,当新进程需要内存时,系统为该进程查找足够大的孔。如果孔太大,那么就分为两块:一块分配给新进程,另一块还回到孔集合。当进程终止时,它将释放其内存,该内存将还给孔集合。如果新孔与其他孔相邻,那么将这些孔合并成大孔。

从一组可用孔中选择一个空闲孔的常用的方法为:

  • 首次适应:分配第一个足够大的孔;
  • 最佳适应:分配最小的足够大的孔;
  • 最差适应:分配最大的孔。

首次适应方法和最佳适应方法都有外部碎片问题

如果将内存以固定大小的块为单元来分配,进程所分配的内存可能比索要的要大,这会带来内部碎片问题

紧缩(compaction)可以通过移动内存内容将空闲空间合并来解决外部碎片问题,但某些静态重定位的情况不能使用,而且紧缩方案开销较大。

另一种可能解决外部碎片问题的方法是允许物理地址空间为非连续,这样只要有物理内存就可以为进程分配,比如分页分段

实现分页的基本方法涉及将物理内存分为固定大小的块,称为(frame),而将逻辑内存也分为同样大小的块,称为(page)。

由CPU生成的每个地址分为两个部分:页号(p)和页偏移(d)。页号作为页表中的索引,页表包含每页所在物理内存的基地址,这些基地址与页偏移的组合就形成了物理地址,就可送交物理单元。

页大小和帧大小是由硬件来决定的。

分页也是一种动态重定位,每个逻辑地址由分页硬件绑定为一定的物理地址。

分页技术不会产生外部碎片,但会产生内部碎片。

分页的一个重要特点是用户视角的内存和实际物理内存的分离。

物理内存的分配细节通常保存在帧表中。

在帧表中,每个条目对应着一个帧,以表示该帧是空闲还是已占用,如果占用,是被哪个进程的哪个页所占用。

转换表缓冲区(TLB)是一个小但专用且快速的硬件缓冲,是关联的快速内存,由键和值组成。

当CPU产生逻辑地址后,其页号提交给TLB,如果找到页号,那么也就得到了帧号,并可用来访问内存。

如果页码不在TLB中(称为TLB失效),那么就需要访问页表。当得到帧号后,就可以用它来访问内存,同时将页号和帧号增加到TLB中,这样下次再用时就可很快查找到。如果TLB中的条目已满,那么操作系统会选择一个来替换。

为了保证TLB中的条目不包括从上一个进程留下来的无效的物理地址,它可以在每个TLB条目中保存地址空间标识符(ASID)来唯一地标识进程并为进程提供地址空间保护,若不支持独立的ASID,每次选择一个页表时,TLB就会冲刷(flushed)或删除,以确保下一个进程不会使用错误的地址转换。

页号在TLB中被查找到的百分比称为命中率

在分页环境下,内存保护是通过与每个帧相关联的保护位来实现的。通常,这些为保存在页表中。

可以用一个为来定义一个页是可读写还是只读的。

页表那个的每一条目都有一个有效-无效位,它可以捕捉到非法地址。

分页的优点之一在于可以共享公共代码,比如可重入代码(或称为纯代码)。

为了能在内存中连续地分配页表,可以将页表换分为更小部分,于是就形成了层次页表

哈希页表的每一个条目都包括一个链表的元素,这些元素哈希成同一位置。每个元素有3个域:虚拟页码(哈希值)、所映射的帧号、指向链表的下一个元素的指针。

群集页表类似于哈希页表,但它的每一条目不止包括一页信息,而是包括多页。

反向页表对于每个真正的内存页或帧才有一个条目,每个条目包含保存在真正内存位置的页的虚拟地址以及拥有该页的进程的信息,故整个系统只有一个页表,对每个物理内存的页只有一条相应的条目。系统中的每个虚拟地址有一个三元组<进程号,页号,偏移> ,每个反向页表的条目为<进程号,页号>

反向页表减少了每个页表所需要的内存空间,但是当引用页时,它增加了查找页表所需要的时间。

采用分页内存管理有一个问题:用户视角的内存和实际物理内存的分离。

分段(segmentation):逻辑地址空间时由一组段组成的,每个段都有名称和长度,地址指定了段名称和段内偏移,用户通过段名称和偏移来指定地址。

为简单起见,段是编号的,是通过段号而不是段名来引用的,因此,逻辑地址由有序对<段号,偏移>组成。

段表可以将二维的用户定义地址映射为一维的物理地址。

段表的每个条目都有段基地址(包含该段在内存中的开始物理地址)和段界限(该段的长度)。

虚拟内存

虚拟内存技术允许执行进程不必完全在内存中,它将用户看到的逻辑内存与物理内存分开,可以使程序可以比物理内存大。

虚拟内存允许进程很容易地共享文件和地址空间,还为创建进程提供了有效的机制。

按需调页(demand paging):程序从磁盘载入内存时,只有在需要时才调入相应的页。

为了区分哪些页在内存里,哪些页在磁盘上可以使用有效-无效位。当该位设置为有效时,该值表示相关的页既合法且也在内存中;当该位设置为无效时,该值表示相关的页为无效或者有效但是在磁盘上。

写时复制:允许父进程与子进程开始时共享同一页面,该页面标记为写时复制页,即如果任何一个进程需要对页进行写操作,那么就创建一个共享页的副本。

如果增加了多道程序的度,那么会过度分配内存。

页面置换算法:

  • 先进先出页置换(FIFO);
  • 最优页置换(OPT或MIN):置换最长时间不会使用的页;
  • 最近最少使用置换(LRU);
  • 第二次机会页置换:二次机会算法又称为时钟算法,有一个引用位;
  • 增强型二次机会页置换:有一个引用位和修改位;
  • 最不经常使用页置换(LFU);
  • 最长使用页置换(MFU)。

帧分配:平均分配或比例分配。

当有多个进程竞争帧时,可将页置换算法分为全局置换局部置换

如果进程没有它所需要的活跃使用的帧,那么它会很快产生页错误,这时,必须置换某个页。然而,其所有页都在使用,它置换一个页,但又立刻再次需要这个页。因此,它会一而再地产生页错误,置换一个页,而该页又立即出错且需要立即调进来。这种频繁的页调度行为称为颠簸(thrashing)。如果一个进程在换页上用的时间要多于执行时间,那么这个进程就在颠簸。

CPU调度程序发现CPU使用率降低,因此会增加多道程序的度。新进程试图从其他运行进程拿到帧,从而引起更多页错误,形成更长的调度设备的队列,这将导致CPU使用率进一步降低。

通过局部置换算法(或优先置换算法)能限制系统颠簸。如果一个进程开始颠簸,那么它将不能从其他进程拿到帧,且不能使后者也颠簸。

为了防止颠簸,必须提供进程所需的足够多的帧。

纯按需调页系统的一个显著特性是当一个进程开始时会出现大量页错误,这是由于试图将最初局部调入到内存的结果。预调页试图阻止这种大量的初始调页,将所需要的所有页一起调入内存。

存储管理

文件系统接口

文件时由操作系统所定义和实现的抽象数据类型,它由一系列逻辑记录组成。逻辑记录可以是字节、行或更为复杂的数据项。

操作系统的主要任务是将逻辑文件概念映射到物理存储设备,如磁盘。

由于设备的物理记录大小可能与逻辑记录大小不一样,所以可能有必要将多个逻辑记录合并以存入物理记录。

文件系统的每个设备都有内容的卷表或设备目录,以列出设备上文件的位置,另外,可创建目录以组织文件。

磁盘分为一个或多个卷,每个卷可包括一个文件系统或无文件系统的生区。文件系统可安装到系统命名结构中,以使其可用。

文件访问可以针对每种访问类型如读、写、执行、添加、删除、列表等分别加以控制。

文件保护可以由口令、访问控制列表和其他特定技术来实现。

文件系统实现

文件系统持久驻留在外存上,外存设计成可以持久地容纳大量数据。

I/O控制由设备驱动程序和中断处理程序组成,实现内存与磁盘之间的信息传输。

文件组织模块知道文件及其逻辑块和物理块。

逻辑文件系统管理元数据。

文件控制块(FCB)包含文件的信息,如拥有者、权限、文件内容的位置。

物理磁盘可分成区,以控制介质使用和允许同一磁盘上支持多个可能不同的文件系统。这些文件系统安装在逻辑文件系统结构上,然后才可以使用。

文件系统通常按层结构或模块结构来加以实现:低层处理存储设备的物理属性,高层处理符号文件名和文件逻辑属性,中间层将逻辑文件概念映射到物理设备属性。

文件在磁盘上有三种不同空间分配方法:连续的、链接的或索引分配。

  • 连续分配有外部碎片问题,但连续分配的空间可以通过扩展来增大,从而增加灵活性和减少外部碎片;
  • 链接分配的直接访问效率低;
  • 索引分配可能因其索引块而浪费一定空间,可以按簇来进行,以增加吞吐量和降低所需索引条目的数量。

空闲空间分配方法也影响磁盘使用效率、文件系统性能、外存可靠性。所使用的方法包括位向量(bit vector)、链表、组和计数。

目录管理程序必须考虑效率、性能和可靠性。哈希表是最为常用的方法,因为它快速且高效。

表损坏和系统崩溃可能导致目录信息与磁盘内容不一致。一致性检查程序可用来修补损坏。

由于文件系统在系统操作中的重要位置,其性能和可靠性十分关键。日志结构和缓存等技术可帮助改善性能,日志结构和RAID可提高可靠性。

大容量存储器的结构

磁盘驱动器是绝大多数计算机的主要外存I/O设备。

磁盘I/O的请求主要由文件系统和虚拟内存系统所产生。

磁盘调度算法:

  • 先到先服务算法(FCFS);
  • 最短寻道时间优先算法(SSTF);
  • SCAN算法,又称电梯算法,变种是C-SCAN算法;
  • LOOK算法,变种是C-LOOK算法。

性能可因外部碎片而降低。

操作系统管理磁盘块。

因为有效交换空间对于提高性能十分关键,系统通常绕过文件系统,而直接使用原始磁盘访问以进行调页。

磁盘冗余阵列(RAID)可以天宫性能和可靠性。

性能有三个重要方便:速度、可靠性和价格。

I/O输入系统

相关I/O硬件的基本要素是总线、设备控制器和设备本身。

I/O设备的发展趋势:标准化和多样性。

设备驱动程序为I/O子系统提供了统一设备访问接口。

设备与计算机通过端口通信。

总线是一组线和一组严格定义的可以描述在线上传输信息的协议。

设备与内存间的数据传输工作由CPU按程序控制I/O来完成,或转交给DMA控制器。

控制设备的内核模块称为设备驱动程序。

系统调用通常会使调用进程阻塞,但是非阻塞和异步调用可以为内核自己所使用,也可为不能等待I/O操作完成的应用程序所使用。

内核I/O子系统提供I/O调度、缓冲、高速缓存、假脱机、设备预留以及出错处理服务,也可以进行名称转换,即在硬件设备和应用程序所用的符号文件名之间来建立连接。

流式使得设备驱动程序可以重用和更容易使用的一种实现方法。通过流,驱动程序可以堆叠,数据可以按单向和双向来传输和处理。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值