作業系統常見面試和筆試題
介紹
作業系統是程式設計最重要的基礎之一,作業系統相關知識廣泛應用在程式設計、系統調優、問題追查、效能優化等重要場景中,一個不懂作業系統的程式設計師不可能寫出優秀的程式碼,更不可能設計出優秀的系統架構,所以作業系統知識也是面試中不可或缺的一部分,尤其對於基礎元件開發、系統調優等相關職位。
本節主要涉及一些作業系統的基本知識,包括作業系統原理及 Linux 系統的基本使用,包含 Linux 系統基本操作是因為現在的網際網路公司基本都在使用 Linux 系統,日常的程式設計和基本操作基本都在 Linux 命令列下進行,所以 Linux 命令列下的基本操作及在 Linux 環境下程式設計和除錯是一項必備技能。
由於本節中涉及到的知識都比較基礎,所以這裡沒有對每個問題給出詳細的答案,如果有不瞭解的內容,可以翻閱參考書籍的相關章節或百度一下,相信可以從各種途徑得到詳細的解答。這也是日後工作中必備的一項技能,主動尋求答案與被動接受答案的效果是相差很大的,被動接受的答案類似於死記硬背,缺乏靈活變通,在經驗豐富的面試官面前會很容易被識破;而主動尋求答案的過程正是帶著自己的思考不斷融會貫通的過程,這樣的
學習能力才是面試中最看中的素質。從現在開始練起吧。
一、程序與執行緒
1、什麼是程序、執行緒,兩者的關係?
2、程序有哪幾種狀態?孤兒程序、殭屍程序?
3、重點要理解孤兒程序和殭屍程序的產生原因、這兩種程序對系統的影響(如:會不會消耗系統資源)、如
何處理這兩種程序、在程式設計時如何避免產生這兩種程序。
4、程序間通訊有幾種方式?詳細解釋其中最熟悉的一到兩種?
5、管道、命名管道、訊號、訊號量、共享記憶體、訊息佇列,各種方式的原理是怎樣的,需要深入理解其中
的至少 2 種方式。
6、作業系統的 CPU 排程演算法有哪些?簡述各種排程演算法的原理?
7、FIFO、SPF、帶優先順序的排程 …,需要能簡要說出各種排程演算法的大致原理及優缺點
8、程序同步有幾種方式?詳細解釋其中的一種?
9、臨界區、訊號量 …,需要能簡述出各種方式的大致原理,並能詳細理解至少其中一種,可以嘗試用虛擬碼實現一種。
10、常見的同步模型:生產者消費者模型?嘗試用你擅長的任何一種語言實現之
11、死鎖問題?死鎖的原因、處理、預防策略?
12、執行緒池的原理及作用?
13、瞭解執行緒池與一般的多執行緒有什麼區別、優點及使用場景,嘗試用程式碼實現之
二、記憶體管理與檔案系統、IO
1、實體記憶體與虛擬記憶體
2、分頁與分段
3、瞭解的頁面置換演算法有幾種?詳述其中一種?
FIFO、LRU、最優頁……需要知道常用的幾種演算法的大致原理,並能詳述其中一種
4、常見的 Linux 檔案系統有哪幾種?有哪些區別?
ext2、ext3、ext4 ?
三、Linux 基本操作
1、如何在 Linux 系統下檢視 CPU、記憶體、磁碟、IO、網絡卡情況?
2、如何檢視一個程序的詳細資訊,如何追蹤一個程序的執行過程
3、awk、sed 等檔案處理工具的使用
4、熟練使用一種 Linux 下的編輯器(VIM、Emacs)
網路基礎
一、網路模型
1、OSI 七層網路模型和 TCP/IP 四層模型分別是什麼樣的?以及每層的資料格式?
2、常見的網路協議及它們分別屬於 TCP/IP 模型的哪一層
應用層:HTTP、FTP ……
傳輸層:TCP、UDP ……
網路層:IP、ICMP、IGMP ……
鏈路層:ARP、RARP ……
3、TCP/IP 協議
1、TCP 建立和關閉連線過程
建立連線的三次握手,關閉連線的四次握手,及為什麼要這麼做,需要理解清楚。
2、TCP 滑動視窗
這個裡面有幾點需要理解
(1)滑動視窗機制的原理
(2)滑動視窗的作用
(3)滑動視窗大小與傳輸效率的關係
(4)TCP 擁塞控制機制,超時與重傳