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

目錄:

面試分爲如下幾大塊:java

1.C/C++
2 網絡
3.操做系統
4.Linux系統
5.MongoDB
6.Redis
7.mysql
8.算法
9.設計模式
10.分佈式架構
11.系統設計

1、C/C++

  1. const
  2. 多態
  3. 什麼類不能被繼承(這個題目很是經典,我當時答出了private可是他說很差,我就沒想到final我覺得那個是java的)

2、網絡

  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有什麼做用?

3、操做系統

  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. 補充一個坑爹坑爹坑爹坑爹的問題:系統如何將一個信號通知到進程?(這一題哥沒有答出來)

4、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調試相關的經驗,會被問到

5、MongoDB

  1. 關於大數據存儲的(mongodb hadoop)各類原理 mongodb又問的深刻不少

6、Redis

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

7、MySQL

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

8、算法

  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中哈希表的實現原理回答)

9、設計模式

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

10、分佈式架構

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

11、系統設計mysql

  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. 服務器CPU 100%怎麼定位?多是因爲平時定位業務問題的思惟定勢,加之處於矇蔽狀態,隨口就是:先查看監控面板看有無突發流量異常,接着查看業務日誌是否有異常,針對CPU100%那個時間段,取一個典型業務流程的日誌查看。最後才提到使用top命令來監控看是哪一個進程佔用到100%。果真陣腳大亂,張口就來,捂臉。。。 原本正確的思路應該是先用top定位出問題的進程,再用top定位到出問題的線程,再打印線程堆棧查看運行狀況,這個流程換平時確定能答出來,可是,可是沒有可是。仍是得好好總結。
  12. 最後問了一個系統設計題目(朋友圈的設計),白板上面畫出系統的架構圖,主要的表結構和講解主要的業務流程,若是用戶變多流量變大,架構將怎麼擴展,怎樣應對? 這個答的也有點亂,直接上來自顧自的用了一個通用的架構,感受毫無亮點。後面反思應該先定位業務的特色,這個業務明顯是讀多寫少,而後和麪試官溝通一期剛開始的方案的用戶量,性能要求,單機目標qps是什麼等等?在明確系統的特色和約束以後再來設計,而不是一開始就是用典型互聯網的那種通用架構自顧本身搞本身的方案。
  13. 設計一個限流的算法
  14. 定時器除了小根堆,還能夠怎麼作
  15. 項目性能瓶頸在哪,數據庫表怎麼設計
  16. .在高併發的生產環境中(非調試場景下),若是出現數據包的丟失,如何定位問題
  17. 補充一個最最重要,最最坑爹,最最有難度的一個題目:一個每秒百萬級訪問量的互聯網服務器,每一個訪問都有數據計算和I/O操做,若是讓你設計,你怎麼設計?

道友總結

  1. tcp/udp,http和https還有網絡這塊(各類網絡模型,已經select,poll和epoll)必定要很是熟悉
  2. 必定要有拿的出手的項目經驗,並且要可以講清楚,講清楚項目中取捨,設計模型和數據表
  3. 分佈式要很是熟悉
  4. 常見問題定位必定要有思路
  5. 操做系統,仍是操做系統,重要的事情說三遍
  6. 系統設計,思路,思路,思路,必定要思路清晰,必定要總結下系統設計的流程
  7. 一點很重要的心得,平時blog和專欄看的再多,若是沒有本身的思考不過是過眼雲煙,根本不會成爲本身的東西,就像內核態和用戶態,日常也看過,可是沒細想,忽然要本身說,還真說不出來,這就很尷尬了。勿以浮沙築高臺,基礎這種東西仍是須要時間去慢慢打牢,多去思考和總結。

C/C++Linux高級開發路線

對標騰訊C++後端開發linux

更多的專業C/C++ Linux技術棧知識能夠加qun1106675687nginx

相關文章
相關標籤/搜索