第一章 绪论
1. 概述
操作系统五大功能:进程管理、存储管理、文件管理、设备管理、用户接口
并行:两个或多个事件在同一时刻发生;并发:两个或多个事件在同一时间间隔发生
2. 中断与异常:
中断:也称为外中断,中断信号是来在CPU执行指令的外部,如I/O结束中断、时钟中断。
异常:也称为内中断、陷入,中断信号来源于CPU执行指令的内部,如非法操作码、地址越界、算数溢出、缺页异常等。
中断的处理流程:关中断,保存断点,引出中断服务程序,保存现场和屏蔽字,开中断,执行中断服务程序,关中断,恢复现场和屏蔽字,开中断、中断返回。
3. 简述系统调用:
系统调用是操作系统提供给用户程序使用计算机软硬件资源的接口,操作系统统一管理计算机资源把用户从底层硬件编程中解放出来专注于应用层面的开发,提高了效率。
4. 大内核和微内核
(1)大内核:将操作系统功能作为一个紧密结合的整体放入内核中,由于各模块共享信息,执行效率很高,但程序庞大,复杂,难以维护。
(2)微内核:将操作系统划分为小的、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态下,因此无可避免的带来核心态和用户态之间的频繁切换,效率降低,但程序管理方便,方便执行。
5. 访管指令与访管中断
访管指令是一条可以在用户态下执行的指令。在用户程序中,因要求操作系统提供服务而使用访管指令,从而产生一个中断事件,使操作系统转换为核心态,称为访管中断。
处于用户态的用户程序使用访管指令时,系统根据访管指令的操作数执行访管中断处理程序,其按系统调用的操作数和参数转到相应的例行子程序。完成服务功能后,退出中断,返回到用户程序断点继续执行。
第二章 进程管理
1. 进程概述
同一个程序的一次执行也可以产生多个进程(通过fork调用);而一个进程也可以执行多个程序(通过exec调用)
进程和程序的区别:(1)动态性:程序是指令的有序集合,能永久的保存在某种介质上,没有任何执行的含义,是一个静态概念。而进程是程序的一次执行过程,是一个动态概念,强调执行过程,它动态地被创建、调度执行、撤消
(3)独立性:进程是一个能够独立运行、独立分配资源和独立接受调度的基本单位。而程序不具有PCB,所以它是不可能在多道程序环境下独立运行
PCB的作用:PCB 是进程实体的一个组成部分,在PCB 中记录了OS所需的、用于描述进程的当前状态及控制进程的全部信息。PCB 的作用是将程序变成可并发执行的进程。
为什么说PCB是进程存在的唯一标志: PCB 的作用是将程序变成可并发执行的进程。系统根据进程的PCB感知到该进程的存在,并对它进行控制,因此,PCB 是进程存在的唯一标志。
原语:操作系统底层是一些可被调用的公用小程序,它们各自完成一个规定的操作,其特点是:
- 它们处于操作系统的最底层,是最接近硬件的部分。
- 这些程序的运行具有原子性,其操作只能一气呵成
- 这些程序的运行时间都较短,而且调用频繁。
- 定义原语的直接方法是关闭中断,让它的所有动作不可分割地进行完再打开中断。
2. 进程同步
- 空闲让进:若临界区空闲,则一次仅允许一个进程进入。
- 忙则等待:如果已有进程进入临界区,则其他试图进入临界区的进程必须等待。
- 有限等待:进入临界区的进程要在有限时间内退出,以便让其他进程进入。
- 让权等待:如果进程不能进入临界区,则释放CPU资源,避免进程出现“忙等”现象。
实现临界区互斥的软件方法:单标志法(违背空闲让进)、双标志法先检查(违背忙则等待)、双标志法后检查(饥饿现象)、Peterson算法
3. 进程通信
- 共享存储:在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行读写操作实现进程之间的信息交换。
- 消息传递:进程间的数据交换是以格式化的消息为单位的。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
- 管道通信:管道是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名pipe文件。写进程以字符流形式将大量的数据送入写管道,读进程从管道中读数据。管道机制提供:互斥、同步、确定对方存在。
- 消息队列自身有同步机制;但不支持广播机制; 当传输大量数据时,花费较高
- 共享内存必须自己考虑同步问题,但支持广播机制;当传输大量数据时,系统开销小
- 管道能传递大量数据,但只支持半双工通信,只能用于有血缘关系的进程之间
4. 进程和线程
(1)调度性:在传统的OS中,拥有资源的基本单位和独立调度、分派的基本单位都是进程。而在引入线程的OS中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位
(2)并发性:在引入线程的OS中,不仅进程间可以并发执行,而且在一个进程的多个线程间也可以并发执行,因而它比传统的OS具有更好的并发性
(3)拥有资源:在这两种OS中,拥有资源的基本单位都是进程。线程除了一点在运行中必不可少的资源(如线程控制块、程序计数器、一组寄存器和堆栈)外,本身基本不拥有系统资源,但它可访问其隶属进程的资源。
(4)系统开销:由于创建和撤销进程时,系统都要为之分配和回收资源,进程切换时所要保存和设置的现场信息也要明显的多于线程,因此,OS在创建、撤销以及切换进程时所付出的开销将明显地大于线程。另外,由于隶属同一个进程的多个线程共享同一地址空间和该进程的所有已打开文件,从而使它们之间的同步和通信的实现也比进程更方便
(5)地址空间和其他资源:进程的地址空间互相独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。
CPU只能执行两种性质的程序:操作系统内核程序、用户自编程程序。
管态又叫系统态、核心态。CPU在管态下有权限执行计算机的任何指令,其资源访问不受限制。操作系统内核程序处于管态。所谓特权指令,是指计算机中不允许用户直接使用的指令,如:I/O指令、置中断指令,存取用于内存保护的寄存器,送程序状态字到程序状态字寄存器等指令。
目态又叫用户态。CPU处于目态时,程序只能执行非特权指令,不能直接使用系统资源,并且只能访问用户程序自己的存储空间。用户编写的程序处于目态。
如何从目态切换到管态:通过系统调用(使用访管指令),可以从目态切换到管态。此外,程序产生异常或中断时(如除以0,缺页,I/O中断),也会切换到内核态。
某计算机系统有两个cpu,每个cpu可两个线程(超线程),A、B、C三个程序在单个CPU上运行时间分别为:5、10、20ms。问当A、B、C在此系统上运行时,有哪几种可能,运行时间为多少?
- 超线程CPU线程的切换很快,但是并不具有线程间并行工作能力,任意时刻只能有一个线程运行
- P0、P1、P2调度到同一个CPU上运行,完成这些程序的执行需要5+10+20=35ms
- P0、P1调度到同一个CPU上运行,P2调度到了一个CPU上运行,完成执行P0、P1需要时间15ms,完成执行P2需要时间20ms,而两个CPU可以并行工作,所以完成这些程序的执行需要20ms
- P0、P2调度到同一个CPU上运行,P1调度到了一个CPU上运行,完成执行P0、P2需要时间25ms,完成执行P1需要时间10ms,而两个CPU可以并行工作,所以完成这些程序的执行需要25ms
- P1、P2调度到同一个CPU上运行,P0调度到了一个CPU上运行,完成执行P1、P2需要时间30ms,完成执行P0需要时间5ms,而两个CPU可以并行工作,所以完成这些程序的执行需要30ms
(1)内核支持线程:创建、撤消和切换等,是依靠内核实现的。此外,在内核空间还为每一个内核支持线程设置了一个线程控制块。
(2)用户级线程:对线程的创建、 撤消、同步与通信等功能,都无需内核的支持。而内核完全不知道用户级线程的存在。当线程执行一个系统调用时,不仅该线程被阻塞,而且,进程内的所有线程会被阻塞
5. 进程调度
(1)高级调度(作业调度):决定把外存上处于后备队列中的哪些作业调入内存,为它们分配必要的资源,并创建进程。
(2)中级调度(内存调度):将那些暂时不能运行的程序调至外存等待,把此时的进程状态称为挂起态。
(3)低级调度(进程调度、分为非抢占方式和抢占方式):保存处理机的现场信息,按某种算法先取进程,再把处理器分配给进程。
(1)终端型作业用户:终端型用户提交的作业属于交互型作业,通常较小,此算法可以保证短作业优先。
(3)长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理。
- 先来先服务 first-come first-serverd(FCFS) :按照请求的顺序进行调度。非抢占式,开销小,无饥饿问题,响应时间不确定(可能很慢) ;对短进程不利,对IO密集型进程不利。
- 最短作业优先 shortest job first(SJF):按估计运行时间最短的顺序进行调度。非抢占式,吞吐量高,开销可能较大,可能导致饥饿问题; 对短进程提供好的响应时间,对长进程不利
- 优先级调度算法:为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
- 时间片轮转:将所有就绪进程按 FCFS 的原则排成一个队列,用完时间片的进程排到队列最后。抢占式(时间片用完时),开销小,无饥饿问题,为短进程提供好的响应时间;若时间片小,进程切换频繁,吞吐量低;若时间片太长,实时性得不到保证。
- 最高响应比优先:响应比 = 1+ 等待时间/处理时间。同时考虑了等待时间的长短和估计需要的执行时间长短,很好的平衡了长短进程。非抢占,吞吐量高,开销可能较大,提供好的响应时间,无饥饿问题。
- 多级反馈队列调度算法:设置多个就绪队列1、2、3...,优先级递减,时间片递增。只有等到优先级更高的队列为空时才会调度当前队列中的进程。如果进程用完了当前队列的时间片还未执行完,则会被移到下一队列。抢占式(时间片用完时),开销可能较大,对I/O型进程有利,可能会出现饥饿问题。
6. 死锁
死锁是指多个并发进程彼此等待对方所拥有的资源,且这些并发进程在得到对方的资源之前不会释放自己所拥有的资源,从而使得各进程不能继续向前推进。
S为死锁状态的充分条件是,当且仅当S状态的资源分配图是不可完全简化的。
- 预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。
- 避免死锁:银行家算法、安全性算法
- 死锁检测:资源分配图
- 解除死锁:
银行家算法是一种避免死锁的算法,它的原理是避免系统进入不安全状态从而避免死锁。在分配资源之前,它会检查资源是否充足,如果充足,它会试分配资源,再检查此时系统是否处于安全状态,如果处于安全状态,那么就正式分配资源,否则拒绝分配资源。
7. 死锁和饥饿
(1)死锁是多个并发进程彼此等待对方所拥有的资源,且这些并发进程在得到对方的资源之前不会释放自己所拥有的资源,从而使得各进程不能继续向前推进。
(2)饥饿指进程无穷等待。产生的原因是,操作系统给进程分配资源的时候可能会导致某个进程长时间等待,结果可能是这个进程等待导致其失去意义。
(3)饥饿并不表示系统会死锁,但是至少有一个进程被无限推迟。其区别如下:
8. 作业和进程
进程是系统资源的使用者,系统的资源大部分是以进程为单位分配的。而用户使用计算机是为了完成一串相关的任务,通常把用户要求计算机完成的这一串任务称为作业。
第三章 内存管理
1. 内存管理概念
- 静态链接:在程序运行之前,将各个目标模块以及所需库链接成为一个完整的可执行程序,不在拆开
- 装入时动态链接:将应用程序编译后所得一组目标模块在装入内存时,边装入边链接。
- 运行时动态链接:在运行时,程序需要哪些模块,才对这些模块进行链接
(3)可用哪几种方式将程序装入内存?它们分别适用于何种场合?
- 绝对装入方式:单道程序环境。在编译时就知道程序将驻留内存的物理地址,编译程序产生含有物理地址的目标代码。
- 可重定位装入方式:多道程序环境。又称静态重定位,操作系统分配以某一地址为起始地址的连续内存,在装入时一次性完成地址转换,将程序指令的逻辑地址加上起始地址得到物理地址。
- 动态运行时装入方式:多道程序环境。装入模块装入内存时仍是相对地址,在程序执行过程中,访问到相应指令时才将相对地址转换为物理地址,这个过程需要依靠硬件地址变换机构。
- 单一连续分配方式(有内部碎片无外部碎片):内存分为用户区和系统区,单道程序独占用户区,无法用于多道程序。
- 固定分区分配方式(有内部碎片无外部碎片):将内存用户空间分为若干个固定大小的分区,每个分区装一道作业
- 动态分区分配方式(无内部碎片有外部碎片,可用紧凑技术解决):在进程装入内存时,根据进程大小和动态分区算法动态建立分区。
- 首次适应算法:按地址从大到小排序,分配第一个符合条件的分区
- 循环首次适应算法:在首次适应的基础上,每次从上一次结束的位置开始查找
- 最佳适应算法:按空间从小到大排序,分配第一个符合条件的分区
- 最坏适应算法:按空间从大到小排序,分配第一个符合条件的分区
覆盖技术,将内存分为一个固定区和若干个覆盖区,固定区存放最活跃的程序段,固定区中的程序不会在运行过程中调入调出;覆盖区中的程序段在运行过程中根据需要进行调入调出。
交换技术,内存紧张情况下,将某些进程换出内存,称为挂起,但该进程的PCB仍驻留内存,换出的程序存放在磁盘上的对换区。
在程序执行过程中,需要将要访问的数据的逻辑地址转换成物理地址。
具体实现方法是增加一个重定位寄存器,装入程序在内存中的起始地址,真正的地址为相对地址与重定位寄存器中的起始地址相加之和,从而实现动态重定位。
- 页是信息的物理单位,分页是出于系统管理的需要;段则是信息的逻辑单位,它含有一组其意义相对完整的信息,分段是出于用户应用的需要。一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
- 页大小是系统固定的;而段大小则通常不固定,由编译程序在对源程序进行编译时,根据信息的性质来划分;通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度
- 逻辑地址表示:分页是一维的,各个模块在链接时必须组织成同一个地址空间;分段是二维的,各个模块在链接时可以每个段组织成一个地址空间
- 界限保护:在CPU中设置界限寄存器,限制进程的活动空间。
- 保护键:为共享内存区设置一个读写保护键,在CPU中设置保护键开关,表示进程的读 写权限。只有进程的开关代码和内存区的保护键匹配时方可进行访问。
- 保护模式:将CPU的工作模式分为用户态与核心态。核心态下的进程可以访问整个内存 地址空间,而用户态下的进程只能访问在界限寄存器所规定范围内的空间。
2. 虚拟内存管理
请求分页系统包含的数据项及其各自的作用:包含 页号、物理块号、状态位P、访问字段A、修改位M、外存地址
- 状态位P:用于指示该页是否已调入内存,供程序访问时参考
- 访问字段A:记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供置换算法换出页面时参考
- 修改位M:标识该页在调入内存后是否被修改过
- 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考
物理块的分配策略:固定分配局部置换、可变分配全局置换、可变分配局部置换
物理块分配算法:平均分配算法、按比例分配算法、 考虑优先权的分配算法
- 最佳置换算法:优先淘汰最长时间不会被访问到的页面(要预知未来,无法实现)
- 先进先出页面置换算法(FIFO):需要替换页面时,将最早调入的页面调出(Belady异常:所分配的物理块数增大而页故障数不减反增)
- 最近最久未使用置换算法(LRU):优先淘汰最近最久未使用的页面(需要硬件支持,算法开销大)
- 最少使用置换算法
- Clock置换算法(最近未使用算法):为每个页面设置一个使用位,需要替换页面时,将使用位为1的置为0,将第一个使用位为0的页面调出
第四章 文件管理
1. 文件管理
文件按逻辑结构分为:无结构文件(流式文件)、有结构文件(记录式文件)
文件目录的结构:单级目录结构、两级目录结构、多级目录结构(树形目录结构)、图形目录结构
引入“打开”这一系统调用的原因和含义:原因是为了避免多次重复检索目录;含义是系统调用将文件打开,磁盘索引结点被拷贝到内存中,后面的目录检索都在内存中进行
2. 磁盘管理
文件存储空间管理(空闲磁盘空间):空闲表法、空闲链表法、位示图法、成组链接法
位视图法申请一块磁盘的流程: ① 顺序扫描位示图,找到一个或一组值为“0”的位 ② 将找到的位转换成与之相对应的盘块号:b=n(i-1)+j ③ 修改位示图
位视图法归还一块磁盘的流程: ① 将回收的盘块号转换成位示图中的行号和列号:i=(b-1) DIV n +1,j=(b-1) MOD n +1 ② 修改位示图
位视图优点: ① 从位示图中很容易找到一个或一组相邻接的空闲盘块 ② 位示图占用空间小,可常驻内存
- 先来先服务(FCFS)
- 最短寻找时间优先(SSTF):总是处理离当前磁头最近的磁道请求,会产生“饥饿”现象
- 扫描算法(电梯算法,SCAN):选择在磁头当前移动方向上最近的磁道请求进行处理
- 循环扫描(C-SCAN):在SCAN的基础上,规定磁头单向移动。磁头到达最远端的请求后,快速返回起始端
3. 磁盘结构
(1)引导控制块:包括系统从该分区引导操作系统所需要的信息。若磁盘没有操作系统,则这块的内容为空。它通常为分区的第一块。也叫引导块、分区引导扇区。
(2)分区控制块:包括分区详细信息,如分区的块数、块的大小、空闲块的数量和指针、空闲FCB的数量和指针等。也叫超级快扩主控文件表。
4. 文件系统实现概述
第五章 输入输出系统
1. I/O管理概述
I/O设备基本功能:隐藏物理设备的细节、与设备无关性、提高处理机和I/O设备的利用率、对I/O设备进行控制、能确保对设备的正确共享、错误处理
设备使用方式:独占式使用设备(独占设备)、分时式共享使用设备(共享设备)、以SPOOLing方式使用外部设备(虚拟设备)
设备独立性也称与设备无关性。其基本含义是:应用程序独立于具体使用的物理设备,使用逻辑设备名来请求某类设备,系统在执行时,则使用该类设备的物理设备名。
I/O系统层次:用户层软件、设备独立性软件、设备驱动程序、中断处理程序、硬件设备(I/O子系统指的前四个)
2. I/O控制
- 程序直接控制方式:从外部设备读取数据到存储器,每次读一个字的数据。对读入的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在I/O控制器的数据寄存器。
- 中断驱动方式:允许I/O设备主动打断CPU的运行并请求服务,从而“解放”CPU,使得其向 I/O 控制器发送读命令后可以继续做其他有用的工作。
-
DMA方式:在中断驱动方式中,I/O设备与内存之间的数据交换必须要经过CPU中的寄存器,所以速度还是受限,而 DMA(直接存储器存取)方式是在I/O设备和内存之间开辟直接的数据交换通路,彻底“解放”CPU.
- 通道控制方式:I/O通道是指专门负责输入/输出的处理机,是DMA方式的扩展,把对一个数据块的读写为单位的干预,减少为对一组数据块的读写及有关控制和管理为单位的干预。同时实现CPU、通道和I/O设备并行操作。
中断技术的重要性:进程之间的切换是通过中断来完成的;中断也是设备管理的基础,为了提高处理机的利用率和实现CPU与I/O设备并行执行,也必需有中断的支持;中断处理程序是I/O子系统中最低的一层,它是整个I/O系统的基础。
DMA工作过程:CPU接收到 I/O 设备的 DMA 请求时,它给 I/O 控制器发出一条命令,启动 DMA 控制器,然后继续其他工作。CPU 就把控制操作委托给 DMA 控制器,由该控制器负责处理。DMA 控制器直接与存储器交互,传送整个数据块,每次传送一个字,这个过程不需要CPU参与。传送完成后,DMA 控制器发送一个中断信号给处理器。因此只有在传送开始和结束时才需要CPU的参与。
通道控制方式:当CPU 要完成一组相关的读(或写)操作及有关控制时,只需向I/O通道发送一条I/O指令,以给出其所要执行的通道程序的首地址和要访问的I/O设备,通道接到该指令后,执行通道程序便可完成CPU指定的I/O任务,数据传送结束时向CPU发中断请求。
DMA方式,CPU每发出一条I/O指令,只能完成一种I/O操作,然后被中断。 通道控制方式,CPU只需要发出一条I/O指令,就可以完成多种I/O操作,之后被中断。
3. I/O缓冲
- 特点:提高了I/O的速度,缓和了CPU与低速I/O设备速度不匹配的矛盾;利用高速共享设备,将独占设备改造为共享设备;实现了虚拟设备功能,用户都感到独占了一台设备
- 举例:将一台独享的打印机改造成可供多个用户共享的打印机。系统对于用户的打印输出,先在输出井申请一个空闲盘块区,并将要打印的数据送入其中,然后将此作业挂在打印队列上。若打印机空闲,输出程序从打印队列中取出作业,将要打印的数据从输出井传送到内存缓冲区,再进行打印。
根据系统设置缓冲器的个数,缓冲技术分为以下几种:单缓冲、双缓冲、循环缓冲、缓冲池
4. 端口和接口
接口是位于主存和外设之间的一种缓冲电路,包括了硬件电路和软件控制;而端口就是一组寄存器,对I/O设备的访问就是通过端口访问实现的,每个端口赋予了一个唯一的地址码,称为端口地址。
5. 中断响应优先级和中断处理优先级
中断响应优先级是由硬件排队线路或中断查询程序的查询顺序决定的,不可动态改变;
中断处理优先级可以由中断屏蔽字来改变,反映的是正在处理的中断是否比新发生的中断的处理优先级低。若是,则中止正在处理的中断,转到新中断去处理,处理完后再回到刚才被中止的中断继续处理。
6. 中断向量、向量地址、向量中断
- 每个中断源都有对应的处理程序,叫做中断服务程序,其入口地址称为中断向量。
- 所有中断的中断服务程序入口地址构成中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表。
- 有的机器把中断服务程序入口的跳转指令构成一张表,称为中断向量跳转表。
第六章 Linux
一、存储管理
1. Linux 内核简介
- 从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行访问
- 从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序中访问的最底层。内核抽象了硬件的相关细节
- 内核是一个资源管理程序。负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配到各个进程
- 内核像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。
- 用户空间:用户空间中又包含 用户的应用程序、C库
- 内核空间:内核空间包括 系统调用、内核、以及与平台架构相关的代码
- 用户空间和内核空间是程序执行的两种不同状态,通过“系统调用”和“硬件中断”来完成用户空间与内核空间的转移。
六、Shell
1. shell 概述
Shell是命令级语言。Shell程序全部由命令而不是语句组成,几乎所有的Shell 命令和 可执行程序都可用来编写Shell程序。
2. shell语法
未声明的变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的 形式存储,即使将整数和小数赋值给变量,它们也会被视为字符串。