盤點騰訊linux C++後臺開發面試題

2020-08-12 17:24:25

鵝廠是cpp的主戰場,而以cpp爲背景的工程師大都對os,network這塊要求特別高,不像是Java這種偏重業務層的語言,之前面試Java的公司側重還是在數據結構、網路、框架、數據庫和分佈式。所以OS這塊吃的虧比較大。

面試分爲以下幾大塊

C/C++
網路
操作系統
Linux系統
MongoDB
Redis
mysql
演算法
設計模式
分佈式架構
系統設計
等等,未完待續

C/C++

  1. const
  2. 多型
  3. 什麼類不能被繼承(這個題目非常經典,我當時答出了private但是他說不好,我就沒想到final我以爲那個是java的)

網路

  1. 網路的位元組序

  2. 網路知識 tcp三次握手 各種細節 timewait狀態

  3. tcp 與 udp 區別 概念 適用範圍

  4. TCP四次揮手講一下過程,最後一次ack如果用戶端沒收到怎麼辦,爲什麼揮手不能只有三次,爲什麼time_wait。

  5. 對於socket程式設計,accept方法是幹什麼的,在三次握手中屬於第幾次,可以猜一下,爲什麼這麼覺得。

  6. tcp怎麼保證有序傳輸的,講下tcp的快速重傳和擁塞機制 機製,知不知道time_wait狀態,這個狀態出現在什麼地方,有什麼用?

  7. 知道udp是不可靠的傳輸,如果你來設計一個基於udp差不多可靠的演算法,怎麼設計?

  8. http與https有啥區別?說下https解決了什麼問題,怎麼解決的?說下https的握手過程。

  9. tcp 粘包半包問題怎麼處理?

  10. keepalive 是什麼東東?如何使用?

  11. 列舉你所知道的tcp選項,並說明其作用。

  12. socket什麼情況下可讀?

  13. nginx的epoll模型的介紹以及io多路複用模型

  14. SYN Flood攻擊

  15. 流量控制,擁塞控制

  16. TCP和UDP區別,TCP如何保證可靠性,對方是否存活(心跳檢測)

  17. tcpdump抓包,如何分析數據包

  18. tcp如何設定超時時間

  19. 基於socket網路程式設計和tcp/ip協定棧,講講從用戶端send()開始,到伺服器端recv()結束的過程,越細越好

  20. http報文格式

  21. http1.1與http1.0區別,http2.0特性

  22. http3瞭解嗎

  23. http1.1長連線時,發送一個請求阻塞了,返回什麼狀態碼?

  24. udp呼叫connect有什麼作用?

操作系統

  1. 進程和執行緒-分別的概念 區別 適用範圍 它們分別的通訊方式 不同通訊方式的區別優缺點
  2. 殭屍進程
  3. 死鎖是怎麼產生的
  4. CPU的執行方式
  5. 程式碼中遇到進程阻塞,進程僵死,記憶體漏失等情況怎麼排查。
  6. 有沒有瞭解過協程?說下協程和執行緒的區別?
  7. 堆是執行緒共有還是私有,堆是進程共有還是私有,棧呢
  8. 瞭解過協程嗎(我:攜程???不瞭解嗚嗚嗚)
  9. 共用記憶體的使用實現原理(必考必問,然後共用記憶體段被對映進進程空間之後,存在於進程空間的什麼位置?共用記憶體段最大限制是多少?)
  10. c++進程記憶體空間分佈(注意各部分的記憶體地址誰高誰低,注意棧從高道低分配,堆從低到高分配)
  11. ELF是什麼?其大小與程式中全域性變數的是否初始化有什麼關係(注意.bss段)
  12. 使用過哪些進程間通訊機制 機製,並詳細說明(重點)
  13. 多執行緒和多進程的區別(重點
    面試官最最關心的一個問題,必須從cpu排程,上下文切換,數據共用,多核cup利用率,資源佔用,等等各方面回答,然後有一個問題必須會被問到:哪些東西是一個執行緒私有的?答案中必須包含暫存器,否則悲催)
  14. 信號:列出常見的信號,信號怎麼處理?
  15. i++是否原子操作?並解釋爲什麼???????
  16. 說出你所知道的各類linux系統的各類同步機制 機製(重點),什麼是死鎖?如何避免死鎖(每個技術面試官必問)
  17. 列舉說明linux系統的各類非同步機制 機製
  18. exit() _exit()的區別?
  19. 如何實現守護行程?
  20. linux的記憶體管理機制 機製是什麼?
  21. linux的任務排程機制 機製是什麼?
  22. 標準庫函數和系統呼叫的區別?
  23. 補充一個坑爹坑爹坑爹坑爹的問題:系統如何將一個信號通知到進程?(這一題哥沒有答出來)

