後臺開發面試問題總結

今天看了幾篇關於後臺開發的面試經驗貼,感受到了來自面試官的滿滿惡意。 主要考察領域:

C++、Linux、算法、數據結構、網絡編程、海量數據處理、數據庫。

C++:

析構函數原理以及步驟; 類對象的內存存儲形式; STL各種容器的特點和實現方式; c++進程內存空間分佈(注意棧從高到低分配,堆從低到高分配); 虛函數以及虛函數的作用(簡單來說是多態,本質是爲了封裝)(哪些是編譯時確定、哪些是運行時確定); makefile編譯; gdb調試; 如何定位內存泄露; 動態鏈接和靜態鏈接的區別; 32位系統一個進程最多多少堆內存; 寫一個c程序辨別系統是64位 or 32位; 寫一個c程序辨別系統是大端 or 小端字節序; 宏定義和展開; 位操作; 內存分配; 哪些庫函數屬於高危函數?爲什麼?(strcpy等等); 一個String類的完整實現必須很快速寫出來(注意:賦值構造,operator=是關鍵); sizeof一個類求大小,變量、對象、指針、類等等; 指針和引用的區別; 多重類構造和析構的順序(對稱); stl各容器的實現原理(必考); extern c 是幹啥的(必須將編譯器的函數名修飾的機制解答的很透徹); volatile是幹啥用的,(必須將cpu的寄存器緩存機制回答的很透徹); static const等等的用法;

Linux:

linux中各種I/O模型原理——select和epoll; 阻塞和非阻塞I/O區別; linux系統文件機制; 多進程同步方式; 使用過哪些進程間通訊機制,並詳細說明(重點); linux系統的各類異步機制; 信號:列出常見的信號,信號怎麼處理? i++是否原子操作? exit() _exit()的區別? 如何實現守護進程? linux的內存管理機制是什麼? linux的任務調度機制是什麼? 系統如何將一個信號通知到進程? 什麼是死鎖?如何避免死鎖? 共享內存的使用實現原理; 多線程和多進程的區別(從cpu調度,上下文切換,數據共享,多核cup利用率,資源佔用,等等各方面回答。哪些東西是一個線程私有的?答案中必須包含寄存器); 標準庫函數和系統調用的區別?

算法:

設計一個算法將兩個字符串合併按字母排序:遍歷一次統計各字符出現次數,直接按字母順序輸出,O(n)。

數據結構:

排序、查找、二叉樹、圖; 哈希和B樹各自特點; 鏈表歸併排序; 大根堆的實現,快排(如何避免最糟糕的狀態?),bitmap的運用; hash(例如爲什麼一般hashtable的桶數會取一個素數?如何有效避免hash結果值的碰撞);

網絡:

netstat tcpdump ipcs ipcrm命令; cpu 內存 硬盤 等等與系統性能調試相關的命令; 設置修改權限chmod; tcp網絡狀態查看; 各進程狀態; 抓包tcpdump; awk sed瞭解; tcp與udp的區別; udp調用connect有什麼作用? tcp連接中時序圖,狀態圖,必須非常非常熟練; socket服務端的實現,select和epoll的區別(必問); epoll哪些觸發模式,有啥區別?(詳盡的解釋水平觸發和邊緣觸發的區別,以及邊緣觸發在編程中要做哪些更多的確認); 大規模連接上來,併發模型怎麼設計? tcp結束連接怎麼握手,time_wait狀態是什麼,爲什麼會有time_wait狀態?哪一方會有time_wait狀態,如何避免? time_wait狀態佔用資源(必須回答的詳細)? tcp頭多少字節?哪些字段?(必問) 什麼是滑動窗口?(必問) connect會阻塞,怎麼解決?(必考必問,提示:設置非阻塞,返回之後用select檢測狀態); 如果select返回可讀,結果只讀到0字節,什麼情況? keepalive 是什麼東東?如何使用? 列舉你所知道的tcp選項,並說明其作用。 socket什麼情況下可讀?

海量數據處理:

1、請統計100W個不等長字符串中各字符串的出現次數:建立哈希表,遍歷一遍讓等長的字符串映射到同一位置,裏面可以再哈希鏈表。有兩種情況:一種哈希鏈表中沒出現過就存儲該字符串並將對應的計數器設爲0,有出現過的就+1。遍歷一遍就完成統計。然後遍歷哈希鏈表的計數器輸出就行了。

2、設計數據結構可以快速返回0~10億中哪些數出現了or沒出現。這題和一面的一樣,而且更簡單,125M的bitmap就夠了。

3、一個每秒百萬級訪問量的互聯網服務器,每個訪問都有數據計算和I/O操作,如果讓你設計,你怎麼設計?

數據庫:

sql; 服務器數據庫大規模數據怎麼設計; db各種性能指標;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章