《操作系统》(学习笔记)(王道)

一、计算机系统概述

1.1 操作系统的基本概念

1.1.1 操作系统的概念

  • 操作系统(OperatinggSystem,OS)是指控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合。
  • 操作系统是计算机系统中最基本的系统软件。

1.1.2 操作系统的特征

1.1.3 操作系统的目标和功能

  • 作为系统资源的管理者

  • 向上层提供方便易用的服务

  • 作为最接近硬件的层次

1.2 操作系统的发展与分类

1.2.1 手工操作阶段(此阶段无操作系统)

1.2.2 批处理阶段(操作系统开始出现)

引入脱机输入/输出技术(用磁带完成),并监督程序负责控制作业的输入、输出。

1.2.3 分时操作系统

计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。

多个用户通过终端同时共享一台主机,用户可以同时与主机进行交互操作而互不干扰。

  • 同时性:同时性也称多路性,指允许多个终端用户同时使用一台计算机,即一台计算机与若干台终端相连接,终端上的这些用户可以同时或基本同时使用计算机。
  • 交互性:用户能够方便地与系统进行人机对话,即用户通过终端采用人机对话的方式直接控制程序运行,与同程序进行交互。
  • 独立性:系统中多个用户可以彼此独立地进行操作,互不干扰,单个用户感觉不到别人也在使用这台计算机,好像只有自己单独使用这台计算机一样。
  • 及时性:用户请求能在很短时间内获得响应。分时系统采用时间片轮转方式使一台计算机同时为多个终端服务,使用户能够对系统的及时响应感到满意。
  • 优点:
    • 用户请求可以被即时响应,解决了人机交互问题。
    • 允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
  • 缺点:无法优先处理紧急任务

1.2.4 实时操作系统

1.2.5 网络操作系统和分布式计算机系统

1.2.6 个人计算机操作系统

1.3 操作系统的运行环境

1.3.1 操作系统的运行机制

1.3.2 中断和异常的概念

1.3.3 系统调用

1.4 操作系统结构

1.5 操作系统引导

  1. 激活CPU:激活的CPU读取ROM中的boot程序,将指令寄存器置为BIOS(基本输入/输出系统)的第一条指令,即开始执行BIOS的指令。
  2. 硬件自检:BIOS程序在内存最开始的空间构建中断向量表,接下来的POST过程要用到中断功能。然后进行通电自检,检查硬件是否出现故障。如有故障,主板会发出不同含义的蜂鸣,启动中止;如无故障,屏幕会显示CPU、内存、硬盘等信息。
  3. 加载带有操作系统的硬盘:通电自检后,BIOS开始读取BootSequence(通过CMOS里保存的启动顺序,或者通过与用户交互的方式),将控制权交给启动顺序排在第一位的存储设备,然后CPU将该存储设备引导扇区的内容加载到内存中。
  4. 加载主引导记录(MBR):硬盘以特定的标识符区分引导硬盘和非引导硬盘。如果发现一个存储设备不是可引导盘,就检查下一个存储设备。如无其他启动设备,就会死机。主引导记录MBR的作用是告诉CPU去硬盘的哪个主分区去找操作系统。
  5. 扫描硬盘分区表,并加载硬盘活动分区:MBR包含硬盘分区表,硬盘分区表以特定的标识符区分活动分区和非活动分区。主引导记录扫描硬盘分区表,进而识别含有操作系统的硬盘分区(活动分区)。找到硬盘活动分区后,开始加载硬盘活动分区,将控制权交给活动分区。
  6. 加载分区引导记录(PBR):读取活动分区的第一个扇区,这个扇区称为分区引导记录(PBR),其作用是寻找并激活分区根目录下用于引导操作系统的程序(启动管理器)。
  7. 加载启动管理器:分区引导记录搜索活动分区中的启动管理器,加载启动管理器。
  8. 加载操作系统:将操作系统的初始化程序加载到内存中执行。

1.6 虚拟机

1.6.1 虚拟机的基本概念

1.7 本章疑难点

1、并行性与并发性的区别和联系

       并行性和并发性是既相似又有区别的两个概念。并行性是指两个或多个事件在同一时刻发生,并发性是指两个或多个事件在同一时间间隔内发生。
       在多道程序环境下,并发性是指在一段时间内,宏观上有多个程序同时运行,但在单处理器系统中每个时刻却仅能有一道程序执行,因此微观上这些程序只能分时地交替执行。若在计算机系统中有多个处理器,则这些可以并发执行的程序便被分配到多个处理器上,实现并行执行,即利用每个处理器来处理一个可并发执行的程序。

2、特权指令与非特权指令

       特权指令是指有特殊权限的指令,由于这类指令的权限最大,使用不当将导致整个系统溃如清内存、置时钟、分配系统资源、修改虚存的段表或页表、修改用户的访问权限等。若所有程序都能使用这些指令,则系统一天死机次就不足为奇。为保证系统安全,这类指令不能直接提供给用户使用,因此特权指令必须在核心态执行。实际上,CPU在核心态下可以执行指令系统的全集。形象地说,特权指令是那些儿童不宜的东西,而非特权指令是老少皆宜的东西。
       为了防止用户程序中使用特权指令,用户态下只能使用非特权指令,核心态下可以使用全部指令。在用户态下使用特权指令时,将产生中断以阻止用户使用特权指令。所以将用户程序放在用户态下运行,而操作系统中必须使用特权指令的那部分程序在核心态下运行,从而保证了系统的安全性和可靠性。从用户态转换为核心态的唯一途径是中断或异常。

