课程概要
- 基本概念及原理
- 操作系统介绍
- 中断及系统调用
- 内存管理
- 进程及线程
- 调度
- 同步
- 文件系统
- I/O子系统
1. 基本概念
- 操作系统是控制软件,管理应用程序,为应用程序提供服务,杀死应用程序,分配资源,管理外设
- 抽象:CPU - 进程,内存 - 地址空间,磁盘 - 文件
- OS分为Shell(界面)和Kernel(内核)
- 并发(concurrent,交替运行) vs 并行(parallel,同时运行)
- 实例:UNIX BSD,LINUX,WIN
2. 启动、系统调用、异常、中断
- 启动过程:BIOS检测外设,加载BootLoader,再由BootLoader加载OS
- 系统调用:应用程序向OS发出请求
- 异常:应用程序发生异常,需要OS处理
- 中断:外设发出请求
- 系统调用之上有API供应用程序调用:Win32 API,POSIX API(UNIX LINUX Mac OS)
- CPU不同状态:用户态 内核态
3. 内存管理
- CPU:运算器、控制器、Register、Cache、MMU
- 内存管理能够实现:物理存储抽象为逻辑地址空间,保护各程序各自内存空间,程序间共享内存,虚拟化 - 暂时不用的数据移动到磁盘
- 程序经过编译、汇编、链接、载入对应到逻辑地址
- 连续内存分配、内存碎片(外碎片 - 程序之间、内碎片 - 程序之内)
- 首次适配、最优适配、最差适配
- 内存碎片整理:压缩式(移动空闲内存)、交换式(暂时不用的数据移动到磁盘)
4. 非连续内存分配
- 解决碎片问题,提高内存利用率
- 分段segment:内存块大小可变
- 内存地址表示为(segment number, offset)
- 段表:段号 - 基址,长度
- 分页page:内存块大小固定(帧)
- 物理地址:(frame number, offset)
- 逻辑地址:(page number, offset)
- 页表:page - frame
- 解决页表过大:
- TLB(Translation Lookaside Buffer)用于缓存常用地址
- 多级页表
- 反向页表:frame - page
- 反向页表的实现:页寄存器、关联内存、hash table
5. 虚拟内存
- 缓解内存不足
- 覆盖技术(overlay),常用程序模块独占常驻内存,不常用程序模块分时共享内存,但需要程序员设计覆盖关系,增加了程序设计复杂度,并且有从硬盘读写模块的开销,粒度是程序模块
- 交换技术(swapping),由OS执行换入换出,以程序为单位,内存可能不足时进行内存和硬盘间数据交换,粒度是程序
- 虚拟内存,由OS执行,程序设计需要有局部性(指令和数据访问在时间和空间上较为集中),低粒度,以页为单位,按需从硬盘调入程序和数据
- 有效存储访问时间(effective memory access time, EAT)
- 数据结构,通过页表实现:
- 驻留位(resident bit, 1表示在内存中,0表示在硬盘中)
- 保护位(设置权限,包括只读、读写、可执行等)
- 修改位(dirty bit, 数据是否被修改过,换出时是否需要写回硬盘)
- 访问位(access/used bit, 是否被访问,长时间未访问的数据在内存不足时优先被换出)
- 锁定位(lock bit, 标记需要常驻内存的数据,如OS进程和对时间敏感的进程) - 算法,在页表中查找所需数据的物理地址,如存在则直接读取;如不存在,先判断是否有空余内存,如无,先换出内存上的数据(未被修改直接free,被修改过则写回硬盘),再从硬盘读取数据
6. 页面置换算法
- 物理内存不足时,需要换出内存中的数据
- 置换算法选择将哪些数据换出,目标是尽可能减少换入换出
- 最优页面置换算法,换出未来等待最长时间才会被访问的数据,是一种理想情况,作为其他评价其他算法的标杆
- 先进先出算法(FIFO),换出在内存中存在时间最长的数据,但存在时间久的数据有可能会被频繁访问,导致缺页较多,造成Belady现象
- 最近最久未使用算法(Least Recently Used, LRU),换出距离上一次被访问间隔时间最久的数据,缺页较少,但需要记录每个数据的访问时间,开销较大
- 时钟算法(Clock),在环形链表中记录frame的access bit,数据被访问时bit置为1,所有bit定期归零。发生缺页时,在环形链表中寻找access bit为0的frame,若为1则置为0,若为0则换出。相当于近似的LRU,缺页次数稍大,但节省空间
- 二次机会算法,改进clock,(access bit, dirty bit) :
- (1, 1) -> (0, 1) -> (0, 0)
- (1, 0) -> (0, 0)
- 换出(0, 0),被修改过的frame换出开销大,指针经过两次才变为(0, 0)
- 最不常用算法(Least Frequently Used, LFU),将访问次数最少的数据换出
- Belady现象,分配更多物理内存,缺页反而更多的现象,如FIFO
- 全局页面置换算法
- 实现全局动态分配各个程序的内存,保持平衡,效果好于局部算法
- 工作集模型,W(t, Δ),t时刻往前Δ时间段(窗口)内,page的集合,集合size越小,程序局部性越好
- 工作集页置换算法,固定窗口大小,随着时间窗口移动,换出窗口外的页,换出最久未访问的页,限制每个程序的可用内存
- 缺页率页置换算法(Page Fault Frequency, PFF),用缺页发生的时间间隔评价缺页率,间隔短说明内存不足,加载页,间隔长说明内存过多,换出未访问的页
- 抖动(thrashing),内存严重不足时,大量时间耗费在换入换出操作上,程序运行效率大大降低的现象
7. 进程
- 进程(Process)
- 定义:程序的一次执行过程
- 为了支持运行多个程序、多个实例而生
- 记录程序的所有状态信息,包含代码、数据、程