1. 程式人生 > >【Linux】C++後臺開發面試

【Linux】C++後臺開發面試

本文將講述(Linux)伺服器後臺開發崗位的要求,包含了大部分會遇到的面試題目。掌握文中提到的技術,也算少許入門水平了,此文既是面經,也是後臺開發的入門手冊。無論社招還是校招,都可作為一個參考。

本文內容收集自知乎和其他部落格,在此整理成章。

校招:以C++基礎為主,資料結構和常見演算法(ACM經典題目)是必須掌握的。
技術類面試跟學校的經驗 / 社團經驗 / 學習成績 掛鉤不太高,當然不是說兩者沒關係。成績好面試官可喜歡了,但成績一般的同學不用灰心,入選初面的條件是簡歷上突出你的技術水平,不需要寫一堆學習績點高,其實是沒很大意義的,HR看簡歷是關鍵字!關鍵字!必須突出專案/實驗中使用到的技術,如多執行緒程式設計

Socket程式設計,Linux環境搭建記憶體洩漏或BUG的檢測手段,STL-標準庫的使用。
非985-211同學,請重點參考簡歷製作過程中突出關鍵字這條規則!

社招:社招的同學,無論是1-3年經驗,還是中途轉行,都可參考。
寫簡歷必須有針對性,以後臺開發為例,請去拉勾網 / 獵聘 / 智聯招聘等網站,多看看後臺開發的JD.,有針對性地突出自身優勢,每種崗位的技術需求的不一樣的!不一樣的!做簡歷千遍一律,必將死沉大海。同樣道理,必須突出專案/實驗中使用到的技術關鍵字。
網際網路企業流動量很大,崗位是很缺的,如果簡歷投中了,一般幾天內一波面完,基本形式是 初面-復面-HR面。BAT的流程相對很長,通常有4-6輪面試,每輪之間甚至隔很久,進大廠請做好持久戰準備。

溫馨提示:面試官也是普通員工,可能是你未來的經理或總監,他們也沒有專業培訓怎樣面試,題目都是網上找的,所以多刷經典題。
校招的面試官是有些套路的,有題庫,所以還是多刷題。
社招時,他們多半基於自身專案用到的知識,問你有沒有相關經驗,經驗比技術重要。沒經驗不要緊,趕緊做個相關的例子,放在Github,面試時秀出來並詳細介紹,狠狠的加分。

C和C++語言基礎

參考書籍:《C++ primer》,《effective C++》,《STL原始碼解析》,《深度搜索C++物件模型》《C++高階進階程式設計》

後臺開發必考C++五大儲存區和map or set用法,別問我為什麼。

3. volatile關鍵字作用

4. 說說const的作用,越多越好。const代表只讀/不可修改,而不僅僅是常量。

6. sizeof的運算結果,針對結構體物件,帶虛擬函式類物件,指標,字串,陣列深入瞭解。

7. C++多型性與虛擬函式表
• C++多型的實現?虛擬函式的作用?瞭解一下。
虛擬函式用於實現多型,虛擬函式在設計上還要封裝和抽象的作用,比如抽象工廠模式。
• 虛擬函式表是針對類還是針對物件的?同一個類的兩個物件的虛擬函式表是怎麼維護的?一個類是三角繼承關係,它的虛擬函式表是什麼形式?有多少個表?
• 純虛擬函式如何定義,為什麼對於存在虛擬函式的類中需要將解構函式定義為虛擬函式?
• 解構函式能丟擲異常嗎?建構函式呢?
• 建構函式和解構函式中呼叫虛擬函式嗎?
• 動態繫結是如何實現的?靜態多型和動態多型的區別
關於虛擬函式和繼承,筆試題必考。考察輸出和函式呼叫。

8. 指標和引用的區別

9. 指標和陣列千絲萬縷的聯絡

10. 智慧指標是怎麼實現的,什麼適合改變引用計數?
auto_ptr是C99的內容,share_ptr,weak_ptr是C11的新內容。

11. C++四種類型的轉換。static_cast, dynamic_cast, const_cast, reinterpret_cast

12. 記憶體對齊的原則,結構體中變數宣告順序不同時sizeof的大小。為什麼要記憶體對齊。

13. 行內函數有什麼優點?行內函數與巨集定義的區別?
• 巨集定義用於計算時,有括號與沒括號計算結果是不同的。

14. C++記憶體管理。五大記憶體區(棧,堆,全域性/靜態區,常量區,程式碼區)
• static和const宣告的變數放在哪個區?
• 全域性陣列最大可宣告多少?區域性陣列最大可宣告多少,如果棧不夠用怎麼辦,可以改嗎?

15. STL標準庫,基礎中的要點,筆試必考,面試也必問。
• map和set是基於什麼實現的?紅黑樹的特點。
• vector和list在儲存上的區別。多維陣列在儲存上是連續的嗎?
• queue和stack的實現,是陣列還是連結串列?
• map中的元素是自定義結構體,這個結構體有什麼要求?(需要過載operator<)