3、访管指令与访管中断

       访管指令是一条可以在用户态下执行的指令。在用户程序中,因要求操作系统提供服务而有意识地使用访管指令,从而产生一个中断事件(自愿中断),将操作系统转换为核心态,称为访管中断。访管中断由访管指令产生,程序员使用访管指令向操作系统请求服务。
       为什么要在程序中引入访管指令呢?这是因为用户程序只能在用户态下运行。若用户程序想要完成在用户态下无法完成的工作,该怎么办?解决这个问题要靠访管指令。访管指令本身不是特权指令,其基本功能是让程序拥有“自愿进管”的手段,从而引起访管中断。

4、定义微内核结构OS的四个方面

  1. 足够小的内核。
  2. 基于客户/服务器模式
  3. 应用“机制与策略分离”原理。机制是指实现某一功能的具体执行机构。策略则是在机制的基础上借助于某些参数和算法来实现该功能的优化,或达到不同的功能目标。在传统的OS中,将机制放在OS内核的较低层中,将策略放在内核的较高层中。而在微内核OS中,通常将机制放在OS的微内核中。正因如此,才可以将内核做得很小。
  4. 采用面向对象技术。基于面向对象技术中的“抽象”和“隐蔽”原则能控制系统的复杂性,进一步利用“对象”“封装”和“继承”等概念还能确保操作系统的正确性、可靠性、易扩展性等。正因如此,面向对象技术被广泛应用于现代操作系统的设计之中。

二、进程与线程

2.1 进程与线程

2.1.1 进程的概念和特征

  • 进程的概念

  • 进程的特征

2.1.2 进程的组成

注:PCB是操作系统用的,而程序段和数据段都只是程序用的。

2.1.3 进程的状态与转换

  • 进程的组织(可能是一个被删掉的考点)

2.1.4 进程控制

  • 进程的创建
  • 进程的终止
  • 进程的阻塞和唤醒
  • 进程的切换

2.1.5 进程的通信

  1. 共享存储
  2. 消息传递
    1. 直接通信方式
    2. 间接通信方式
  3. 管道通信

注:一个管道允许多个写进程,一个读进程。

2.1.6 线程和多线程模型

1、线程的基本概念

2、线程与进程的比较

3、线程的属性

4、线程的状态和转换

注:就和进程一样一样滴。

5、线程的组织和控制

  1. 线程控制块:与进程类似,系统也为每个线程配置一个线程控制块TCB,用于记录控制和管理线程的信息。同一进程中的所有线程都完全共享进程的地址空间和全局变量。各个线程都可以访问进程地址空间的每个单元,所以一个线程可以读、写或甚至清除另一个线程的堆栈。线程控制块通常包括:
    1. 线程标识符;
    2. 一组寄存器,包括程序计数器、状态寄存器和通用寄存器;
    3. 线程运行状态,用于描述线程正处于何种状态;
    4. 优先级;
    5. 线程专有存储区,线程切换时用于保存现场等;
    6. 堆栈指针,用于过程调用时保存局部变量及返回地址等。
  2. 线程的创建:线程也是具有生命期的,它由创建而产生,由调度而执行,由终止而消亡。相应地,在操作系统中就有用于创建线程和终止线程的函数(或系统调用)。用户程序启动时,通常仅有一个称为初始化线程的线程正在执行,其主要功能是用于创建新线程。在创建新线程时,需要利用一个线程创建函数,并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小、线程优先级等。线程创建函数执行完后,将返回一个线程标识符。
  3. 线程的终止:当一个线程完成自己的任务后,或线程在运行中出现异常而要被强制终止时,由终止线程调用相应的函数执行终止操作。但是有些线程(主要是系统线程)一旦被建立,便一直运行而不会被终止。通常,线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止线程才与资源分离,此时的资源才能被其他线程利用。终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。

6、线程的实现方式

7、多线程模型

2.1.7 本节小结

1、为什么要引入进程?

        在多道程序设计的背景下,进程之间需要共享系统资源,因此会导致各程序在执行过程中出现相互制约的关系,程序的执行会表现出间断性等特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是静态的概念,无法描述程序在内存中的执行情况,即无法从程序的字面上看出它何时执行、何时停顿,也无法看出它与其他执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质乃至更好地支持和管理多道程序的并发执行,便引入了进程的概念。

2、什么是进程?进程由什么组成?

        进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码本身,还包括当前的活动通过程序计数器的值和处理寄存器的内容来表示。
       一个进程实体由程序段、相关数据段和PCB三部分构成,其中PCB是标志一个进程存在的唯一标识,程序段是进程运行的程序的代码,数据段则存储程序运行过程中相关的一些数据。

