淘先锋技术网

首页 1 2 3 4 5 6 7

操作系统教程总结

made by @杨领well ([email protected])

一、基础知识点

1. 操作系统的资源管理技术

资源管理解决物理资源数量不足合理分配资源这两个问题。
PM2VM
操作系统虚拟机为用户提供了一种简单、清晰、易用、高效的计算机模型。虚拟机的每种资源都是物力资源通过复用虚拟抽象而得到的产物。
虚拟机提供进程运行的逻辑计算环境。从概念上来说,一个进程运行在一台虚拟机上,可以认为一个进程就是一台虚拟机,一台虚拟机就是一个进程。

  • 复用空分复用共享时分复用共享
    a. 空分复用共享(space-multiplexed sharing): 将资源从“空间”上分割成更小的单位供不同进程使用。在计算机系统中,内存和外存(磁盘)等是空分复用共享的。
    b. 时分复用共享(time-multiplexed sharing): 将资源从“时间”上分割成更小的单位供不同进程使用。在计算机系统中,处理器和磁盘机等是时分复用共享的。

  • 虚拟:对资源进行转化、模拟或整合,把一个物理资源转变成多个逻辑上的对应物,也可以把多个物理资源变成单个逻辑上的对应物,即创建无须共享独占资源的假象,或创建易用且多于实际物理资源的虚拟资源假象,以达到多用户共享一套计算机物理资源的目的。虚拟技术可用于外部设备(外部设备同时联机操作(SPOOLing)),存储资源(虚拟内存)和文件系统(虚拟文件系统(Virtual File System, VFS))中。

    复用和虚拟相比较,复用所分割的是实际存在的物理资源,而虚拟则实现假想的同类资源。虚拟技术解决某类物理资源不足的问题,提供易用的虚拟资源和更好的运行环境。

  • 抽象:通过创建软件来屏蔽硬件资源的物理特性和实现细节,简化对硬件资源的操作、控制和使用。

    复用和虚拟的主要目标是解决物理资源数量不足的问题,抽象则用于处理系统复杂性,重点解决资源易用性。

2. 系统调用

  • 系统调用: 为给应用程序的运行提供良好环境,内核提供了一系列具有预定功能的服务例程,通过一组称为**系统调用(System Call)**的接口呈现给用户,系统调用把应用程序的请求传送至内核,调用相应的服务例程完成所需处理,将处理结果返回给应用程序。
    OS_System_Call

    注:系统调用的编号称为功能号

  • 系统调用的执行过程: 当CPU执行程序中编写的由访管指令(supervisor, 也称自陷指令(trap)或中断指令(interrupt), 指引起处理器中断的机器指令)实现的系统调用时会产生异常信号,通过陷阱机制(也称异常处理机制,当异常或中断发生时,处理器捕捉到一个执行线程,并且将控制权转移到操作系统中某一个固定地址的机制),处理器的状态由用户态(user mode, 又称目态或普通态)转变为核心态(kerbel mode, 又称管态或内核态),进入操作系统并执行相应服务例程,以获得操作系统服务。当系统调用执行完毕时,处理器再次切换状态,控制返回至发出系统调用的程序。

  • 系统调用是应用程序获得操作系统服务的唯一途径

系统调用的作用

  1. 内核可以基于权限和规则对资源访问进行裁决,保证系统的安全性。
  2. 系统调用对资源进行抽象,提供一致性接口,避免用户在使用资源时发生错误,且编程效率大大提高。

系统调用与函数调用的区别

  1. 调用形式和实现方式不同。功能号 VS 地址; 用户态转换到内核态 VS 用户态。
  2. 被调用代码的位置不同。 动态调用 + 操作系统 VS 静态调用 + 用户级程序。
  3. 提供方式不同。 操作系统 VS 编程语言。

3. 操作系统内核

  • 内核: 是一组程序模块,作为可信软件来提供支持进程并发执行的基本功能和基本操作,通常驻留在内核空间,运行于内核态,具有直接访问硬件设备和所有内存空间的权限,是仅有的能够执行特权指令的程序。

  • 内核的功能:
    a. 中断处理。中断处理是内核中最基本的功能,也是操作系统赖以活动的基础。
    b. 时钟管理。时钟管理是内核的基本功能。
    c. 短程调度。短程调度的职责是分配处理器,按照一定的策略管理处理器的转让,以及完成保护和恢复现场工作。
    d. 原语管理。 原语是内核中实现特定功能的不可中断过程。

内核是操作系统对裸机的第一次改造,内核和裸机组成了第一层虚拟机,进程在虚拟机上运行。


