面試分為以下幾大塊:
1、C/C++;2、網絡;3、操作系統;4、Linux系統;5、MongoDB;6、Redis;7、mysql;8、算法;9、設計模式;10、分布式架構;11、系統設計
一、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++、windows編程、網絡編程、QT界面開發、Linux編程、游戲編程、網絡安全等等......

一個活躍、高逼格、高層次的程序員編程學習殿堂;編程交流只是順帶,思維的提高才有價值!