Linux系統

  1. linux的各種命令 給你場景讓你解決
  2. Linux瞭解麼,檢視進程狀態ps,檢視cpu狀態 top。檢視佔用埠的進程號netstat grep
  3. Linux的cpu 100怎麼排查,top jstack,日誌,gui工具
  4. Linux操作系統瞭解麼
  5. 怎麼檢視CPU負載,怎麼檢視一個客戶下有多少進程
  6. Linux內核是怎麼實現定時器的
  7. gdb怎麼檢視某個執行緒
  8. core dump有沒有遇到過,gdb怎麼偵錯
  9. linux如何設定core檔案生成
  10. linux如何設定開機自啓動
  11. linux用過哪些命令、工具
  12. 用過哪些工具檢測程式效能,如何定位效能瓶頸的地方
  13. netstat tcpdump ipcs ipcrm (如果這四個命令沒聽說過或者不能熟練使用,基本上可以回家,通過的概率較小,這四個命令的熟練掌握程度基本上能體現面試者實際開發和偵錯程式的經驗)
  14. cpu 記憶體 硬碟 等等與系統效能偵錯相關的命令必須熟練掌握,設定修改許可權 tcp網路狀態檢視 各進程狀態 抓包相關等相關命令必須熟練掌握
  15. awk sed需掌握
  16. gdb偵錯相關的經驗,會被問到

MongoDB

  1. 關於大數據儲存的(mongodb hadoop)各種原理 mongodb又問的深入很多

Redis

  1. Redis記憶體數據庫的記憶體指的是共用記憶體麼
  2. Redis的持久化方式
  3. Redis和MySQL有什麼區別,用於什麼場景。
  4. redis有沒有用過,常用的數據結構以及在業務中使用的場景,redis的hash怎麼實現的
  5. 問了下快取更新的模式,以及會出現的問題和應對思路?
  6. redis的sentinel上投票選舉的問題 raft演算法
  7. redis單執行緒結構有什麼優勢?有什麼問題?
  8. 主要優勢單執行緒,避免執行緒切換產生靜態消耗,缺點是容易阻塞,雖然redis使用io複用epoll和輸入緩衝區把命令按照佇列先進先出輸入等等
  9. 你覺得針對redis這些缺點那些命令在redis上不可使用? 比如keys、hgetall等等這些命令 建議用scan等等 這方面闡述
  10. 你覺得爲什麼專案中沒有用mysql而用了es,redis在這裏到底起到了什麼作用?因爲架構上這裏理解不清楚,最後回答自己都覺得有漏洞了
  11. 你覺得redis什麼算有用? 有用? 是說存進去了還是說命中快取?最後把快取命中率是什麼說了一遍 你們這邊redis叢集是怎麼樣子的
  12. 平常redis用的多的數據結構是什麼,跳錶實現,怎麼維護索引,當時我說是一個簡單的二分,手寫二分演算法,並且時間複雜度是怎麼計算出來的(2的k次方等於n k等於logn)