4. 处理器状态: 内核态和用户态

  • 仅在内核态下才能使用的指令称为特权指令,执行这些指令不仅影响运行程序自身,而且还会干扰其他程序及操作系统。 非特权指令在内核态和和用户态下都能工作。

现代计算机为处理器建立硬件标志位,称处理器状态位,通常是**程序状态字(Program Status Word, PSW)**中的一位,来将处理器的状态设置为内核态或用户态。

  • 用户态向内核态转换的情况:
    a. 程序请求操作系统服务, 执行系统调用。
    b. 在程序运行时产生中断事件(如I/O操作完成),运行程序被中断,转向中断处理程序处理。
    c. 在程序运行时产生异常事件(如在目态下执行特权指令),运行程序被打断,转向异常处理程序工作。

以上三种情况都是通过中断机制发生,可以说中断和异常是用户态到内核态转换的仅有途径。

  • 用户栈和核心栈
    a. 用户栈是用户进程空间中的一块区域。用于保存应用程序的子程序(函数)间相互调用的参数,返回值,返回点和子程序的局部变量。
    b. 核心栈是内存中操作系统空间的一块区域。用于保存中断现场和保存操作系统程序(函数)间相互调用的参数,返回值,返回点和程序的局部变量。

5. 中断(Interupt)

  • 中断:程序执行过程中遇到急需处理的事件时,暂时终止现行程序在CPU上的运行,转而执行相应的事件处理程序,待处理完成后再返回断点或调度其他程序的执行过程。

  • 中断的分类:
    a. 外中断(又称中断或异步中断): 来自处理器之外的中断信号,如,时钟中断、键盘中断等。外中断可分为可屏蔽中断和非可屏蔽中断。
    b. 内中断(又称异常或同步中断),来自处理器内部的中断信号,如,访管中断,硬件故障中断,程序性中断等。内中断不能被屏蔽

  • 中断和异常的响应: 发现中断源 → 保护现场 → 转向中断/异常事件处理程序执行 → 恢复现场

6. 进程

  • 进程:具有独立功能的程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。
    a. 从原理角度看,进程是支持程序执行的一种系统机制,它对处理器上运行程序的活动进行抽象。
    b. 从实现角度看,进程是一种数据结构,用来准确地刻画运行程序的状态和系统动态变化状况。

  • 进程状态的七态模型

    OS_SEVEN

    a. 新建态(new): 进程被创建,尚未进入就绪队列。
    b. 就绪态(ready): 进程具备运行条件,等待系统分配处理器。
    c. 挂起就绪态(ready suspend):进程具备运行条件,但目前在外存中。
    d. 运行态(running): 进程占有处理器正在运行。
    e. 终止态(exit): 进程达到正常结束点或被其他原因所终止,下一步将被撤销。
    f. 等待态(wait): 又称阻塞态或休眠态。进程正在等待某个事件完成,目前不具备运行条件。
    g. 挂起等待态(blocked suspend): 进程正在等待某个事件完成,并且在外存中。

  • 程序和数据刻画进程的静态特征,称为进程控制块的一种数据结构刻画进程的动态特征。**进程映像(process image)**包括进程控制块、进程程序块、进程核心块、进程数据块等要素。

  • 进程控制块(Process Control Block, PCB):进程存在的唯一标识,操作系统掌握进程的唯一资料结构和管理进程的主要依据。包括标识信息、现场信息和控制信息等信息。

  • 进程队列(process queue):处于同一状态的所有进程的PCB链接在一起的数据结构。 有两种队列组织方式:链接方式和索引方式。

  • 进程切换必定在内核态而非用户态发生。

  • 进程可以分为两部分,资源集合和线程集合。进程要支撑线程运行,为线程提供虚拟地址空间和各种资源。进程封装管理信息,线程封装执行信息。

    OS_MultiThread

