後臺開發面試問題整理
阿新 • • 發佈:2018-11-01
最近實習招聘又開始了,被一些師弟問了面試會問到的問題,於是想把之前實習、校招被問過的問題整理出來,希望對需要的人有幫助。雖然下面很多問題,但面試時可以問的問題是一個無限集,而且因人而異,只能作為一定的參考,如果把所有知識面都掌握得很牢固那問什麼都沒問題 :)這裡的問題也不是說要所有都能答得上來,能答大部分我覺得 BAT 就沒啥問題了。
個人背景:本科,偏工程,技術棧 C++,接觸過 Python、Java、PHP、Go
面試職位:後臺開發、C++工程師等
問題來源:包括但不限於阿里、騰訊、百度、網易遊戲,均為實際中遇到的。
後續再看有沒有必要標註哪些問得比較頻繁,需不需要回答參考。
C++
- static 關鍵字有哪些用法
- 說說繼承和組合的概念?什麼時候應該用繼承?什麼時候應該用組合
- C++ 的菱形繼承會發生什麼問題?畫出對應的記憶體佈局
- 說說對 C++ 智慧指標的瞭解
- 說說虛擬函式實現機制
- 如果父類中僅有方法,子類有一個 int 變數,這時候 sizeof 是多大
- 指標一定是 4 個位元組嗎
- #define 和 inline 函式的區別是什麼
- const static 在哪裡初始化
- 派生類的建構函式和解構函式執行順序
- 什麼情況下基類的解構函式沒有被呼叫
- 如何生成靜態庫?如何生成動態庫
- 如何用 gdb 除錯
- coredump 檢視,core 檔案分析
- 如何除錯執行中的程式
- 運行了幾天的程式崩掉,如何分析錯誤
- 如何編寫 makefile
- 編譯器的編譯過程?連結的時候做了什麼事?在中間層優化時怎麼做?
- STL 各容器如何實現
- 介面卡是用來做什麼的
- queue 如何實現
- map 用什麼實現
- 如何實現 vector?優化 O(n) 的複製
- 紅黑樹插入資料發現不平衡應該怎麼做
- debug 模式和 release 模式編譯的區別
- 如何檢視連結的動態庫
Python
- Python 的裝飾器是什麼
- 什麼是閉包
- 說說 Tornado 的架構
- 說說 flask 的架構
- Python 的生成器是什麼?底層怎麼實現
演算法
- 瞭解哪幾種排序方式?有沒有 O(n) 的排序
- 平衡二叉樹的插入
- 二叉查詢樹
- 10個 G 的最高訪問 Ip 統計
- 倒排索引
- 常用快取置換演算法
- Lru 演算法的實現及優化
- 堆和棧的區別
- 常用 hash 演算法
- md5、sha1 的實現
- 一萬個 url 的快速查詢
- 兩個有序陣列找並集的優化
- 10億個整數中找最大的 100 個,用 O(n)
網路
- HTTP 和 TCP 有什麼關係
- TCP 的三次握手過程
- TCP 和 UDP 的區別
- TCP 包為什麼需要 Seq
- 包為什麼會亂序
- 說說 HTTP 協議
- HTTP 1.0 和 HTTP 1.1 的差別
- HTTP 頭部有哪些欄位
- 為什麼 HTTP 是無連線的
- 有沒有保持長連線的 HTTP
- TCP 的擁塞控制是怎樣的
- TCP 中客戶端傳送 SYN 後客戶端和伺服器分別處在什麼狀態
- 伺服器呼叫 send 後返回傳送資料大小,是否可以認為客戶端已收到?如何確保客戶端收到資料
- 304 狀態碼的意義?在 HTTP 協議中的實現
- 如何判斷伺服器檔案是否已修改?知道瀏覽器快取的檔案與伺服器檔案不一致?在 HTTP 中哪個欄位
- A 類地址和 B 類地址的區別
- 區域網沒有 ip 時如何通訊?如何得知 mac 地址
- tcp ip 層的意義?
- 程序 accept 時在哪裡取得套接字
- 什麼是網路虛擬化
- vpn 工作原理
- TCP 對網路擁堵的判斷
- TCP 幾種擁塞機制的重傳機制
系統
- 指標對應的地址是不是實體地址
- 實體地址和虛擬地址通常叫做什麼?縮寫是什麼
- 作業系統的定址方式
- linux 中如何計算可用記憶體
- linux 中如何用 top 命令中檢視虛地址和實地址的資訊
- 如何用搜索引擎去了解 top 中的虛地址?不用搜索引擎怎麼知道
- top 的輸出中哪些是表明了記憶體
- 根據 top 計算可用記憶體有多少
- 用 top 看耗效能的執行緒
- 還有哪些命令可以找出效能瓶頸
- epoll 與 select 比較
- epoll 的缺點,如何克服缺點
- epoll 機制中檔案描述符就緒時如何從核心態通知到使用者態的程序
- epoll 實現
- 說說同步 非同步的區別
- 程序間通訊的方式
- 程序間的通訊有哪些機制?在資源記憶體方面比較如何
- 同一程序執行緒間的通訊;不同程序執行緒間的通訊;
- 如何判斷系統在哪些地方耗費效能
- cpu 排程的單位是什麼
- 如何讓多核 cpu 更好的利用資源
- 什麼是缺頁
- 如何控制兩個程序對一個數據的訪問?怎麼處理加鎖問題
- 說一說協程
- 是否瞭解 netstat
- 在 shell 中用 ./a.out | wc- l 結果是多少?管道的輸入是哪個程序的
- 談談 Linux 的檔案許可權。讓只有擁有者才能讀寫?讓擁有者只能讀和執行? 刪除檔案需要什麼許可權
- 假如一個程序在對檔案進行讀寫,管理員把檔案刪除了怎麼辦
- 協程與程序執行緒比較有什麼優勢
- 計算機從電源載入開始的啟動過程
- 什麼是中斷呼叫?中斷程式的分類
- lsof strace ptrace gdb 使用
- 核心態和使用者態的區別
- 為什麼需要核心態
- 什麼時候進入核心態
- 多執行緒需要加鎖的變數
- 程式在記憶體中的佈局
後端元件
- memcached 的記憶體設計
- 有哪些伺服器模型
- tinyhttpd 的基本工作流程
- cgi 程式是什麼?fastcgi 等等
- Apache 和 nginx 中分別如何新增一個網站的訪問?如何限制 ip
- apache 和 nginx 的不同在哪裡
- nginx 和 apache 的架構分別是怎樣的
- memcached 和 redis 的差別是什麼
- 簡述 redis 的幾個操作
- 知不知道程序池?有沒有用過
- redis 的用什麼實現持久化?redis 的持久化是否能夠信任
- memcached 和 redis 為什麼不能作為常用資料庫
- tinyhttpd 中對 HTTP 請求的處理
- 記憶體池對不同大小資料結構怎麼儲存
- RPC 有哪幾種實現方式?如何提供介面呼叫
- RPC 呼叫中同步、非同步、阻塞、非阻塞的區別
Web
- cookie 和 session 的區別
- get 與 post 的區別?訪問安全性是否有區別?如何做到真正的訪問安全
- 如果發現網路不能訪問會檢查哪些方面?如果只有某個網站不能訪問
- 沒有登陸後臺的情況猜測伺服器掛掉會是什麼原因?如果你是網站管理員使用者反饋你的網站不能訪問應該怎麼做
- 在後臺發現執行程式卡時應該怎麼做?檢查哪些方面
- 介紹 HTTPS。能否截獲 HTTPS 的資料包
資料庫
- 資料庫之間如何同步
- 怎麼保證資料庫同時操作幾個表的一致性
- 怎麼保證主從伺服器中資料庫的同步
- 資料庫 ACID 是什麼
- 關係型資料庫和非關係型資料庫的區別
- MySQL 的鎖的型別
- 什麼時候 MySQL 會對錶上鎖?對一行上鎖
- 行級鎖、表級鎖的區別
- 高併發訪問 MYSQL 時,如何保持資料一致性
- MySQL 有哪些儲存引擎?為什麼使用 InnoDB
- MySQL 如何建立索引
- 建立 A 列和 B 列的索引需要考慮什麼
- 資料庫查詢過慢的優化
- 索引實現機制
大資料,高併發
- 如何設計一個高效能伺服器架構
- 在叢集之間做快取,一個節點掛了怎麼辦
- 叢集中 session 的同步
- 叢集之間的訊息佇列
- 在叢集之間做快取,一個節點掛了怎麼辦
- 有哪些高併發的伺服器設計
- I/O 複用模型有哪些
- select 和 epoll 的區別
- 秒殺中多個數據庫伺服器的同步
- 搶票系統怎麼做?
- 設計 qq 對應所有屬性的儲存和訪問
- 什麼是負載均衡?負載均衡的實現
前端
- 網頁中的 js 事件
$( function(){ } )
是什麼意思?和window.onload
什麼區別- 用兩句話概括 BootStrap
- 用兩句話概括 Jquery
Docker
(因自己做過 docker 相關)
- Docker 的適用場景
- 什麼是無狀態應用
- Docker 分層映象機制
- Go 與 C++ 設計比較,優缺點是什麼
- Go 的 import 機制優缺點
- cgroup 原理
- 為什麼要把專案 docker 化
- 為什麼需要資源隔離和虛擬化
其他
- 介紹 MVC 模式
- SVM 原理
- Java 記憶體回收機制
- 位元組和字元的區別
- 什麼時候用字元讀檔案,什麼時候用位元組讀檔案
- 寫過的最難的程式是什麼
- 成就感最大的專案
- 單例模式如何實現
- 中文的編碼有哪些
- XSS 攻擊?舉例說明 SQL 注入
- 用兩條能燃燒一個小時的不均勻的香計算 15 分鐘
- 7 個工人 7 小時挖了 7 米的洞,50 小時挖 50 米的洞需要多少人?