大廠面試作業系統高頻10問:程序+記憶體+檔案系統全覆蓋

面試專題作者: 美歷團隊

涵蓋程序、記憶體、檔案系統等10道作業系統高頻面試題,每題含考察點與答案方向,助你全面備戰OS面試。

背景介紹

作業系統這門課,大學的時候學得稀裡糊塗的,考試也就是背了背程序狀態轉換圖。工作之後發現,面試官問的OS問題都特別實際——epoll為什麼高效、虛擬記憶體怎麼工作的、程序和執行緒到底什麼區別。我花了大概十天時間把OS高頻題重新梳理了一遍,發現其實就那麼幾個核心知識點,理解了底層邏輯之後,面試的時候就能舉一反三了。這10道題是我面過的幾家公司裡出現頻率最高的。

一、程序(3題)

1. 程序、執行緒、協程的區別?

考察點:並發模型理解

程序是資源分配的基本單位,有獨立的地址空間;執行緒是CPU排程的基本單位,共享程序的地址空間;協程是使用者態的輕量級執行緒,由程式自己排程,切換不需要核心參與。關鍵區別:程序切換開銷最大(需要切換頁表、TLB等),執行緒切換次之(共享地址空間,只需切換暫存器和堆疊),協程切換開銷最小(只在使用者態儲存恢復暫存器)。面試官追問:什麼時候用多程序什麼時候用多執行緒?多程序適合CPU密集型且需要隔離的場景(如Chrome的多程序架構),多執行緒適合需要共享記憶體的場景。Go的goroutine本質上就是協程+多執行緒排程器的組合。

2. 程序間通訊(IPC)方式?

考察點:程序協作機制

七種方式:管道(半雙工,父子程序間)、命名管道(無關程序間)、訊息佇列(核心中的訊息鏈表)、共享記憶體(最快,需配合號量同步)、號量(計數器,控制存取順序)、訊號(非同步通知機制)、Socket(跨網路通訊)。面試官最愛問:哪種最快?共享記憶體,因為不需要核心態和使用者態的資料拷貝。但共享記憶體需要自己處理同步問題,一般配合號量使用。實際專案中,同機器用共享記憶體+號量,跨機器用Socket或RPC。

3. 死鎖的條件和預防?

考察點:死鎖理論

四個必要條件:互斥(資源同時只能被一個程序使用)、持有並等待(持有資源同時等待其他資源)、不可搶佔(已獲得的資源不能被強行剝奪)、循環等待(程序間形成環狀等待)。破壞任一條件即可預防:互斥一般無法破壞;持有並等待可以要求程序一次性申請所有資源;不可搶佔可以設定超時釋放;循環等待可以對資源編號按序申請。面試官追問:實際開發中怎麼避免死鎖?最實用的方法是統一加鎖順序和設定超時時間。我在專案中就是用tryLock帶超時來避免死鎖的。

二、記憶體(3題)

4. 虛擬記憶體是什麼?

考察點:記憶體管理核心概念

虛擬記憶體為每個程序提供了一個獨立的、連續的虛擬地址空間,通過頁表對映到實體記憶體。核心好處:程序隔離(每個程序有獨立地址空間);記憶體保護(頁表項有許可權位);按需分配(只有實際存取的頁才分配實體記憶體);記憶體超分配(實體記憶體不夠時可以把頁換出到磁碟)。面試官追問:虛擬地址到實體地址的轉換過程?虛擬地址→MMU查TLB→TLB命中直接得到實體地址→TLB未命中查頁表→頁表命中得到實體地址→頁表未命中觸發缺頁中斷→從磁碟載入頁面到實體記憶體→更新頁表和TLB。

5. 頁面置換演算法?

考察點:缺頁處理策略

常見演算法:OPT(最優,未來最久不使用的頁面,理論存在不可實現)、FIFO(先進先出,可能Belady異常——實體頁增多缺頁反而增加)、LRU(最近最少使用,效能好但實現開銷大)、Clock(近似LRU,用引用位+環形鏈表)、LFU(最不經常使用,按頻率淘汰)。Linux實際使用的是改進版Clock演算法,考慮了存取位和髒位。面試官追問:LRU怎麼實現?雜湊表+雙向鏈表,O(1)的查詢和調整。這個在LeetCode 146題有經典實現,面試經常手寫。

6. 記憶體對映(mmap)是什麼?

考察點:檔案對映機制

