【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用法,別問我為什么。


1. extern關鍵字的作用


2. static關鍵字作用


3. volatile關鍵字作用


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


5. new和malloc的區別


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. 進程間的通訊方法


方式一:管道 pipe


方式二:消息隊列 msgget


方式三:信號 signal


方式四:信號量 semget


方式五:共享儲存區 shmget


方式六:共享文件映射 mmap


方式七:套接字 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. 虛擬內存的作用,虛擬內存的實現。


7. 操作系統對內存的管理。


8. 線程池,內存池的作用及實現方法,STL里內存池的實現方法。


9. Linux的內存管理機制是什么。淺談Linux的內存管理機制


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在數學意義下是正確的。



【Linux】C++后台開發面試 - 不知鯨又是魚 - CSDN博客 blog.csdn.net


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM