本文將講述(Linux)服務器後臺開發崗位的要求,包含了大部分會遇到的面試題目。掌握文中提到的技術,也算少量入門水平了,此文既是面經,也是後臺開發的入門手冊。不管社招仍是校招,均可做爲一個參考。node
本文內容收集自知乎和其餘博客,在此整理成章。面試
校招:以C++基礎爲主,數據結構和常見算法(ACM經典題目)是必須掌握的。算法
技術類面試跟學校的經驗 / 社團經驗 / 學習成績 掛鉤不過高,固然不是說二者不要緊。成績好面試官可喜歡了,但成績通常的同窗不用灰心,入選初面的條件是簡歷上突出你的技術水平,不須要寫一堆學習績點高,實際上是沒很大意義的,HR看簡歷是關鍵字!關鍵字!必須突出項目/實驗中使用到的技術,如多線程編程,Socket編程,Linux環境搭建,內存泄漏或BUG的檢測手段,STL-標準庫的使用。數據庫
非985-211同窗,請重點參考簡歷製做過程當中突出關鍵字這條規則!編程
社招:社招的同窗,不管是1-3年經驗,仍是中途轉行,均可參考。windows
寫簡歷必須有針對性,之後臺開發爲例,請去拉勾網 / 獵聘 / 智聯招聘等網站,多看看後臺開發的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在數學意義下是正確的。