3、进程是如何解决问题的?

       进程将能够识别程序运行状态的一些变量存放在PCB中,通过这些变量系统能够更好地了解进程的状况,并在适当时机进行进程的切换,以避免一些资源的浪费,甚至划分为更小的调度单位一一线程来提高系统的并发度。

 本节主要介绍什么是进程,并围绕这个问题进行一些闸述和讨论,为下一节讨论的内容做铺垫,但之前未学过相关课程的读者可能会比较费解,到现在为止对进程这个概念还未形成比较清晰的认识。接下来,我们再用一个比较熟悉的概念来类比进程,以便大家能彻底理解本节的内容到底在讲什么,到底解决了什么问题。
        我们用“人的生命历程”来类比进程。首先,人的生命历程一定是一个动态的、过程性的概念,要研究人的生命历程,先要介绍经历这个历程的主体是什么。主体当然是人,相当于经历进程的主体是进程映像,人有自己的身份,相当于进程映像里有PCB;人生历程会经历好几种状态;出生的时候、弥留的时候、充满斗志的时候、发奋图强的时候及失落的时候,相当于进程有创建、撤销、就绪、运行、阻塞等状态,这几种状态会发生改变,人会充满斗志而转向发奋图强,发奋图强获得进步之后又会充满斗志预备下一次发奋图强,或者发奋图强后遇到阻碍会进入失落状态,然后在别人的开导之下又重新充满斗志。类比进程,会由就绪态转向运行态,运行态转向就绪态,或者运行态转向阻塞态,然后在别的进程帮助下返回就绪态。若我们用“人生历程”这个过程的概念去类比进程,则对进程的理解就更深一层。前面生活化的例子可以帮我们理解进程的实质,但它毕竞有不严谨的地方。一种较好的方式是,在类比进程和人生历程后,再看一遍前面较为严谨的书面述和讨论,这样对知识的掌握会更加准确而全面。
       这里再给出一些学习计算机科学知识的建议。学习时,很多同学会陷入一个误区,即只注重对定理、公式的应用,而忽视对基础概念的理解。这是我们从小到大应付考试而培养出的一个毛病,因为熟练应用公式和定理对考试有立见影的效果。公式、定理的应用固然重要,但基础概念的理解能让我们透彻地理解一门学科,更利于我们产生兴趣,培养创造性思维。

2.2 CPU调度

2.2.1 调度的概念

1、调度的基本概念

        在多道程序系统中,进程的数量往往多于CPU的个数,因此进程争用CPU的情况在所难免。CPU调度是对CPU进行分配,即从就绪队列中按照一定的算法(公平、高效的原则)选择一个进程并将CPU分配给它运行,以实现进程并发地执行。
        CPU调度是多道程序操作系统的基础,是操作系统设计的核心问题。

2、调度的层次

3、三级调度的联系

2.2.2 调度的实现

1、调度程序(调度器)

2、调度的时机、切换和过程

3、进程调度的方式

4、闲逛进程

5、两种线程的调度

2.2.3 调度的目标

2.2.4 进程切换

2.2.5 典型的调度算法

1. 先来先服务(FCFS)算法

2. 短作业优先(SJF)算法

3. 高响应比优先调度算法

4. 优先级调度算法

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

6. 多级队列调度算法

7. 多级反馈队列调度算法(融合了前几种算法的优点)

2.2.6 本节小结

1、为什么要进行CPU调度?

        若没有CPU调度,则意味着要等到当前运行的进程执行完毕后,下一个进程才能执行,而实际情况中,进程时常需要等待一些外部设备的输入,而外部设备的速度与CPU相比是非常缓慢的,若让CPU总是等待外部设备,则对CPU的资源是极大的浪费。而引进CPU调度后,可在运行进程等待外部设备时,将CPU调度给其他进程,从而提高CPU的利用率。用一句简单的话说,就是为了合理地处理计算机的软/硬件资源。

2、调度算法有哪几种?结合第章学习的分时操作系统和实时操作系统,思考有没有哪种调度算法比较适合这两种操作系统。

本节介绍的调度算法有先来先服务调度、短作业优先调度、优先级调度、高响应比优先调度、时间片轮转调度、多级队列调度、多级反馈队列调度7种。
       先来先服务算法和短作业优先算法无法保证及时地接收和处理问题,因此无法保证在规定的时间间隔内响应每个用户的需求,也同样无法达到实时操作系统的及时性需求。优先级调度算法按照任务的优先级进行调度,对于更紧急的任务给予更高的优先级,适合实时操作系统。
       高响应比优先调度算法、时间片轮转调度算法、多级反馈队列调度算法都能保证每个任务在一定时间内分配到时间片,并轮流占用CPU,适合分时操作系统。

        本节主要介绍了CPU调度的概念。操作系统主要管理CPU、内存、文件、设备几种资源只要对资源的请求大于资源本身的数量,就会涉及调度。例如,在单处理器系统中,CPU只有一个,而请求的进程却有多个,因此就需要CPU调度。出现调度的概念后,又有了一个问题,即如何调度、应该满足谁、应该让谁等待,这是调度算法所面对的问题;而应该满足谁、应该让谁等待,要遵循一定的准则。调度这一概念贯穿于操作系统的始终,读者在接下来的学习中,将接触到几种资源的调度问题。将它们与CPU调度的内容相对比,将发现有异曲同工之妙。

2.3 同步与互斥

2.3.1 同步与互斥的基本概念

  • 临界资源和互斥

  • 实现临界区互斥必须遵循的准则

  • 同步

2.3.2 实现临界区互斥的基本方法

  1. 软件实现方法
    1. 单标志法


      注:违背了“空闲让进”准则(两个进程必须交替进入临界区)
    2. 双标志先检查法

    3. 双标志后检查法


      注:违背了“空闲让进”准则,且因此会导致“饥饿”现象(违背了“有限等待”准则)
    4. Peterson算法


      注:很好的遵守了其他三个准则,但是还是违背了“让权等待”
  2. 硬件实现方法
    1. 中断屏蔽方法

    2. 硬件指令方法——TestAndSet方法


      注:违背了“让权等待”
    3. 硬件指令方法——Swap方法

2.3.3 互斥锁

2.3.4 信号量

  • 整型信号量

  • 记录型信号量

  • 利用信号量实现进程互斥

  • 利用信号量实现同步

  • 利用信号量实现前驱关系(多级同步)

2.3.5 经典同步问题

1. 生产者-消费者问题
  1. 单消费者单生产者


    注:一定得是先同步后互斥,否则将造成死锁。
  2. 多消费者多生产者


    注:该结论不适用于多个盘子也就是盘子容量不唯一的情况哦。
2. 读者-写者问题

3. 哲学家进餐问题

4. 吸烟者问题

2.3.6 管程

2.3.7 本节小结

1)为什么要引入进程同步的概念?

        在多道程序共同执行的条件下,进程与进程是并发执行的,不同进程之间存在不同的相互制约关系。为了协调进程之间的相互制约关系,引入了进程同步的概念。

2)不同的进程之间会存在什么关系?

        进程之间存在同步与互的制约关系
        同步是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系
        互斥是指当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。

3)当单纯用本节介绍的方法解决这些问题时会遇到什么新的问题吗?        

        当两个或两个以上的进程在执行过程中,因占有一些资源而又需要对方的资源时,会因为争夺资源而造成一种互相等待的现象,若无外力作用,它们都将无法推进下去。这种现象称为死锁。

2.4 死锁

2.4.1 死锁的概念

  • 死锁、饥饿和死循环的共同点和区别

  • 死锁产生的必要条件

  • 什么时候会发生死锁

  • 死锁的处理机制

2.4.2 死锁预防

  1. 破环互斥条件

  2. 破坏不可剥夺条件

  3. 破坏请求并保持条件

  4. 破环循环等待条件

2.4.3 死锁避免

2.4.4 死锁检测和解除

  • 死锁检测

  • 死锁解除

2.4.5 本节小结

1)为什么会产生死锁?产生死锁有什么条件?

        由于系统中存在一些不可剥夺资源,当两个或两个以上的进程占有自身的资源并请求对方的资源时,会导致每个进程都无法向前推进,这就是死锁。死锁产生的必要条件有4个,分别是互条件、不剥夺条件、请求并保持条件和循环等待条件
       互斥条件是指进程要求分配的资源是排他性的,即最多只能同时供一个进程使用。
       不剥夺条件是指进程在使用完资源之前,资源不能被强制夺走。
       请求并保持条件是指进程占有自身本来拥有的资源并要求其他资源
       循环等待条件是指存在一种进程资源的循环等待链。

2)有什么办法可以解决死锁问题?

        死锁的处理策略可以分为预防死锁、避免死锁及死锁的检测与解除

  • 死锁预防是指通过设立一些限制条件,破坏死锁的一些必要条件,让死锁无法发生。
  • 死锁避免指在动态分配资源的过程中,用一些算法防止系统进入不安全状态,从而避免死锁。
  • 死锁的检测和解除是指在死锁产生前不采取任何措施,只检测当前系统有没有发生死锁,若有,则采取一些措施解除死锁。

2.5 本章疑难点

1、进程与程序的区别与联系

        1)进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。进程的运行实体是程序,离开程序的进程没有存在的意义。从静态角度看,进程是由程序、数据和进程控制块(PCB)三部分组成的。而程序是一组有序的指令集合,是一种静态的概念。

        2)进程是程序的一次执行过程,它是动态地创建和消亡的,具有一定的生命周期,是暂时存在的:而程序则是一组代码的集合,是永久存在的,可长期保存。
        3)一个进程可以执行一个或几个程序,一个程序也可构成多个进程。进程可创建进程,而程序不可能形成新的程序。
       4)进程与程序的组成不同。进程的组成包括程序、数据和PCB

2、银行家算法的工作原理

        银行家算法的主要思想是避免系统进入不安全状态。在每次进行资源分配时,它首先检查系统是否有足够的资源满足要求,若有则先进行试分配,并对分配后的新状态进行安全性检查。若新状态安全,则正式分配上述资源,否则拒绝分配上述资源。这样,它保证系统始终处于安全状态,从而避免了死锁现象的发生。

3、进程同步、互斥的区别和联系

        并发进程的执行会产生相互制约的关系:一种是进程之间竞争使用临界资源,只能让它们逐个使用,这种现象称为互斤,是一种竞争关系:另一种是进程之间协同完成任务,在关键点上等待另一个进程发来的消息,以便协同一致,是一种协作关系。

三、内存管理

3.1  内存管理概念

3.1.1 内存管理的基本原理和要求

注:重定位寄存器也称基址寄存器、界地址寄存器也称为限长寄存器。

将用户程序变为可在内存中执行的程序的步骤

1、程序的链接和装入

  1. 绝对装入

  2. 可重定位装入

  3. 动态运行时装入

 链接的三种方式:

  1. 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
  2. 装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
  3. 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。

3.1.2 连续分配管理方式

  1. 单一连续分配

  2. 固定分区分配

  3. 动态分区分配

    ​​​​​​​
    1. 系统要用什么样的数据结构记录内存的使用情况?

    2. 当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?

    3. 如何进行分区的分配与回收操作?

      将相邻的空闲空间合并。
动态分区分配算法

1、首次适应算法(First Fit)

2、邻近适应(Next Fit)算法

3、最佳适应(Best Fit)算法

4、最坏适应(Worst Fit)算法

3.1.3 基本分页存储管理

1. 分页存储的基本概念

分页存储的定义

重要的存储结构——页表

每个页表项占多少字节?

注:页表是隐含的!!!

如何实现地址的转换?

逻辑地址结构

2. 基本地址变换机构

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

快表是什么?

4. 两级页表

3.1.4 基本分段存储管理

分页、分段管理的对比:

3.1.5 段页式存储管理

3.1.6 本节小结

1)为什么要进行内存管理?

        在单道批系统阶段,一个系统在一个时间段内只执行一个程序,内存的分配极其简单,即仅分配给当前运行的进程。引入多道批程序后,进程之间共享的不仅仅是处理机,还有主存储器。然而,共享主存会形成一些特殊的挑战。若不对内存进行管理,则容易导致内存数据的混乱,以至于影响进程的并发执行。因此,为了更好地支持多道程序并发执行,必须进行内存管理。

2)多级页表解决了什么问题?又会带来什么问题?

        多级页表解决了当逻辑地址空间过大时,页表的长度会大大增加的问题。而采用多级页表时,一次访盘需要多次访问内存甚至磁盘,会大大增加一次访存的时间。

        无论是段式管理、页式管理还是段页式管理,读者都只需要掌握下面三个关键问题:

  1. 逻辑地址结构
  2. 页(段)表项结构
  3. 寻址过程。

搞清楚这三个问题,就相当于搞清楚了上面几种存储管理方式。再次提醒读者区分逻辑地址结构和表项结构。

3.2 虚拟内存管理

3.2.1  虚拟内存的基本概念

  • 传统存储管理方式的特征​​​​​​​

  • 虚拟内存器的定义和特征

  • 虚拟内存技术的实现

3.2.2  请求分页管理方式

  • 页表机制

  • 缺页中断机构

    ​​​​​​​
  • 地址变换机构

3.2.3  页框分配

3.2.4 页面置换算法

  1. 最佳(OPT)置换算法

    ​​​​​​​
  2. 先进先出(FIFO)算法

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

  4. 时钟(CLOCK)置换算法

  5. 改进型CLOCK置换算法

*3.2.5  抖动和工作集

3.2.6 内存映射文件

3.2.7 虚拟存储器性能影响因素

3.2.8 地址翻译

3.2.9 本节小结

1)为什么要引入虚拟内存?

        上一节提到过,多道程序并发执行不仅使进程之间共享了处理器,而且同时共享了主存。然而,随着对处理器需求的增长,进程的执行速度会以某种合理平滑的方式慢下来。但是,若同时运行的进程太多,则需要很多的内存,当一个程序没有内存空间可用时,那么它甚至无法运行。所以,在物理上扩展内存相对有限的条件下,应尝试以一些其他可行的方式在逻辑上扩充内存。

2)虚拟内存(虚存)空间的大小由什么因素决定?

虚存的容量要满足以下两个条件

  1. 虚存的实际容量内存容量和外存容量之和,这是硬件的硬性条件规定的,若虚存的实际容量超过了这个容量,则没有相应的空间来供虚存使用。
  2. 虚存的最大容量≤计算机的地址位数能容纳的最大容量。假设地址是32位的,按字节编址,一个地址代表1B存储空间,则虚存的最大容量≤4GB(2B)。这是因为若虚存的最大容量超过4GB,则32位的地址将无法访问全部虚存,也就是说4GB以后的空间被浪费了,相当于没有一样,没有任何意义 。

实际虚存的容量是取条件1和2的交集,即两个条件都要满足,仅满足一个条件是不行的。

3)虚拟内存是怎么解决问题的?会带来什么问题?

       虚拟内存使用外存上的空间来扩充内存空间,通过一定的换入/换出,使得整个系统在逻辑上能够使用一个远远超出其物理内存大小的内存容量。因为虚拟内存技术调换页面时需要访问外存,会导致平均访存时间增加,若使用了不合适的替换算法,则会大大降低系统性能。
      本节学习了4种页面置换算法,要将它们与处理机调度算法区分开。当然,这些调度算法之间也是有联系的,它们都有一个共同点,即通过一定的准则决定资源的分配对象。在处理机调度算法中这些准则比较多,有优先级、响应比、时间片等,而在页面调度算法中就比较简单,即是否被用到过或近段时间内是否经常使用。在操作系统中,几乎每类资源都会有相关的调度算法读者通过将这些调度算法作为线索,可将整个操作系统的课程连成一个整体。

