面試分為以下幾大塊:
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編程、游戲編程、網路安全等等......

一個活躍、高逼格、高層次的程式員編程學習殿堂;編程交流只是順帶,思維的提高才有價值!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/196050.html
標籤:其他
上一篇:Python3 + Appium + 安卓模擬器 實作APP自動化測驗,并生成測驗報告
下一篇:容器技術(三)鏡像分層【6】
