一、概论
典型的操作系统
- 多道批处理:用户所提交的作业存放在外存上,排成一个后备队列,然后,由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享CPU和系统中的各种资源。
- 分时:在一台主机上连接多个带有显示器和键盘的终端,同时允许多个用户通过自己的终端,以交互方式使用计算机,共享主机中的资源。
- 实时:系统能即时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致的运行。
操作系统的概念
- 作为扩展机器
- 作为资源管理者
二、进程与线程
什么是进程
- 进程是指一个具有独立功能的程序在某个数据集合上的一次动态执行过程,它是操作系统进行资源分配和调度的基本单元。
什么是线程
- 线程是进程上下文中执行的代码序列,也称为轻量级的进程。
进程与线程的区别与联系
- 线程是轻量级进程,一个进程可以由很多个线程组成
- 调度:在传统的操作系统中,CPU调度和分派的基本单位是进程。在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位。同一进程中线程切换不会引起进程切换,进程间的线程切换会引起进程切换。
- 并发性:进程和进程之间,进程的线程之间都可以并发执行,线程的并发性大于进程。
- 拥有资源:进程是拥有系统资源的独立单位,线程不能拥有系统资源,但是可以访问其隶属进程的资源。
- 系统开销:进程创建、切换和撤销会产生系统开销,线程的创建和切换不会产生系统开销。
进程与程序的区别
- 程序是一段静态的代码,进程是一个动态的概念,是程序的一次执行过程,包括动态创建、调度、执行和消亡的整个过程,它是程序执行和资源管理的最小单位。
- 程序是指令和数据的有序集合,进程不但包括程序的指令和数据,而且包括程序计数器和处理器的所有寄存器以及存储临时数据的进程堆栈。
进程的三种状态及转换
- 就绪(ready)状态:进程已分配到需要的资源后,只要再获得CPU,便可立即执行。
- 运行(running)状态:进行已经获得CPU,程序正在执行。
- 阻塞(blocked)状态:进程的执行受到阻塞而暂停,把这种暂停状态称为阻塞状态。
(1)运行-阻塞:进行因为要等待某种事件发生而无法继续执行
(2)运行-就绪:时间片用完,或者被优先级更高的进程打断
(3)阻塞-就绪:等待的事件发生(I/O操作等)
(4)就绪-运行:调度程序选中进程
进程间两种制约关系:互斥与同步
- 互斥(间接相互制约关系):由于各进程要求共享资源,而有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥。
- 同步(直接相互制约关系):一些进程需要相互合作,共同完成一项任务。
进程的通信方式
- 管道:数据只能单项流动,并且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是父子进程
- 普通管道:只能单向传输,只能在父子进程间使用
- 流管道:可以双向传输,只能在父子进程间使用
- 命名管道:可以双向传输,可以在不相关的进程间使用
- 系统IPC(包括消息队列、信号量、共享内存)
- 消息队列:用于两个进程之间的通信,在一个进程中创建消息队列,然后往消息队列中写数据,另一个进程从消息队列中取数据。(如果一个进程向消息队列中写入了数据之后,另一个进程没有取出数据,即使写数据的进程已经结束,保存在消息队列中的数据并没有消失,下次再从这个消息队列读数据的时候,还是上次的数据。)
- 信号量:只能用来同步
- 共享内存:创建一个共享内存区,其它进程就能访问到这个共享内存区中的数据,可读可写
- 套接字socket:用于不同进程间的进程通信。
线程同步方式
- 互斥锁:在访问共享资源时,对互斥量加锁,访问完成后释放锁。对互斥量加锁以后,其他任何试图对互斥量再次加锁的线程会被阻塞,直至当前线程释放互斥锁。
- 信号量:允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 条件变量:用来自动阻塞一个线程,直到某特殊情况发生为止。主要包括两个动作:一个线程等待条件变量的条件成立而挂起;另一个线程使条件成立。条件变量和互斥锁一起使用。
信号量、PV操作
- 信号量是一种特殊的变量,是解决进程同步的工具。只允许对它进行两个操作,P操作和V操作。
- P操作:wait,将信号量S的值减1
- 当信号量的值 >=0 时,进程继续执行
- 当信号量的值 <0 时,进程进入等待状态,进入等待队列。
- V操作:signal,将信号量S的值加1
- 当信号量的值 >0 时,进程继续执行
- 当信号量的值 <=0 时,将第一个等待进程唤醒。
临界资源与临界区
- 临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享资源。
- 每个进程中访问临界资源的那段代码称为临界区。
- 多个进程涉及到同一个临界资源的的临界区称为相关临界区。
进程调度算法
- 先来先服务(FCFS):总是选择最先进入队列的进程。
- 最短剩余时间优先(SRT):总是选择预期剩余时间最短的进程。
- 最短进程优先(SPN):总是选择所需处理时间最短的进程。
- 高响应比优先(HRRN):总是选择响应比最高的进程。
- 响应比=(等待时间+服务时间)/(服务时间)
- 时间片轮转(RR):以一个周期性产生中断,当前运行的程序置于就绪队列队尾,基于先来先服务选择下一个就绪进程运行。
- 多级反馈队列:
- 设置多个就绪队列,并为各个队列赋予不同的优先级,第一个队列的优先级最高。
- 当新进程进入内存后,将它放入第一个队列的末尾,按先来先服务原则排队等待调度。
- 当一个长作业从第一个队列一次降到第n个队列后,在第n队列中便采取按时间片轮转的方式运行。
- 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。
缓冲区溢出
- 指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
- 危害:
- 程序崩溃,拒绝服务
- 跳转并且执行一段恶意代码
- 原因:程序中没有仔细检查用户输入
三、死锁
死锁
指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
产生原因
(1)竞争资源:系统中所拥有的资源数量不足以满足进程运行的需要,使得在运行过程中,因争夺资源而陷入僵局
(2)进程间推进顺序非法:进程在运行过程中,申请和释放的顺序不合法
产生死锁的必要条件
- 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用
- 请求和保持条件(Hold and wait):进程在请求其余资源时,不主动释放已经占用的资源
- 不剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺
- 环路等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源
死锁避免——银行家算法
- 每个线程进入系统时,必须声明在运行过程中,所需的每种资源类型最大数目,数目不应超过系统所拥有每种资源总量
- 当线程请求一组资源系统必须确定有足够资源分配给该进程
- 若能在分配资源时找到一个安全序列,则将资源分配给它,否则等待
四、内存管理
存储管理的功能
- 内存的分配和回收::由操作系统完成主存储器空间的分配和管理,无需人工操作,提高编程效率。
- 提高内存的利用:使用内存管理,能够提高内存的利用率
- 扩充内存大小:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
- 存储保护:保证各道作业在各自的存储空间内运行,互不干扰;同时充分利用内存空间,共享内存中存放的信息
- 地址变换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址
逻辑地址
- 由程序产生的与段相关的偏移地址部分。
物理地址
- 在存储器里以字节为单位存储信息,为正确地存放或取得信息,每个字节单元有一个唯一的存储器地址,称为物理地址。
- 物理地址又叫绝对地址、实地址。
存储的层次结构
- CPU寄存器register
- 高速缓存cache
- 主存
- 辅存
重定位
- 静态重定位是在程序装入内存的同时,就一次性将逻辑地址转换成物理地址
- 动态重定位是在程序执行过程中,每当执行指令或访问数据时,将要用到的逻辑地址转换成物理地址
内存覆盖
- 指同一主存区可以被不同的程序段重复使用
- 作业在一次运行时,让不会同时执行的程序段共用一个主存区
内存交换
- 系统根据需要把主存中暂时不允许的某个或某些作业部分或全部移到辅存,而把辅存中的某个或某些作业移到相应的主存区,并使其投入运行。
虚拟存储器
- 当一个作业程序的地址空间比主存可用空间大时
- 操作系统将这个程序的地址空间的一部分放入主存内,其余部分放在辅存上
- 当访问的信息不在主存时,再由操作系统负责调入所需要的部分
- 计算机系统好像为用户提供了一个比实际主存大得多的存储空间,这样的技术叫做虚拟存储器
内存管理的方式
- 单一连续分配
- 固定分区
- 可变分区
- 页式存储管理
- 段式存储管理
单一连续分配
- 指主存中只有一个用户作业,把程序装入主存之后,占据全部存储空间和资源。
- 优点:简单、无外碎片,可以釆用覆盖技术,不需要额外的技术支持
- 缺点:只能用于单用户、单任务的操作系统中,有内碎片,存储器的利用率低
固定分区
- 将内存划分成若干个固定大小的块,将程序装入块中。
- 程序可能太大而放不进任何一个分区中,需要使用覆盖技术来使用内存空间
- 主存利用率低,有内碎片。
可变分区
- 在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。
- 有外碎片
- 首次适应(First Fit)算法:给进程分配大小能满足要求的第一个空闲分区
- 最佳适应(Best Fit)算法:给进程分配分区大小相差最小的空闲分区。
- 最坏适应(Worst Fit)算法:给进程分配最大的分区
- 邻近适应(Next Fit)算法:分配内存时从上次查找结束的位置开始继续查找,分配能满足要求的第一个空闲分区
页式存储管理
- 页:将一个进程的逻辑地址空间分成若干个大小相等的片,称为页。分为页号(高位)、页内偏移(页内地址)。
- CPU每存取一个数据时,需要两次访问主存。一次是访问页表项的物理地址,得到了数据的物理块地址。第二次拿着物理块地址去取数据。
- 页表:作用是实现从页号到物理块号的地址映射。
- CPU每存取一个数据时,需要两次访问主存。一次是访问页表项的物理地址,得到了数据的物理块地址。第二次拿着物理块地址去取数据。
(1)基本思想
- 将进程的逻辑地址空间分成若干大小相等的页面
- 同时,也将物理内存分成相等大小的页面
- 可将用户程序的任一页放在内存的任一块中,实现了离散分配
(2)地址变换(逻辑地址->物理地址)
- 根据页面大小可计算出页内地址的位数k
- 页内地址为低k为,页号为高16-k位
- 根据页号,在页表中找到对应的块号
- 块号和块内地址进行拼接,即可得出物理地址
例:逻辑地址0A5C(H),二进制为:000 1010 0101 1100
页面为1KB,1KB=210,所以页内地址为10位,页号6位
0000 10为页号,10 0101 1100为页内地址
查页表,得到块号是4,即 0001 00
拼块号和块内地址,物理地址为:0001 0010 0101 1100,即125C(H)。
(3)缺页中断
- 要访问的页不再内存中, 需要从外存中调入内存才可访问
(4)页面淘汰算法
- 最佳置换算法(OPT):选择以后永不使用的,或在未来不再被访问的页面作为淘汰的页面。(无法预知)
- 先进先出置换算法(FIFO):总是淘汰最先进入内存的页面,即选择在内存中驻留时间最长的页面淘汰。(与实际运行规律不符,产生抖动)
- 最近最久未使用置换算法(LRU):选择最近一段时间内最长时间未被使用的页面淘汰。(增加硬件成本)
- Clock置换算法 / 最近未用算法(NRU):LRU的变形(算法开销较大)
- 为每页设置一位访问位,将内存中的所有页面都通过链接指针链接成一个循环队列
- 当某页被访问时,其访问位被置1
- 在选择页面淘汰时,检查页的访问位,如果是0,就选择该页换出;若为1,则重新将它置为0,暂时不换出,给该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面
- 当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面
- 最少使用置换算法(LFU):为每个页面配置一个计数器,页被访问,将计数器的值加1,在需要选择一页置换时,选择计数器值最小的页面,即内存中访问次数最少的页面淘汰。
段式存储管理
- 段:将用户作业的逻辑地址空间划分成若干个大小不等的段。分为段号(高位)、段内偏移(段内地址)。
- 段表:记录了段与内存位置的对应关系,保存在内存中。
(1)基本思想
- 将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息
- 存储分配时,以段为单位,段与段在内存中可以不相邻接,实现了离散分配
(2)地址变换(逻辑地址->物理地址)
- 根据逻辑地址,获知段号和段内地址
- 在段表中,找到段号对应的段长和内存起始地址
- 若段内地址 > 段长,则为非法段
- 若段内地址 <= 段长,物理地址=段内地址+内存起始地址
例:逻辑地址为 0 430
段号为0,段内地址为430
查段表,得到段长为500,内存起始地址为210
430 < 500,物理地址为:430+210=640
例:逻辑地址为 2 120
段号为2,段内地址为120
查段表,得到段长为90,内存起始地址为100
120 > 90,非法段
分页和分段的区别
- 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外碎片,提高内存的利用率,有利于系统管理,但不利于满足用户的需要。段是信息的逻辑单位,它含有一组其意义相对完整的信息,能满足用户的需要。
- 页的大小固定且由系统确定,一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序。
- 分页的作业地址空间是一维的,即单一的线性空间,只须利用一个记忆符,即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
内碎片、外碎片
- 内碎片:已经被分配出去,但不能被利用的内存空间
- 外碎片:没有被分配出去,但由于太小无法分配的内存空闲区域。
五、文件管理
文件
- 文件是记录在外存上的相关信息的具有名称的集合。
文件系统及其功能
- 文件系统包含文件和目录
文件的共享
- 符号链接
- 硬链接
文件的结构和存取方法
- 文件的逻辑结构
- 文件的物理结构(连续存储、链式、索引)
目录的实现方法
- 目录是一个包含若干文件属性信息的节点的集合
磁盘配额、文件备份策略(增量备份、差异备份)
虚拟文件系统
空闲块的管理
- 位图
- 链表
文件的备份
LVM
- 优点
- 物理卷
- 逻辑卷
- 卷组
RAID(Redundant Arrays of Independent Drives)独立磁盘冗余阵列
- 把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术。
- 增强数据的可靠性和可用性
六、输入输出
DMA
组成:CPU,内存,DMA控制器
- DMA控制器:主机与DMA控制器的接口;DMA控制器域块设备的接口;I/O控制逻辑;命令/状态寄存器CR;内存地址寄存器MAR;数据寄存器DR;数据计数器DC
工作原理:
- 当CPU需要读/写一整块数据时,给DMA发送一条命令,包含:一次读或写的指令、I/O设备的地址、开始读或写的主存地址、需要传送的数据长度等
- CPU发送完命令后就可处理其它事情
- DMA独立管理整块数据的传送
- 数据传输完成后,向CPU发一个中断请求
I/O软件层次结构
五层,从底到高依次:
- 硬件:I/O设备
- 中断处理程序:用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完后恢复现场,并返回到被中断的进程
- 设备驱动程序:与硬件直接有关,用来具体实现系统对设备发出的操作指令,驱动I/O设备工作
- 设备独立性软件:用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护,以及设备分配与释放等。
- 用户层I/O软件:用于实现用户与I/O设备交互
单缓冲,双缓冲
- 假定从磁盘把一块数据输入到缓冲区的时间为T
- 操作系统将该缓冲区中的数据传送到用户区的时间为M
- CPU对这一块数据处理的时间为C
单缓冲:
- 由于T和C是可以并行的
- 当T>C时,系统对每一块数据的处理时间为M+T,反之则为M+C
- 故可把系统对每一块数据的处理时间表示为max(C, T)+M
双缓冲:
- 系统处理一块数据的时间可以粗略地认为是max(C, T)
- 如果C < T,可使块设备连续输入(图中所示情况)
- 如果C > T,则可使CPU不必等待设备输入
区别:
- 双缓冲:用户在输入完第一行之后,在CPU执行第一行中的命令的同时,可继续向第二缓冲区输入下一行数据
- 单缓冲:必须等待一行数据被提取完毕才可输入下一行的数据。
磁盘臂调度算法
- 先来先服务(FCFS):根据进程请求访问磁盘的先后次序进行调度
- 最短寻道时间优先(SSFT):先调度访问的磁道与当前磁头所在的磁道距离最近,即寻道时间最短的进程
- 扫描算法 / 电梯算法(SCAN):先调度磁道与当前磁道间的距离最近,并且磁头的移动方向与当前方向相同的进程