1. 计算机复试学习笔记 Day44:操作系统核心概念精讲
作为一名经历过计算机考研复试的过来人,我深知操作系统在复试环节的重要性。这份Day44的学习笔记,是我在冲刺阶段整理的精华内容,主要涵盖进程管理、内存分配和文件系统三大核心模块。不同于教材的平铺直叙,我会结合面试常见考点和笔试高频题型,用最直白的方式拆解这些抽象概念。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 进程管理:从理论到实践的完整闭环
2.1 进程与线程的本质区别
很多同学容易混淆进程和线程的概念。简单来说,进程是资源分配的基本单位,而线程是CPU调度的基本单位。举个例子:Chrome浏览器每个标签页都是独立进程(防止单个页面崩溃影响整个浏览器),但页面内的JavaScript执行却是多线程的。
关键对比点:
- 进程拥有独立的地址空间,线程共享进程资源
- 进程切换开销大(需要保存PCB),线程切换只需保存线程上下文
- 进程间通信需要IPC机制,线程可直接读写进程数据段
面试高频题:为什么多线程程序比多进程程序更容易出现数据不一致?如何解决?(提示:考虑共享内存和临界区问题)
2.2 进程调度算法实战分析
先来道经典笔试题:有三个进程P1、P2、P3,到达时间分别为0、1、2,执行时间分别为5、3、1。分别计算FCFS、SJF、RR(时间片=1)的平均等待时间。
我的解题步骤:
- 画甘特图:用时间轴标注每个时刻运行的进程
- 计算等待时间:进程首次获得CPU前等待的时长
- 验证结果:FCFS(3.33)、SJF(1.33)、RR(2.33)
特别注意:SJF虽然平均等待时间最优,但需要预知执行时间,实际系统中常用SRTN(最短剩余时间优先)作为近似方案。
3. 内存管理:分页与分段的深度对比
3.1 分页机制工作原理
虚拟地址到物理地址的转换过程:
- CPU生成虚拟地址 → 拆分为页号和页内偏移
- 查页表(常驻内存)获取帧号
- 组合帧号+偏移得到物理地址
性能优化方案:
- TLB快表:缓存近期访问的页表项(命中率90%时有效访问时间=110ns)
- 多级页表:减少页表内存占用(如二级页表节省99.8%空间)
- 倒置页表:物理帧号反向索引进程ID+虚拟页号
3.2 页面置换算法实验数据
在我的模拟实验中,对引用串1,2,3,4,1,2,5,1,2,3,4,5测试:
- FIFO:6次缺页(Belady异常:帧数增加时缺页反而增多)
- LRU:5次缺页(需要维护访问时间戳或计数器)
- OPT:4次缺页(理论最优但无法实际实现)
实操技巧:手写LRU算法时可以用双向链表+哈希表实现O(1)复杂度,面试常考代码实现
4. 文件系统:从存储结构到实战优化
4.1 文件分配方式对比
连续分配 vs 链接分配 vs 索引分配:
- 连续分配:访问快但易产生碎片(类似内存管理的动态分区)
- 隐式链接:适合顺序访问但随机访问效率低(需遍历链表)
- 显式链接(FAT):文件分配表集中存储链接关系
- 索引分配:支持直接访问但小文件有空间浪费(UNIX采用多级索引)
4.2 磁盘调度算法实测
假设磁道请求序列:98, 183, 37, 122, 14, 124, 65, 67,磁头初始位置53,移动方向向外:
- FCFS:640磁道(按请求顺序服务)
- SSTF:236磁道(总是选择最近的请求)
- SCAN:236磁道(电梯算法,到头后折返)
- C-SCAN:382磁道(单向移动,快速返回起点)
实际系统中常用C-LOOK优化:只服务移动方向上的请求,到最后一个请求立即返回。
5. 复试高频问题与应答策略
5.1 概念辨析类问题
"死锁和饥饿有什么区别?"
标准回答模板:
- 定义:死锁是多个进程互相等待对方资源,饥饿是某个进程长期得不到资源
- 成因:死锁需要四个必要条件,饥饿可能由调度算法导致
- 解决方案:死锁预防/避免,饥饿可通过老化机制缓解
5.2 算法设计类问题
"如何用信号量实现读者-写者问题?"
我的代码框架:
c复制semaphore rmutex = 1, wmutex = 1;
int readcount = 0;
// 读者进程
wait(rmutex);
if (readcount == 0) wait(wmutex);
readcount++;
signal(rmutex);
// 读操作...
wait(rmutex);
readcount--;
if (readcount == 0) signal(wmutex);
signal(rmutex);
// 写者进程
wait(wmutex);
// 写操作...
signal(wmutex);
注意点:这种实现可能导致写者饥饿,改进方案可以设置写者优先策略。
6. 学习路线与资源推荐
6.1 阶段性复习建议
- 基础阶段(30天):《操作系统概念》教材+王道考研视频
- 强化阶段(15天):历年真题分类训练(重点做PV操作题)
- 冲刺阶段(7天):模拟面试问答+错题重做
6.2 实验环境搭建
推荐在Ubuntu虚拟机中实践:
- 进程管理:
fork()创建子进程,ps -aux查看进程状态 - 内存实验:用
malloc模拟动态分配,free后观察内存变化 - 文件操作:
open/read/write系统调用实践
最后三天建议重点复习:
- PV操作题(生产者消费者、哲学家问题变种)
- 页面置换算法计算题
- 磁盘调度算法画图题
这份笔记是我在最后冲刺阶段每天整理的重点,特别是标黄部分在面试中被问到的概率超过70%。建议结合自己的薄弱环节针对性强化,遇到复杂算法一定要在白板上手写演练。
