[关闭]
@lasdtc 2013-11-06T11:54:56.000000Z 字数 13895 阅读 1699

OS Note

A. 基本概念

  1. 计算机系统,管理计算机软硬件资源,控制作业调度的程序集合。
  2. 批处理系统,把用户要求计算机系统进行处理的一个计算问题成为一个作业,在系统运行过程中,不允许用户与其作业发生交互作用。
    • 多道批处理系统。系统内可同时容纳多个作业。这些作业放在外存中,组成一个后备队列,系统按一定规则依次选取作业到内存中执行。
    • 单道批处理系统。
  3. 分时操作系统,用户通过与计算机相连的终端来使用计算机系统,允许多个用户同时进行人机交互。分时操作系统将系统处理机时间与内存空间按一定的时间间隔,轮流地切换给各终端用户的程序使用。
  4. 实时操作系统,是保证在一定时间限制内完成特定功能的操作系统,系统接收到外部信号后及时进行处理,并且在严格的规定时间内处理结束,再给出反馈信号。
    • 硬实时操作系统必须使任务在确定的时间内完成(完不成操作系统就会报错结束),而软实时操作系统能让绝大多数任务在确定时间内完成。
  5. 计算机系统结构
    • 硬件系统
      • 中央处理器
      • 存储器
      • 输入/输出控制系统
      • 输入/输出设备
    • 软件系统
      • 系统软件,是计算机系统中与硬件结合最紧密的软件,也是计算机系统中必不可少的软件。例如,操作系统、编译系统都是系统软件。
      • 支撑软件,是可支持其他软件的开发和维护的软件。例如,数据库、各种接口软 件、软件开发工具等都是支撑软件。
      • 应用软件,是按特定领域中的某种需要而编写的专用程序。例如,财务管理、人口普查等专用程序均属应用软件。
    • 用户
  6. 系统工作框架
    • BIOS(Basic IO System)。BIOS被写死在主板的ROM中,用于计算机开机时执行系统各部分的的自检,并启动引导程序或装载在内存的操作系统。此外,BIOS还向操作系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS服务而不是直接访问硬件。现代操作系统会忽略BIOS提供的抽象层并直接访问硬件组件。
    • 引导程序(Boot loader,第一阶段引导程序位于主引导记录(MBR)),用以检查分区表是否正确并且在系统硬件完成自检以后引导位于某个分区上的第二阶段引导程序,如NTLDR、GNU GRUB等。
    • 主引导记录(Master Boot Record),是计算机开机后访问硬盘时所必须要读取的首个扇区。有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT,Disk Partition Table)。主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息,是数据信息的重要入口。
    • 开机,BIOS開機完成後,引导程序首先进行系统初始化的工作,然后把操作系统中的核心程序装入主存储器,并让操作系统的核心程序占用处理器执行。
  7. 硬件环境
    • 主板概图
      主板图
    • 系统总线。系统总线上传送的信息包括数据信息、地址信息、控制信息,因此,系统总线包含有三种不同功能的总线,即数据总线DB(Data Bus)、地址总线AB(Address Bus)和控制总线CB(Control Bus)。系统总线
      • 数据总线是双向三态形式(双向是指可以两个方向传输,可以A->B也可以A<-B;三态指 0,1和第三态(tri-state)。tri-state既不是一也不是零,三态门的闭合无输出高阻状态。)的总线,即他既可以把CPU的数据传送到存储器或I/O接口等其它部件,也可以将其它部件的数据传送到CPU。数据总线的位数通常与微处理的字长相一致。数据的含义是广义的,它可以是真正的数据,也可以指令代码或状态信息,有时甚至是一个控制信息。
      • 地址总线。由于地址只能从CPU传向外部存储器或I/O端口,所以地址总线总是单向三态的,这与数据总线不同。地址总线的位数决定了CPU可直接寻址的内存空间大小,比如一个 32位元地址总线可以寻址的内存空间为2Bit^32=4GB(前提:数据总线的宽度是8位)的位址。
      • 控制总线CB用来传送控制信号和时序信号。控制信号中,有的是微处理器送往存储器和I/O接口电路的,如读/写信号,片选信号、中断响应信号等;也有是其它部件反馈给CPU的,比如:中断申请信号、复位信号、总线请求信号、限备就绪信号等。因此,控制总线的传送方向由具体控制信号而定,一般是双向的,控制总线的位数要根据系统的实际控制需要而定。实际上控制总线的具体情况主要取决于CPU。
    • 存储体系
      • 寄存器,处理器的组成部分,用来存放处理器的工作信息。下面以Intel 80x86 CPU作介绍。
        • 通用寄存器。存放参加运算的操作数、指令的运算结果等。通用寄存器的长度取决于机器字长。16位cpu通用寄存器共有8个:AX,BX,CX,DX,BP,SP,SI,DI。八个寄存器都可以作为普通的数据寄存器使用。但也有特殊的用途:AX(Accumulator)为累加器,BX(Base)为基址寄存器,CX(Count)为计数器,DX(Data)为数据寄存器,SI(Source Index),DI(Destination Index)为变址寄存器,BP(Base Pointer)和SP(Stack Pointer)为指针寄存器,BP可以是基址指针,SP为堆栈指针。AX,BX,CX,DX可以当做2个8位寄存器,AL与AH、BL与BH、CL与CH、DL与DH分别对应于AX、BX、CX和DX的低8位与高8位。32位cpu通用寄存器共有8个:EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI功能和上面差不多,AX、BX、CX、DX、SI、DI、BP和SP分别对应于EAX、EBX、ECX、EDX、ESI、 EDI、EBP和ESP的低16位。

          机器字长是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点整数运算)。机器字长通常也是CPU内部数据通路的宽度。机器字长与主存储器字长通常是相同的,但也可以不同。不同的情况下,一般是主存储器字长小于机器字长,例如机器字长是32位,主存储器字长可以是32位,也可以是16位,当然,两者都会影响CPU的工作效率。

        • 专用寄存器。指令指针和标志寄存器不能用作指令的操作数,它们是由CPU直接操纵的。
          • 指令指针寄存器(IP,Instruction Pointer),又称程序计数器(PC):为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。当执行指令时,CPU将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。
          • 指令寄存器(IR,Instruction Register)。存放当前从主存储器经由指令指针寄存器读出的正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器(DR,Data Register)中,然后再传送至IR。指令划分为操作码和地址码字段,由二进制数字组成。为了执行任何给定的指令,必须对操作码进行测试,以便识别所要求的操作。指令译码器就是做这项工作的。指令寄存器中操作码字段的输出就是指令译码器的输入。操作码一经译码后,即可向操作控制器发出具体操作的特定信号。
          • 标识寄存器(FR,Flag Register):存放当前程序执行时的状态。也称程序状态字寄存器PSW(Program Status Word)。用来存放两类信息:一类是体现当前指令执行结果的各种状态信息,称为状态标志,如有无进位(CF(Carry)进位标志),有无溢出(OF(Overflow)溢出标志),结果正负(SF(Sign)符号标志),结果是否为零(ZF(Zero)零标志),结果奇偶(PF(Parity)奇偶标志),寄存器低4位是否向前借位(AF(Auxiliary carry)辅助借位标志)等;另一类是存放控制信息,称为控制状态,如指令内存地址递增还是递减(DF(Direction)方向标志),CPU是否响应外部可屏蔽中断请求(IF(Interrupt)中断标志),CPU是否进入单步调试方式(TF(Track)跟踪标志)等。
        • 段寄存器。Intel 80x86 CPU采用分段内存管理机制,该机制允许程序员将程序划分为相对独立的多个地址空间,每个地址空间被称作一个段(Segment),一个程序可以拥有多个代码段、多个数据段,甚至多个堆栈段。Intel 80x86 CPU中主要包括以下几种类型的段。
          • 代码段(Code Segment):用来存放程序的指令序列。
          • 数据段(Data Segment):用来存放程序的数据。
          • 堆栈段(Stack Segment):作为堆栈使用的内存区域。堆栈用于存储过程返回地址、过程参数和局部变量等。
          • 附加段寄存器(Extra Segment、FS和GS),它们也用来存放数据段的段地址。此外,在串操作指令中,ES用来表示目的串所在数据段的段地址。
        • 其他寄存器 除了以上三类寄存器以外,Intel 80x86 CPU还包括下列寄存器(8086除外):4个内存管理寄存器、5个控制寄存器和8个调试寄存器,以及用于系统测试的测试寄存器。 当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的地址,以此实现转移。有些机器中也称PC为指令指针IP(Instruction Pointer)
      • 主存储器,也就是微机中的内存,以“字节”为单位进行编址。
      • 高速缓冲存储器,位于处理器和主存储器之间的cache起到了缩短存取事件和缓冲存储的作用。
      • 辅助存储器,如硬盘,磁带。
    • 硬件保护措施
      • 特权指令。为保证计算机系统能正确可靠地工作,硬件把由中央处理器执行的指令分为两类:特权指令和非特权指令。不允许用户程序中直接使用的指令称为特权指令,其余的称为非特权指令。例如,“启动I/O”、设置时钟、设置控制寄存器等一类可能影响系统安全的指令都属于特权指令。
      • 管态和目态。中央处理器设置了两种工作状态:管态和目态。当中央处理器处于管态时可执行包括特权指令在内的一切机器指令,当中央处理器处于目态时不允许执行特权指令。
      • 存储保护。每个程序在主存中占一个连续的存储空间。硬件设置两个寄存器:一个称为“基址寄存器”,另一个称为“限长寄存器”,用来限定用户程序执行时可以访问的主存空间范围。
  8. 操作系统结构
    • 设计目标
      • 正确性
      • 高效性
      • 维护性
      • 移植性
    • UNIX系统结构
      • 内核层。UNIX操作系统的核心,它具有存储管理、文件管理、设备管理、进程管理等功能,以及为外壳层提供服务的系统调用。外壳层为用户提供各种操作命令(UNIX把它们称为shell命令)和程序设计环境。
      • 外壳层由shell解释程序、支持程序设计的各种语言(如C、PASCAL和BASIC等)、编译程序、解释程序、实用程序和系统库等组成。
    • UNIX系统不允许外壳程序直接访问和干扰内核程序。因此,UNIX系统提供两种程序运行环境,即用户态和核心态。外壳层的程序在用户态运行,内核层的程序在核心态运行。UNIX把在用户态运行的程序称为用户程序,把在核心态运行的程序称为系统程序。用户态和和心态运行的程序分别占用不同的存储空间。
    • 操作系统为用户提供两种类型的使用接口,一种是操作员级的接口,另一种是程序员级的接口,以便用户与操作系统建立联系。操作员级的接口是一组操作控制命令,它们供用户提出如何控制作业执行的要求。程序员级的接口是一组系统功能调用,它们为用户程序提供服务功能。
      • 操作控制命令,操作系统提供了让联机用户(操作员一级)表示作业执行步骤的手段。
      • 系统调用。操作系统编制了许多不同功能的子程序(例如,读文件子程序,写文件子程序,分配主存空间子程序,启动I/O子程序等),供用户程序执行中调用。这些由操作系统提供的子程序称为系统功能调用程序,简称系统调用。系统调用应是在管态下执行的程序。
        • 文件操作类。这类系统调用有打开文件、建立文件、读文件、写文件、关闭文件、删除文件等。
        • 资源申请类。用户调用系统功能请求分配主存空间、归还主存空间、分配外围设备、归还外围设备等。
        • 控制类。执行中的程序可以请求操作系统中止其执行或返回到程序中的某一点再继续执行。操作系统要根据程序中止的原因和用户的要求作出处理。因而这类系统调用有正常结束、异常结束、返回断点/指定点等。
        • 信息维护类。例如,设置日历时间、获取日历时间、设置文件属性、获取文件属性等。
    • UNIX的用户接口
      • shell命令。UNIX提供操作控制命令称为shell命令,一组shell命令组成了shell命令语言。
      • 系统在执行命令时,若发现末尾有“&”符号,则就把实现这条命令功能的程序转入后台执行。在批处理兼分时的系统中,往往把有分时操作系统控制的作业成为前台作业,而由批处理系统控制的作业称为后台作业。
      • 在UNIX中,规定用户用“trap”指令(UNIX中的访管指令)来请求系统调用。

B. 处理器管理

  1. 多道程序
    • 让多个计算问题同时装入一个计算机系统的主存储器并执行,这种程序设计技术称为多道程序设计,这种计算机系统称为多道程序设计系统,或简称为多道系统。
    • 程序可以随机地从主存储器的一个区域移动到另一个区域,程序被移动后,仍丝毫不影响它的执行,这种技术称为程序浮动。
    • 优势:对具有处理器与外设并行工作能力的计算机系统来说,采用了多道程序设计技术后,能提高整个系统的效率。具体表现为:
      • 提高了处理器的利用率
      • 充分利用外围设备资源
      • 发挥了处理器与外围设备以及外围设备之间并行工作能力
  2. 进程

    • 程序,可看做具有独立功能的一组指令或一组语句的集合,或者说是指出处理器执行操作的步骤。
    • 程序的执行必须依赖于一个实体——数据集。把一个程序在一个数据集上的一次执行称为一个进程(Process)。
    • 进程(动态的)包括程序和程序(静态的)处理的对象(数据集),进程实现了程序的功能。
    • 进程的属性
      • 进程的动态性
      • 多个不同的进程可包含相同的程序
      • 进程可以并发执行
      • 进程有三种基本状态
        • 等待(阻塞)态——等待某一事件
        • 就绪态——等待系统分配处理器以便运行。
        • 运行态-正在占用处理器运行。
      • 异步性:进程的异步性应该是指不同进程之间是异步的,因为他们都有自己的数据集,互相不冲突,可以分别做事。

        同步和异步是实现并发的两种形式。同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

    • 进程控制块。为了标识进程,记录各个进程执行时的情况,操作系统在创建进程时为每一个进程设置一个进程控制块。进程控制块的英文名称是Process Control Block,缩写为PCB。
      • 标识信息。每个进程都有一个唯一的标识符,用以标识进程的存在和区分各个进程。
      • 说明信息。说明信息用于说明本进程的情况,其中“进程状态”是指进程的当前状态(运行、就绪和等待(阻塞)三种基本状态之一)。
      • 现场信息。通常被保留的现场信息有通用寄存器内容、控制寄存器内容、以及记录有关系统状态和进程暂停执行时断点的状态字寄存器内容等。
      • 管理信息。管理信息是对进程进行管理和调度信息。通常用“进程优先级”指出进程可以占用处理器的先后次序。“队列指针”指处于同一状态的另一个进程的进程控制块地址,这样就可把具有相同状态的进程链接起来,便于对进程实施管理。
    • 原语。操作系统中往往设计一些能完成特定功能且不可中断的进程。我们把这些不可中断的进程称为原语。用于控制进程的原语有:
      • 创建原语:为程序分配一个工作区和建立一个进程控制块,并置该进程为就绪态。
      • 撤销原语:一个进程完成工作后,收回它的工作区和进程控制块。
      • 阻塞原语:进程运行过程中发生等待事件时,把进程状态改为等待态。
      • 唤醒原语:当进程等待的事件发生时,把进程的状态改为就绪态。
    • 进程队列。为了便于管理,经常把处于相同状态的进程链接在一起,称为进程队列。
      • 把若干个等待运行的进程(就绪进程)按一定次序链接起来的队列称为就绪队列。
      • 把等待资源或等待某些事件的进程也排成队列,称为等待队列。
      • 一个进程从所在的队列中退出称为出队。一个进程进入指定的队列称为入队。系统中负责进程入队和出队的工作称为队列管理。
    • 进程间通信IPC(Inter-Process Communication)

      IPC是一种标准的Unix通信机制。

      • 消息队列。消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式。消息队列提供了异步的通信协议,也就是说:消息的发送者和接收者不需要同时与消息队列互交。消息会保存在队列中,直到接收者取回它。
      • 信号。信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。
        • 信号处理函数可以通过signal()系统调用来设置。在没有处理函数的情况下,程序可以指定两种行为:忽略这个信号(SIG_IGN)或者用默认的处理函数(SIG_DFL)。但是有两个信号是无法被截获并处理的:SIGKILL和SIGSTOP。
        • 在处理一个信号的过程中,进程可能收到另一个信号(甚至是相同的信号)。sigprocmask()系统调用可以用来阻塞和恢复信号的传递。信号可以造成进程中系统调用的中断,并在信号处理完后重新开始未完成的系统调用。
      • 共享内存,即可被多个进程存取的内存。
        • 信号量(Semaphore),它以一个整数变量,提供信号,以确保在并行计算环境中,不同进程在访问共享资源时,不会发生冲突。
        • 如果信号量是一个任意的整数,通常被称为计数信号量(Counting semaphore),或一般信号量(general semaphore);如果信号量只有二进制的0或1,称为二进制信号量(binary semaphore)。在linux系中,二进制信号量(binary semaphore)又称互斥锁(Mutex)。
        • 计数信号量具备两种操作动作,之前称为 V(又称signal())与 P(wait())。 V操作会增加信号量 S的数值,P操作会减少它。进程进入临界区段前运行运行 P(wait()),退出离开时运行V(signal())。
        • Berkeley套接字(也称为BSD套接字),是应用程序接口(API),包括了一个用C语言写成的应用程序开发库,主要用于实现进程间通讯,在计算机网络通讯方面被广泛使用。
        • 管道(英语:Pipeline)是原始的软件管道,即是一个由标准输入输出链接起来的进程集合,所以每一个进程的输出(stdout)被直接作为下一个进程的输入(stdin)。 每一个链接都由未命名管道实现。 管道例图
          • 普通管道PIPE, 通常有两种限制,一是半双工,只能单向传输;二是只能在父子或者兄弟进程间使用。
          • 流管道s_pipe: 去除了第一种限制,可以双向传输。
          • 命名管道:name_pipe, 去除了第二种限制,可以在许多并不相关的进程之间进行通讯。
    • UNIX进程
      • 由于UNIX把用户的程序设计环境也作为UNIX的组成部分,所以,UNIX不区分系统进程和用户进程。UNIX中的进程即可执行操作系统程序,又可执行用户程序,按照需要进行转换。
      • UNIX进程由进程控制块、正文段和数据段组成。
        • 为了节省进程控制块所占的主存空间,UNIX把每个进程控制块分成两部分:
          • 进程基本控制块。进程基本控制块常驻在主存储器中。它记录了进行进程调度是必须使用的一些信息。不管进程是否占用处理器运行,操作系统经常会对这部分的内容进行查询和处理。在UNIX中,把进程基本控制块的数据结构成为proc结构。
          • 进程扩充控制块。进程扩充控制块非常驻主存储器中。当进程不占用处理器时,操作系统不会对这部分内容进行查询和处理。在UNIX中,把进程扩充控制块的数据结构成为user结构。
        • 正文段。在UNIX中把可供多个进程共享的程序称为进程的正文段。显然,正文段是可再入的程序,它由不可被修改的程序和常数组成。
        • 数据段。进程的数据段包括进程执行的非共享程序和程序执行时用到的数据。UNIX把进程的数据段划分为三部分:用户栈区、用户数据区和系统工作区,其中系统工作区又由核心栈和user区两部分组成。
      • UNIX系统采用优先数调度算法来分配处理器。在进程调度中,每次调度时,系统把处理机分配给就绪队列中优先数最高的进程。它又分为两种:非抢占式优先数算法和抢占式优先数算法。
        • 非抢占式优先数算法中,进程一旦占用CPU,非结束前其它进程不能进入CPU。
        • 抢占式优先数算法中,高优先数的进程可以抢占低优先数进程占用的CPU。
      • UNIX进程的状态
        • 运行状态。进程正占用处理器运行。
        • 就绪状态。在UNIX系统中,一个进程连续占用处理器一段时间后,就会迫使它让出处理器,由其他进程抢先运行。如果处于就绪状态的进程在磁盘的对换区中,则必须先由“交换进程”(称为0进程)把它换入主存储器,然后才能调度它去运行。
        • 睡眠状态。进程为了等待某事件而让出处理器便进入睡眠状态。一般进程在内存中睡眠,当内存不足时,可能被换到交换区。
        • 创建状态。UNIX用系统调用fork创建进程。在创建过程中,处于变迁阶段的状态称为创建状态。创建状态时进程的初始状态,最终它会成为就绪状态。
        • 僵死状态。这是进程消亡前的暂时状态。一个进程可按执行情况通过exit请求终止自己。当进程终止时便处于僵死状态。僵死状态时进程的最后状态,它再也不会转换成其他状态。
      • 进程树。UNIX系统中的进程构成了一个树形结构的进程簇。UNIX把被创建的进程称为创建者的子进程,创建者就是子进程的父进程。在UNIX中,0号进程和1号进程是进程簇的老祖宗,在系统运行期间永不消亡。shell进程则是为每个终端用户服务的所有进程的祖先。
        • 0号进程。当计算机系统被启动后,首先把UNIX的核心程序装入主存。核心程序在做完自身的初始化工作后,建立系统的第一个进程。在UNIX系统中,把这个进程称为0号进程。0号进程始终在核心态运行。它的功能是进行进程调度和让进程在主存与磁盘上进行交换。故也把0号进程称为交换进程。
        • 1号进程。0号进程创建1号进程(内核态,kernel_init进程),kernel_init进程负责执行内核的部分初始化工作及进行系统配置,并创建若干个用于高速缓存和虚拟主存管理的内核线程。随后,kernel_init进程调用execve()运行可执行程序init,并演变成用户态1号进程,即init进程。它按照配置文件/etc/initab的要求,完成系统启动工作,创建编号为1号、2号...的若干终端注册进程getty。
        • 每个getty进程设置其进程组标识号,并监视配置到系统终端的接口线路。当检测到来自终端的连接信号时,getty进程将通过函数execve()执行注册程序login,此时用户就可输入注册名和密码进入登录过程,如果成功,由login程序再通过函数execv()执行shell,该shell进程接收getty进程的pid,取代原来的getty进程。再由shell直接或间接地产生其它进程。
        • 0、1的进程是杀不掉的,系统进行初始化的时候将这两个进程的所有信号屏蔽掉了。
      • 进程的创建和终止。在UNIX中,除了0号和1号进程外,其他的进程总是使用系统调用fork来创建新进程,形成父子关系。UNIX为每个用户创建的第一个进程是shell进程。shell进程可用系统调用fork来创建子进程。子进程根据shell进程读入的命令请求系统调用exec把命令处理程序装入进程空间,并启动执行。系统调用exit的主要任务是把终止进程自被创建以来所占用的系统资源退还给系统。
      • UNIX进程的换进换出。在UNIX中经常要发生进程在主存与磁盘之间的转换,0号进程(交换进程)在核心态运行,它执行schedule程序来完成换进换出的工作。UNIX规定,一个进程被换出前必须至少在主存驻留2s。同样,一个在磁盘兑换区的进程要换进时也必须至少在对换区驻留2s。
      • 进程睡眠和唤醒。进程有时需要等待直到某个特定的事件发生,如等待I/O 操作等,此时,进程则必须从运行队列移出,加入到一个等待队列中,这个时候进程就进入了睡眠(阻塞)状态。 Linux 中的进程睡眠状态有两种:一种是可中断的睡眠状态,其状态标志位TASK_INTERRUPTIBLE; 另一种是不可中断的睡眠状态,其状态标志位为TASK_UNINTERRUPTIBLE。可中断的睡眠状态的进程会睡眠直到某个条件变为真,比如说产生一个硬件中断、释放进程正在等待的系统资源或是传递一个信号都可以是唤醒进程的条件。对于不可中断睡眠状态,把信号传递到这种睡眠状态的进程不能改变它的状态,也就是说它不响应信号的唤醒。不可中断睡眠状态一般较少用到。
  3. 中断技术
    • 一个进程占有处理器运行时,由于自身或外界的原因(出现了事件)使运行被打断,让操作系统处理所出现的事件,到适当的时候再让被打断的进程继续运行。我们称这个进程在运行中被中断了,引起中断的事件称为中断源,对出现的事件进行处理的程序称为中断处理程序。
      • 强迫性中断事件。 这类中断事件不是正在运行的进程所期待的,而是由于外部的请求或某些意外事故而迫使正在运行的进程被打断。强迫性中断事件大致有以下几种:
        • 硬件故障中断
        • 程序性中断事件
        • 外部中断时间
        • 输入/输出中断时间
      • 自愿性中断事件。这是正在运行的进程所期望的中断事件,是正在运行的进程执行一条“访管指令”请求系统调用为其服务所引起的中断。经常把自愿性中断称为访管中断。UNIX系统中使用的是“trap指令”,MS DOS系统中使用的是“INT指令”。
    • 中断响应。通常,处理器每执行完一条指令后,硬件的中断装置立即检查有无中断事件发生。若有中断事件发生,则暂定现行进程的执行,而让操作系统的中断处理程序占用处理器。这一过程成为中断响应。
    • 中断标识码(中断类型号)。由硬件(通常是中断控制器)产生,以标识不同的中断源。
    • 中断向量。中断服务程序的入口地址。在某些计算机中(如ARM处理器),中断向量的位置存放一条跳转到中断服务程序入口地址的跳转指令。一般中断类型号×4=存放中断子程序首地址的存储区首地址=中断向量地址
    • 中断优先级。中断装置是按预定的中断优先级响应同时出现的中断事件。中断优先级是按中断事件的重要性和紧迫程度来确定的,是在硬件设计时固定的。一般情况下,优先级的高低顺序依次为:硬件故障中断、自愿中断、程序性中断、外部中断、输入/输出中断。
  4. UNIX中的中断技术

    • 中断事件和异常情况。在UNIX中把可能出现的事件分成两大类:中断事件(硬件中断)和异常情况(软件中断)。
      • 如果出现的事件与正在运行的进程无关,是由其他硬件设备依照CPU 时钟周期信号随机产生的,则把这些事件称为中断事件。例如,I/O中断事件、时钟中断事件、电源故障中断事件等都是由异步于进程运行的事件引起的,我们把这类事件都归属于中断事件。
      • 如果出现的事件与正在运行的进程有关,是当指令执行时由 CPU控制单元产生的,则把这些事件称为异常情况。异常情况都是在执行指令时捕获到的,包括陷阱,异常终止,编程异常( 也称软中断 ),int指令。硬中断可屏蔽,软中断不可屏蔽。
    • UNIX把中断划分为32级。异常情况为0级;1~15级是操作系统为了完成某些特定功能而设置的中断(例如,跟踪);我们把操作系统设置的中断称为软中断;16~31级是硬件中断。
    • 处理器状态字。UNIX用一个由32位组成的字作为处理器状态字(记为ps)。每个进程都有自己的ps,当进程运行时就把它的ps送入处理器状态字寄存器中。
    • 中断处理

      • 中断响应。中断响应是由中断装置完成的。中断响应是硬件对中断请求作出响应的过程,包括识别中断源,保留现场,引出中断处理程序等过程。在UNIX中,不同的事件由不同的处理程序来处理。
      • 中断处理程序。UNIX处理程序的工作可以分为现场保护、分析处理、恢复现场三个阶段。当CPU(中央处理器)执行一条现行指令的时候,如果外设向CPU发出中断请求,那么CPU在满足响应的情况下,将发出中断响应信号,与此同时关闭中断,表示CPU不再受理另外一个设备的中断。这时,CPU将寻找中断请求源是哪一个设备,并保存CPU自己的程序计数器(PC)的内容。然后,他将转移到处理该中断源的中断服务程序。CPU在保存现场信息,设备服务(如交换数据)以后,将恢复现场信息。在这些动作完成以后,开放中断,并返回到原来被中断的主程序的下一条指令。
      • 中断响应时间,从发出中断请求到进入中断处理所用的时间。占先式内核的中断响应时间由下式给出:

      中断响应时间=关中断的最长时间 +保护CPU内部寄存器的时间 +进入中断服务函数的执行时间 +开始执行中断服务例程(ISR)的第 一条指令时间

      • (硬件)中断处理
        • 设备产生中断。
        • PIC(可编程中断控制器)会产生一个对应的中断向量。
        • 和中断向量表中的每一个中断向量进行比较,转到对应的中断处理程序。
        • 中断处理程序进行保存现场,做相关处理,恢复现场。
        • 内核调度,返回用户进程。
      • 异常(软件中断)处理
        • 当发生异常时,CPU 控制单元产生一个硬件出错码。
        • CPU根据该中断吗找到中断向量表内的对应向量,根据该向量转到中断处理程序。
        • 中断处理程序处理完之后向当前进程发送一个SIG*** 信号。
        • 若进程定义了相应的信号处理程序则转移到相应的程序执行,若没有,则执行内核定义的操作。
    • 中断与信号(进程间通信)的区别:
      • 中断有优先级,而信号没有优先级,所有的信号都是平等的;
      • 信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
      • 中断响应是及时的,而信号响应通常都有较大的时间延迟。

        信号捕获过程。从图可以看出,信号的处理时机是在当前进程由于系统调用、中断或者异常而进入系统空间以后。 信号捕获过程

  5. 作业调度

    • 把在批处理操作系统控制下的作业称为批处理作业。
    • 把磁盘上用来存放信息的专用区域称为输入井(SWAP,交换区)。
    • 把在输入井中等待处理的作业称为后备作业。
    • 从输入井中选取后备作业装入主存储器的工作称为作业调度。
    • 从就绪进程中选取一个进程,让它占用处理器的工作称为进程调度。
    • 在分时操作系统控制下的作业称为终端作业。
    • 批处理作业的调度算法。

      假定作业i进入输入井的时间为Si。若它被选中执行,得到计算结果的时间为Ei,那么他的周转时间就定义为Ti=Ei-Si。即作业的周转时间为其进入输出井到得出结果的时间。

      • 先来先服务算法。先来先服务,是按照作业进入输入井的先后次序来挑选作业,先进入的作业优先被挑选。但要注意,不是先进入的作业一定被先选中,只有满足必要条件的作业才可能被选中。
      • 计算时间短的作业优先算法。采用这种算法时,要求用户对自己的作业需要计算的时间预先作一个估计。作业调度时根据在输入井中的作业提出的计算时间为标准,优先选择计算时间短且资源能得到满足的作业。这种算法能降低作业的平均周转时间,从而提高系统的吞吐能力。采用计算时间短的作业优先算法,能使平均周转时间最小。
      • 响应比高者优先算法。响应比=等待时间/计算时间 采用响应比高者优先算法进行调度时,必须先计算出输入井中资源能得到满足的所有作业的响应比,然后从中选择响应比最高者优先装入主存储器。
      • 优先级调度算法。为每一个作业确定一个优先级,资源能满足且优先级高的作业优先被选取,当几个作业有相同优先级时,对这些具有相同优先级的作业在按照先来先服务的原则进行调度。
      • 均衡调度算法。根据作业对资源的要求进行分类,作业调度从各类作业中去挑选,尽可能地使得使用不同资源的作业同时执行。
    • 进程调度算法。
      • 先来先服务调度算法。按照进程进入就绪队列的先后次序来选择可占用处理器的进程。
      • 最高优先级调度算法。对每一个进程给出一个优先级,进程调度总是让当时具有最高优先级的进程先使用处理器。
      • 时间片轮转调度算法。时间片是指允许进程一次占用处理器的最长时间。时间片轮转调度算法把就绪进程安就绪的先后次序排成队列,调度时总是选择就绪队列中的第一个进程,让它占用处理器,但规定它一次连续占用处理器的时间不能超过预定的时间片。如果允许的时间片用完而进程尚未运行结束,则它必须把处理器让给下一个就绪进程使用,进程让出处理器后重新链到就绪队列的末尾等待再次运行。
      • 分级调度算法。这种调度算法是,由系统设置多个就绪队列,每个就绪队列中的进程按时间片轮转法占用处理器。
    • UNIX系统的进程调度算法
      • 虽然UNIX是一个分时操作系统,但它对进程的调度不是采用时间片轮转法,而是采用了动态优先数调度算法。
      • 优先数和优先权。UNIX中每个进程都有一个优先数,进程的优先数随进程的执行情况而变化。就绪进程能占用处理器的优先权取决于进程的优先数,优先数越小则优先权越高。
      • UNIX确定进程优先权的原则如下:
        • 进入核心态的进程优先权高于在用户态运行的进程优先权。
        • 一个进程因用完了一个时间片而被剥夺处理器时,应降低改进程的优先权,以使其他进程有机会使用处理器。
        • 对进入睡眠的进程,系统将按照它们等待事件的轻重缓急程度赋予它们不同的优先权。
        • 应相应降低累计使用处理器时间较长的进程的优先权。
      • 根据确定进程优先权的原则,UNIX系统采用两种方法来确定进程的优先数:设置法和计算法。设置法用于即将进入睡眠状态的进程。当进程由于某个事件要睡眠时,根据事件的相知对该进程设置优先数。当进程转入用户态运行时,则用计算法来确定其优先数。
        • 设置优先数。进程进入睡眠时,系统按其睡眠原因设置优先数。0号交换进程的工作对整个系统的性能有较大影响,因此当它睡眠时给其设置一个最小优先数(-100)。
        • 计算优先数。UNIX采用计算的方法动态改变进程的优先数。在UNIX System V版本中,进程优先数p_pri的计算式为: p_pri=p_cpu/2+PUSER+p_nice+NZERO;
          其中,PUSER和NZERO是两个偏置常数,分别为25和20。p_cpu和p_nice是基本进程控制块中的两个项,分别表示进程使用处理器的情况和用户自己设置的计算优先数的偏移量。
      • 进程调度程序swtch在UNIX系统中,进程调度的工作由swtch程序来完成。 进程调度程序swtch的主要任务是:在主存就绪的进程中,选择一个优先数最小的进程;为被选中的进程恢复现场信息。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注