3.3 本章疑难点

四、文件管理

4.1 文件系统基础

4.1.1 文件的基本概念

 

一个文件有哪些属性?

  • 文件名:由创建文件的用户决定文件名,主要是为了方使用户找到文件,同一目录下不允许有重名文件。
  • 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性因此标识符只是操作系统用于区分各个文件的一种内部名称。
  • 类型:指明文件的类型
  • 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
  • 大小:指明文件大小创建时间、上次修改时间、文件所有者信息
  • 保护信息:对文件进行保护的访问控制信息

4.1.2 文件控制块和索引节点

  • 文件控制块​​​​​​​

  • 索引节点

4.1.3 文件的操作

注:读写文件操作用文件描述符即可指明文件,无需用到文件名!!!

  1. 创建文件

  2. 删除文件

  3. 读文件

  4. 写文件

  5. 打开文件

  6. 关闭文件

4.1.4 文件保护

4.1.5 文件的逻辑结构

  1.  无结构文件

  2. 有结构文件(定长记录、变长记录)

    ​​​​​​​
    1. 顺序文件

    2. 索引文件

    3. 索引顺序文件

4.1.6 文件的物理结构

  1. 连续分配

  2. 链接分配
    1. 显式链接:FAT在整个磁盘中只有一张,常驻内存、开机读入内存。(盘块号可隐含)
    2. 隐式链接(Default)

  3. 索引分配

    ​​​​​​​
    1. 链接方案

    2. 多级索引分配方式

    3. 混合索引分配方式

4.1.7 本节小结

1)什么是文件?

文件是以计算机硬盘为载体的存储在计算机上的信息集合,它的形式多样。

2)单个文件的逻辑结构和物理结构之间是否存在某些制约关系?

        文件的逻辑结构是用户可见的结构,即从用户角度看到的文件的全貌。文件的物理结构是文件在存储器上的组织结构。它和文件的存取方法以及存储设备的特性等都有着密切的联系。单个文件的逻辑结构和物理结构之间虽无明显的制约或关联关系,但是如果物理结构选择不慎,也很难体现出逻辑结构的特点,比如一个逻辑结构是顺序结构,而物理结构是隐式链接结构的文件,即使理论上可以很快找出某条记录的地址,而实际仍需在磁盘上一块一块地找。
       学到这里时,读者应能有这样的体会:现代操作系统的思想中,处处能见到面向对象程序设计的影子。本节我们学习的一个新概念一—文件,实质上就是一个抽象数据类型,也就是一种数据结构,若读者在复习操作系统之前已复习完数据结构,则遇到一种新的数据结构时,一定会有这样的意识:要认识它的逻辑结构、物理结构,以及对这种数据结构的操作。

4.2 目录

4.2.1 目录的基本概念

4.2.2 目录结构

  1. 单级目录结构

    单级目录结构实现了“按名存取”,但是存在查找速度慢、文件不允许重名、不便于文件共享等缺点,而且对于多用户的操作系统显然是不适用的。
  2. 两级目录结构


    两级目录结构提高了检索的速度,解决了多用户之间的文件重名问题,文件系统可以在目录上实现访问限制。但是两级目录结构缺乏灵活性,不能对文件分类。
  3. 树形目录结构

    树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。在树形目录中,不同性质、不同用户的文件,可以分别呈现在系统目录树的不同层次或不同子树中,很容易地赋予不同的存取权限。但是,在树形目录中查找一个文件,需要按路径名逐级访问中间节点,增加了磁盘访问次数,这无疑会影响查询速度。目前,大多数操作系统如UNIX、Linux和Windows系统都采用了树形文件目录。
  4. 无环图目录结构

4.2.3 目录的操作

  • 搜索:当用户使用一个文件时,需要搜索目录,以找到该文件的对应日录项。
  • 创建文件:当创建一个新文件时,需要在日录中增加一个日录项。
  • 删除文件:当删除一个文件时,需要在日录中删除相应的目录项
  • 创建目录:在树形日录结构中,用户可创建白己的用户文件目录,并可再创建子目录删除目录。有两种方式:
    • 不删除非空目录,删除时要先删除目录中的所有文件,并递归地删除子目录。
    • 可删除非空目录,目录中的文件和子目录同时被删除。
  • 移动目录:将文件或子目录在不同的父目录之间移动,文件的路径名也会随之改变。
  • 显示目录:用户可以请求显示目录的内容,如显示该用户目录中的所有文件及属性。
  • 修改目录:某些文件属性保存在目录中,因而这些属性的变化需要改变相应的目录项。

*4.2.4 目录实现

4.2.5 文件共享

  1. 基于索引节点的共享方式(硬链接)

  2. 利用符号实现文件共享(软链接)

4.2.6 本节小结

