鵝廠是cpp的主戰場,而以cpp為背景的工程師大都對os,network這塊要求特別高,不像是Java這種偏重業務層的語言,之前面試Java的公司側重還是在數據結構、網絡、框架、數據庫和分佈式。所以OS這塊吃的虧比較大。
面試分為以下幾大塊
- C/C++
- 網絡
- 操作系統
- Linux系統
- MongoDB
- Redis
- mysql
- 算法
- 設計模式
- 分佈式架構
- 系統設計
- 等等,未完待續
C/C++
- const
- 多態
- 什麼類不能被繼承(這個題目非常經典,我當時答出了private但是他說不好,我就沒想到final我以為那個是java的)
網絡
- 網絡的字節序
- 網絡知識 tcp三次握手 各種細節 timewait狀態
- tcp 與 udp 區別 概念 適用範圍
- TCP四次揮手講一下過程,最後一次ack如果客戶端沒收到怎麼辦,為什麼揮手不能只有三次,為什麼time_wait。
- 對於socket編程,accept方法是幹什麼的,在三次握手中屬於第幾次,可以猜一下,為什麼這麼覺得。
- tcp怎麼保證有序傳輸的,講下tcp的快速重傳和擁塞機制,知不知道time_wait狀態,這個狀態出現在什麼地方,有什麼用?
- 知道udp是不可靠的傳輸,如果你來設計一個基於udp差不多可靠的算法,怎麼設計?
- http與https有啥區別?說下https解決了什麼問題,怎麼解決的?說下https的握手過程。
- tcp 粘包半包問題怎麼處理?
- keepalive 是什麼東東?如何使用?
- 列舉你所知道的tcp選項,並說明其作用。
- socket什麼情況下可讀?
- nginx的epoll模型的介紹以及io多路複用模型
- SYN Flood攻擊
- 流量控制,擁塞控制
- TCP和UDP區別,TCP如何保證可靠性,對方是否存活(心跳檢測)
- tcpdump抓包,如何分析數據包
- tcp如何設定超時時間
- 基於socket網絡編程和tcp/ip協議棧,講講從客戶端send()開始,到服務端recv()結束的過程,越細越好
- http報文格式
- http1.1與http1.0區別,http2.0特性
- http3瞭解嗎
- http1.1長連接時,發送一個請求阻塞了,返回什麼狀態碼?
- udp調用connect有什麼作用?
操作系統
- 進程和線程-分別的概念 區別 適用範圍 它們分別的通訊方式 不同通訊方式的區別優缺點
- 殭屍進程
- 死鎖是怎麼產生的
- CPU的執行方式
- 代碼中遇到進程阻塞,進程僵死,內存洩漏等情況怎麼排查。
- 有沒有了解過協程?說下協程和線程的區別?
- 堆是線程共有還是私有,堆是進程共有還是私有,棧呢
- 瞭解過協程嗎(我:攜程???不瞭解嗚嗚嗚)
- 共享內存的使用實現原理(必考必問,然後共享內存段被映射進進程空間之後,存在於進程空間的什麼位置?共享內存段最大限制是多少?)
- c++進程內存空間分佈(注意各部分的內存地址誰高誰低,注意棧從高道低分配,堆從低到高分配)
- ELF是什麼?其大小與程序中全局變量的是否初始化有什麼關係(注意.bss段)
- 使用過哪些進程間通訊機制,並詳細說明(重點)
- 多線程和多進程的區別(重點 面試官最最關心的一個問題,必須從cpu調度,上下文切換,數據共享,多核cup利用率,資源佔用,等等各方面回答,然後有一個問題必須會被問到:哪些東西是一個線程私有的?答案中必須包含寄存器,否則悲催)
- 信號:列出常見的信號,信號怎麼處理?
- i++是否原子操作?並解釋為什麼???????
- 說出你所知道的各類linux系統的各類同步機制(重點),什麼是死鎖?如何避免死鎖(每個技術面試官必問)
- 列舉說明linux系統的各類異步機制
- exit() _exit()的區別?
- 如何實現守護進程?
- linux的內存管理機制是什麼?
- linux的任務調度機制是什麼?
- 標準庫函數和系統調用的區別?
- 補充一個坑爹坑爹坑爹坑爹的問題:系統如何將一個信號通知到進程?(這一題哥沒有答出來)
Linux系統
- linux的各種命令 給你場景讓你解決
- Linux瞭解麼,查看進程狀態ps,查看cpu狀態 top。查看佔用端口的進程號netstat grep
- Linux的cpu 100怎麼排查,top jstack,日誌,gui工具
- Linux操作系統瞭解麼
- 怎麼查看CPU負載,怎麼查看一個客戶下有多少進程
- Linux內核是怎麼實現定時器的
- gdb怎麼查看某個線程
- core dump有沒有遇到過,gdb怎麼調試
- linux如何設置core文件生成
- linux如何設置開機自啟動
- linux用過哪些命令、工具
- 用過哪些工具檢測程序性能,如何定位性能瓶頸的地方
- netstat tcpdump ipcs ipcrm (如果這四個命令沒聽說過或者不能熟練使用,基本上可以回家,通過的概率較小 ^_^ ,這四個命令的熟練掌握程度基本上能體現面試者實際開發和調試程序的經驗)
- cpu 內存 硬盤 等等與系統性能調試相關的命令必須熟練掌握,設置修改權限 tcp網絡狀態查看 各進程狀態 抓包相關等相關命令 必須熟練掌握
- awk sed需掌握
- gdb調試相關的經驗,會被問到
MongoDB
- 關於大數據存儲的(mongodb hadoop)各種原理 mongodb又問的深入很多
Redis
- Redis內存數據庫的內存指的是共享內存麼
- Redis的持久化方式
- Redis和MySQL有什麼區別,用於什麼場景。
- redis有沒有用過,常用的數據結構以及在業務中使用的場景,redis的hash怎麼實現的
- 問了下緩存更新的模式,以及會出現的問題和應對思路?
- redis的sentinel上投票選舉的問題 raft算法
- redis單線程結構有什麼優勢?有什麼問題? 主要優勢單線程,避免線程切換產生靜態消耗,缺點是容易阻塞,雖然redis使用io複用epoll和輸入緩衝區把命令按照隊列先進先出輸入等等
- 你覺得針對redis這些缺點那些命令在redis上不可使用? 比如keys、hgetall等等這些命令 建議用scan等等 這方面闡述
- 你覺得為什麼項目中沒有用mysql而用了es,redis在這裡到底起到了什麼作用?因為架構上這裡理解不清楚,最後回答自己都覺得有漏洞了
- 你覺得redis什麼算有用? 有用? 是說存進去了還是說命中緩存?最後把緩存命中率是什麼說了一遍
- 你們這邊redis集群是怎麼樣子的
- 平常redis用的多的數據結構是什麼,跳錶實現,怎麼維護索引,當時我說是一個簡單的二分,手寫二分算法,並且時間複雜度是怎麼計算出來的 (2的k次方等於n k等於logn)
MySQL
- 你們後端用什麼數據庫做持久化的?有沒有用到分庫分表,怎麼做的?
- 索引的常見實現方式有哪些,有哪些區別?MySQL的存儲引擎有哪些,有哪些區別?InnoDB使用的是什麼方式實現索引,怎麼實現的?說下聚簇索引和非聚簇索引的區別?
- mysql查詢優化
- MySQL的索引,B+樹性質。
- B+樹和B樹,聯合索引等原理
- mysql的悲觀鎖和樂觀鎖區別和應用,ABA問題的解決
- 項目性能瓶頸在哪,數據庫表怎麼設計
- 假設項目的性能瓶頸出現在寫數據庫上,應該怎麼解決峰值時寫速度慢的問題
- 假設數據庫需要保存一年的數據,每天一百萬條數據,一張表最多存一千萬條數據,應該怎麼設計表
- 數據庫自增索引。100臺服務器,每臺服務器有若干個用戶,用戶有id,同時會有新用戶加入。實現id自增,統計用戶個數?不能重複,好像是這樣的。
- mysql,會考sql語言,服務器數據庫大規模數據怎麼設計,db各種性能指標
算法
- 堆棧
- 有序數組排序,二分,複雜度
- 常見排序算法,說下快排過程,時間複雜度
- 有N個節點的滿二叉樹的高度。1+logN
- 如何實現關鍵字輸入提示,使用字典樹,複雜度多少,有沒有其他方案,答哈希,如果是中文呢,分詞後建立字典樹?
- hashmap的實現講一下吧,講的很詳細了。講一下紅黑樹的結構,查詢性能等。
- 快排的時間複雜度,冒泡時間複雜度,快排是否穩定,快排的過程
- 100w個數,怎麼找到前1000個最大的,堆排序,怎麼構造,怎麼調整,時間複雜度。
- 一個矩陣,從左上角到右下角,每個位置有一個權值。可以上下左右走,到達右下角的路徑權值最小怎麼走。
- 四輛小車,每輛車加滿油可以走一公里,問怎麼能讓一輛小車走最遠。說了好幾種方案,面試官引導我優化了一下,但是還是不滿意,最後他說跳過。
- MySQL的索引,B+樹性質。
- 十億和數找到前100個最大的,堆排序,怎麼實現,怎麼調整。
- 布隆過濾器
- hash表解決衝突的方法
- 跳錶插入刪除過程
- 讓你實現一個哈希表,怎麼做(當時按照Redis中哈希表的實現原理回答)
設計模式
- 對於單例模式,有什麼使用場景了,講了全局id生成器,他問我分佈式id生成器怎麼實現,說了zk,問我zk瞭解原理不,講了zab,然後就沒問啦。
- 除了單例模式,知道適配器模式怎麼實現麼,有什麼用
分佈式架構
- CAP BASE理論
- 看你項目裡面用了etcd,講解下etcd幹什麼用的,怎麼保證高可用和一致性?
- 既然你提到了raft算法,講下raft算法的基本流程?raft算法裡面如果出現腦裂怎麼處理?有沒有了解過paxos和zookeeper的zab算法,他們之前有啥區別?
- rpc有沒有了解
系統設計
- 朋友之間的點對點關係用圖維護,怎麼判斷兩人是否是朋友,並查集,時間複雜度,過程。
- 10g文件,只有2g內存,怎麼查找文件中指定的字符串出現位置。
- Linux大文件怎麼查某一行的內容。
- 秒殺系統的架構設計
- 十億個數的集合和10w個數的集合,如何求它們的交集。
- 回到網絡,剛才你說到直播場景,知道直播的架構怎麼設計麼,要點是什麼,說了幾個不太對,他說要避免廣播風暴,答不會。
- 針對自己最熟悉的項目,畫出項目的架構圖,主要的數據表結構,項目中使用到的技術點,項目的總峰值qps,時延,以及有沒有分析過時延出現的耗時分別出現在什麼地方,項目有啥改進的地方沒有?
- 如果請求出現問題沒有響應,如何定位問題,說下思路?
- 除了公司項目之外,業務有沒有研究過知名項目或做出過貢獻?
- go程和線程有什麼區別? 答:1 起一個go程大概只需要4kb的內存,起一個Java線程需要1.5MB的內存;go程的調度在用戶態非常輕量,Java線程的切換成本比較高。接著問為啥成本比較高?因為Java線程的調度需要在用戶態和內核態切換所以成本高?為啥在用戶態和內核態之間切換調度成本比較高?簡單說了下內核態和用戶態的定義。接著問,還是沒有明白為啥成本高?心裡瞬間崩潰,沒完沒了了呀,OS這塊依舊是痛呀,支支吾吾半天放棄了。
- 服務器CPU 100%怎麼定位?可能是由於平時定位業務問題的思維定勢,加之處於矇蔽狀態,隨口就是:先查看監控面板看有無突發流量異常,接著查看業務日誌是否有異常,針對CPU100%那個時間段,取一個典型業務流程的日誌查看。最後才提到使用top命令來監控看是哪個進程佔用到100%。果然陣腳大亂,張口就來,捂臉。。。 本來正確的思路應該是先用top定位出問題的進程,再用top定位到出問題的線程,再打印線程堆棧查看運行情況,這個流程換平時肯定能答出來,但是,但是沒有但是。還是得好好總結。
- 最後問了一個系統設計題目(朋友圈的設計),白板上面畫出系統的架構圖,主要的表結構和講解主要的業務流程,如果用戶變多流量變大,架構將怎麼擴展,怎樣應對? 這個答的也有點亂,直接上來自顧自的用了一個通用的架構,感覺毫無亮點。後面反思應該先定位業務的特點,這個業務明顯是讀多寫少,然後和麵試官溝通一期剛開始的方案的用戶量,性能要求,單機目標qps是什麼等等?在明確系統的特點和約束之後再來設計,而不是一開始就是用典型互聯網的那種通用架構自顧自己搞自己的方案。
- 設計一個限流的算法
- 定時器除了小根堆,還可以怎麼做
- 項目性能瓶頸在哪,數據庫表怎麼設計
- .在高併發的生產環境中(非調試場景下),如果出現數據包的丟失,如何定位問題
- 補充一個最最重要,最最坑爹,最最有難度的一個題目:一個每秒百萬級訪問量的互聯網服務器,每個訪問都有數據計算和I/O操作,如果讓你設計,你怎麼設計?
道友總結
- tcp/udp,http和https還有網絡這塊(各種網絡模型,已經select,poll和epoll)一定要非常熟悉
- 一定要有拿的出手的項目經驗,而且要能夠講清楚,講清楚項目中取捨,設計模型和數據表
- 分佈式要非常熟悉
- 常見問題定位一定要有思路
- 操作系統,還是操作系統,重要的事情說三遍
- 系統設計,思路,思路,思路,一定要思路清晰,一定要總結下系統設計的流程
- 一點很重要的心得,平時blog和專欄看的再多,如果沒有自己的思考不過是過眼雲煙,根本不會成為自己的東西,就像內核態和用戶態,平常也看過,但是沒細想,突然要自己說,還真說不出來,這就很尷尬了。勿以浮沙築高臺,基礎這種東西還是需要時間去慢慢打牢,多去思考和總結。
C/C++Linux高級開發路線
對標騰訊C++後端開發
更多的專業C/C++ Linux技術棧知識可以私信“資料”
閱讀更多 編程資源庫 的文章