16. 必須在建構函式初始化列表裡初始化的資料成員有哪些?

17. 什麼是原子操作?++i是原子操作嗎,為什麼?
• ++i和i++的區別,++i = (j++)+(++i) 結果是什麼

18. 迭代器/遊標使用需要注意什麼?

19. iterator中remove和erase的區別?

資料結構與演算法

1. 手寫strcoy, strcat, strcmo, memcpy等函式

2. 合併兩個升序單鏈表

3. 求一個數組中子序列的最大和

4. 檢測是否二叉查詢樹

5. 刪除單鏈表的倒數k節點;反向列印連結串列(遞迴);連結串列是否有環

6. 海量資料量中檢測重複多的數值(鵝廠喜歡考,海量QQ號找重複的)
• 一百萬個整數中,前100個最大的數。(劃重點
• 一百萬個整數中出現頻率最高的100個數。
海量資料的十種問題

7. 10機制轉16進位制

8. 排序演算法,其實面試很少現場寫快排,但要懂演算法思路,演算法複雜度等。排序是經典中經典,不考也要看。

9. 實現一個string類,基礎題大題。

這一塊考察範圍很廣,多刷題。牛客網,劍指OFFER,LeetCode等。
鵝廠習慣手寫程式碼,寫的問題不難,都是經典演算法。
華為有機測,做的題目以考察編碼邏輯為主。三道題。
百度的題比較有深度,也是經典演算法,保不準要你寫個查詢樹的刪除演算法,都趕上微軟了。
大疆有機測,題目以一般基礎知識為準。程式設計題與牛客網上的類似。
阿里用的是JAVA,偏向推薦演算法和廣告大資料,本人未面過。
其他公司,有拿個mac現場把類補全實現的;有口述加板書描述的;有一口氣說N個問題,看你思路怎樣的;但不管怎樣,還是多刷題!演算法是加分項,過不了也別擔心,思路必須清晰。

再囉嗦一句,寫演算法時判空和判越界和判NULL等必須寫出來!

1. 二叉樹的結構,二叉查詢樹的實現和搜尋。

2. 二叉樹的6種遍歷,按層遍歷。一般不會問演算法題,簡述即可。

3. 什麼是紅黑樹,與AVL樹有什麼區別?

樹很重要,因為map和MySQL的實現都與樹有關,二叉樹結構的搜尋和刪除插入效率都極高。樹結構能用在很多地方提高效能。

Socket程式設計  - TCP/IP  HTTP

參考書籍:《圖解TCP/IP》,《TCP/IP詳解 卷一》,《圖解HTTP》,《HTTP權威指南》

後臺開發必考TCP三次握手四次揮手,重點!
後臺開發必考TCP多連線問題,如高併發(社招)
後臺開發必考HTTP狀態碼和方法集,重點!

1. TCP和UDP之間的區別
• IP首部,TCP首部,UDP首部。一般不直接考,但要懂。
• TCP和UDP的應用場景。
• 如何實現可靠的UDP。(可靠的UDP,其實就是TCP好不。)

2. TCP的三次握手和四次揮手。
• 其中的細節要了解清楚,例如2MSL,CLOSE_WAIT,TIME_WAIT.
• 一定要會畫出整個過程圖,最好是每個符號都畫出來。

3. TCP中六個標識位的作用

4. Socket程式設計知識,請理解每個函式的返回值,引數值和特殊欄位含義。
• Client和Server的使用,函式呼叫過程是怎樣的。
• listen函式,第二個引數什麼作用。
• recv函式的返回值是什麼含義。
• 怎麼判斷字元接受完畢。(設計一個結束符,通常是 '\n')
• accpet函式返回的套接字和listen中套接字的關係。

5. TCP重發機制

6. TCP的擁塞控制使用的演算法和具體過程

7. Http/Https 1.0 1.1 2.0的特點和區別

8. Http返回狀態碼

• 302 和 303有什麼區別
• 1xx  2xx 3xx 4xx 5xx 分別代表什麼型別含義
• 500什麼時候會出現,怎麼解決

9. Http有什麼方法集

10. Https和Http的區別,如何實現加密傳輸?加解密方法是什麼?

11. 瀏覽器中輸入一個URL會發生什麼,用到哪些協議?

12. 請描述伺服器過程,客戶端到伺服器中間的過程描述一下。

資料庫 (MySQL)

主要參考書籍:《資料庫系統概念》,《高效能MySQL》

1. SQL語言,內外連線,子查詢,分組,聚集,巢狀,邏輯。手寫一些例子。

2. MySQL索引方法?索引的優化。

3. InnoDB和MyISAM區別

4. 什麼是NoSQL

5. 查詢優化,從索引上優化,從SQL語言上優化。

6. B-樹和B+樹區別。MySQL的核心是棵B+樹
注意二叉樹,B樹,B-樹,B+樹,B*樹的區別。B樹和B-樹是一個意思。B樹是M階查詢,當B樹是二階時就是二叉查詢樹。

7. MySQL的聯合索引,又稱多列索引是什麼,生效的條件是什麼?

8. 分庫分表

程序與執行緒

1. 程序間的通訊方法

方式七:套接字 socket

2. 執行緒和程序有什麼區別?

3. 執行緒比程序有哪些優勢?

3. 什麼時候有多程序,什麼時候用多執行緒?

4. Linux中程序和執行緒使用的幾個函式是什麼?

5. 執行緒的同步方法有哪些?
在Windows下執行緒同步的方式有:互斥量,訊號量,事件,關鍵程式碼段,全域性變數,臨界區。
在Linux下執行緒同步的方式有:互斥鎖,自旋鎖,讀寫鎖,屏障(併發完成同一項任務時,屏障的作用特別好使) 知道這些鎖之間的區別,使用場景?

6. 關於程序排程 瞭解一下
Linux程序分為兩種,實時程序和非實時程序
優先順序分靜態優先順序和動態優先順序,優先順序的範圍
排程策略
互動程序通過平均睡眠時間而被獎勵

7. 死鎖,及死鎖產生的必要條件,怎麼防止死鎖? 重點!很常考。

8. 什麼是執行緒安全,執行緒安全是否完全由執行緒安全的類構成?

記憶體管理問題(社招) 

後臺開發必考記憶體類問題,沒固定,多看。開發過程中最怕遇到記憶體洩漏,一定要會除錯查詢記憶體BUG,也要注意記憶體碎片,程序使用記憶體問題。不要爆記憶體,不要降效能。
會記憶體管理的校招同學,有加分。

1. 什麼是記憶體洩漏,怎麼定位記憶體洩漏。定位記憶體洩漏
• 在windows平臺下通過CRT中的庫函式進行檢查
• Linux下通過工具valgrind檢測

2. 什麼是記憶體碎片,怎麼避免記憶體碎片。
new申請大量不連續的空間後,剩餘可用記憶體分佈零散,無法被有效使用。這些零散的可用記憶體叫記憶體碎片。
避免記憶體碎片使用夥伴演算法。

3. C++五大儲存區,上文已提及。

4. 32位系統一個程序最多可以佔用多少記憶體。64位呢。

5. 棧空間的最大是多少,堆空間的最大是多少。

6. 虛擬記憶體的作用,虛擬記憶體的實現。

Linux操作

主要參考書籍:《現代作業系統》,《APUE》,《UNP》,《LINUX核心設計與實現》,《深入理解LINUX核心》

1. 怎麼檢視計算機狀態,記憶體使用情況等(工作管理員)
cpu,記憶體,硬碟,等等與系統性能除錯相關的命令必須熟練掌握,設定修改許可權 ,tcp網路狀態檢視,各程序狀態,抓包相關等相關命令 必須熟練掌握。(top, free, df, fdisk)

2. netstat tcpdump ipcs ipcrm這幾個命令是什麼作用?這是網路相關的命令,請熟悉。

3. sed, awk, grep 三個超強大的命令,分別用於格式化修改,統計,和正則查詢。請熟系。

4. select, poll, epoll的區別。用select實現一個連線的大概步驟。

5. frok和vfork的區別。
fork和vfork都用於建立子程序。但是vfork建立子程序後,父程序阻塞,直到子程序呼叫exit()或者excle()。
對於核心中過程fork通過呼叫clone函式,然後clone函式呼叫do_fork()。do_fork()中呼叫copy_process()函式先複製task_struct結構體,然後複製其他關於記憶體,檔案,暫存器等資訊。fork採用寫時拷貝技術,因此子程序和父程序的頁表指向相同的頁框。但是vfork不需要拷貝頁表,因為父程序會一直阻塞,直接使用父程序頁表。

6. exit() 與 _exit()的區別
exit()清理後進入核心,_exit()直接陷入核心。

7. 孤兒程序是怎麼產生的?僵死程序是怎麼產生的?

8. 僵死程序的危害有哪些?怎麼避免?

其他遇到的題目

1. 有哪些東西是編譯期間確定的,哪些是執行期間確定的?
考察編譯和執行的瞭解。編譯期間確定陣列大小空間,巨集定義,行內函數展開,extern變數等。執行期間確定new大小,多型類物件的函式呼叫,未賦值全域性指標的指向等。

2. 怎麼判斷大小端,怎麼判斷程式是32位還是64位?
主要實現為static靜態方法,首先為long分配了8個位元組記憶體,然後為long分配了值,之後拿出long的第一個位元組,如果為資料的高位,那麼平臺採用的是大端位元組序,如果為資料的低位,那麼平臺採用的時小端位元組序。
sizeof 指標等於4是32位,8是64位。

3. 記憶體只有2GB,怎麼讀入3GB的檔案。
使用mmap瞭解一下。

社招面試,很多會先問你做過的專案,技術大牛會從中深入,建議大家先打個草稿,突出重點,並避開自己不足的地方,臨場發揮很容易踩雷。
面試內容遠不止這些,更多後續補充....

末尾讓大家思考一道題,什麼情況下,等式5+5=11在數學意義下是正確的。