这几周我把散落在备忘录、网盘和纸质本子里的操作系统笔记全部重新过了一遍,顺便把复习阶段踩过的坑、整理过的知识点、实际动手操作过的环境配置都补了进去。这份笔记最早是为了应付期末,后来慢慢变成了我理解“电脑到底是怎么跑起来的”的重要资料。如果你正在学操作系统、准备考研408,或者工作中总要跟虚拟机、服务器系统打交道,这份从底层概念到实操排障的笔记整理思路,应该能帮你省下不少时间。
1. 画完这张知识骨架,操作系统笔记才真正开始“长”在自己脑子里
1.1 为什么我先把整体框架画出来而不是直接抄ppt
第一次复习操作系统的时候,我犯过很蠢的错误:拿起书本就从第一章笨拙地抄概念,花了一周时间抄完,合上本子发现脑子里什么都没留下。后来我一个考过研的学长点了我一句:操作系统这门课,知识点之间不是线性的,是环环相扣的。你抄一章pV操作的时候,如果不理解进程调度,不理解内存分配,根本不知道信号量到底解决的是什么问题。
后来我学乖了,第一件事不是抄书,而是在一张A3纸上把所有章节之间的关系画成一张大图。我的框架大概是这样的:
- 硬件之上:CPU怎么管理(进程与线程、调度算法)
- 内存怎么分配(内存管理、虚拟内存、页面置换)
- 文件怎么存(文件系统、磁盘管理)
- 设备怎么用(I/O系统、中断、驱动)
- 用户怎么跟系统对话(系统调用、shell)
这张图画完之后,再去看课本,思路就清晰了。我不再是“孤零零地背知识点”,而是把每个知识点放回它原本的位置。比如看到“进程”这个概念,我能立刻想到它是“CPU管理的核心单位”,然后自然而然联想到线程、协程、调度、上下文切换、进程同步与互斥,这一条线下来,笔记的结构感就出来了。
1.2 五大核心板块怎么串在一起记
我最后整理出来的笔记主体分成了五大板块,分别是“进程管理”、“内存管理”、“文件管理”、“设备管理”和“操作系统接口与启动”。
这五个板块不是并列的,它们之间有一个很自然的逻辑链:程序要跑起来,必须先被加载进内存,加载进来就要安排CPU跑它,跑的过程需要访问文件和设备,整个过程中用户总要有一个“入口”来要求系统干事情,这个入口就是系统调用。所以我的笔记顺序是“接口→进程→内存→文件→设备→启动”,而不是按课本的顺序死记。
举一个实际操作中的体会:配置服务器的时候,如果发现某个服务起不来,我第一反应不是去看日志,而是先看内存够不够、进程是不是被杀掉了、文件权限有没有问题。这一套排查思路,其实就是操作系统五大板块在实际场景中的应用。系统性的笔记框架能帮你培养这种“整体视角”,而不是头痛医头脚痛医脚。
2. 最容易丢分的几个点:管程、协程、进程和线程的区别
2.1 进程、线程、协程到底差在哪
操作系统笔记里,进程、线程、协程是最基础也最容易考的内容。很多同学背概念很熟,但一遇到实际场景就分不清。
我用一句话帮助自己记忆:进程是操作系统分配资源的基本单位,线程是CPU调度的基本单位,协程是用户态自己管理并发的基本单位。
进程有自己独立的地址空间,一个进程崩了不影响另一个进程,但代价是进程切换开销大。线程共享进程的地址空间,创建和切换成本低很多,但一个线程崩了可能拖垮整个进程。协程更轻量,它完全由用户程序自己调度,不涉及内核态切换,所以特别适合高并发场景。
我自己在做笔记的时候,列过一张对比表,后来复习时才发现这张表的价值:
| 维度 | 进程 | 线程 | 协程 |
|---|---|---|---|
| 资源拥有者 | 拥有独立地址空间 | 共享进程资源 | 共享线程资源 |
| 调度方式 | 内核调度 | 内核调度 | 用户态调度 |
| 切换开销 | 大 | 中 | 小 |
| 独立性 | 高 | 中 | 低 |
| 适用场景 | 多任务隔离 | 多线程并发 | 高并发I/O |
实际写代码的时候,我对这三者的感受更深。用多进程写爬虫,稳是真稳,但内存消耗大;用多线程写文件下载,共享队列很方便,但要注意锁的问题;用协程写网络请求,能够用单线程支撑几千个并发连接,资源占用极小。这些经历反过来帮我理解了课本里的理论:不同并发模型,本质上是对操作系统资源的权衡管理。
2.2 管程为什么比信号量更“省心”
热词里有“计算机操作系统管程和协程”,可见很多同学在这里卡住了。管程这个概念,我第一次看教材的时候完全没看懂,后来结合Java的synchronized才恍然大悟。
信号量是操作系统提供的原语,用P、V操作(wait/signal)来控制资源的申请和释放。问题在于,程序员必须自己保证P、V成对出现,一旦少写一个V,其他进程就会一直阻塞,这种错误非常难排查。
管程把它封装起来了。你可以把管程理解成一个“带锁的房间”,每次只允许一个进程进入房间执行操作。房间里的共享变量和操作这些变量的函数,都被包在里面,进入房间的时候自动加锁,离开的时候自动解锁。程序员不需要自己手动写wait和signal,只要调用管程提供的接口就行。
日常开发里的Java synchronized关键字、Python的threading.Lock,本质上都带有管程思想。理解了管程再回头看信号量,你会觉得信号量更底层、更灵活,管程更安全、更不容易出错。考试的时候如果问你“信号量和管程有什么区别”,别只回答“一个手动一个自动”,要补充一点:管程引入了条件变量,可以更方便地解决等待/唤醒机制的问题,这是它比信号量先进的地方。
3. 从按下电源键到进入桌面:操作系统的引导全流程
3.1 中断向量表的建立和BIOS通电自检,到底谁先谁后
热门搜索里有“在操作系统的引导中中断向量表的建立和bios的通电自检有先后顺序吗”,这个问题我在笔记里专门写了一页。
先说结论:BIOS的通电自检(POST)在前,中断向量表的建立(加载)在后。原因很简单:计算机刚通电的时候,CPU会从一个固定地址取第一条指令,这个地址在x86体系里就是BIOS的入口。BIOS先要做最基本的硬件自检,比如检查内存条、显卡、键盘这些设备是否存在且工作正常。
自检通过后,BIOS才负责把引导程序(bootloader)从硬盘、U盘或者光驱里读进内存,然后跳转过去执行。引导程序再把操作系统内核加载到内存中,内核开始运行以后,才会动手建立中断向量表。中断向量表本质上是内核建立的一张“中断处理程序登记表”,告诉CPU每个中断号都对应哪段处理代码。这个过程发生在内核启动阶段,远在BIOS自检之后。
我在笔记里画了一条时间线:
- 按下电源键
- CPU跳到BIOS入口地址
- BIOS执行POST自检
- BIOS按启动顺序查找可引导设备
- 从引导设备读取引导程序(如GRUB)
- GRUB加载内核到内存
- 内核初始化,建立中断向量表
- 内核挂载根文件系统,启动init进程
- 进入桌面或终端
这条时间线除了应付考试,实际排障也很有用。比如电脑开机黑屏无反应,可以先判断是电源问题还是主板问题;如果屏幕上有一行英文提示找不到引导设备,那就是硬盘引导扇区或者BIOS启动顺序出了问题,跟系统内部故障是两回事。
3.2 虚拟机里“找不到操作系统”和“客户机操作系统已禁用CPU”是怎么回事
很多人在使用VMware的时候会遇到两个提示。一个是“找不到操作系统”,另一个是“客户机操作系统已禁用CPU。请关闭或重置虚拟机”。这两个都是引导阶段的问题,正好可以用来检验操作系统引导知识的掌握程度。
“找不到操作系统”通常有三种原因:第一,ISO镜像文件没有正确挂载到虚拟光驱里;第二,虚拟机的启动顺序里光驱排在硬盘后面,而硬盘上又没有引导记录;第三,ISO镜像本身已经损坏,不是可引导镜像。解决方法是进入虚拟机的BIOS设置,把启动顺序改成“光驱优先”,然后重新挂载镜像。还有一个不太容易想到的原因:镜像位子写错了,把VMware的镜像文件路径指到了别的目录,导致虚拟机读不到文件。
至于“客户机操作系统已禁用CPU”,这个提示我最早看到时一头雾水。后来查了资料才明白,VMware虚拟机为了兼容不同平台,默认会让CPU暴露某些硬件虚拟化特性。如果你在物理机上开启了Hyper-V,或者开启了内核隔离功能,虚拟机里的操作系统就感知不到这些特性了,于是报错“CPU被禁用”。解决方法是关闭Windows的内核隔离相关功能,或者在VMware里把CPU的“虚拟化引擎”选项关掉再重新安装系统。
顺带提一句,VMware Tools装不上也是一个经典问题。新版VMware对老旧操作系统的支持在收窄,比如Windows 10以下版本可能收不到对应Tools更新,这时候可以去官方下载一个兼容版本的VMware Tools安装包,而不必硬用虚拟机软件自带的那个。这个问题在热词“VMware Tools 不再随旧版客户机操作系统的VMware Workstation一起提供”里已经提到了,属于官方更新导致的已知情况。
4. 实操型笔记:从系统安装到日常配置的环境搭建记录
4.1 手动安装虚拟机和系统的完整流程
如果虚拟机装不上系统,或者不知道从哪里下手,我把最稳的一套流程整理在这里,基本能覆盖大部分场景。
第一步,下载对应系统的ISO镜像。Windows系统可以用官方Media Creation Tool,Linux系统去各发行版官网下。注意下完以后核对一下SHA256校验值,避免镜像被篡改或下载不完整。
第二步,创建虚拟机。CPU核心数和内存大小按实际需求分配,比如2核4G可以跑轻量Linux桌面,4核8G可以跑Windows Server或带图形界面的麒麟系统。硬盘建议用“动态分配”,先用多大占多大,避免一开始就占满物理磁盘。
第三步,挂载镜像并设置启动顺序。在虚拟机设置里把CD/DVD指向ISO,然后进入虚拟机的固件(BIOS/UEFI),把光驱启动排到第一位。如果用的是UEFI启动,要确保镜像支持UEFI引导,否则会出现“找不到引导设备”的问题。
第四步,开始安装。选择自定义安装,手动划分分区。Linux一般建议分boot分区、swap分区和根分区。Windows可以直接用默认分区,但要注意用GPT分区表才能支持UEFI启动,MBR在大型硬盘上有2TB限制。
第五步,安装完成后安装增强工具。VMware里是VMware Tools,VirtualBox里是Guest Additions,Windows系统直接安装驱动,Linux系统可能需要编译内核模块。不装这个工具,屏幕分辨率会固定在一个较低值,复制粘贴和拖拽文件也不可用。
4.2 机房批量装系统:从“一台台装”到“自动化部署”
热词里出现了“电脑教室批量安装操作系统”“裸金属服务器批量安装操作系统的软件”,说明很多人也遇到过批量部署的痛点。我自己的经验是,批量装Linux服务器最常用的工具是PXE+Preseed或者PXE+Kickstart,Windows可以用WDS或者MDT,现在也有一些开源的自动化装机工具,像Cobbler、Foreman。
PXE的整个流程非常有趣,正好跟前面提到的引导流程对应上。客户机开机后,网卡上的PXE固件会主动向DHCP服务器请求IP地址,然后从DHCP服务器拿到TFTP服务器地址和启动文件名,再从TFTP下载一个最小的开机引导程序。这个引导程序接下来会加载PXE内核,内核挂载NFS或HTTP上的安装源,启动安装过程。整个过程中,安装应答文件可以预先写好在配置服务器里,这样每台机器装出来的分区方案、软件包、网络配置就完全一致。
我实际部署过一次几十台机器的机房环境,第一次跑PXE的时候翻车了,问题出在DHCP配置上:PXE客户机在网络上发出广播请求,我的DHCP服务器同时又在做普通IP分配,两个功能混在同一个配置文件里,导致部分机器拿不到正确的引导文件路径。后来把PXE的配置独立出来,放在单独的subnet里,问题就解决了。所以做这类事情的时候,不要怕多查日志,tftp的日志、dhcp的lease文件,每一个都能告诉你到底卡在哪一步。
4.3 安装完系统之后的第一个小时我在做什么
新系统装好之后,我的笔记里专门有一页叫“装机后清单”。第一步是更新软件源和系统补丁,Linux下用apt update或dnf update,Windows下把Windows Update跑一遍。第二步是配置基础网络,固定IP地址、设置主机名、配置DNS,避免重启之后IP漂移导致连不上服务器。第三步是配置SSH远程登录,禁用root密码登录、改用密钥登录,顺便修改默认端口,这是提高服务器基础安全的最快手段。第四步是装常用工具,vim、curl、git、htop这些是Linux服务器的刚需。
很多人装完系统直接开工,结果出了问题才发现连tmux都没装,操作体验特别痛苦。我从第一次自己搭服务器起就养成了“先做基线配置再干活”的习惯,这个习惯后来帮我省了很多重复劳动。建议你也把这些固定动作做成自己的检查清单,每次装完系统就照着执行一遍,效率会高很多。
5. 操作系统日记:国产系统和Linux发行版的适配心得
5.1 从麒麟到openEuler,国产系统安装软件的三个典型坑
热词里关于麒麟、银河麒麟、中标麒麟、openEuler的内容很多。这些系统本质上是Linux发行版,或者基于CentOS,或者基于Debian,安装软件的大方向跟Ubuntu/CentOS是类似的。但实际用下来,有三个坑几乎每次都会遇到。
第一个坑是APT/YUM源不通。国产系统默认的软件源有时候速度很慢,或者缺少某些软件包。解决方法是在安装软件之前先把源的URL换成内网源或者速度更快的镜像源。注意有些国产系统用的是自己定制的源,直接换CentOS源反而可能出问题,因为包管理器版本可能不一样。
第二个坑是ARM架构的兼容性。像银河麒麟常跑在飞腾、鲲鹏这些ARM处理器上,很多软件默认提供的是x86编译的rpm包或deb包,装上去会直接报“架构不匹配”,比如热词里提到的“银河麒麟 nginx arm安装包下载”。解决办法是先确认CPU架构,再用uname -m查看,根据架构去下载对应的aarch64包,或者直接用源码编译安装。
第三个坑是老软件依赖问题。比如麒麟V10上安装Oracle 19c单机,最麻烦的是缺依赖库。Oracle安装文档会列一堆依赖库,这些库在国产系统上可能会因为源不通导致装不上,缺一个就报一个错。我的建议是先一次性把常见依赖全部装上,用yum localinstall或者dpkg -i来安装下载好的离线包,有缺漏再用一个恐怖的“yum deplist”命令逐个解决依赖。
5.2 nginx、SSH和危险服务检测的排查经验
热词里“国产操作系统银河麒麟v10危险服务检测怎么关闭ssh服务”这个表述,看起来是有人被系统的一些安全基线检测提醒搞烦了。这类系统出厂的时候会带一个安全加固服务,定期扫描系统上开着的端口和服务,一旦发现SSH或者其他服务“不算安全配置”,就会告警。
我自己的处理思路不是一上来就关闭检测服务,而是先看检测报告里到底报了什么问题。如果是SSH服务告警,多半是“允许root登录”或者“密码登录”这类策略问题。合理的做法是修改/etc/ssh/sshd_config,把PermitRootLogin改成no,把PasswordAuthentication改成no,配置密钥登录,然后用sshd -t检查语法,再重启ssh服务。这样既保留了SSH功能,又让检测服务觉得“加固完成”。
如果确实因为测试需要,必须临时关闭检测服务,一般是通过systemctl命令来操作,先查看服务的名字,再disable和stop。但这里我不建议在生产环境里做这种操作,因为安全检测服务本身是为了等保合规和风险预警,关掉它相当于给自己埋雷。想要让它不吵,更健康的思路是去修复它提出的问题。
5.3 Windows Server 2022的AI自动化安装和金山打字般的“指导式安装”
热词里有一条“Windows Server 2022操作系统AI自动化安装教程”,这其实是指Windows Setup自带的高效安装和卸载定制功能。微软这几年在Server系统里引入了更智能的基线配置,比如Windows Admin Center、SAC(半年度渠道)的批量部署支持,还有Azure Automanage里的“机器最佳实践”服务,它会自动为你推荐并应用安全基线、更新策略和监控日志配置。
在实际安装Windows Server 2022的时候,最常见的是通过“服务核心”模式安装,这种模式没有桌面体验,占用的资源少很多,适合跑容器或者特定应用角色。但很多初学者不习惯命令行,装完以后连网卡IP都不知道怎么配。我的建议是,如果你不熟悉命令行,可以先装“带桌面体验”的版本,等熟悉了再用“服务核心”。另外一定要记住Windows Server默认不开启远程管理,需要进入Server Manager里把“本机远程管理”打开,设置好防火墙策略,才能真正实现远程管理。
6. 期末和408备考:王道怎么配教材,笔记怎么查漏补缺
6.1 王道408和经典教材怎么搭配
如果时间允许,操作系统经典的教材像汤小丹版《计算机操作系统》和《操作系统精髓与设计原理第九版》应该精读一遍。但备考来说,王道408的题量更大、重点更突出,更适合用来刷题。我自己复习的时候,是先以王道为主线,把知识点过一轮,然后回到教材去查原理,尤其是一些容易出填空题的细节,比如调度算法的平均等待时间计算、银行家算法的安全性判断。真题做得多了你会发现,这些细节非常需要教材的原始表述来支撑。
汤小丹版教材附带的习题答案很有参考价值,特别是“哲学家进餐问题”“读者写者问题”这类经典同步问题,理解其解法之后再来做王道上的变形题,基本就能举一反三。还有《操作系统精髓与设计原理》第九版的英文版,如果你英语能力可以,强烈建议配合阅读。它能帮你理解中文教材里被翻译得有些生硬的概念,比如“spooling技术”真正讲的是什么。
6.2 我的复习节奏和知识点自查清单
操作系统这门课,知识点太密,我复习了三轮才觉得自己勉强过关。
第一轮是“搭框架”,花两三天时间把所有章节的标题和核心概念理出来,配上面的那张思维导图。这轮的目标就是知道这门课在讲什么,哪章跟哪章有关系,不追求记住细节。
第二轮是“攻重点”,按照进程管理、内存管理、文件管理、I/O管理、死锁这几大块逐个击破。每一块要配合王道视频课和习题,做错的地方回到教材原文看原理。死锁这块我额外画了资源分配图来判断死锁,这个方法特别实用,几乎能应对所有死锁相关的大题。
第三轮是“做真题”,把近十年的真题按题型整理成Excel表格,统计哪些知识点重复考得多。结果发现调度算法、页面置换算法、PV操作几乎每年必考。我就把这几项单独拎出来重点背,制成了简版自查表:
- 进程状态转换图能默画出来吗
- 银行家算法能够手推安全序列吗
- 页面置换算法(FIFO/LRU/OPT)能算出缺页次数吗
- 磁盘调度算法(先来先服务/扫描/电梯)能算出总寻道长度吗
- 中断和系统调用的区别能说清楚吗
- 文件系统索引节点的原理能讲明白吗
只要你一条条过下来,默写、动手算一遍,操作系统这门课基本就稳了。
6.3 复习时踩过的两个坑,提醒你别再踩
第一个坑是只看视频不做题。操作系统这种课,听课觉得都会,一做题就露馅。尤其是调度算法和内存管理部分的计算题,不亲手按计算器算一遍,考试的时候时间复杂度你都会算错。我不夸张地说,有一次我看了三遍调度视频,结果模拟题里一道多级反馈队列题目算出来少了一个时间片,翻了半天才发现是FCFS阶段的排队顺序没搞清楚。动手做题真的比看视频重要十倍。
第二个坑是不重视系统调用的概念。考试里系统调用和中断的区别是高频考点,但我复习第一轮时直接把这一节略过了,直到做真题才发现考察得非常细。系统调用是用户程序请求操作系统服务的唯一合法方式,比如读文件、开进程、调用网络接口,而中断是硬件或异常触发的事件,两者完全不是一个层级的东西。如果笔记里缺了这块,一定要补上,别觉得它简单就跳过。
最后分享一个我自己的小习惯:每整理完一个大章节,我会在笔记最后面留一页“随口能说斩钉截铁”的清单,这一页只记录8到10个特别容易混淆的结论。比如“PCB是进程存在的唯一标志”“管程是语言或内核提供的同步机制,信号量是操作系统原语”“中断向量表是内核建立的一张登记表”这类短句。每次翻笔记时只翻这一页,考前最后一天也只看这一页。这个方法帮我稳住了很多容易丢的细节分,你也可以试试。