自己總結(jié)PDF:以資源管理為主線串起進(jìn)程內(nèi)存文件IO)
簡介這是一份面向西北工業(yè)大學(xué)801考研考生的操作系統(tǒng)核心知識點(diǎn)總結(jié)PDF內(nèi)容按考試大綱要求編排適合備考后期對照真題查漏補(bǔ)缺。筆記覆蓋操作系統(tǒng)概述、進(jìn)程管理、內(nèi)存管理、文件管理、設(shè)備管理與作業(yè)調(diào)度等考綱模塊進(jìn)程三態(tài)及PCB、FCFS/SJF/優(yōu)先級調(diào)度、信號量與PV操作分頁與分段、地址映射、虛擬內(nèi)存及碎片問題文件邏輯/物理結(jié)構(gòu)、存取方法與訪問控制設(shè)備分類、I/O控制方式與SPOOLing技術(shù)作業(yè)生命周期及周轉(zhuǎn)時(shí)間等性能指標(biāo)。考點(diǎn)以要點(diǎn)形式歸納便于快速回顧。資源壓縮包內(nèi)共1個(gè)PDF文件大小19.05MB掃描版頁面清晰、內(nèi)容連貫可直接打印或置入平板標(biāo)注重點(diǎn)。目前已有167人瀏覽學(xué)習(xí)。1. 操作系統(tǒng)自己總結(jié).pdf把教材讀薄、把面試題串起來的“個(gè)人操作手冊”臨近期末或面試前很多人電腦里都躺著一份“操作系統(tǒng)自己總結(jié).pdf”——但說實(shí)話大部分人的版本只是把湯小丹那本《計(jì)算機(jī)操作系統(tǒng)》的目錄抄了一遍復(fù)制了點(diǎn)概念合上之后照樣不會(huì)做那種“多級隊(duì)列調(diào)度計(jì)算題”也扛不住面試?yán)镒穯枴澳惝嫷倪@個(gè)狀態(tài)圖為什么沒有掛起”。這份PDF真正該干的事只有一件把操作系統(tǒng)這根藤上的進(jìn)程、內(nèi)存、文件、IO、死鎖五大塊按“資源如何被管理”串成自己的話讓復(fù)習(xí)從“翻書”變成“檢索”。它不解決你讀不讀教材的問題它解決的是你合上教材之后能不能默寫主線、能不能對著一個(gè)場景說出系統(tǒng)調(diào)用和調(diào)度策略的問題。這份總結(jié)適合三類人期末沖刺的在校生、準(zhǔn)備校招或社招面試的開發(fā)者、以及日常要排查Linux性能問題卻總在碎片知識里打轉(zhuǎn)的運(yùn)維。2. 先立主線把“資源管理”當(dāng)骨架別按教材章節(jié)抄為什么大多數(shù)總結(jié)沒價(jià)值因?yàn)榻滩氖前础案拍畹皆碓俚剿惴ā钡木€性順序?qū)懙亩说挠洃浭蔷W(wǎng)狀結(jié)構(gòu)。操作系統(tǒng)這門課說到底就是一臺計(jì)算機(jī)里 CPU、內(nèi)存、存儲、IO 設(shè)備這四類資源如何被抽象、分配、調(diào)度、回收的過程。我一般會(huì)把“資源管理”四個(gè)字作為整個(gè)總結(jié)的目錄根節(jié)點(diǎn)下面掛四大資源再往下掛操作系統(tǒng)為實(shí)現(xiàn)管理而引入的概念進(jìn)程、地址空間、文件描述符。這樣復(fù)習(xí)時(shí)你的路徑是“內(nèi)存不夠了怎么辦 → 虛擬內(nèi)存 → 頁表 → 缺頁中斷 → 頁面置換”而不是“翻到第三章第二節(jié)”。2.1 為什么主線選“資源管理”而不是“進(jìn)程、內(nèi)存、文件”平鋪直接按五大塊平鋪有個(gè)問題各章之間的因果斷了。比如文件系統(tǒng)里的頁緩存為什么值得專門寫一段因?yàn)樽x文件時(shí)進(jìn)程發(fā)出 read 系統(tǒng)調(diào)用經(jīng)過 VFS、具體文件系統(tǒng)、頁緩存最后落到磁盤 IO 調(diào)度器——這條鏈路橫跨文件、內(nèi)存、IO 三章。如果總結(jié)按平鋪目錄寫你會(huì)在每一章都重復(fù)一遍“頁緩存”卻始終建立不起整體感。以資源為主線后我會(huì)在關(guān)鍵位置寫一個(gè)“跨章節(jié)引用”在文件系統(tǒng)章寫“讀文件的數(shù)據(jù)通路”并順帶標(biāo)注“詳見 IO 章 DMA”“詳見內(nèi)存章頁緩存”讓 PDF 自己長出超鏈接式的知識勾連。動(dòng)手搭這份 PDF 時(shí)我建議按下面四步走別急著打開編輯器打字用思維導(dǎo)圖把教材目錄拆散按“CPU、內(nèi)存、存儲、IO設(shè)備”四個(gè)桶重新分揀所有知識點(diǎn)。對每個(gè)桶提煉出“核心抽象、分配單位、主要策略、常見痛點(diǎn)”四項(xiàng)這就是后面每一章的模板。把跨桶的知識點(diǎn)頁緩存、DMA、文件描述符單獨(dú)記為“樞紐節(jié)點(diǎn)”在正文里顯式交叉引用。最后再給每個(gè)桶配一幅狀態(tài)機(jī)圖圖放章節(jié)開頭文字解釋放圖后。這四步做完目錄樹就立住了。目錄樹決定后續(xù)所有筆記的落位改起來最貴所以先花一晚上把結(jié)構(gòu)想清楚比抄一星期筆記值。2.2 用一張“四資源管理視圖”表格把總綱釘住我會(huì)在 PDF 的第 1 頁放一張固定表格之后每往一個(gè)資源分支寫一節(jié)就回來更新這一行的狀態(tài)。具體表格如下資源核心抽象分配單位主要策略常見痛點(diǎn)CPU進(jìn)程 / 線程時(shí)間片調(diào)度算法先來先服務(wù)、短作業(yè)優(yōu)先、多級反饋隊(duì)列饑餓、上下文切換開銷內(nèi)存虛擬地址空間頁 / 段請求調(diào)頁、頁面置換LRU、時(shí)鐘抖動(dòng)、頁表開銷存儲文件與目錄、inode塊空閑空間管理、日志文件系統(tǒng)掉電一致性、碎片IO 設(shè)備文件描述符、設(shè)備文件IO 請求中斷、DMA、IO 調(diào)度阻塞與忙等、緩沖這張表的價(jià)值在于它把六章教材壓成幾個(gè)“槽位”。復(fù)習(xí)進(jìn)程的時(shí)候你看到 CPU 行得能說出典型調(diào)度算法看到內(nèi)存行得能畫出頁表結(jié)構(gòu)。表不是擺著看的是給你做主動(dòng)回憶用的——遮住策略列自己默寫一行寫不出來就回去翻對應(yīng)章節(jié)。這個(gè)動(dòng)作比把正文讀十遍都有效。我還會(huì)在表格下方加三行手寫批注提醒自己哪些地方容易考第一CPU 的可搶占性讓它不會(huì)成為死鎖資源第二文件系統(tǒng)的 inode 是存儲資源的核心抽象和內(nèi)存的頁表一樣需要單獨(dú)畫圖第三IO 設(shè)備的“文件描述符”把設(shè)備和文件統(tǒng)一了所以 IO 和文件系統(tǒng)在“打開、讀寫、關(guān)閉”這條路徑上高度重疊。這三條批注是整份 PDF 的“鉤子”復(fù)習(xí)時(shí)掃一眼表格就能把它們帶出來。2.3 每個(gè)資源分支配一張“狀態(tài)機(jī)圖”比抄十頁筆記管用PDF 是靜態(tài)的但操作系統(tǒng)的很多概念是狀態(tài)遷移。我會(huì)為進(jìn)程、虛擬內(nèi)存、IO 請求各畫一張狀態(tài)機(jī)圖。這里不需要 Visiodraw.io 或 Excalidraw 就夠關(guān)鍵在于圖里必須包含“阻塞 → 就緒”這類容易丟的邊。以進(jìn)程三態(tài)圖為例我會(huì)畫運(yùn)行占用 CPU 執(zhí)行指令就緒萬事俱備只差 CPU阻塞等待某事件IO 完成、鎖釋放、信號量。邊分別是運(yùn)行 → 就緒時(shí)間片到或被搶占、運(yùn)行 → 阻塞主動(dòng)等待事件、阻塞 → 就緒事件到達(dá)、就緒 → 運(yùn)行被調(diào)度。除此之外我會(huì)用虛線額外標(biāo)出“掛起”狀態(tài)當(dāng)內(nèi)存不夠時(shí)整個(gè)進(jìn)程被換出到外存從就緒或阻塞變?yōu)閽炱鹁途w、掛起阻塞。這是很多期末試卷和面試官最愛挖的細(xì)節(jié)問“等待事件的過程中進(jìn)程能不能被換出內(nèi)存”答案是可以這就是掛起。把這張圖畫完之后基本上就能回答“進(jìn)程和線程的區(qū)別除了共享地址空間還差什么”這類連環(huán)問調(diào)度單位、切換開銷、通信方式、同步需求都不一樣。圖的好處是復(fù)習(xí)時(shí)一眼掃過馬上知道自己哪里記不清不用從頭讀正文。每次考前我只看這些圖和那張四資源表能直接說出概念才算真正過了一遍。3. 進(jìn)程與內(nèi)存把知識點(diǎn)寫成能從系統(tǒng)調(diào)用推演到缺頁中斷的事故鏈這一章要處理整份 PDF 里最厚的兩大部分。我的做法是每個(gè)部分只寫一條主線進(jìn)程部分走“創(chuàng)建 → 調(diào)度 → 同步 → 死鎖”內(nèi)存部分走“邏輯地址 → 頁表 → 缺頁中斷 → 置換”。主線上的每一個(gè)節(jié)點(diǎn)都配一個(gè)可復(fù)現(xiàn)的命令或代碼片段讓總結(jié)在理論之外還能當(dāng)操作手冊用。3.1 進(jìn)程章節(jié)的骨架PCB、調(diào)度隊(duì)列、同步原語、死鎖必要條件進(jìn)程是一段運(yùn)行中的程序這句話背下來沒用要拆開看。我在 PDF 里會(huì)先定義 PCB進(jìn)程控制塊說清楚它是內(nèi)核里保存進(jìn)程全部信息的數(shù)據(jù)結(jié)構(gòu)包括 PID、狀態(tài)、程序計(jì)數(shù)器、寄存器現(xiàn)場、內(nèi)存指針、打開文件表、調(diào)度信息。所有“進(jìn)程管理”動(dòng)作其實(shí)都是對該進(jìn)程的 PCB 做修改。然后用一個(gè)最小代碼塊展示 fork 的過程#include unistd.h #include stdio.h int main() { pid_t pid fork(); // 調(diào)用一次返回兩次 if (pid 0) { perror(fork failed); // 進(jìn)程數(shù)達(dá)上限或內(nèi)存不足 } else if (pid 0) { printf(child, my pid is %d\n, getpid()); // 子進(jìn)程從這里繼續(xù) } else { printf(parent, child pid is %d\n, pid); // 父進(jìn)程拿到子進(jìn)程 PID } return 0; }這段代碼的邏輯說明fork 是 Unix 系創(chuàng)建進(jìn)程的唯一系統(tǒng)調(diào)用調(diào)用一次后內(nèi)核復(fù)制當(dāng)前進(jìn)程的 PCB 和地址空間之后兩個(gè)進(jìn)程各自從 fork 返回處繼續(xù)執(zhí)行。返回值是區(qū)分父子進(jìn)程的關(guān)鍵父進(jìn)程拿到子進(jìn)程 PID子進(jìn)程拿到 0。這段代碼在總結(jié)里不是用來教 C 語言的而是為了讓你記住兩個(gè)考點(diǎn)進(jìn)程創(chuàng)建的代價(jià)是復(fù)制地址空間寫時(shí)復(fù)制優(yōu)化除外以及 fork 由內(nèi)核完成調(diào)用者只看到返回值。調(diào)度的部分我一般整理成一組決策問題什么時(shí)候觸發(fā)調(diào)度進(jìn)程退出、阻塞、時(shí)間片耗盡、中斷返回調(diào)度器選擇哪一個(gè)就緒進(jìn)程策略切換要做哪些事保存現(xiàn)場、恢復(fù)現(xiàn)場、更新 PCB 狀態(tài)把這三個(gè)問題串起來調(diào)度算法的名字就自然記住了。多級反饋隊(duì)列的要點(diǎn)是“優(yōu)先數(shù)越高時(shí)間片越短動(dòng)態(tài)調(diào)整”講到 Linux 時(shí)再補(bǔ)充一句 CFS 用虛擬運(yùn)行時(shí)間實(shí)現(xiàn)公平別把教材的通用模型直接扣到某個(gè)具體系統(tǒng)頭上。同步與死鎖建議寫在同一小節(jié)里因?yàn)樗鼈兊母聪嗤噙M(jìn)程訪問共享資源。信號量、互斥鎖、管程是三種常見實(shí)現(xiàn)死鎖的四個(gè)必要條件是互斥、持有并等待、不可搶占、循環(huán)等待。我在 PDF 里會(huì)給每個(gè)必要條件配一個(gè)反例如果資源可搶占死鎖可能不會(huì)發(fā)生——比如 CPU 就是可搶占的所以 CPU 資源不會(huì)形成傳統(tǒng)意義下的死鎖。3.2 內(nèi)存部分寫成一條事故鏈缺頁異常從哪來、到哪去內(nèi)存管理最怕的是“背了頁表結(jié)構(gòu)但不會(huì)推演”。我用的方式是事故鏈敘事程序訪問一個(gè)邏輯地址 → MMU 查頁表 → 頁表項(xiàng)有效位為 0 → 觸發(fā)缺頁異常 → 內(nèi)核檢查地址合法性 → 合法則從磁盤調(diào)入頁面并更新頁表 → 重新執(zhí)行被中斷的指令。這六個(gè)環(huán)節(jié)每一個(gè)都可能出問題PDF 里我會(huì)把“可能出問題”寫成批注邏輯地址越界進(jìn)程訪問了不屬于它的地址缺頁異常處理時(shí)發(fā)現(xiàn)地址超出進(jìn)程空間直接報(bào)段錯(cuò)誤。頁表項(xiàng)有效位為 0 但頁在內(nèi)存比如剛被換出的頁面又被訪問這就是抖動(dòng)的前兆。換入時(shí)內(nèi)存滿了需要先換出一個(gè)犧牲頁若是臟頁還要寫回磁盤。重新執(zhí)行指令因?yàn)槿表撉爸噶顩]有執(zhí)行完CPU 必須恢復(fù)現(xiàn)場從原指令重來。為每一個(gè)環(huán)節(jié)寫“出問題”的分支記憶會(huì)牢得多。比這更硬核的是把頁表層級畫出來。這里用一小段偽代碼表示地址翻譯// 兩級頁表的地址翻譯x86 典型結(jié)構(gòu) 虛擬地址 目錄索引(10位) 頁表索引(10位) 頁內(nèi)偏移(12位) 1. 讀 CR3 寄存器拿到頁目錄基址 2. 用目錄索引查頁目錄項(xiàng)得到頁表基址 3. 用頁表索引查頁表項(xiàng)得到物理頁框號 4. 物理地址 頁框號 12 頁內(nèi)偏移 5. 若第 2 步或第 3 步的頁表項(xiàng)有效位為 0則觸發(fā)缺頁異常這段偽代碼的邏輯說明不要把“頁表”想象成一張大表現(xiàn)代系統(tǒng)是多級頁表加上 TLB快表。偽代碼的價(jià)值在于讓你看見每一步訪問的是“哪張表”和“哪個(gè)表項(xiàng)”。如果面試問“為什么需要多級頁表”答案就是單級頁表要為進(jìn)程的整個(gè)地址空間預(yù)留頁表項(xiàng)4GB 空間需要一百萬個(gè)頁表項(xiàng)太浪費(fèi)多級頁表只按需分配葉節(jié)點(diǎn)未分配區(qū)域在上級頁表項(xiàng)里置空省下的內(nèi)存非常可觀。缺頁中斷之后的頁面置換算法也放在這一章但我一般只重點(diǎn)寫兩個(gè)LRU最近最久未使用實(shí)現(xiàn)代價(jià)高實(shí)際用的是時(shí)鐘算法Clock近似 LRU抖動(dòng)thrashing的根源是局部性差或物理內(nèi)存太小工作集模型是應(yīng)對抖動(dòng)的經(jīng)典思路。寫到這里我會(huì)順手記一條 Linux 查看命令free -h 看物理內(nèi)存和 swap 的使用率如果 si/so 持續(xù)跳動(dòng)說明系統(tǒng)正在頻繁換頁這就把“抖動(dòng)”從概念變成了可觀測現(xiàn)象。4. 文件與 IO最容易在總結(jié)里被低估、面試卻全問的兩塊很多人的 PDF 把文件系統(tǒng)和 IO 寫得很薄因?yàn)榻滩睦镞@兩章偏描述性。但實(shí)際工作中排查磁盤 IO 高、文件刪不掉、服務(wù)報(bào) too many open files 時(shí)這兩塊最常被用到。我在總結(jié)里傾向于把文件系統(tǒng)抽象成“三層結(jié)構(gòu)”系統(tǒng)調(diào)用層、VFS 層、具體文件系統(tǒng)層然后從 open 到 read 走一遍完整鏈路。4.1 文件系統(tǒng)總結(jié)的粒度從 inode 到目錄項(xiàng)再到掛載文件系統(tǒng)的核心不是“文件內(nèi)容”而是“文件元數(shù)據(jù)”。我會(huì)在 PDF 里澄清這幾個(gè)術(shù)語inode索引節(jié)點(diǎn)保存文件的元數(shù)據(jù)——權(quán)限、所有者、大小、時(shí)間戳、數(shù)據(jù)塊指針。不含文件名。目錄項(xiàng)dentry把文件名映射到 inode 編號。目錄本質(zhì)上是一個(gè)特殊文件內(nèi)容是“文件名 inode 號”的列表。超級塊superblock記錄整個(gè)文件系統(tǒng)的整體信息——塊大小、總塊數(shù)、空閑塊位圖、inode 表位置。這三者的關(guān)系可以這樣理解打開路徑 /tmp/data.log 時(shí)內(nèi)核從根目錄開始用 dentry 找到 tmp 的 inode進(jìn)入 tmp 的目錄內(nèi)容再找到 data.log 的 inode最后根據(jù)該 inode 的數(shù)據(jù)塊索引把文件內(nèi)容讀進(jìn)頁緩存。整趟“路徑解析”是 IO 密集型的所以現(xiàn)代系統(tǒng)都有 dentry cache 和 inode cache——這也是為什么大量小文件操作對內(nèi)存那么敏感。我在總結(jié)里會(huì)給一個(gè)“看待文件系統(tǒng)”的命令場景用 stat 查看 inode 信息# 查看一個(gè)文件的 inode 元數(shù)據(jù) $ stat main.c File: main.c Size: 1024 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 2885151 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user) Access: 2024-05-01 10:00:00.000000000 0800 Modify: 2024-05-01 09:00:00.000000000 0800 Change: 2024-05-01 09:00:00.000000000 0800 Birth: 2024-04-30 18:00:00.000000000 0800命令的邏輯說明stat 直接讀 inode 表輸出里的 Inode 號就是文件在文件系統(tǒng)中的身份標(biāo)識Blocks 顯示占用的磁盤塊數(shù)Links 是硬鏈接計(jì)數(shù)。理解 inode 之后很多“刪不掉文件”“移動(dòng)目錄卡死”的現(xiàn)象就不再玄學(xué)刪除文件實(shí)際上是刪除目錄項(xiàng)并遞減 inode 的 Links 數(shù)直到 Links 歸零才真正回收 inode 和數(shù)據(jù)塊——如果某個(gè)進(jìn)程還持有該文件的文件描述符空間依舊不會(huì)釋放。掛載這一塊我一般用一張表格整理“查看、掛載、卸載”的操作操作命令說明查看當(dāng)前掛載df -hT顯示文件系統(tǒng)類型和使用率查看內(nèi)核記錄的掛載關(guān)系mount -l列出所有掛載點(diǎn)掛載 USB 或 ISOmount /dev/sdb1 /mnt -t vfat指定類型掛載卸載umount /mnt若設(shè)備忙會(huì)報(bào) target is busy查看具體文件所在文件系統(tǒng)findmnt /path比 df 更精細(xì)這張表的價(jià)值在排查當(dāng)磁盤滿、inode 滿df -i、文件系統(tǒng)只讀時(shí)先分清是哪個(gè)掛載點(diǎn)的問題再?zèng)Q定擴(kuò)容、清理還是查 lsof??偨Y(jié)時(shí)別只抄命令要抄“什么時(shí)候用”比如寫日志的應(yīng)用突然報(bào) No space left on devicedf -h 看塊沒滿df -i 看 inode 滿了這種經(jīng)驗(yàn)比背命令更有用。4.2 IO 章節(jié)用“中斷、DMA、緩沖”把層次講清而不是抄流程圖IO 部分最容易寫得像教科書插圖。我會(huì)從 CPU 的角度梳理IO 設(shè)備怎么通知 CPU、數(shù)據(jù)怎么搬運(yùn)、應(yīng)用怎么等待。三層遞進(jìn)關(guān)系程序查詢pollingCPU 死循環(huán)檢查設(shè)備狀態(tài)。簡單但浪費(fèi) CPU。中斷驅(qū)動(dòng)設(shè)備完成 IO 后發(fā)中斷CPU 暫停當(dāng)前工作去處理。適合低速設(shè)備但每個(gè)字節(jié)都中斷開銷大。DMA設(shè)備控制器直接和內(nèi)存交換數(shù)據(jù)完成后只發(fā)一次中斷。適合塊設(shè)備是磁盤、網(wǎng)卡的主流。這三層不是“三種做法”而是“CPU 越來越不想等”的演進(jìn)。在 PDF 里我會(huì)配一個(gè)對比表方式數(shù)據(jù)搬運(yùn)者CPU 介入次數(shù)適用場景程序查詢CPU每次傳輸持續(xù)占用簡單控制器、早期系統(tǒng)中斷CPU每字節(jié)或每塊一次串口、鍵盤等低速設(shè)備DMADMA 控制器每次傳輸結(jié)束一次磁盤、網(wǎng)卡、顯卡至于“阻塞 / 非阻塞、同步 / 異步”這兩組詞我的總結(jié)方式是給四個(gè)組合各配一句人話阻塞 同步read 系統(tǒng)調(diào)用沒數(shù)據(jù)就睡過去數(shù)據(jù)到了被喚醒。最常見。非阻塞 同步read 沒數(shù)據(jù)就立刻返回 EAGAIN應(yīng)用輪詢。典型如 epoll 用非阻塞 fd 配合事件循環(huán)。異步 通知aio_read 或 io_uring發(fā)出后繼續(xù)干別的完成時(shí)回調(diào)。高性能 IO 的關(guān)鍵。這個(gè)總結(jié)是 IO 層最容易在面試?yán)锉蛔穯柕牟糠?。我?huì)在 PDF 里特別加上一句提示非阻塞是指調(diào)用不等待不是數(shù)據(jù)到達(dá)不需要時(shí)間異步是指調(diào)用后由內(nèi)核或硬件主動(dòng)告知結(jié)果。這句話能避掉八成對這兩個(gè)詞的混淆。5. 避坑自己總結(jié)操作系統(tǒng)時(shí)的六個(gè)翻車點(diǎn)總結(jié)這活兒看著簡單實(shí)際上一個(gè)晚上就能寫出幾十頁但值不值錢要看能不能躲開下面這些坑。5.1 坑一按教材目錄抄合上 PDF 大腦一片空白現(xiàn)象總結(jié)寫完復(fù)習(xí)時(shí)像看新書什么都很熟悉什么題都不會(huì)做。原因目錄是教材作者設(shè)計(jì)的知識編排順序不是你的記憶組織方式。解決每寫完一節(jié)遮住正文用一句話說出這節(jié)的“問題是什么、解法是什么、代價(jià)是什么”。比如“邏輯地址到物理地址頁表映射代價(jià)是頁表占用內(nèi)存和查表開銷解法是多級頁表加 TLB”。如果說不出來說明這節(jié)還不是你的需要重寫。5.2 坑二只寫“是什么”不寫“為什么、什么時(shí)候用”現(xiàn)象寫“LRU 是最近最久未使用”但題目讓它實(shí)現(xiàn) LRU 或判斷時(shí)鐘算法是否等價(jià)于 LRU 時(shí)卡殼。原因把算法名字和算法機(jī)制混為一談。解決每個(gè)算法都補(bǔ)三個(gè)要素——時(shí)間空間代價(jià)、適用場景、典型變種。LRU 的代價(jià)是維護(hù)訪問時(shí)間序鏈表加哈希實(shí)際用近似 LRU時(shí)鐘算法場景是局部性明確的頁面或緩存淘汰。補(bǔ)齊這些考試和面試都不怕追問。5.3 坑三純理論不碰 Linux命令和概念兩層皮現(xiàn)象能默寫 fork 是什么但在 Linux 里查進(jìn)程、看調(diào)度策略、找內(nèi)存占用時(shí)手足無措。原因只把總結(jié)當(dāng)背誦材料沒當(dāng)操作手冊。解決給每個(gè)概念配一條可執(zhí)行命令。進(jìn)程狀態(tài)配 ps -eo pid,stat,comm內(nèi)存配 free -h 和 cat /proc/meminfo文件系統(tǒng)配 df -hT 和 stat。命令不用多每節(jié)一條但必須親手跑過并把輸出或關(guān)鍵字段截進(jìn) PDF。5.4 坑四把調(diào)度算法和實(shí)際調(diào)度器混為一談現(xiàn)象拿著“多級反饋隊(duì)列”去套 Linux 的 CFS發(fā)現(xiàn)對不上。原因教材講的是通用原理Linux 的 CFS 用紅黑樹按虛擬運(yùn)行時(shí)間調(diào)度它的前身是 O(1) 調(diào)度器。解決總結(jié)時(shí)明確加一個(gè)“現(xiàn)實(shí)與教材差異”小節(jié)Linux 有實(shí)時(shí)優(yōu)先級SCHED_FIFO/RR和普通優(yōu)先級 CFSWindows 用基于優(yōu)先級的搶占調(diào)度但概念模型仍可參考通用框架。別在面試?yán)镎f“Linux 用多級反饋隊(duì)列”容易被追問穿。5.5 坑五死鎖背“四個(gè)必要條件”不會(huì)用資源分配圖畫環(huán)現(xiàn)象判斷“兩個(gè)進(jìn)程各持有一把鎖并互相等待”是不是死鎖時(shí)猶豫寫代碼時(shí)沒意識到 AB-BA 鎖問題。原因只背定義不動(dòng)手畫圖。解決在總結(jié)里畫一遍資源分配圖能構(gòu)成循環(huán)等待就是死鎖再對應(yīng)到代碼線程 A 持有鎖 1 等鎖 2線程 B 持有鎖 2 等鎖 1就是活生生的死鎖。用 pthread_mutex_lock 寫一個(gè)這樣的例子記錄 strace 卡住的現(xiàn)象比任何理論都深刻。5.6 坑六總結(jié)完不驗(yàn)證以為寫完就是會(huì)了現(xiàn)象覺得 PDF“寫完了”但隨機(jī)抽一個(gè)知識點(diǎn)無法脫稿講明白。原因缺乏閉環(huán)。解決把總結(jié) PDF 當(dāng)“半成品”每周抽一天做“裸講”對著章節(jié)標(biāo)題不看正文把該章講一遍。講不出來時(shí)不是重抄而是只補(bǔ)“卡住的那張圖或那條命令”。這能保持總結(jié)持續(xù)可用而不是變成一個(gè)漂亮但永遠(yuǎn)不翻的收藏品。6. 把總結(jié) PDF 變成能反復(fù)刷的“一頁紙”驗(yàn)證與進(jìn)階用法最后一步我想給出一個(gè)可執(zhí)行的驗(yàn)證與迭代方案讓這份“操作系統(tǒng)自己總結(jié).pdf”真正發(fā)揮價(jià)值。我的習(xí)慣做法是每寫完一章做三件事——提煉一張“一頁紙”把核心狀態(tài)機(jī)畫成圖把容易混淆的對比做成表格。一頁紙不是摘要而是“如果只能看一頁你會(huì)寫什么”的極限壓縮。比如進(jìn)程章的一頁紙可能是PCB 描述了進(jìn)程的一切fork 復(fù)制 PCB狀態(tài)機(jī)有運(yùn)行、就緒、阻塞、掛起同步用信號量和鎖死鎖四條件調(diào)度權(quán)衡吞吐、延遲、公平。完成一章后我會(huì)嘗試用三句話復(fù)述這一頁紙做不到就說明輸入還不夠稠密。驗(yàn)證方法分三層。第一層是默寫就是前文說的遮住正文說一句話。第二層是做題找一份期末試卷或考研真題限時(shí)做完再對照總結(jié)看遺漏。第三層是講給別人聽找一個(gè)同樣在復(fù)習(xí)操作系統(tǒng)的人把調(diào)度算法的權(quán)衡講五分鐘。講完你會(huì)發(fā)現(xiàn)自己以為懂的地方其實(shí)沒有閉環(huán)。這三層做完基本可以判斷這份總結(jié)是否真正內(nèi)化。進(jìn)階用法是把一頁紙和對比表導(dǎo)入 Anki做成間隔重復(fù)的卡片正面是“進(jìn)程三態(tài)圖中的掛起怎么畫”背面是“從就緒或阻塞掛起均因內(nèi)存換出恢復(fù)時(shí)先換入內(nèi)存再回就緒或阻塞”。這會(huì)把你手里的靜態(tài) PDF 變成主動(dòng)回憶的訓(xùn)練集。我一般會(huì)在復(fù)習(xí)階段每周做三十張卡片考前面試前只刷卡片不再從頭翻 PDF。最后說一條我自己的血淚經(jīng)驗(yàn)。最早做操作系統(tǒng)總結(jié)時(shí)我追求“全”抄了各種教材和博客PDF 洋洋灑灑近一百頁結(jié)果期末成績并不理想因?yàn)槿虥]有主動(dòng)回憶只是把文檔存進(jìn)了硬盤。后來我把那份 PDF 推倒重來改成“主線加狀態(tài)機(jī)圖加一頁紙加坑位”的模式才真正把知識點(diǎn)記牢。希望這份思路對你也有幫助愿你能寫出一份讓自己信服、可以反復(fù)刷出自己的操作系統(tǒng)總結(jié)。本文還有配套的精品資源點(diǎn)擊獲取