mmap將檔案對映到程序的虛擬地址空間,對這塊記憶體的讀寫就相當於對檔案的讀寫,由作業系統負責同步到磁碟。優點:避免使用者態和核心態的資料拷貝(傳統read/write需要兩次拷貝);適合大檔案處理;多個程序對映同一檔案可以實現共享記憶體。缺點:對映區域大小受限於虛擬地址空間;隨機寫入效率不如順序寫。面試官追問:mmap和read/write的區別?read/write需要核心緩衝區做中轉,mmap直接操作頁快取。Kafka就用了mmap來提升寫入效能。

三、檔案系統(2題)

7. inode是什麼?

考察點:檔案系統元資料

inode(索引節點)儲存檔案的元資料:檔案大小、許可權、所有者、時間戳、資料塊位置等。關鍵點:inode不儲存檔名,檔名儲存在目錄項(dentry)中。一個分割區有多少inode在格式化時就確定了,如果大量小檔案可能inode用完但磁碟空間還有剩餘。面試官追問:怎麼檢視inode使用情況?df -i。怎麼解決inode耗盡?刪除無用檔案、重新格式化增加inode數量、使用更大磁碟。

8. 軟連結和硬連結的區別?

考察點:檔案連結機制

硬連結:指向同一個inode的不同檔名,刪除一個不影響另一個,不能跨檔案系統,不能連結目錄。軟連結(符號連結):一個獨立檔案,內容是另一個檔案的路徑,可以跨檔案系統,可以連結目錄,原始檔刪除後軟連結失效(懸空連結)。面試官追問:ls -i可以看到硬連結的inode號相同。建立硬連結用ln,建立軟連結用ln -s。實際開發中,軟連結用得更多,比如Nginx的sites-enabled目錄就是用軟連結管理配置的。

四、其他(2題)

9. select、poll、epoll的區別?

考察點:IO多路複用機制

select:最多監聽1024個fd(FD_SETSIZE),每次呼叫需要把fd集合從使用者態拷貝到核心態,返回後需要遍歷所有fd找就緒的,O(n)複雜度。poll:沒有1024限制,用鏈表代替位圖,但仍然是O(n)遍歷。epoll:事件驅動,epoll_ctl註冊fd時就在核心建立回撥,epoll_wait只返回就緒的fd,O(1)複雜度(實際O(活躍fd數));支援ET(邊緣觸發,只通知一次)和LT(水平觸發,持續通知)模式。面試官追問:ET和LT怎麼選?ET效率更高但程式設計更複雜(必須非阻塞IO+迴圈讀直到EAGAIN),LT更安全。Nginx用ET,Redis用LT。

10. 使用者態和核心態的區別?

考察點:作業系統特權級

核心態執行作業系統核心程式碼,可以存取所有記憶體和硬體;使用者態執行應用程式,只能存取受限記憶體,不能直接操作硬體。使用者態到核心態的切換方式:系統呼叫(主動)、異常(如缺頁中斷)、外設中斷(如鍵盤輸入)。切換開銷:儲存/恢復使用者態暫存器、切換堆疊、更新CPU特權級、可能重新整理TLB和CPU流水線。面試官追問:怎麼減少核心態切換?使用mmap代替read/write、批量系統呼叫、使用vDSO(核心對映到使用者態的只讀頁,某些系統呼叫不需要切換)。

心得建議

作業系統面試的準備,我的體會是:程序和記憶體是重點中的重點,幾乎每場面試都會涉及;epoll是後端開發的必考題,必須能把select/poll/epoll的演進過程和原理講清楚;虛擬記憶體和頁面置換是理解記憶體管理的基礎,建議結合Linux的實際實現來理解。另外,OS問題經常和具體場景結合,比如「Redis為什麼用單執行緒」、「Kafka為什麼用mmap」,理解了OS原理才能回答這類綜合題。

FAQ

Q:作業系統面試需要看Linux原始碼嗎?
不需要通讀,但了解關鍵模組的實現(如epoll原始碼、程序排程器)會非常加分。

Q:epoll面試怎麼準備?
重點理解ET/LT的區別、epoll的資料結構(紅黑樹+就緒鏈表)、為什麼比select/poll高效。

Q:程序和執行緒面試常考什麼?
區別和選擇、程序間通訊方式、執行緒同步機制(互斥鎖/條件變數/讀寫鎖)、死鎖的預防和檢測。

#操作系统#Linux#大廠面試#进程#内存管理#面試八股文