MySQL

  1. 你們後端用什麼數據庫做持久化的?有沒有用到分庫分表,怎麼做的?
  2. 索引的常見實現方式有哪些,有哪些區別?MySQL的儲存引擎有哪些,有哪些區別?InnoDB使用的是什麼方式實現索引,怎麼實現的?說下聚簇索引和非聚簇索引的區別?
  3. mysql查詢優化
  4. MySQL的索引,B+樹性質。
  5. B+樹和B樹,聯合索引等原理
  6. mysql的悲觀鎖和樂觀鎖區別和應用,ABA問題的解決
  7. 專案效能瓶頸在哪,數據庫表怎麼設計
  8. 假設專案的效能瓶頸出現在寫數據庫上,應該怎麼解決峯值時寫速度慢的問題
  9. 假設數據庫需要儲存一年的數據,每天一百萬條數據,一張表最多存一千萬條數據,應該怎麼設計表
    數據庫自增索引。100台伺服器,每台伺服器有若幹個使用者,使用者有id,同時會有新使用者加入。實現id自增,統計使用者個數?不能重複,好像是這樣的
  10. mysql,會考sql語言,伺服器數據庫大規模數據怎麼設計,db各種效能指標

演算法

  1. 堆疊
  2. 有序陣列排序,二分,複雜度
  3. 常見排序演算法,說下快排過程,時間複雜度
  4. 有N個節點的滿二元樹的高度。1+logN
  5. 如何實現關鍵字輸入提示,使用字典樹,複雜度多少,有沒有其他方案,答雜湊,如果是中文呢,分詞後建立字典樹?
  6. hashmap的實現講一下吧,講的很詳細了。講一下紅黑樹的結構,查詢效能等。
  7. 快排的時間複雜度,冒泡時間複雜度,快排是否穩定,快排的過程
  8. 100w個數,怎麼找到前1000個最大的,堆排序,怎麼構造,怎麼調整,時間複雜度。
  9. 一個矩陣,從左上角到右下角,每個位置有一個權值。可以上下左右走,到達右下角的路徑權值最小怎麼走。
  10. 四輛小車,每輛車加滿油可以走一公裡,問怎麼能讓一輛小車走最遠。說了好幾種方案,面試官引導我優化了一下,但是還是不滿意,最後他說跳過。
  11. MySQL的索引,B+樹性質。
  12. 十億和數找到前100個最大的,堆排序,怎麼實現,怎麼調整。
  13. 布隆過濾器
  14. hash表解決衝突的方法
  15. 跳錶插入刪除過程
  16. 讓你實現一個雜湊表,怎麼做(當時按照Redis中雜湊表的實現原理回答)

設計模式

  1. 對於單例模式,有什麼使用場景了,講了全域性id生成器,他問我分佈式id生成器怎麼實現,說了zk,問我zk瞭解原理不,講了zab,然後就沒問啦。
  2. 除了單例模式,知道適配器模式怎麼實現麼,有什麼用

分佈式架構

  1. CAP BASE理論
  2. 看你專案裏面用了etcd,講解下etcd幹什麼用的,怎麼保證高可用和一致性?
  3. 既然你提到了raft演算法,講下raft演算法的基本流程?raft演算法裏面如果出現腦裂怎麼處理?有沒有瞭解過paxos和zookeeper的zab演算法,他們之前有啥區別?
  4. rpc有沒有瞭解

