面經總結——基礎平臺研發崗">面經總結——基礎平臺研發崗

分類:IT技術 時間:2017-09-11

秋招才剛開始,原則上是不應該放面經的。我個人十分不贊成投機取巧,知識面狹窄的問題,絕非面經能夠解決,有時可能適得其反。

無奈的是應該有不少實驗室做的研究和業界(客氣點說)實在不太對口,相信大家在內推階段或多或少的遇到過類似的困擾,面試不好並不是我平時偷懶,而是因為面試官只問他們感興趣的/擅長的,對於自己不懂的,總有那麽一點“不屑一顧”的感覺。

我的個人經歷證實,這些情況確實是存在的,只不過大多數面試官還是會嘗試讓你去解釋研究工作,只不過此時更多考察個人的表述能力。

我投的崗位涉及編譯器開發、服務架構、基礎平臺研發(網絡、存儲)等,絕大多數問題都差不多,大致涵蓋如下方面:

  1. 基本算法
  2. linux命令的使用
  3. 操作系統(著重)
  4. 網絡(著重)
  5. 數據庫
  6. 編譯技術
  7. 分布式

面試基本會涉及如下幾個環節:

  1. 自我介紹
  2. 手擼代碼(通常是一面)
  3. 領域問題考察
  4. 項目細節考察
  5. 系統設計題(通常是架構崗)

現場要求寫的代碼都很簡單(不知道是不是我遇到的比較簡單),涉及一些遞歸、DP等,不會難於LC的middle級別,所以LC刷個200+就基本沒問題了。

基本算法方面考察的主要是算法的應用場景,時間復雜度等,如果是C++相關崗位,可能會涉及一些STL中的數據結構,所以可能會遭遇紅黑樹。另外,由於B樹和B+樹由於在數據庫中應用的較多,亦有可能被考到。

遇到不會的問題很正常,關鍵看你怎麽回答。若能夠跟著面試官的節奏走最好,若是似懂非懂的狀態,不要太坦誠,可以把你知道的完整地跟面試官解釋一遍,按著自己的節奏走,這樣就不會太尷尬了。

如果遇到的全是不會的問題,那麽有2種可能:

  1. 你投錯崗位了
  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: 面試 問題 考察 涉及 基本 可能

文章來源:


ads
ads

相關文章
ads

相關文章

ad