虚拟化 CPU
进程 API
受限直接执行
设置陷阱表,硬件先保存到内核栈,然后陷入高权限执行。
利用时间中断使 os 总是获得硬件控制权,如果要切换上下文就将当前进程保存在 PCB 中,看起来就像是刚刚从系统中断返回 B 一样(从 A→B)。
进程调度
STCF(Shortest Time Completed First)+RR(Round Robin)轮询=周转时间+响应时间。
多级反馈队列
MLFQ(Multi-Level Feedback Queue)
- 规则 1:如果 A 的优先级 > B 的优先级,运行 A(不运行 B)。
- 规则 2:如果 A 的优先级 = B 的优先级,轮转运行 A 和 B。
- 规则 3:工作进入系统时,放在最高优先级(最上层队列)。
- 规则 4:一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次
- CPU),就降低其优先级(移入低一级队列)。
- 规则 5:经过一段时间 S,就将系统中所有工作重新加入最高优先级队列。
比例份额
彩票调度和步长调度。
多处理器调度
虚拟化内存
分段
地址转换:硬件上使用基址+偏移。
分段:将代码/数据/栈/堆分开,除了“显式”的指明段基址(比如 01 表示栈基址),还可以“隐式”的表明(比如 ret 指令的相对偏移地址计算,就是直接用代码段的偏移来计算的,不用查基址)
空闲空间管理:分离空闲列表(厚块分配 slab,给小内存对号入座减少内部碎片),伙伴系统(每次二分,导致地址只有一位不同,很好查询并合并)。
分页
分页的问题:太慢(TLB 缓存)/太大(多级页表,用页目录来套娃寻找)(但是会引入额外内存开销)
磁盘
交换空间/替换策略(比如 LRU:least recent use)
写时复刻
并发
临界区(访问共享资源的一段代码)
竞态条件(多个线程同时进入临界区,试图更新数据)