秋招才剛開始,原則上是不應該放面經的。我個人十分不贊成投機取巧,知識面狹窄的問題,絕非面經能夠解決,有時可能適得其反。
無奈的是應該有不少實驗室做的研究和業界(客氣點說)實在不太對口,相信大家在內推階段或多或少的遇到過類似的困擾,面試不好並不是我平時偷懶,而是因為面試官只問他們感興趣的/擅長的,對於自己不懂的,總有那麽一點“不屑一顧”的感覺。
我的個人經歷證實,這些情況確實是存在的,只不過大多數面試官還是會嘗試讓你去解釋研究工作,只不過此時更多考察個人的表述能力。
我投的崗位涉及編譯器開發、服務架構、基礎平臺研發(網絡、存儲)等,絕大多數問題都差不多,大致涵蓋如下方面:
- 基本算法
- linux命令的使用
- 操作系統(著重)
- 網絡(著重)
- 數據庫
- 編譯技術
- 分布式
面試基本會涉及如下幾個環節:
- 自我介紹
- 手擼代碼(通常是一面)
- 領域問題考察
- 項目細節考察
- 系統設計題(通常是架構崗)
現場要求寫的代碼都很簡單(不知道是不是我遇到的比較簡單),涉及一些遞歸、DP等,不會難於LC的middle級別,所以LC刷個200+就基本沒問題了。
基本算法方面考察的主要是算法的應用場景,時間復雜度等,如果是C++相關崗位,可能會涉及一些STL中的數據結構,所以可能會遭遇紅黑樹。另外,由於B樹和B+樹由於在數據庫中應用的較多,亦有可能被考到。
遇到不會的問題很正常,關鍵看你怎麽回答。若能夠跟著面試官的節奏走最好,若是似懂非懂的狀態,不要太坦誠,可以把你知道的完整地跟面試官解釋一遍,按著自己的節奏走,這樣就不會太尷尬了。
如果遇到的全是不會的問題,那麽有2種可能:
- 你投錯崗位了
- 你遇到了壓力面(壓力面當然可以出現在技術面中)
面試過程,更多的是一種技術交流,所以遇到不會的問題,最好請對方給一個答案。另外,你需要清楚,通過面試的關鍵並不是你回答對了多少題目,而是環比其他面試者,你的表現能排第幾,能否擠進HC,當然前提是性格、智商和邏輯都沒問題。。。
接下來給出領域問題,絕大多數問題只是大致回答,懶得詳細闡述了,答案存在問題是難免的。
Linux使用
查看內存信息
free/vmstat/top/htop
查看磁盤信息
iostat
查看CPU信息
vmstat/top/htop
查看網絡信息
netstat -i 網卡信息 netstat -a 連接信息 lsof -i:PORT 查看端口占用信息
proc目錄的實現原理
procfs,內部使用sysctl實現
gdb調試,線程信息,線程棧
info stack/bt 調用棧 info threads 線程信息 thread id 切換線程 watch expr 監控指定表達式
buffer、cache和total的含義
IO寫入時存放數據的內存page buffer IO讀取時存放數據的內存page cache
操作系統
進程和線程的區別
對於Linux內核而言,區別並不是很大。 進程的隔離級別更加高,可以使用命名空間等,IPC的代價稍大。 線程間共享進程的地址空間,所以數據交互更容易,代價也稍小,但是數據競爭更加嚴重,且一旦進程crash,所有線程也就不存在了。
進程切換所做的事情
保存寄存器現場 切換棧空間 處理內存頁(最好深入一下)
線程同步機制
互斥鎖、自旋鎖、讀寫鎖、條件變量
列舉進程通訊的方式
PIPE、共享內存、Socket、文件、MQ等 其中共享內存最快,但是需要額外的工作才能保證數據的一致性
命名空間及其效果
UTS、IPC、PID、NS、NET、USER
cgroup的功能
限制CPU和內存的使用量/使用頻率
VFS文件系統
磁盤中數據的存放
IO調度算法
為何需要IO調度?結合機械硬盤的工作原理,隨機讀寫開銷很大,因此可以通過匯總數據的方式實現順序讀寫。 Anticipatory算法、Deadline算法、CFQ算法以及Noop(No Operation)算法 NOOP算法是最簡單的IO調度算法,適合SSD,只需要將IO請求入隊列即可。
虛擬地址、物理地址及其實現
進程中可見的地址是虛擬地址,物理地址對應真實的內存,虛擬地址通過MMU映射成物理地址,Linux采用的是4級頁表(PGD、PUD、PMD、PTE),最終對應到CR3寄存器。 轉換的方式為基址+“偏移”,由於頁表保存在內存中,CPU訪存代價過大,因此引入TLB緩存,每次映射時優先查找TLB。
網絡
TCP狀態圖,結合握手和揮手
註意同時打開和同時關閉即可,其余結合TCP狀態轉移圖進行理解。
異常狀態的出現場景以及解決方案
大量SYN_RECV狀態的連接,大量TIME_WAIT狀態的連接等。
長連接和短連接
短連接:數據請求到達後即關閉連接 長鏈接:多次請求復用一次連接,需要清楚如何保證連接是否存活,如心跳信號等。
TIME_WAIT的等待時間,MSL的意思
MSL(Maximum Segment Lifetime) TIME_WAIT後並不能保證最終的ACK能夠安全到達對端,因此需要預留重傳的時間,即等待2MSL。 可以通過SO_REUSEADDR規避2MSL的等待。
RTT如何估計
RTT(Round-Trip Time)
開啟SO_REUSEADDR後可能會出現什麽問題
可能接收到對端傳回的FIN、RST等,造成莫名其妙的問題。
TCP如何保證其可靠性
重傳機制、流量控制、擁塞控制
IP序號重合對上層的影響
由IP層負責在組包時解決,對上層無影響。
內核如何解決accept的驚群問題
使用了WQ_FLAG_EXCLUSIVE標記,確保只有一個進程會被喚醒。
用戶態如何解決accept的驚群問題
多進程搶占自旋鎖即可,使用pthread_spinlock或者共享內存+CAS自行實現。 進一步討論,如何在這個階段提供負載均衡。
數據庫
悲觀鎖和樂觀鎖
SQL中如何使用鎖
索引的實現方式和作用
加快數據檢索的速度,但是寫入時有相應的代價,所以適合讀多寫少的場景。 內存通常使用B+樹實現。
編譯相關
解釋器和編譯器
常見的誤區:所謂變異,並非一定要求生成本地代碼,只要從語言A轉換到語言B,這個過程就是編譯。
編譯的流程
預處理-詞法解析-文法解析-語義制導-抽象語法樹(IR的一種)-三地址碼(SSA)-優化(控制流圖、數據流圖)-匯編
動態鏈接庫和靜態鏈接庫的區別
虛擬機如何重新加載腳本
關於熱更新的討論
分布式存儲
redis、rockdb、leveldb的存儲布局
SSD和HDD的區別使用場景
機械結構:主控+多flash芯片 vs 電機+磁盤+磁車 延遲:SSD的延遲至少比HDD低1個數量級 壽命:SSD的壽命主要由P/E次數決定,因此適合多讀少寫的環境 其實,對於順序讀寫,hdd的開銷也不是那麽大,原因自己去計算,另外此處可以結合IO調度算法一起考察。
鎖和MVCC的適用場景
視場景而定,如果數據競爭少,則優先使用MVCC,否則老老實實用鎖。
HDFS的讀寫操作
metadata、membership的管理
etcd或者zookeeper,真的很方便哦~
副本一致性(RSM)
通過最終一致性算法,如Paxos、2PC、3PC、Raft等
主從使用push和pull的優缺點
主節點push可以保證一致性,如果無需考慮一致性,則從節點pull更加靈活,可以支持更多的從節點
Tags: 面試 問題 考察 涉及 基本 可能
文章來源: