C++面試準備

C++ 面經

C++部分

面向對象設計

- 面向對象含義及其幾大特性
    - 基於對象的、基於類的軟件開發思想
    - 面向對象具備繼承、封裝、多態的特性
- 析構函數
- 有個Computer類,有內存、硬盤、CPU屬性。其中CPU有AMD和INTEL兩個類別,畫下類的設計。這兩個CPU多是AMD或者INTEL,實現可能不一樣,實現方法?
- 回調函數
- for循環中i++和++i哪一個效率快
    - 對基礎類型來講編譯器作了優化,效率差很少,對於自定義類型來講,i++會返回一個i的副本,效率低一些。
- HashMap解決衝突的方法
    - 鏈表和紅黑樹
- 函數重載
- extern c的做用

C++基礎

- 《Effective C++》、《C++ Prime》、《STL源碼剖析》
- 指針和引用的區別
    - 指針保存的是指向對象的地址,引用至關於變量的別名
    - 引用在定義的時候必須初始化,不能直接傳遞字面量,指針沒這個要求
    - 指針能夠改變地址,引用必須從一而終
    - 不存在空引用,可是存在空指針,相對而言引用更加安全
    - 引用的建立不會調用類的拷貝構造函數
- new/delete與malloc/free的區別
    - new是運算符,malloc是C語言庫函數
    - new能夠重載,malloc不能重載
    - new的變量是數據類型,malloc的是字節大小
    - new能夠調用構造函數,delete能夠調用析構函數,malloc/free不能
    - new返回的是指定對象的指針,而malooc返回的是void*,所以malloc的返回值通常都須要進行類型轉化
    - malloc分配的內存不夠的時候能夠使用realloc擴容,new沒有這樣的操做
    - new內存分配失敗能拋出bad_malloc,malloc內存分配失敗返回NULL值
- volatile關鍵字
    - 用volatile關鍵字聲明的變量i每一次被訪問時,執行部件都會從i相應的內存單元中取出i的值。
    - 沒有用volatile關鍵字聲明的變量i在被訪問的時候可能直接從CPU寄存器中取值,這樣作的目的是爲了提高速度,是編譯器優化的結果
    - 可是當訪問某些特殊內存地址,該內存地址上的數據可能被某些編譯器未知的因素修改(好比操做系統、硬件、其餘線程)而且來不及同步到寄存器上
    - 爲了保證變量及時更新,使用volatile關鍵字修飾,保證對變量的讀取訪問內存地址而不是寄存器
- 一個參數能夠既是const又是volatile的嗎?能夠,一個例子是隻讀狀態寄存器,是volatile是由於它可能被意想不到的改變,是const告訴程序不該該試圖去修改他。
- static 關鍵字的做用
    - 修飾全局變量
    - 修飾局部變量
    - 修飾全局函數
        - 限制他的做用域只在本文件內
    - 修飾局部函數
    - 修飾類的成員變量、成員函數
- extern 關鍵字
    - 聲明一個外部變量
- const 關鍵字做用 (const 指針好像錯了)
    - 修飾全局變量
    - 修飾局部變量
    - 修飾指針,const int*
    - 修飾引用作形參
    - 修飾成員變量,必須在構造函數列表中初始化
    - 修飾成員函數,說明該函數不該該修改非靜態成員,可是這樣並非十分可靠的,指針所指的非成員對象值可能會被改變
- define/const/inline的區別
    - define只是宏替換,const 參與編譯運行
        - define不會作類型檢查,const擁有類型,會執行相應的類型檢查
        - define僅僅是宏替換,不佔用內存,const會佔用內存
        - const內存效率更高,編譯器一般將const變量保存在符號表中,而不會分配存儲空間,這使得它成爲一個編譯期間的常量,沒有存儲和讀取的操做
    - define宏替換,inline由編譯器控制
        - 內聯函數在編譯時展開,而宏是由預處理器對宏進行展開
        - 內聯函數會檢查參數類型,宏定義不檢查參數,因此內聯函數更安全
        - 宏不是函數,而inline函數是函數
        - 宏在定義時要當心處理宏參數(通常狀況下是把參數用括弧括起來)
    - C++預約義宏
        - <center>
        - _LINE_ => 在程序編譯時包含當前行號
        - _FILE_ => 在程序編譯時包含當前文件名
        - _DATE_ => 包含一個形式爲 month/day/year
        - _TIME_ => 包含一個形式爲 hour:minute:second 的字符串,它表示程序被編譯的時間
    - C++構造函數能拋出異常嘛?析構呢?
    - C++/C內存分配方式,堆與棧的區別
    - 構造函數爲何不能定義爲虛函數,析構函數爲何能夠?
        - 虛函數的執行依賴於虛函數表。而虛函數表須要在構造函數中進行初始化工做,即初始化vptr,讓他指向正確的虛函數表。而在構造對象期間,虛函數表尚未被初始化,將沒法進行。
        - 在類的繼承中,若是有基類指針指向派生類,那麼用基類指針delete時,若是不定義成虛函數,派生類中派生的那部分沒法析構。
        - 構造函數不要調用虛函數。在基類構造的時候,虛函數是非虛,不會走到派生類中,既是採用的靜態綁定。顯然的是:當咱們構造一個子類的對象時,先調用基類的構造函數,構造子類中基類部分,子類尚未構造,尚未初始化,若是在基類的構造中調用虛函數,若是能夠的話就是調用一個尚未被初始化的對象,那是很危險的,因此C++中是不能夠在構造父類對象部分的時候調用子類的虛函數實現。可是不是說你不能夠那麼寫程序,你這麼寫,編譯器也不會報錯。只是你若是這麼寫的話編譯器不會給你調用子類的實現,而是仍是調用基類的實現。
    - 有哪些內存泄漏?如何判斷內存泄漏?如何定位內存泄漏?
            - new完不delete
            - malloc完不free
            - 待添加...
    - 全局變量和局部變量的區別
    - C++智能指針
    - C++動態內存
    - C++11新特性
    - 純虛函數的做用和實現方式
    - 字節對齊原則
        - 從0位置開始存儲
        - 變量存儲的起始位置是該變量大小的整數倍
        - 結構體總的大小是其最大元素的整數倍,不足的後面要補齊
        - 結構體中包含結構體,從結構體中最大元素的整數倍開始存
        - 若是加入pragma pack(n),取n和變量自身大小較小的一個
    - 空結構體的sizeof()的返回值
        - 答案是1
    - 靜態連接和動態連接的區別
        - 靜態連接
            - 在編譯連接時直接將須要的執行代碼拷貝到調用處,優勢就是在程序發佈的時候就不須要依賴庫,也就是再也不須要帶着庫一塊發佈,程序能夠獨立執行,可是體積可能會相對大一些。
        - 動態連接
            - 在編譯的時候不直接拷貝可執行代碼,
            - 而是經過記錄一系列符號和參數,在程序運行或加載時將這些信息傳遞給操做系統,操做系統負責將須要的動態庫加載到內存中,而後程序在運行到指定的代碼時,去共享執行內存中已經加載的動態庫可執行代碼,最終達到運行時鏈接的目的。
            - 優勢是多個程序能夠共享同一段代碼,而不須要在磁盤上存儲多個拷貝,缺點是因爲是運行時加載,可能會影響程序的前期執行性能。
    - 多態是什麼?舉一個多態的例子
    - 多態性與虛函數表
    - 靜態多態和動態多態
        - 多態分爲靜態多態和動態多態。靜態多態是經過重載和模板技術實現,在編譯的時候肯定。動態多態經過虛函數和繼承關係來實現,執行動態綁定,在運行的時候肯定。
    - 重寫、重載與隱藏的區別
        - 重載的函數都是在類內的。只有參數類型或者參數個數不一樣,重載不關心返回值的類型。
        - 覆蓋(重寫)派生類中從新定義的函數,其函數名,返回值類型,參數列表都跟基類函數相同,而且基類函數前加了virtual關鍵字。
        - 隱藏是指派生類的函數屏蔽了與其同名的基類函數,注意只要同名函數,無論參數列表是否相同,基類函數都會被隱藏。有兩種狀況
            - 參數列表不一樣,無論有無virtual關鍵字,都是隱藏;
            - 參數列表相同,可是無virtual關鍵字,也是隱藏。
    - 必須在構造函數初始化式裏進行初始化的數據成員有哪些
        - 常量成員
            - 由於常量只能初始化不能賦值,因此必須放在初始化列表裏面
        - 引用類型
            - 引用必須在定義的時候初始化,而且不能從新賦值,因此也要寫在初始化列表裏面
        - 沒有默認構造函數的類類型
            - 由於使用初始化列表能夠沒必要調用默認構造函數來初始化,而是直接調用拷貝構造函數初始化
    - C++四種類型轉換
        - static_cast
            - 非const 轉const
            - void*轉指針
            - static_cast能用於多態向上轉化,若是向下轉能成功可是不安全,結果未知;
        - dynamic_cast
            - 動態類型轉換
            - 只能用於含有虛函數的類,用於類層次間的向上和向下轉化。只能轉指針或引用。向下轉化時,若是是非法的對於指針返回NULL,對於引用拋異常。要深刻了解內部轉換的原理。
        - const_cast
            - 將const變量轉換爲非const
        - reinterpret_cast
            - 幾乎什麼均可以轉,好比將int轉指針,可能會出問題,儘可能少用
        - 爲何不用C的強制轉換?
            - C的強制轉換表面上看起來功能強大什麼都能轉,可是轉化不夠明確,不能進行錯誤檢查,容易出錯。
    - 如何讓一個類不能實例化?
        - 將類定義爲抽象基類或者將構造函數聲明爲private
    - 如何讓main函數以前執行函數
        - C++在main以前定義一個全局對象,調用構造函數
        - C語言使用GCC的attribute關鍵字,聲明constructor和destructor
    - C++如何建立一個類,使得他只能在堆上或者棧上建立?
        - 只能在堆上建立對象:將虛構函數設置爲私有
            - C++是靜態綁定型語言,編譯器管理棧上對象的生命週期,編譯器在爲類對象分配棧空間時,會先檢查類的析構函數的訪問性,若析構函數不可訪問,則不能在棧上建立對象。
        - 只能在棧上生成對象:將new和delete重載爲私有
            - 在堆上生成對象,使用new關鍵詞操做,其過程分爲兩個階段
            - 第一階段,使用new在堆上尋找可用內存,分配給對象
            - 第二階段,調用構造函數生成對象。將new操做設置爲私有,那麼第一階段就沒法完成,就不可以再在堆上生成對象。
    - C++命名空間,命名空間的嵌套
        - namespace first_space{void fun(){...}}
        - namespace second_space{void fun(){...}}
        - int main() { 
        - first_space::fun();
        - second_space::fun();
        - return 0;
        - }
    - C++多線程
        - 
    - explict關鍵字的做用

