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

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



【Linux】C++後臺開發面試 - 不知鯨又是魚 - CSDN博客blog.csdn.net
相關文章
相關標籤/搜索