本文將講述(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在數學意義下是正確的。