C++內存模型

- 內存分配
- malloc函數實現原理
- 給一段邏輯連續的內存,怎麼設計
    - 保證充分利用空間和動態分配
    - 內存分配的幾大算法

C++ STL庫

- vector
    - 變長數組
- map
    - 紅黑樹實現,有序
- unordered_map
    - vector實現,hash
- 和Java中的區別
- priority_queue
-

C和C++的區別

- C是面向過程的語言,C++是面向對象的語言
- C++中new和delete是對內存分配的運算符,取代了C中的malloc和free
- C++中有引用的概念,C中沒有
- C++引用了類的概念,C沒有
- C++有函數重載,C中不能
- C變量只能在函數的開頭出聲明和定義,C++隨用隨定義

C和Java的區別

- Java的應用在高層,C++在中間件和底層
- Javaa語言簡潔,取消了指針帶來更高的代碼質量,徹底面向對象,獨特的運行機制是其具備自然的可移植性
- Java在web應用上具備C++無可比擬的優點
- 垃圾回收機制的區別,C++用析構函數回收垃圾,Java自動回收,寫C和C++程序必定要注意內存的申請和釋放
- Java用接口(Interface)技術取代C++程序中的多繼承性

不一樣語言區別、編碼

- 強類型和弱類型
    - 強類型如Java,弱類型如Python
- varchar和char的區別
    - varchar動態決定佔用空間大小,char固定
- UTF-8下面varchar能佔用多少字符?GBK呢?
- Java和C++的區別

計算機基礎知識部分

算法與數據結構

- 《劍指offer》、《LeetCode》、《組合數學》
- 鏈表
    - 輸出鏈表中倒數第K個節點
    - 找到鏈表環節點入口
    - 單鏈表倒置
    - 鏈表歸併
- 排序算法
    - 冒泡、選擇
    - 快排、歸併、堆排序
        - 快排時間複雜度 : patition複雜度O(N),有T(N) = 2(T(N/2) + O(N))
    - 順帶分析最好、最壞、平均時間複雜度
    - 排序算法的穩定性
    - 經常使用排序的優缺點、應用場景
    - 鏈表實現快排
    - 鏈表的倒數第K個結點
    - 快排思想
        - 基於二分法的排序
        - 有遞歸法和非遞歸法
    - 1000w個整數排序,範圍0到100w,8G內存(MapReduce)
- 動態規劃
    - 動態規劃的思想
    - 動態規劃的使用前提
    - 動態規劃和分治法、貪心算法的異同
        - dp和分治法都是分解子問題可是分治法子問題不重疊
        - dp和貪心都是要求問題有最優子結構
            - 貪心算法是自頂向下,經過一種規則直接選擇一種最優子問題去求解,沒被選到的子問題就不去求解了。
            - dp是自底向上,無論子問題是否是最優子結構都去求解,解上層子問題時再來選擇最優子結構。
    - 應用
        - 最大連續子列和 LCS
        - 最長不降低子序列 LIS
        - 最長迴文子串
        - 最長重複子序列
        - 找零錢問題(動態規劃&貪心算法)
        - 01揹包
        - 徹底揹包
- 排列組合問題(遞歸&回溯)
- 圖的存儲以及相關算法
    - 二分圖相關算法
    - 圖搜索算法
- 哈希算法
    - 哈希處理衝突的解決辦法
        - 開放定址法
        - 鏈表法
    - 空間換時間
    - O(1)時間複雜度訪問
    - 但根據映射方法不一樣,會退化到O(N) ?
    - 一致性哈希的性質、算法
- 各類樹結構
    - 二叉樹
        - 非遞歸完成二叉樹的遍歷
            - 先序用棧
            - 中序用棧
            - 後序用兩個棧(不必定哦)
        - 求二叉樹最大深度
            - 先序遍歷,求高度
        - 二叉樹的鏡像
        - 二叉樹的前K個大個節點
            - 堆排序
    - 構建霍夫曼樹
    - B樹
    - B+樹
    - 紅黑樹
        - 平衡二叉樹
        - 紅黑樹的自旋
    - 線段樹
    - 字典樹
        - 可有自旋?
    - 前綴樹
- 樹狀數組
- 並查集
- 求兩個集合的交集和並集
- 有25匹馬,5個賽道,用最少比賽次數將25匹馬排序
    - 隊列算法?https://www.nowcoder.com/questionTerminal/e07d8e0df93b4f6b93a3fadbe72f2c7c](https://www.nowcoder.com/questionTerminal/e07d8e0df93b4f6b93a3fadbe72f2c7c
    - 一匹馬只有跑了才能看出其速度,25匹馬至少都跑了一次,最少五輪,且每輪能排除名詞,因爲最終只要最快的三名,故每組只有一、二、3有意義繼續比下去,四、5名直接淘汰,每組的3有意義的前提是該組的2就是總排名的二、1就是總排名的1,每組的2有意義的前提是該組的1至少第2;歸根到底仍是看每組第一的狀況,故5個第一比一次,第一就是總的第一;第四第五所在的組所有被淘汰,故第一組的二三名,第二組的第一二名,第三組的第一名比最後一次,前兩名就是總的二三名;共七輪。    
- 8個球,有一個比較重的,給一個沒有刻度的天平,怎麼最快找出
    - 3和3相稱,相同再稱,兩次搞定
- 千萬的數據求前100個最大重複的(Top-K問題)
    - Hash + 小頂堆
        - int -> 8Byte能夠表示十億的範圍
        - Hash統計每一個數出現的次數,發生衝突的地方用鏈表連接起來
        - 結點結構體成員:data和count,data記錄相應的數字,count記錄對應的數字出現的次數,這一步的時間複雜度是O(N),雖然有十億個數字,可是出大量重複,因此不用擔憂最後的空間會有十億)
        - 建立一個大小爲100的小頂堆,將Hash表中前100個非空成員放入小頂堆
        - 堆頂是當前小頂堆中出現次數最少的數
        - 將Hash表中其餘數據和堆頂出現的次數比較,若是比堆頂出現的次數少,則丟棄當前數,若是大於堆頂元素出現的次數,則替換堆頂,而後進行堆調整,這一步時間複雜度是O(Nlog100)
        - 總的時間複雜度是O(N)+O(Nlog100)
- 數組中數字出現的次數,一個數組中除了兩個數字只出現一次,其餘的都出現兩次,找出這兩個數字?位運算,或者哈希表
- 實現12306餘票查詢的關鍵數據結構與算法
    - 車次 + 時間 : 車箱 + 車座。 兩層hash + 一層數組
- 證實一個數字是2的n次方
    - int類型 2^k次方只有一位是1,其餘位是0,故統計1個數
    - 最簡潔的方法 value & (value - 1) == 0
- 合併兩個有序數組並取中位數
    - twopointer 合併 過程當中第n/2個數就是中位數
- 給定二叉樹現實最右邊的那一列結點
    - 層序遍歷,存個high表示當前層數,每一個high相同的最後一個元素打印
    - 若是是徹底二叉樹,能夠遞歸使用NRL遍歷,直到第一個葉子結點(不保證對)
- 實現一個最簡單的hashmap,參考jdk1.7
- 大量int,內存裝不下,去重 + 排序
    - C++數據結構 bitset
    - 使用bit位圖,int能夠裝10億個位
    - 將全部位置0 => 將集合初始化爲空
    - 經過讀入文件中的每一個整數創建集合,將每一個對應的位置爲1
    - 檢驗每一位,若是該位位1,就輸出對應的整數
- 兩個數組去重,分別根據有序和無序說下,寫個有序的算法
- 給個式子,括號匹配,括號去了怎麼算出結果
    - 中綴表達式轉前綴表達式
- 1000瓶水有1瓶水有毒,老鼠喝一滴就會死,可是須要一週毒發,請問最少須要多少老鼠多少時間才能找到那瓶有毒的水
    - 十隻老鼠一週,解法是十進制轉二進制
- A...Z全部字母組合方式,不容許有重複的,用最優的方法實現
    - 位運算方式
    - 位運算判斷2的26次方種狀況 (i & allcs[j]) == 1判斷該字母是否取到
    - 組合數
- 寫一個方法輸入一個整數,輸出這個整數裏面的最大質數
    - 質數標記法,找出N之內的全部質數,而後標記
    - 每輸入一個數,判斷是不是質數,而且和最大的質數比較
- 跳躍數組問題
    - dfs
- 二叉樹後序遍歷用幾個棧實現
    - 答案都說是兩個棧,可是我爲何只用一個棧就能寫?
- 設定N張撲克牌和一個隨機函數,設計一個洗牌算法
    - 設定N次獨立重複實驗,對每張牌打亂順序
- 異步消息隊列的實現
- 100層樓,2個雞蛋,雞蛋從某一個臨界樓層丟下會摔碎,請設計方案,能用最小的次數找到臨界樓層
- 用三、四、五、六、七、8組成不重複的四位奇數,按照從小到大的順序排序,第62個數字是?
    - 首先是奇數的話,末位只能是三、五、7中的一種,有$C_{3}^{1}$種方法
    - 前面三個數是$A_{5}^{3}$排列方法
    - 那麼總的方法數爲$C_{3}^{1}×A_{5}^{3} = 180$種方法,組成的奇數從小到大排序
    - 當第一位是3的時候,末位必定是5或者7,那麼這樣的數一共有$C_{2}^{1}×A_{4}^{2} = 24$種方法
    - 當第一位是4的時候,末位必定是3或者5或者7,這樣的數一共有$C_{3}^{1}×A_{4}^{2} = 36$種方法
    - 那麼這裏一共就有$24+36=60$種方法
    - 當第一位是5的時候,末位必定是3或者7,取較小的數,第二位是3,最後一位是7,那麼第61個數是5347,第62個數爲5367
- 24點遊戲
- 25匹馬,5個跑道,如何經過最少的比賽次數肯定前3名?
- 一家人過橋問題

操做系統

- 臨界區
    - 一段共享資源的保護代碼,該代碼在任意時刻只容許一個線程對共享資源訪問
- 進程進入臨界區的調度原則
    - 搶佔性,如有若干進程要求進入空閒的臨界區,一次僅容許一個進程進入
    - 忙等待,任什麼時候候,處於臨界區的進程不可多於一個,若是已有進程進入本身的臨界區,則其餘全部試圖進入臨界區的進程必須等待
    - 進入臨界區的進程要在有限時間內退出,以便於其餘進程可以及時進入本身的臨界區
    - 若是進程不能進入本身的臨界區,則應該出讓CPU,避免出現忙等待現象
- 互斥對象、臨界區和事件的區別
    - 互斥
        - 用途普遍的內核對象。可以保證多個線程對同一資源的互斥訪問。
    - 事件對象
        - 內核對象,主要成員包括
            - 使用計數
            - 指明該事件是一個自動重置事件仍是一我的工重置事件的布爾值
            - 指明該事件處於已通知狀態仍是未通知狀態的布爾值
    - 互斥對象、事件對象都屬於內核對象,利用內核對象進行線程同步,速度較慢,但能夠在多個進程種的多個線程間進行同步
    - 臨界區屬於在用戶模式下,同步速度也較快,可是很容易進入死鎖狀態,由於在等待進入臨界區時沒法設定超時值
- 進程和程序
     - 進程是動態的,而程序是靜態的
     - 進程有必定的生命週期,而程序是指令的集合,自己無「運動」的含義。沒有創建進程的程序不能做爲1個獨立單位獲得操做系統的承認
     - 一個程序能夠對應多個進程,但1個進程只能對應1個程序。進程和程序的關係就猶如演出和劇本的關係
- 進程和線程
    - 進程內存地址的分配
        - 分配虛擬內存地址
    - 一個進程能夠建立多少個線程,和什麼有關?
    - 進程和線程的區別(經典問題)
        - 進程
            - 資源(CPU、內存等)分配的基本單位,它是程序執行時的一個實例。程序運行時系統就會建立一個進程,併爲她分配資源,而後把該進程放入進程就緒隊列,進程調度器選中它的時候就會爲它分配CPU時間,程序開始真正運行。
        - 線程是程序執行時的最小單位,它是進程的一個執行流,是CPU調度和分派的基本單位,一個進程能夠由不少個線程組成,線程間共享進程的全部資源,每一個線程有本身的堆棧和局部變量。線程由CPU獨立調度執行,在多CPU環境下就容許多個線程同時運行。一樣多線程也能夠實現併發操做,每一個請求分配一個線程來處理。
        - 內核和用戶線程的映射
            - 一對一
            - 一對多
            - 多對多
        - 一個進程能夠建立多少個線程?和什麼有關?
        - 一個進程必定要有個線程嗎?
            - 不用
        - 沒有線程的進程是什麼?
            - 守護進程 daemon
        - 線程間的同步和互斥怎麼作的
        - 守護進程和殭屍進程、孤兒進程有什麼瞭解?
            - 孤兒進程是子進程未結束時而父進程異常退出,子進程變成孤兒,init進程會認做他爹
            - 殭屍進程是子進程結束後,父進程沒有顯示發送通知,致使子進程的結構沒辦法被回收,變成殭屍進程,浪費空間
            - 守護進程就是init進程、負責監控進程的狀態,以及認兒子,殺死父進程等操做
            - 系統對殭屍進程和孤兒進程的解決辦法
                - init會殺死父進程或者回收殭屍進程
        - 進程是對計算機資源的複用,線程是對CPU時間片的複用
        - 線程共享、獨佔進程的資源
            - 共享的資源
                - 堆
                    - 因爲堆實在進程空間中開闢出,理所固然被共享
                    - 所以new出來的都是被共享的
                    - 16位平臺上分全局堆和局部堆,局部堆是獨享的
                - 全局變量
                    - 它與某一具體函數無關,與特定線程無關
                - 靜態變量
                    - 對於局部變量來講,它在代碼中是「放」在某一函數中的,可是其存放位置和全局變量同樣,存於堆中開闢的.bss和.data段,是共享的
                - 文件等公用資源
                    - 共享,使用該資源的線程必須同步
                    - 對於互斥資源要保持互斥
                    - 同步與互斥的方式
                        - 信號量、臨界區、事件和互斥體
            - 獨享的資源
                - 棧
                - 寄存器
                    - 線程裏存放的是寄存器值得副本,包括程序計數器PC
                - 
        - ...
    - 進程的結構
    - 進程通訊
        - 管道pipe
            - 管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。
        - 命名管道FIFO
            - 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
        - 消息隊列MessageQueue
            - 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流及緩衝區大小受限等缺點。
        - 共享存儲SharedMemory
            - 共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,可是多個進程能夠訪問
            - 共享內存是最快的IPC(進程間通訊)方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步和通訊
        - 信號量Semaphore
            - 信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問,
            - 它做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程間的同步手段
        - 套接字Socket
            - 套接口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及主機間的進程通訊
        - 信號(signal)
            - 信號是一種比較複雜的通訊方式,用於通知接受某個進程事件已經發生
    - 線程共享資源
        - JAVA內存模型 
            - 以 JVM爲例,JVM裏的堆就是一個公共區間,線程負責採起資源,這樣就能夠實現資源共享
    - 線程同步方法
        - 鎖機制
            - 互斥鎖
                - 提供了以排它方式阻止數據結構被併發修改的方法
            - 讀寫鎖
                - 容許多個線程同時讀共享數據,而對寫操做互斥
            - 條件變量
                - 能夠以原子方式阻塞進程,直到某個特定條件真爲止。對條件測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一塊兒使用
        - 信號量機制
            - 包括無名線程信號量與有名線程信號量
        - 信號機制
            - 相似於進程間信號處理
        - Note -> 線程間通訊主要目的是用於線程同步,因此線程沒有像進程通訊用於數據交換的通訊機制
    - 線程建立方式有幾種
    - 進程調度算法
        - 先來先去服務 -> FIFO
        - 短做業優先調度算法SJ(P)F
        - 時間片輪轉算法
        - 多級反饋隊列算法
- 頁面置換算法
    - 最優頁面置換算法 OPT
        - 只在理論上存在,其所選擇被淘汰的頁面,將是之後永不使用的
    - 最近未使用頁面置換算法(NRU) Not Recently Used 
        - 一個訪問位R,0:未訪問過 1 被訪問
        - 一個修改位M,0:未修改過 1 被修改
        - R位被按期清零
        - 共四類頁面,00 01 10 11
        - 按照00 -> 11前後順序替換頁面
    - 先進先出頁面置換算法(FIFO)及其改進
        - 每次置換最早調入內存的頁面
        - 優勢 : 實現比較簡單,能夠不須要硬件的支持
        - 缺點 : 會發生Belady異常
    - 第二次機會算法 - FIFO算法改進
        - 基本思想與FIFO相同,改進是避免把常用的頁面換出去,當選擇置換頁面時依然和FIFO同樣,選擇最先置入內存的頁面。
        - 可是第二次機會法還設置了一個訪問狀態位,因此還要檢查頁面的訪問位,若是是0,就淘汰這頁,若是訪問位是1,就給第二次機會,並選擇下一個FIFO頁面
        - 當一個頁面獲得第二次機會時,它的狀態位就清0,它的到達時間就置爲當前時間
        - 若是該頁在此期間被訪問過,則訪問位置爲1
        - 這樣給了第二次機會的頁面將不被淘汰,直至全部的其餘頁面被淘汰過(或者也給了第二次機會)。所以,若是一個頁面常用,它的訪問位總保持爲1,就歷來不會被淘汰出去
        - 第二次機會算法可視爲一個環形隊列,用一個指針指示哪一頁是下面要淘汰的,當缺頁時,指針就往前遍歷直到找到訪問位是0的頁。隨着指針的前進,把訪問位清0,在最壞的狀況下,全部的訪問位是1,指針要經過整個隊列一週,每一個頁都給第二次機會,這時就退化成FIFO算法。
    - 時鐘頁面置換算法(CLOCK)
        - 給每一個訪問的頁面關聯一個附加位(reference bit),有些地方也叫作使用位(use bit)。
        - 附加位造成一個大小爲內存最大能支持的頁面數量
        - 當頁面所有爲1時,指針加一同時將全部use bit置0
    - 最近最少使用頁面置換算法(LRU) Least Recently Used => 性能接近OPT,但實現起來比較困難,開銷大
        - 最近最久未使用的頁面被淘汰
        - 當發生缺頁中斷時,選擇未使用時間最長的頁面置換出去
        - 能夠考慮使用一個大頂堆做爲數據結構?
    - 工做集算法
        - 一個進程當前正在使用的頁面 => 工做集(集合,頁面重複)
        - 設法跟蹤進程的工做集,以確保在讓進程運行前,它的工做集就已在內存中 = > 工做集模型
        - 在進程運行前預先裝入其工做集頁面也稱爲預先調頁
- 布隆過濾器的優缺點
    - 一種比較巧妙的機率型數據結構(probabilistic data)
    - 特色是高效插入和查詢,能夠用來得知」某樣東西必定不存在或者可能存在「
    - 優勢
        - 相比於傳統的List、Set、Map等數據結構,更加高效、佔用空間更少
    - 缺點
        - 返回的結果是機率性的而不是確切的
    - 普通哈希查找的問題
        - HashMap能夠完成查找,可是考慮到負載因子,空間利用率經常不高
        - 還好比數據集存儲在遠程服務器上,本地服務器接受輸入,而數據集很是大不可能一次性讀進內存構建HashMap的時候,也會存在問題
- 布隆過濾器數據結構
    - 一個bit向量或者說是bit數組
    - 要映射一個值到布隆過濾器中,須要使用多個不一樣的哈希函數生成多個哈希值,並對每一個生成的哈希值指向的bit位置1
    - 隨着存儲的數據增多,因爲key衝突,未查找到的key必定不存在,查找到的key可能存在,也可能不存在
    - 傳統布隆過濾器不支持刪除操做
    - 布隆過濾器通常用來加速判斷一個查找是否存在,因其判斷不存在的操做很是廉價,能夠避免肯定性哈希查找算法的昂貴操做
- 布隆過濾器實踐
    - 減小磁盤IO或者網絡請求,由於一旦一個值一定不存在的話,咱們能夠不用進行後續昂貴的查詢請求
    - 既然布隆過濾器用來加速查找和判斷是否存在,那麼性能很低的哈希函數不是個好選擇,推薦MurmurHash、Fnv這些
    - 處理大規模問題時的持久化,包括內存大小受限、磁盤換入換出問題
- 布隆過濾器trade-off
    - 太小的布隆過濾器很快全部的bit均爲1,那麼查詢任何值都會返回」可能存在「,起不到過濾的目的了。布隆過濾器的長度會直接影響誤報率,布隆過濾器越長其誤報率越小。
    - 哈希函數的個數也須要權衡,個數越多則布隆過濾器bit位置爲1的速度越快,且布隆過濾器的效率越低,可是若是太少的話,誤報率會變高
    - 有合適業務大小的k(哈希函數個數)和m(布隆過濾器長度)的推導公式
- 文件讀寫使用的系統調用
- 線程池的瞭解、優勢、調度處理方式和保護任務隊列的方式
    - 爲了不一個程序須要大量建立線程時的沒必要要浪費,也就是最好的去避免線程建立與線程銷回的開銷,出現了線程池
    - 線程池就是初始批量建立線程(一般認爲CPU核心數的兩倍爲最佳,也有說是兩倍+1,建立的線程爲掛起狀態(就緒),當咱們有任務要處理的時候,就激活一個線程完成任務,完成後線程又變爲就緒態。
    - 每一個線程一次建立,屢次使用
- 線程池怎麼建立
- 怎麼回收線程
- 多線程同步(項目中可能會問)
- mencache
- 異常和中斷的區別
- 如何保證線程安全
- 生產者和消費者的程序,注意臨界區和加鎖
- OS內存管理實現
- 進程間調度和上下文切換怎麼實現
- 系統調用或者說中斷的過程
- 軟中斷 硬中斷
- Inode是什麼
    - 文件的根節點,存儲除了文件名以外的全部元數據信息,真正存儲着數據所在硬盤地址的節點。
- 彷佛還有個文件控制塊FCB、對比一下和Inode的區別
- 軟鏈接 硬鏈接
    - 硬鏈接不一樣文件名指向同一個node,node中有引用計數
    - 軟鏈接只是節點中存儲目標文件的絕對路徑
    - 刪除硬鏈接和軟鏈接的後果
        - 硬鏈接會根據引用計數判斷是否爲0來決定是否刪除文件
        - 軟鏈接不會
- Windos內存管理方式
    - 分頁存儲
        - 用戶程序的邏輯地址空間被劃分爲若干固定大小的區域,稱爲:頁「或者」頁面「,相應地,內存物理空間也分紅相對應地若干個物理塊,頁和塊地大小相等,提升了內存的利用率
    - 分段存儲
        - 將用戶程序地址空間分紅若干個大小不等的段,每段能夠定義一組完整的邏輯信息。提升程序的邏輯性
    - 段頁式存儲
        - 二者結合,做業地址空間首先被分爲若干個邏輯段,每段都有本身的段號,而後再將每段分紅大小相等的頁。
- 一個程序從開始運行到結束的完整過程
    - 預處理
        - 源代碼.c -> 預處理器 -> .i文件,把替換頭文件以及預處理宏定義
    - 編譯
        - .i文件通過編譯生成彙編.s文件
    - 彙編
        - .s的彙編文件通過彙編器生成.obj的目標文件
    - 連接
        - .obj通過連接器和lib(靜態連接庫)dll(動態連接庫)文件生成exe可執行程序
- 頭文件在編譯過程當中的做用(網易遊戲)
    - 頭文件並不參加連接和編譯
    - 在預處理階段提供頭文件替換
    - 頭文件裏包含函數、庫聲明
    - 通常不包含數據結構定義
    - 頭文件中可定義靜態變量和靜態函數
- 爲什麼不能再頭文件中定義
    - 防止多重定義
- 內存延遲分配實現方法
- VFS是啥
- 雲計算?虛擬化?
- 內存分配的系統調用是什麼
- Linux裏的RCU是啥
- 鎖
    - Linux有哪些鎖
    - 死鎖產生的緣由
        - 系統資源的競爭
            - 系統資源的競爭致使系統資源不足,以及資源分配不當,致使死鎖。
        - 進程運行推動順序不合適
            - 進程在運行過程當中,請求和釋放資源的順序不當,會致使死鎖
    - 什麼狀況下會發生死鎖,解決策略有哪些
        - 互斥條件:一次只有一個進程能夠使用一個資源,已經分配掉的資源不能被從新佔用
        - 請求並保持條件:當一個進程在等待分配獲得其餘資源時,其繼續佔有已經分配獲得的資源。
        - 不可剝奪,非搶佔:不能強行搶佔進程中已經佔有的資源。
        - 循環等待:存在一個封閉的進程鏈,使得每一個資源至少佔有此鏈中下一個進程所須要的一個資源。
    - 解決策略
        - 死鎖預防 : 確保思索的一個必要條件不會知足
        - 死鎖檢測 : 容許死鎖的發生,可是能夠經過系統設置的檢測結構及時的檢測思索地發生,採起一些措施,講死鎖清除掉。
        - 死鎖避免 : 銀行家算法,在資源分配過程當中經過某種方法避免系統進入**不安全狀態**,從而避免發生死鎖。
        - 死鎖解除 : 與死鎖檢測配套的措施,檢測到發生死鎖,須要將進程從死鎖中釋放出來。
            - 經常使用方法 : 撤銷或者掛起一些進程,以便回收一些資源,再將資源分配給處於阻塞狀態的進程。
            - 撤銷進程法
            - 資源剝奪法
- 有哪些自旋鎖,分別是怎麼實現的
- Linux的地址空間佈局是怎麼樣的
- 爲何內核映射到每一個進程是同樣的,若是每一個進程的內核映射是不同的會怎麼樣
- LRU算法
-

計算機網絡

- OSI七層網絡模型
- 交換機的工做原理和做用
- 對路由協議的理解與介紹,內部網關協議IGP包括RIP,OSPF和外網網關協議EGP和BGP
- 路由協議使用的算法
- 服務器攻擊(DDos攻擊)
- 路由器的工做原理和做用
- TCP可靠傳輸實現
- TCP和UDP
    - 區別
    - TCP滑動窗口
        - 「窗口」對應一段能夠被髮送者發送的字節序列,其連續的範圍稱之爲「窗口」
        - 滑動則是指這段「容許發送的範圍」是能夠隨着發送的過程而變化的,方式就是按照順序「滑動」
        - 是爲了進行流量控制,讓發送方的發送速率不要太快,讓接收方來得及接收
        - Nagle算法
        - 滑動窗口機制爲端到端設備間的數據傳輸提供了可靠的流量控制機制。然而它只能在源端設備和目的端設備間起做用,當網絡中間設備(例如路由器等)發生擁塞控制時,滑動窗口機制將不起做用。
    - TCP擁塞控制
        - 慢開始、擁塞避免、快重傳、快恢復
    - TCP擁塞控制和流量控制的區別
        - 擁塞控制
            - 防止過多的數據注入到網絡中,這樣能夠使網絡中的路由器或鏈路不會過載
        - 流量控制
            - 每每是點對點通訊量的控制,是一個端到端的問題,流量控制要作的是抑制發送端發送數據的速率,以便接收端來得及接收。
    - TCP怎麼樣保證可靠性
        - 應用數據被分割成TCP認爲最合適發送的數據塊
        - 超時重傳:當TCP發出一個段後,它啓動一個定時器,等待目的端ACK確認收到這個報文段。若是不能及時收到一個確認ACK,將重發這個報文段
        - TCP給發送的每個包進行編號,接收方對數據包進行排序,把有序數據傳送給應用層
        0 校驗和:TCP將保持它首部和數據的校驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程當中的任何變化。若是收到段的檢驗和有差錯,TCP將丟第這個報文段和不確認收到此報文段
        - TCP的接收端會丟棄重複的數據
        - 流量控制:讓發送方的發送速率不要太快,要讓接收方來得及接收
        - 擁塞控制:當網絡擁塞時,減小數據的發送
    - TCP創建鏈接、重發、保證有序等
    - TCP保證消息有序
        - 連續發送連續確認,根據序號來保證有序
    - TCP流水線傳輸
        - 效率比較高
    - HTTP協議和TCP協議的聯繫
        - TCP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。
        - HTTP協議是創建在TCP協議基礎上的,當瀏覽器須要從服務器獲取網頁數據的時候,會發出一次HTTP請求。
        - HTTP會經過TCP創建起一個到服務器的鏈接通道,當本次請求須要的數據完畢後,HTTP會當即將TCP鏈接斷開,這個過程是很短的。因此HTTP鏈接是一種短鏈接,是一種無狀態鏈接。
- 網絡的四層結構,TCP協議屬於哪一層?(傳輸層)
- MTU
    - MTU限制最大幀長度
    - 因此當IP數據報超過MTU時,IP數據報必須分片
    - TCP則會本身進行數據長度安排
- TCP三次握手
    - C----->SYN(x)------>S,  C進入SYN_SENT狀態
    - S收到請求報文段,S----->seq(y),ack(x+1)----->C, S進入SYN_REVD狀態
    - C收到S的SYN+ACK包,C----->seq(x+1),ack(y+1)-----S,此包發送完畢,C和S進入ESTABLISHED(TCP鏈接成功)狀態,完成三次握手。
- TCP三次握手時client&server的狀態,爲何不是兩次握手?
    - 三次握手的狀態
        - 第一次C進入SYN_SENT狀態
        - 第二次S進入SYN_REVD狀態
        - 第三次C和S進入ESTABLSHED(TCP鏈接成功)狀態,完成三次握手
    - 須要三次的緣由
        - 防止已經失效的報文段出如今本連接中
- TCP四次揮手過程?最後等待鏈接關閉要多長時間?
    - 客戶端發送斷開TCP鏈接請求的報文,其中報文包含seq序列號,是由發送端隨機生成的,而且還將報文中的FIN字段置爲1,表示須要斷開TCP鏈接。(FIN=1, seq=x, x由客戶端隨機生成)
    - 服務端會回覆客戶端發送的TCP斷開請求報文,其包含seq序列號,是由回覆端隨機生成的,並且會產生ACK字段,ACK字段數值是在客戶端發過來的seq序列號基礎上加1進行回覆,以便客戶端收到信息時,知曉本身的TCP斷開請求已經獲得驗證。(FIN=1, ACK=x+1, seq=y, y由服務端隨機生成)
    - 服務端在回覆完客戶端的TCP斷開請求後,不會立刻進行TCP鏈接的斷開,服務端會先確保斷開前,全部傳輸到A的數據是否已經傳輸完畢,一旦確認數據傳輸完畢,就會將回復報文的FIN字段置1,而且產生隨機seq序列號。(FIN=1, ACK=x+1, seq=z, z由服務端隨機生成)
    - 客戶端收到服務端的TCP斷開請求後,會回覆服務端的斷開請求,包含隨機生成的seq字段和ACK字段,ACK字段會在服務端的TCP斷開請求的seq基礎上加1,從而完成服務端請求的驗證回覆。(FIN=1, ACK=z+1, seq=h, h爲客戶端隨機生成)至此TCP斷開的4次揮手過程完畢
- 爲何TCP創建鏈接要三次握手,而斷開鏈接須要四次揮手?
    - 由於S端收到C端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉鏈接時,當S端收到FIN報文時,極可能不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴C端「你發的FIN報文我收到了」。只有等到我S端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送,故須要四步握手。
- TIME_WAIT的意義,爲何等於2MSL
    - MSL是最長報文段壽命,設置的目的是
        - 保證A發送的最後一個ACK可以到達B
        - 防止已經失效的報文段出如今本鏈接中
- TCP頭部校驗的原理,安全嗎?能夠仿造嘛?
    - TCP校驗是一個端到端的校驗和,由發送端計算,而後由接收端驗證。其目的是爲了發現TCP首部和數據在發送端到接收端之間發生的任何改動。若是接收方檢測到的校驗和有差錯,則TCP段會被直接丟棄。
    - 能夠仿造
    - 你會發現TCP報文超出MTU時,分組發送也會從新計算首部校驗和
- TCP、UDP的區別?服務端和客戶端創建的過程?
    - TCP
        - 傳輸控制協議提供的是面向鏈接、可靠的字節流服務。
        - 當客戶端和服務器彼此交換數據前,必須先在雙方創建一個TCP鏈接,以後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能順序地從一端傳送到另外一端。
    - UDP
        - 用戶數據協議,是一個簡單地面向數據報地運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層地數據報發送出去,可是並不能保證它們能到達目的地。因爲UDP在傳輸數據報前不用再C/S之間創建一個鏈接,且無超時重發等機制,不保證數據按順序傳遞,故而傳輸速度很快。
- UDP編程
    - 服務器通常步驟
        - 建立一個socket,用函數socket()
        - 設置socket屬性,用函數setsockopt()*可選
        - 綁定IP地址、端口等信息到socket上,用函數bind()
        - 循環接收數據,用函數recvform()
        - 關閉網絡鏈接
    - 客戶端通常步驟是
        - 建立一個socket,用函數socket()
        - 設置socket屬性,用函數setsockopt(); *可選
        - 綁定IP地址、端口等信息到socket上,用函數bind(); *可選
        - 設置對方的IP地址和端口等屬性
        - 發送數據,用函數sendto()
        - 關閉網絡鏈接
- TCP編程
    - 服務端
        - 建立一個socket,用函數socket()
        - 設置socket屬性,用函數setsockopt()*可選
        - 綁定IP地址、端口等信息到socket上,用函數bind()
        - 開啓監聽,用函數listen()
        - 接收客戶端上來的鏈接,用函數accept()
        - 接收數據,用函數send()和recv(),或者read()和write()
        - 關閉網絡鏈接
        - 關閉監聽
    - 客戶端
        - 建立一個socket,用函數socket()
        - 設置socket屬性,用函數setsockopt()*可選
        - 綁定IP地址、端口等信息到socket上,用函數bind() *可選
        - 設置要鏈接的對方的IP地址和端口等屬性
        - 鏈接服務器,用函數connect()
        - 收發數據,用函數send()和recv(),或者read()和write()
        - 關閉網絡鏈接
- 超時重傳是怎麼作的?
- ACK序號表示已經收到的序號嗎?(關於重傳)
    - ACK表示返回已收到的序列
    - 超時重傳是對每一個序列作一個計時器,而後若是沒有收到ACK則說明超時,重傳
- 給每一個組分配不一樣的IP段,怎麼設計一種結構快速得知IP是哪一個組的
    - Trie樹是什麼?
    - B+樹,每一個樹節點保存一個段
- TCP粘包
    - 發送緩衝區和接收緩衝區處理不及時或者大小設置不當,致使粘包和拆包。
    - 正常狀況:若是Socket Client發送的數據包,在Socket Sever端也是一個一個完整接收的,那個就不會出現粘包和分包狀況,數據可正常讀取
    - 粘包狀況:Socket Client發送的數據包,在客戶端發送和服務器接收的狀況下都有可能發送,由於客戶端發送的數據都是發送的一個緩衝Buffer,而後由緩衝buffer最後刷到數據鏈路層的,那麼就有可能把數據包2的一部分數據結合數據包1的所有被一塊兒發送出去了,這樣在服務器端就有可能出現這樣的狀況,致使讀取的數據包包含了數據包2的一部分數據,產生粘包,固然也有可能把數據包1和數據包2所有讀取出來。
    - 分包狀況:意思就是把數據包2或者數據包1都有可能被分開一部分發送出去,接着另外的部分,在服務器端有可能一次讀取操做只讀到一個完整數據包的一部分。
    - 在數據包發送的狀況下,有可能後面的數據包分開成2個或者多個,可是最前面的部分包,黏住在前面的一個完整或者部分包的後面。也就是粘包和分包同時產生了。
- 有沒有抓過TCP包,描述一下
- 一個IP配置多個域名,靠什麼識別?
    - 主機頭
- HTTP和HTTPS的區別,HTTPS是如何加密的,它的加密方式怎麼樣
    - HTTP - 超文本傳輸協議
    - HTTPS - 超文本傳輸安全協議
    - HTTPS就是將HTTP中的傳輸內容進行了加密,而後經過可靠的鏈接(TCP),傳輸到對方的機器上。加密的協議是TLS,其前身是SSL
    - http明文傳輸不安全,https加密傳輸
    - 後者是前者的安全實現
    - 客戶端發起請求時服務端會返回一個公鑰
    - 而後客戶端根據公鑰規則發送消息
    - 服務端根據本身的配對密鑰解密實現加密
    - 公鑰放在哪裏呢?
    - HTTP中瀏覽器訪問一個URL的流程
        - 瀏覽器向DNS服務器查詢輸入的URL對應的地址
        - DNS服務器返回網站的IP地址
        - 瀏覽器根據IP地址與目標web服務器在80端口上創建TCP鏈接
        - 瀏覽器獲取請求頁面的HTML代碼
        - 瀏覽器在顯示窗口內渲染HTML
        - 窗口關閉時,瀏覽器終止與服務器的鏈接
    - URL包括
        - 協議(或者稱爲服務方式)
        - 存有該資源的主機IP地址(有時也包括端口號)
        - 主機資源的具體地址,如目錄和文件名等
    - HTTP的四個會話過程
        - 創建TCP鏈接
        - 發出請求文檔
        - 發出響應文檔
        - 釋放TCP鏈接
        - 網頁解析的過程
    - 一個機器能使用的端口號上限
        - 端口號兩個字節:16位,因此最大表示65535
        - 端口號不能超出限制,表示端口號的字節數也不能改變
    - https創建鏈接的過程
        - 數字證書
        - 生成隨機數
        - 公鑰加密
        - 私鑰加密
        - 之後都用該隨機數進行對稱加密
    - http請求方法有哪些?get和post的區別
        - OPTIONS
            - 返回服務器針對特定資源所支持的HTTP請求方法,也能夠利用向web服務器發送‘*’的請求來測試服務器的功能性
        - HEAD
            - 向服務器索與GET請求相一致的響應,只不過響應體將不會被返回。這一方法能夠再沒必要傳輸整個響應內容的狀況下,就能夠獲取包含在響應小消息頭中的元信息。
        - GET
            - 向特定的資源發出請求。注意:GET方法不該當被用於產生「反作用」的操做中,例如在Web Application中,其中一個緣由是GET可能會被網絡蜘蛛等隨意訪問。Loadrunner中對應get請求函數:web_link和web_url
        - POST
            - 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的創建和/或已有資源的修改。 Loadrunner中對應POST請求函數:web_submit_data,web_submit_form
        - PUT
            - 向指定資源位置上傳其最新內容
        - DELETE
            - 請求服務器刪除Request-URL所標識的資源
        - TRACE
            - 回顯服務器收到的請求,主要用於測試或診斷
        - CONNECT
            - HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器
        - 根據HTTP規範,GET用於信息獲取,並且應該是安全的和冪等的
        - 根據HTTP規範,POST表示可能改變服務器上的資源的請求
    - http1.0 和 http1.1有什麼區別
        - http1.1提供永久性鏈接,1.0使用非持久鏈接
        - http1.1增長host頭
        - http1.1還提供了身份認證,狀態管理和cache緩存機制等相關的請求頭和響應頭
        - header、長鏈接、二進制
    - http常見狀態碼
        - 300
        - 302
        - 301
        - 304
    - http緩存說一下?
- 介紹一下Ping的過程,分別用到了哪些協議?
    - 過程 ...
    - ICMP協議
- icmp原理
- Restful和傳統的http對比
- session和cookie講一下
    - session的出現是爲了解決cookie存放本地並且量小的問題產生的,經過瀏覽器緩存的技術把須要的信息緩存,服務端就能夠在同一應用中不一樣頁面傳遞數據,我的以爲服務端採用的是hash表存放信息。
    - 服務端會發送一個sessionid標識客戶端
    - cookies的最大保存時間
- SYN FLOOD瞭解嗎?DDOS
    - 洪泛攻擊
    - 分佈式請求攻擊
    - 如何處理SYN FLOOD
- XSS原理
    - 跨站點腳本注入
    - 嵌入js代碼致使頁面被惡意篡改和重定向
- 介紹區塊鏈

數據庫SQL原理與應用

- 寫SQL
- 左鏈接
- Mysql索引的原理、底層是怎麼存的
- 主鍵和惟一鍵有什麼區別
- 十億個QQ號,每秒有10萬條請求查詢過來,如何處理
    - 消息隊列削峯
    - 緩存查找
    - 數據庫集羣
- innodb和MyISAM區別
- 數據庫MD5加密方法的具體實現
- 三級範式
- 數據庫CAP
- 數據庫存儲引擎瞭解嗎?
- 底層索引怎麼實現的?
- 黑名單功能算法實現
- 存儲過程
    - 經常使用的關係型數據庫是MySQL,操做數據庫的語言通常爲SQL語句,SQL在執行的時候須要先編譯,而後執行,而存儲過程(Stored Procedure)是一組爲了完成某種特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名字並給定參數(若是該存儲過程帶有參數)來調用執行它
    - 一個存儲過程是一個可編程的函數,它在數據庫中建立並保存。它能夠有SQL語句和一些特殊的控制結構組成,當但願在不一樣的應用程序或平臺上執行相同的函數或封裝特定功能時,存儲過程是很是有用的。數據庫中的存儲過程能夠看做是對面向對象方法的模擬,它容許控制數據的訪問方式
- 存儲過程的優勢
    - 存儲過程加強了SQL語言的功能和靈活性
        - 存儲過程能夠用流控制語句編寫,有很強的靈活性,能夠完成複雜的判斷和較複雜的運算
    - 存儲過程容許標準組件式編程
        - 存儲過程被建立後,能夠在程序中被屢次調用,而沒必要從新編寫該存儲過程的SQL語句,並且能夠隨時對存儲過程進行修改,對應用程序源代碼毫無影響
    - 存儲過程能實現較快的執行速度
        - 若是某一操做包含大量的Transaction-SQL代碼或者分別被屢次執行,那麼存儲過程要比批處理的執行速度快不少。由於存儲過程是預編譯的。在首次運行一個存儲過程時,優化器對其進行分析優化,而且給出最終被存儲在系統表中的執行計劃。而批處理的Transaction-SQL語句每次運行時都要進行編譯和優化,速度都相對要慢一些。
    - 存儲過程能減小網絡流量
        - 針對同一個數據庫對象的操做(如查詢、修改),若是這一操做涉及的Transacion-SQL語句被組織成存儲過程,那麼當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調用語句,從而大大增長了網絡流量並下降了網絡負載
    - 存儲過程可被做爲一種安全機制來充分利用
        - 系統管理員經過對執行某一存儲過程的權限進行限制,可以實現相應的數據的訪問權限的限制,避免了非受權用戶對數據的訪問,保證了數據的安全
- 索引
    - 索引(Index)是幫助MySQL高效獲取數據的數據結構,在數據以外,數據庫兄還維護者知足特定算法查找的數據結構,這些數據結構以某種方式引用(指向)數據,能夠在這些數據結構上實現高級查找算法,提升查詢速度,這種數據結構,就是索引
    - B-Tree索引 -> 最多見的索引類型,大部分引擎都支持B樹索引
    - HASH索引 -> 只有Memory引擎支持,使用場景簡單
    - R-Tree索引(空間索引) -> 空間索引是MyISAM的一種特殊索引類型,主要用於地理空間數據類型
    - Full-text(全文索引) -> 全文索引也是MyISAM的一種特殊索引類型,主要用於全文索引,InnoDB從MySQL5.6版本提供對全文索引的支持
- 事務是什麼
    - 事務(Transaction)是併發控制的基本單位,所謂的事務,它是一個操做序列,由一條或者多條SQL語句組成,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位
- ACID特性
    - 原子性(Atomicity)
        - 指整個數據庫事務是不可分割的工做單位,只有事務中全部的數據庫操做都執行成功,整個事務的執行纔算成功。事務中任何一個SQL語句執行失敗,那麼已經執行成功的SQL語句必須撤銷,數據庫狀態應退回到執行事務以前的狀態
    - 一致性(Consistency)
        - 事務應確保數據庫的狀態從一個一致狀態轉變爲另外一個一致狀態,一致狀態的含義是數據庫中的數據應知足完整性約束,也就是說事務開始以前和事務結束以後,數據庫的完整性約束沒有被破壞
    - 隔離性(Isolation)
        - 隔離性也叫作併發控制、可串行化或者鎖
        - 事物的隔離性要求每一個讀寫事務的對象與其餘事務的操做對象能相互分離,即該事務提交前對其餘食物都不可見,這一般使用鎖來實現多個事務併發執行,一個事務的執行不該影響其餘事務的執行
    - 持久性(Durability)
        - 表示事務一旦提交了,其結果就是永久性的,也就是數據已經寫入到數據庫了,若是發生了宕機事故,數據庫也能將數據恢復
- 數據庫中的「主屬性」、「碼」、「主碼」的區別是什麼?
    - 在數據庫的表(關係)中可以用於惟一區分開每一個記錄(元組)的屬性或屬性的集合,咱們稱之爲碼(候選碼)
    - 當咱們指定其中一個用來區分每一個記錄(元組)的碼稱爲主碼
    - 主屬性是指包含在候選碼中的屬性
        - 主碼和碼的關係就像班長和班長候選人之間的關係
        - 每一個班長候選人,咱們可稱之爲主屬性,只不過在數據庫中,候選碼多是多個屬性共同組成的

計算機組成原理

實踐應用

Linux

- Linux操做系統啓動加載進程
- 熟悉的Linux命令
    - 基本
        - pwd rm
        - touch 生成文件
        - cat mkdir
        - file 查看文件類型
        - df 查看磁盤容量
        - wc 計數工具
        - tr 刪除一段文本信息中的某些文字,或者將其進行轉換
        - join 鏈接兩個文件
        - paste 它是在不對比數據的狀況下,簡單的將多個文件合併在一塊兒,以Tab隔開
        - grep、awk、sed掌握程度
            - grep 打印輸出文本中匹配的模式串,它使用正則表達式做爲模式匹配的條件
            - sed 用於過濾和轉換文本的流編輯器
            - AWK是一種用於處理文本的編程語言工具
    - 文件 : ls ll -a la
        - lsof -p pid
            - 列出被進程打開得文件的信息,被打開的文件能夠是普通的文件、目錄、網絡文件系統的文件、字符設備文件、(函數)共享庫、管道、命名管道、符號連接、底層的socket字節流、網絡socket、unix域名socket
    - 進程和文件 : ps top df du pstree
    - 網絡 : netstat ping curl traceroute
        - 查看網絡鏈接 netstat 都有什麼狀態,剛剛說的狀態怎麼發生
        - 產看某個端口占用的進程
            - netstat -anp
        - 查看網絡鏈接
            - netstat -n
            - ip a
        - traceroute原理說一下
        - icmp原理說一下
    - 文本 : cat vi wc grep awk sed head tail more less
    - 查找 : where is find -n locate which
    - 權限 : chmod chown 777 su sudo
    - 磁盤 : 
    - 定時任務和後臺執行 : crontab nohup & 後臺執行(終端能不能關掉?)
- 如何把文件快速下發到100w個服務器(迅雷怎麼做到下載速度那麼快的)
    - P2P的下載,發佈文件到整個網絡中,每一個機器上既能上傳又能下載
- Linux socket相關
- 在linux裏面,大部分東西被當成文件
- 文件描述符做用
    - 負責文件的標識,包括網絡流、文件流、設備io流,這些均可以經過文件描述符來表示
- epoll => eventpoll linux內核實現IO多路複用的一個實現
    - https://zhuanlan.zhihu.com/p/56486633
    - select & epoll是什麼?併發度各有什麼限制?epoll爲何快?
        - 就序列表,根據場景
    - epoll的水平觸發和邊緣觸發
        - 水平不斷通知io就緒,邊緣觸發只有一次通知
    - epoll後的套接字怎麼存
        - 紅黑樹 + 鏈表
- 阿里雲linux版本
    - 6.3
- 阿里雲虛擬機版本
    - 7.0
- Linux性能監測
    - 待查
- Linux的I/O模型介紹以及同步異步非阻塞的區別
    - 阻塞IO
    - 非阻塞IO
    - IO複用
    - 信號驅動IO
    - 異步IO
- Linux進程管理
- Linux內核的進程調度
- fork返回值是什麼
- 什麼是虛擬內存
- 文件系統的理解
    - EXT4
        - 使用普遍
    - XFS
        - XFS文件系統時擴展文件系統的一個擴展,XFS文件系統有一些缺陷,例如它不能壓縮,刪除大量文件時性能低下
    - btrfs
        - 有不少好用的功能,例如寫複製、擴展校驗、快照、清晰、自修複數據、冗餘刪除以及其餘保證數據完整性的功能
- Linux的內存管理
- Linux如何避免內存碎片
    - 夥伴算法,用於管理物理內存,避免內存碎片
    - 高速緩存Slab層用於管理內核分配內存,避免碎片
- Linux如何打開一個文件,如何處理一個正在動態增加的文件
- IO複用的三種方法,poll、epoll、slect的特色和區別
    - select、poll、epoll都是IO多路複用的機制
    - IO多路複用就經過一種機制,能夠監視多個描述符,一旦某個描述符就緒(通常是讀就緒或者寫就緒),可以通知程序進行相應的讀寫操做
    - 但slect、poll、epoll本質上都是同步IO,由於他們都須要在讀寫事件就緒後本身負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步IO則無需本身負責進行讀寫,異步IO的實現會負責把數據從內核拷貝到用戶空間
    - SELECT
        - 最初解決IO阻塞問題的方法。用結構體fd_set來告訴內核監聽多個文件描述符,該結構體被稱爲描述符集。由數組來維持哪些描述符被置位了。對結構體的操做封裝在三個宏定義中,經過輪詢來查找是否有描述符要被處理,若是沒有則返回
        - 存在的問題
            - 內置數組的形式使得select的最大文件數受限與FD_SIZE
            - 每次調用select前都要從新初始化描述符集,將fd從用戶態拷貝到內核態,每次調用select後,都須要將fd從內核態拷貝到用戶態
            - 輪詢排查當文件描述符個數不少時,效率很低
    - poll
        - 經過一個可變長度的數組解決了select文件描述符受限的問題。數組中元素是結構體,該結構體保存描述符的信息,每增長一個文件描述符就向數組中加入一個結構體,結構體只要拷貝一次到內核態,poll解決了select重複初始化的問題,輪詢排查的問題未解決。
    - epoll
        - 輪詢排查全部文件描述符的效率不高,使服務器併發能力受限,所以,epoll採用只返回狀態發生變化的文件描述符,便解決了輪詢的瓶頸
- 爲何使用IO多路複用,最主要的緣由是什麼?
- epoll有兩種觸發模式?這兩種觸發模式有什麼區別?編程的時候有什麼區別?
- GDB調試
- Linux進程和線程如何建立、退出?進程退出的時候,本身沒有釋放的資源(如內存沒有free)會怎麼樣?

git命令

- git init
- git pull
- git fetch git merge
- git commit
- git push
- git reset --hard
- git stash git stash pop

深度學習網絡調優

分佈式

- 什麼是分佈式
    - 多節點部署
    - 分佈式存儲
    - 分佈式計算
    - 分佈式部署
- 分佈式存儲架構
    - 通常存儲使用raid冗餘陣列或者SSD快速磁盤
    - raid0 raid 1區別?
- 分佈式存儲方案
    - 塊存儲
        - 直接對磁盤進行裸盤映射使用,甚至不安裝文件系統,使用起來比較麻煩
    - 文件存儲
        - 基於文件系統使用存儲,經過網絡協訪問,好比ftp。通常是單機的存儲系統
    - 對象存儲
        - 包括控制節點和存儲節點,控制節點存儲元數據,存儲結點存儲數據,通常經過api使用,相似hdfs,結合塊存儲的速度和文件存儲的易用性,而且支持併發讀寫。
- 分佈式鎖原理
- 間隙鎖
- 可重複通常不能避免幻讀(可是MYSQL中能夠,它使用了gap lock+行級鎖的增強版:next key lock來避免幻讀)
- 序列化則是加表鎖
- 固然使用mvcc機制也能夠解決這個問題
- mvcc存儲引擎
- 請求失敗怎麼辦
    - 重發
- 加鎖失敗怎麼辦
    - 輪詢cas
- 回滾失敗怎麼辦
    記錄日誌,重試
- 高併發與異步服務器怎麼設計
    - 網絡IO的話就epoll大法好,異步就用回調模型
    - 高併發就要多線程開發代碼
    - 具體設計就是請求到達、處理、訪問IO、以及回覆結果

加密算法

- MD五、SHA摘要算法,非對稱加密
- RSA是對稱加密算法,有公鑰私鑰之分,比較複雜
- 對稱加密和非對稱加密
    - 對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。有時又叫傳統密碼算法,就是加密密鑰可以從解密密鑰中推算出來,同時解密密鑰也能夠從加密密鑰中推算出來。
    - 非對稱加密算法須要兩個密鑰:公開密鑰(public key)和私有密鑰(private key)。公開密鑰與私有密鑰是一對,若是用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密,若是用私有密鑰對數據進行加密,那麼只有用對應耳洞公開密鑰才能解密。由於加密和解密使用的是兩個不一樣的密鑰,因此這種算法才叫作非對稱加密算法。
- 數字證書的瞭解(高頻)
- 客戶端爲何信任第三方證書?
- RSA加密算法,MD5原理
- 單條記錄高併發訪問的優化

redis

- redis的主從複製怎麼作的
- aof 和 rdb兩種同步方式
- redis在項目中用來幹什麼,基於什麼考慮
    - 講了頻繁訪問的數據放到redis中,還有拿redis作異步任務隊列
- 單機redis有可能掛掉,解決措施
    - 單機作持久化,主從部署
    - 哨兵或者集羣
- 集羣redis掛掉的話,解決措施。
    - 把數據訪問直接轉到mysql
    - 是否是最好加一個異步任務隊列來作數據庫操做
    - 整個集羣掛掉只能異地容災
- redis掛掉了,而後如今恢復了,怎麼作,redis掛掉的這段時間,你是把在mysql上存取數據,這樣勢必要同步數據到redis。可是同步這個過程你redis是須要被訪問的,解決措施 : 
    - 同步後訪問
    - 增量同步
    - 主從,寫入主、訪問從
- 數據庫分庫分表,垂直和水平來分,若是某個問題數據量暴增,講了用分類來做爲分庫的依據,又給了場景,若是某類問題數據暴增,要怎麼作。後面面試官說了基於預測,能夠先作一個冗餘庫。好比某類問題有可能會數據量暴增,那能夠對這個模塊加冗餘的庫。而後冗餘庫接下來去怎麼用這個...沒聽清楚(hash?)
    - 垂直分業務,水平分數量
    - 劃分依據,好比id、時間戳、根據場景、好比某個類
    - 分片的規則就是進行hash,取模等方式進行
    - 最好使用數據庫中間件如mycat
- 驚羣效應和雪崩效應說一下,redis源碼看過沒
    - 多線程/多進程(linux下線程進程也沒多大區別)等待同一個socket事件
    - 當這個socket事件發生時,這些線程/進程被同時喚醒,這就是驚羣。
    - 驚羣效率很低下,許多進程被內核從新調度喚醒,同時去響應這一事件,固然只有一個進程只能處理事件成功,其餘的進程在處理該事件失敗後從新休眠(也有其餘選擇)。這種性能浪費現象就是驚羣。
    - 驚羣一般發生在server上,當父進程綁定一個端口監聽socket,而後fork出多個子進程,子進程們開始循環處理(好比accept)這個socket。
    - 每當用戶發起一個TCP鏈接時多個子進程被同時喚醒,而後其中一個子進程accept新鏈接成功,餘者皆失敗,從新休眠。
    - 避免驚羣要保證每次只通知到一個等待線程
    - 其實在linux2.6內核上,accept系統調用已經不存在驚羣了(至少我在2,6,18內核版本上已經不存在)。你們能夠寫個簡單的程序試下,在父進程中bind,listen,而後fork出子進程,全部的子進程都accept這個監聽句柄。
    - 這樣,當新鏈接過來時,你們會發現,僅有一個子進程返回新建的鏈接,其餘子進程繼續休眠在accept調用上,沒有被喚醒。
    - however,一般咱們的程序沒那麼簡單,不會願意阻塞在accept調用上,咱們呢還有許多其餘網絡讀寫事件處理,linux下咱們愛用epoll解決非阻塞socket。因此,即便accept調用沒有驚羣了,咱們也還得處理驚羣這事,由於epoll有這問題。上面說的測試程序,若是咱們在子進程內不是阻塞調用accept,而是用epoll_wait,就會發現,新鏈接過來時,多個子進程都會在epoll_wait後被喚醒。
- 驚羣的性能瓶頸是什麼
    - 性能瓶頸是內存大小
- nginx驚羣效應?
    - nginx就是這樣,master進程監聽端口號(例如80),全部的nginx worker進程開始用epoll_wait開始用來處理新事件,若是不加任何保護,一個新鏈接來臨時,會有多個worker進程在epoll_wait後被喚醒,而後發現本身accept失敗。
- nginx處理驚羣
    - nginx的每一個worker進程在函數ngx_process_events_and_timer中處理事件,(void)ngx_process_events(cycle, timer, flags);封裝了不一樣的事件處理機制,在linux上默認就封裝了epoll_wait調用。咱們來看看ngx_process_events_and_timers爲解決驚羣作了什麼, 代碼過長,存儲在另一個地方。
    - 簡單的說,就是同一時刻只容許一個nginx worker在本身的epoll中處理監聽句柄。它的負載均衡也很簡單,當達到最大connection時,本worker不會去試圖拿accept鎖,也不會去處理新連接,這樣其餘nginx worker進程就有機會去處理監聽句柄,創建新連接了。並且,因爲timeout的設定,使得沒有拿到鎖的worker進程,去拿鎖的頻率更高。

nginx的七層負載和四層負載均衡

- nginx的消息中間件

消息中間件開源

- kafka, rabbitmq

tomcat

- 網絡上點擊一個連接說一下全過程,到tomcat後,tomcat作了什麼呢?
- 底層如何處理整個請求的?詳細說一下?
- 線程池,NIO,socket,servlet等

設計模式

- 參考資料《設計模式之禪》,簡要了解一下便可
- 23種設計模式
    - 單例模式程序的實現

軟件工程

- 軟件的健壯性是指什麼
    - 程序能夠適應正常和非正常的運行環境,均可以正常的運行,隨着業務量的增長,不會出現阻塞和不可用的狀況
- 影響程序健壯性的因素
    - 沒有容錯控制
    - 執行耗時的操做
    - 執行復雜的任務
    - 數據不一致
    - 算法效率低
    - 不能應對大流量衝擊
- 什麼是正確性
    - 不可重入的任務被重入
    - 沒有前置狀態斷定
    - 沒有遵照」受理-處理-關閉「AHC模型
    - 沒有遵照「申請-前置審批-審批-善後-完成」RPC模型
    - 數據庫複製形成的數據延遲

Java思想

- Java四個特性
- Java GC原理,什麼對象會進入老年代?垃圾回收算法有哪些?爲何新生代使用複製算法?
- Java裏面的final關鍵字怎麼用的?
- 重載和重寫的區別?相同參數不一樣返回值能重載嗎?
    - 不能
- 進程通訊、GC機制
    - 共享內存
    - 管道和信號量
- JVM內存模型
    - JVM裏的堆就是一個公共區間,線程負責取資源,這樣就能夠實現資源共享
    - 內存模型
- Java裏面抽象類和接口的區別,同步機制的方式
- 接口能不能直接執行方法
- Java網絡編程,Java中socket的使用,騰訊基本用Java來作網絡編程,其餘的都用C來實現。
- Java反射機制
    - 在類加載的加載階段會產生java.lanag.class對象,並且初始化階段jvm也規定由relect包下的方法必須加載進來,這樣就能夠經過class forname動態加載類得到對象和調用getclass得到class對象,而後再用newinstance方法得到對象,...不夠全面
    - 依賴倒置
- Java裏的sort方法
- hashmap和hash衝突
    - 1.7用數組+單鏈表,1.8變成了紅黑樹
    - 初始容量和擴容問題
    - 取哈希值的改進,能夠算得更快
- HashMap和concurrenthashmap內部實現細節

智力題

- 100層樓,2個雞蛋,雞蛋從某一個臨界樓層丟下會摔碎,請設計方案,能用最小的次數找到臨界樓層
- 用3,4,5,6,7,8組成不重複的4位奇數,按照從小到大的順序排序,第62個數字是?
- 24點遊戲
- 25匹馬,5個跑道,如何經過最少的比賽次數肯定前3名?
- 一家人過橋問題

待定

- 如何處理SYN FLOOD

注意事項

- 儘可能現場面試
- 作加法 : 充實本身的知識面,計網、操做系統、數據結構和常見算法、開發框架都要懂一些,而後挑其中一個深挖一下。
- 作減法 : 不要提到任何本身不熟的東西,包括簡歷上和自我介紹中,禁不起深挖的項目,課程都要刪掉。
- 作總結:對於簡歷上每個項目經歷、實習經驗都要總結。對本身的貢獻和過程當中的難點進行整理。
- 創建排版 : 簡歷控制在一頁內。

跟面試官交流下怎麼修改簡歷

團隊、業務問題

- 如何解決團隊中的衝突,在團隊討論中該怎麼作。
    - 先聽onwer的解決方案,而後提意見,本身是owner本身先有解決方案,而後聽其餘人意見。
- 怎麼看由於工做換主語言
- 項目主要作的啥?本身負責的部分?
- 以爲最很差解決的幾個問題?怎麼解決的?
- 家裏哪裏的?爸爸媽媽幹什麼的?
- 還投了別的什麼公司嗎?偏向於哪一個?
- 找實習比較看重什麼?
- 家庭狀況、女票、互聯網行業高壓、騰訊文化、房價

我的提問環節

- 秒殺系統設計
- 爆發性增加的數據給數據庫帶來的問題
- 常規三問
    - 您是哪一個部門的,作什麼?
    - 對我今天面試的表現評價一下?
    - 對我從此的學習或者工做提些建議?
相關文章
相關標籤/搜索