7. 处理器调度

  • 处理器调度层次:
    OS_Scheduling
    a. 高级调度: 又称作业调度、长程调度。从输入系统的一批**作业(job, 用户提交给操作系统计算的一个独立任务)**中按照预定的调度策略挑选若干作业进入内存,为其分配所需资源并创建对应作业的用户进程。
    b. 中级调度: 又称平衡调度,中程调度。根据内存资源情况决定内存所能容纳的进程数目,并完成外存和内存中进程对换工作。
    c. 低级调度:又称进程调度/线程调度,短程调度。根据某种原则决定就绪队列中那个进程/线程先获得处理器,并将处理器出让给它使用。

  • 低级调度算法:
    a. 先来先服务(First Come First Server, FCFS)算法
    b. 最短作业优先(Shortest Job First, SJF)算法
    c. 最短剩余时间优先(Shortest Remaining Time First, SRTF)算法: 假设当前某进程/线程正在运行,如果***有新进程/线程移入就绪队列***,若它所需的CPU运行时间比当前运行的进程/线程所需的剩余CPU时间还短,抢占式最短作业优先算法强行剥夺当前执行者的控制权,调度新进程/线程执行。
    d. 最高响应比优先(Highest Response Ratio First, HRRF)算法:非剥夺式算法。其中,响应比 = (作业已等待时间 + 作业处理时间) / 作业处理时间。
    e. 优先级调度算法:优先级高的选择进程/线程优先选择。
    f. 轮转调度(Round-Robin, RR)算法: 也称时间片调度。就绪队列的进程轮流运行一个时间片。
    g. 多级反馈队列(Multi-Level Feedback Queue, MLFQ)算法

    衡量调度算法的性能指标:
    a. 资源利用率: CPU利用率 = CPU有效工作时间/(CPU有效工作时间 + CPU空闲等待时间)
    b. 吞吐率: 单位时间内CPU处理作业的个数。
    c. 公平性: 确保每个进程都能获得合理的CPU份额和其他资源份额,不会出现饥饿现象。
    d. 响应时间: 从交互式进程提交一个请求(命令)直到获得响应之间的时间间隔。
    e. 周转时间: 批处理用户从向系统提交作业开始到作业完成为止的时间间隔。
    平均周转时间:T = ($ \sum_{i=1}^n t_i $ ) / n , 其中

            t
           
           
            i
           
          
         
         
          t_i
         
        
       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.76508em; vertical-align: -0.15em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span> 表示作业i的周转时间。<br> <strong>平均带权作业周转时间</strong>: T = ($ \sum_{i=1}^n w_i $) / n, 其中 <span class="katex--inline"><span class="katex"><span class="katex-mathml">
       
        
         
          
           
            w
           
           
            i
           
          
          
           =
          
          
           
            t
           
           
            i
           
          
          
           /
          
          
           
            t
           
           
            k
           
          
         
         
          w_i = t_i / t_k
         
        
       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.58056em; vertical-align: -0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: -0.02691em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.336108em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right: 0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span> , <span class="katex--inline"><span class="katex"><span class="katex-mathml">
       
        
         
          
           
            t
           
           
            i
           
          
         
         
          t_i
         
        
       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.76508em; vertical-align: -0.15em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span> 表示作业i的周转时间。 <span class="katex--inline"><span class="katex"><span class="katex-mathml">
       
        
         
          
           
            t
           
           
            k
           
          
         
         
          t_k
         
        
       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.76508em; vertical-align: -0.15em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.336108em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right: 0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span> 表示作业i的运行时间。</p> 
    

8. 进程的交互

  • 进程互斥(Mutual Exclusion): 若干进程因相互抢夺独占型资源而产生的竞争制约关系。

  • 进程同步(Synchronization): 为完成共同任务的并发进程基于某个条件来协调其活动,因为需要在某些位置上排定执行的先后次序而等待、传递信息或消息所产生的协作制约关系。

    资源竞争会引发两个控制问题:
    a. 死锁: 一组进程因争夺资源陷入永远等待的状态。
    b. 饥饿: 一个可运行进程由于由于其他进程总是优先于它,而被调度程序无限期地拖延而不能被执行。

9. 临界区管理

  • 并发进程中与共享变量有关的程序段称为临界区(Critical Section)。共享变量所代表的资源称为临界资源(Critical Resource),即一次仅能供一个进程使用的资源。

  • 临界区调度原则:
    a. 择一而入。 一次之多只有一个进程进入临界区内执行。
    b. 忙则要等。 如果已有进程在临界区中, 试图进入此临界区的其他进程应等待。
    c. 有限等待。 进入临界区内的进程应在有限时间内退出。

  • 临界区管理的软件算法:Peterson算法
    为每个进程设置标志,当标志值为 true 时表示该进程要求进入临界区,另外再设置一个指示器 turn 以指示可以由哪个进程进入临界区,当 turn = i 时则可由 Pi 进入临界区。

      /* Peterson 算法 */
    

bool inside[2];
inside[0] = false;
inside[1] = false;
enum { 0, 1 } turn;


process P0(){
inside[0] = true; //请求…
turn = 1;
while(inside[1] && turn == 1) ; //等待…

  /*临界区 */

  inside[0] = false;              //归还...

}


process P1(){
inside[1] = true; //请求…
turn = 0;
while(inside[0] && turn == 0) ; //等待…

  /*临界区 */

  inside[1] = false;              //归还...

}

  • 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

Peterson算法满足临界区管理的三个原则。