系統設計

  1. 朋友之間的對等關係用圖維護,怎麼判斷兩人是否是朋友,並查集,時間複雜度,過程。
  2. 10g檔案,只有2g記憶體,怎麼查詢檔案中指定的字串出現位置。
  3. Linux大檔案怎麼查某一行的內容。
  4. 秒殺系統的架構設計
  5. 十億個數的集合和10w個數的集合,如何求它們的交集。
  6. 回到網路,剛纔你說到直播場景,知道直播的架構怎麼設計麼,要點是什麼,說了幾個不太對,他說要避免廣播風暴,答不會。
  7. 針對自己最熟悉的專案,畫出專案的架構圖,主要的數據表結構,專案中使用到的技術點,專案的總峯值qps,時延,以及有沒有分析過時延出現的耗時分別出現在什麼地方,專案有啥改進的地方沒有?
  8. 如果請求出現問題沒有響應,如何定位問題,說下思路?
  9. 除了公司專案之外,業務有沒有研究過知名專案或做出過貢獻?
  10. go程和執行緒有什麼區別? 答:1起一個go程大概只需要4kb的記憶體,起一個Java執行緒需要1.5MB的記憶體;go程的排程在使用者態非常輕量,Java執行緒的切換成本比較高。接着問爲啥成本比較高?因爲Java執行緒的排程需要在使用者態和內核態切換所以成本高?爲啥在使用者態和內核態之間切換排程成本比較高?簡單說了下內核態和使用者態的定義。接着問,還是沒有明白爲啥成本高?心裏瞬間崩潰,沒完沒了了呀,OS這塊依舊是痛呀,支支吾吾半天放棄了。
  11. 伺服器CPU100%怎麼定位?可能是由於平時定位業務問題的思維定勢,加之處於矇蔽狀態,隨口就是:先檢視監控面板看有無突發流量異常,接着檢視業務日誌是否有異常,針對CPU100%那個時間段,取一個典型業務流程的日誌檢視。最後才提到使用top命令來監控看是哪個進程佔用到100%。果然陣腳大亂,張口就來,捂臉。。。
    本來正確的思路應該是先用top定位出問題的進程,再用top定位到出問題的執行緒,再列印執行緒堆疊檢視執行情況,這個流程換平時肯定能答出來,但是,但是沒有但是。還是得好好總結。
  12. 最後問了一個系統設計題目(朋友圈的設計),白板上面畫出系統的架構圖,主要的表結構和講解主要的業務流程,如果使用者變多流量變大,架構將怎麼擴充套件,怎樣應對?
    這個答的也有點亂,直接上來自顧自的用了一個通用的架構,感覺毫無亮點。後面反思應該先定位業務的特點,這個業務明顯是讀多寫少,然後和麪試官溝通一期剛開始的方案的使用者量,效能要求,單機目標qps是什麼等等?在明確系統的特點和約束之後再來設計,而不是一開始就是用典型網際網路的那種通用架構自顧自己搞自己的方案。
    設計一個限流的演算法
  13. 定時器除了小根堆,還可以怎麼做
  14. 專案效能瓶頸在哪,數據庫表怎麼設計
  15. .在高併發的生產環境中(非偵錯場景下),如果出現數據包的丟失,如何定位問題
  16. 補充一個最最重要,最最坑爹,最最有難度的一個題目:一個每秒百萬級存取量的網際網路伺服器,每個存取都有數據計算和I/O操作,如果讓你設計,你怎麼設計?

道友總結

  1. tcp/udp,http和https還有網路這塊(各種網路模型,已經select,poll和epoll)一定要非常熟悉
    一定要有拿的出手的專案經驗,而且要能夠講清楚,講清楚專案中取捨,設計模型和數據表 分佈式要非常熟悉
  2. 常見問題定位一定要有思路 操作系統,還是操作系統,重要的事情說三遍
    系統設計,思路,思路,思路,一定要思路清晰,一定要總結下系統設計的流程
    一點很重要的心得,平時blog和專欄看的再多,如果沒有自己的思考不過是過眼雲煙,根本不會成爲自己的東西,就像內核態和使用者態,平常也看過,但是沒細想,突然要自己說,還真說不出來,這就很尷尬了。勿以浮沙築高臺,基礎這種東西還是需要時間去慢慢打牢,多去思考和總結。
  3. 本人整理了一些一線網際網路大廠的面試題供大家參考,大家掃描下方二維條碼關注領取!
    在这里插入图片描述C/C++Linux高階開發路線對標騰訊C++後端開發
    在这里插入图片描述