1)目录管理的要求是什么?

  1. 实现“按名存取”,这是目录管理最基本的功能。
  2. 提高对目录的检索速度,从而提高对文件的存取速度。
  3. 为了方便用户共享文件,目录还需要提供用于控制访问文件的信息。
  4. 允许不同用户对不同文件采用相同的名字,以使用户按自己的习惯给文件命名。

2)在目录中查找某个文件可以使用什么方法?

        可以采用线性列表法或哈希表法。线性列表将文件名组织成一个线性表,查找时依次与线性表中的每个表项进行比较。

  • 若将文件名按序排列,则使用折半查找法可以降低平均的查找时间但建立新文件时会增加维护线性表的开销。
  • 哈希表用文件名通过哈希函数得到一个指向文件的指针,这种方法非常迅速,但要注意避免冲突。

4.3 文件系统

磁盘空闲空间管理的方法
  1. 空闲表法

  2. 空闲链表法
    1. 空闲盘块链

    2. 空闲盘区链

  3. 位示图法

  4. 成组链接法

    ​​​​​​​
    ​​​​​​​

虚拟文件系统VFS所定义的对象类型

(1)超级块对象:表示一个已安装(或称挂载)的特定文件系统。超级块对象对应于磁盘上特定扇区的文件系统超级块,用于存储已安装文件系统的元信息。其操作方法包含一系列可在超级块对象上调用的操作函数,主要有分配inode、销毁inode、读inode、写inode等。
(2)索引节点对象:表示一个特定的文件。索引节点和文件是一对一的关系。只有当文件被访问时,才在内存中创建索引节点对象,每个索引节点对象都会复制磁盘索引节点包含的一些数据。索引节点对象还提供许多操作函数,如创建新索引节点、创建硬链接、创建新目录等。
(3)目录项对象:表示一个特定的目录项。目录项对象是一个路径的组成部分,它包含指向关联索引节点的指针,还包含指向父目录和指向子目录的指针。不同于前面两个对象,目录项对象在磁盘上没有对应的数据结构,而是VFS在遍历路径的过程中,将它们逐个解析成目录项对象的。

(4)文件对象:表示一个与进程相关的已打开文件。可以通过调用openO打开一个文件,通过调用closeO关闭一个文件。文件对象和物理文件的关系类似于进程和程序的关系。文件对象仅是进程视角上代表已打开的文件,它反过来指向其索引节点。文件对象包含与该文件相关联的目录项对象,包含该文件的文件系统、文件指针等,还包含在该文件对象上的一系列操作函数。当进程发起一个面向文件的系统调用时,内核调用VFS中的一个函数,该函数调用目标文件系统中的相应函数,将文件系统请求转换到面向设备的指令。以在用户空间调用writeO为例,它在VFS中通过sys_writeO函数处理,sys_writeO找到具体文件系统提供的写方法,将控制权交给该文件系统,最后由该文件系统与物理介质交互并写入数据,如图所示。

4.4 本章疑难点

1、文件的物理分配方式的比较

2、文件打开的过程描述

  1. 检索目录,要求打开的文件应该是已经创建的文件,它应登记在文件目录中,否则会出错。在检索到指定文件后,就将其磁盘iNode复制到活动iNode表中。
  2. 将参数mode所给出的打开方式与活动iNode中在创建文件时所记录的文件访问权限相比较,如果合法,则此次打开操作成功。
  3.  当打开合法时,为文件分配用户打开文件表表项和系统打开文件表表项,并为后者设置初值,通过指针建立表项与活动iode之间的联系,再将文件描述符f返回给调用者。

五、输入/输出(I/O)管理

5.1 I/O管理概述

5.1.1 I/O设备

注:稍微注意一下块设备是可以寻址的,但是字符设备是不可寻址的。

  • I/O接口(又称为设备控制器)

    ​​​​​​​

5.1.2 I/O控制方式

  • 程序直接控制方式

  • 中断驱动方式

  • DMA方式

  • *通道控制方式

5.1.3 I/O软件层次结构

 

  • 用户层软件(产生I/O请求;格式化I/O;SPOOLing)

  • 设备独立性软件(映射;保护;分块;缓冲;分配)

  • 设备驱动程序(设置设备寄存器;检查状态)​​​​​​​

    ​​​​​​​
  • 中断处理程序

5.1.4 应用程序I/O接口

 

5.1.5 本节小结

I/O管理要完成哪些功能?

I/O管理需要完成以下4部分内容:

  1. 状态跟踪。要能实时掌握外部设备的状态。
  2. 设备存取。要实现对设备的存取操作。
  3. 设备分配。在多用户环境下,负责设备的分配与回收。
  4. 设备控制。包括设备的驱动、完成和故障的中断处理。

5.2 设备独立性软件

注:设备独立性是指用户编程时使用的设备与实际使用的设备无关。

5.2.1  设备独立性软件

5.2.2  高速缓存与缓冲区

  • 单缓冲


  • 双缓冲

    ​​​​​​​
    注:实现”同一时刻“下,数据的双向传输。
  • 循环缓冲

5.2.3  设备分配与回收


注:设备分配常用的算法:1、先来先服务算法 2、最高优先级算法

5.2.4  SPOOLing技术(假脱机技术)

注:

  • 其主要目的就是提高了独占设备(技术前提)的利用率。
  • 实现的基本条件是不仅要有大容量、高速度的外存作为输入和输出井,而且还要有SPOOLing软件。
  • 是一种以空间换取时间的技术,能够提高作业执行的速度。
  • 只需要外存蛤,不需要外围计算机。
  • 建立在多道程序设计的基础上,在同一时间段内,输入进程、输出进程是可以和运行的作业进程并发执行的。

5.2.5  设备驱动程序接口

5.2.6 本节小结

1)当处理机和外部设备的速度差距较大时,有什么办法可以解决问题?

        可采用缓冲技术来缓解CPU与外设速度上的矛盾,即在某个地方(一般为主存)设立一片缓冲区,外设与CPU的输入/输出都经过缓冲区,这样外设和CPU就都不用互相等待。

2)什么是设备的独立性?引入设备的独立性有什么好处?

        设备独立性是指用户在编程序时使用的设备与实际设备无关。一个程序应独立于分配给它的某类设备的具体设备,即在用户程序中只指明IO使用的设备类型即可。

        设备独立性有以下优点:①方便用户编程。②使程序运行不受具体机器环境的限制。③便于程序移植。

5.3  磁盘和固态硬盘

5.3.1 磁盘

5.3.2 磁盘的管理

5.3.3 磁盘调度算法


注:减少延迟时间的方法有:1、交替编号 2、错位命名

5.3.4 固态硬盘

注:静态磨损均衡算法通常比动态磨损均衡算法的表现更优秀。

5.3.5 本节小结

1)在磁盘上进行一次读/写操作需要哪几部分时间?其中哪部分时间最长?

       在磁盘上进行一次读/写操作花费的时间由寻道时间、延迟时间和传输时间决定。其中寻道时间是将磁头移动到指定磁道所需要的时间,延退时间是磁头定位到某一磁道的扇区(块号)所需要的时间,传输时间是从磁盘读出或向磁盘写入数据所经历的时间。一般来说,寻道时间因为要移动磁头臂,所以占用时间最长。

2)存储一个文件时,当一个磁道存储不下时,剩下部分是存在同一个盘面的不同磁道好还是存在同一个柱面上的不同盘面好?

       上一问经说到,寻道时间对于一次磁盘访问的影响是最大的,若存在同一个盘面的不同磁道,则磁头臂势必要移动,这样会大大增加文件的访问时间,而存在同一个柱面上的不同盘面就不需要移动磁道,所以一般情况下存在同一个柱面上的不同盘面更好。

5.4 本章疑难点

1、为了增加设备分配的灵活性、成功率,可以如何改进?

可以从以下两方面对基本的设备分配程序加以改进:

  1. 增加设备的独立性。进程使用逻辑设备名请求IO。这样,系统首先从SDT中找出第一个该类设备的DCT。若该设备忙,则又查找第二个该类设备的DCT。仅当所有该类设名都忙时,才将进程挂到该类设备的等待队列上:只要有一个该类设备可用,系统便进一步计算分配该设备的安全性。
  2. 考虑多通路情况。为防止IO系统的“瓶颈”现象,通常采用多通路的IO系统结构。此时对控制器和通道的分配同样要经过几次反复,即若设备(控制器)所连接的第一个控制器(通道)忙时,则应查看其所连接的第二个控制器(通道),仅当所有控制器(通道)都忙时,此次的控制器(通道)分配才算失败,才将进程挂到控制器(通道)的等待队列上。而只要有一个控制器(通道)可用,系统便可将它分配给进程。

设备分配过程中,先后分别访问的数据结构为SDT→DCT→COCT→CHCT。要成功分配备一个设备,必须要:①设备可用:②控制器可用:③通道可用。所以,“设备分配,要过三关”。

2、什么是用户缓冲区、内核缓冲区?

        5.1.4节中讨论过:“IO操作完成后,系统将数据从内核复制到用户空间”,这里说的是“内核”其实是指内核缓冲区,“用户空间”是指用户缓冲区。

        用户缓冲区是指当用户进程读文件时,通常先申请一块内存数组,称为Buffer,用来存放读取的数据。每次read调用,将读取的数据写入Buffer,之后程序都从buffer中获取数据,当buffer使用完后,再进行下一次调用,填充buffer。可见,用户缓冲区的目的是减少系统调用次数,从而降低系统在用户态与核心态之间切换的开销。

        内核也有自己的缓冲区。当用户进程从磁盘读取数据时,不直接读磁盘,而将内核缓冲区中的数据复制到用户缓冲区中。若内核缓冲区中没有数据,则内核请求从磁盘读取,然后将进程挂起,为其他进程服务,等到数据已读取到内核缓冲区中时,将内核缓冲区中的数据复制到用户进程的缓冲区,才通知进程(当然,IO模型不同,处理的方式也不同)。当用户进程需要写数据时,数据可能不直接写入磁盘,而将数据写入内核缓冲区,时机适当时(如内核缓冲区的数据积累到一定量后),内核才将内核缓冲区的数据写入磁盘。可见,内核缓冲区是为了在操作系统级别提高磁盘I/O效率,优化磁盘写操作。

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值