面經中的各類問題彙總

語言基礎,操做系統,計算機網絡,數據庫,設計模式,算法html

讀書的建議:
(1)讀每一本書都建議必定要讀取書的源碼,本身敲一遍,相信我,讀沒讀過源碼,是否本身可以寫出代碼差異仍是很大的。
(2)強烈建議處於校招或者準備校招的各位,要有一個讀書計劃,上面不只要有讀每本書的計劃時間(10天或者兩週),而且記載讀完每本書的感覺或者問題。若是可能,能夠記錄讀書過程當中發現的問題,而且在不少博客上去查找答案。若是一番讀書過程,受益不淺。java

讀書:mysql

c++primer,深度探索c++對象模型,STL源碼剖析,effective c++,more effective c++linux

深刻理解計算機基礎,現代操做系統,UNIX環境高級編程,MIT6.828課程c++

計算機網絡,圖解TCP/IP(非必讀),TCP/IP詳解(卷一),UNIX網絡編程(卷一),圖解HTTPgit

算法:劍指offer,程序員代碼面試指南,leetcode(在不能確保本身其餘基礎水平達到的狀況下,不建議貪多隻花時間刷算法)程序員

數據庫:數據庫概論,mysql必知必會,高性能mysql(建議讀前面索引和性能部分就好)——打好基礎就好,沒時間的話不用深github

設計模式:大話設計模式,——重點研究單例模式,工廠模式等常見設計模式web

linux:鳥哥lunux家常菜,深刻理解linux內核面試

-----------------------------------------------------------
以C++開放舉例,粗略說說筆試通常會考哪些內容:
(1) 語言基礎,C++中的定義,指針,模板,多態,重載等(尤爲是多態,給定一個程序,基類子類有不一樣實現,考慮輸出結果,這一類的題目面試題也極爲高頻)
(2) TCP/IP協議及其編程:計算機網絡基礎,socket編程,其中子網劃分,七層協議(例如交換機屬於數據鏈路層一類題目),五層協議,協議名稱及其做用,經常使用端口號,https1.0 1.1特性與區別,三次握手四次揮手(可能出現的服務器攻擊),加密(對稱,非對稱),IO複用等
(3) 操做系統:進程通訊方式(linux/windows,每種方式的特色),線程通訊(linux/windows),進程與線程區別,頁面置換策略(考察置換幾回),進/線程狀態轉換圖,進程調度方式,死鎖(必要條件,哲學家就餐,銀行家,讀者寫者問題),
(4) 數據庫:索引做用,應該/不該該建立索引的列,索引底層實現,sql語法,常見引擎特色,事務特色,隔離級別(引擎默認級別),隔離級別的問題,鎖等
(5) Linux方面:IO模型,linux常見命令(grep,awk,sed),文件系統,

-----------------------------------------------------------

面試高頻題:
1語言基礎(C++)
(1) 指針和引用的區別

指針是變量,存儲的是地址;引用只是別名,不能爲空,必須初始化,而且初始化後不能改變,不能指向其它;

指針能夠有const,能夠爲空,能夠改變指向,由於它是一個變量,若是sizeof獲得的結果也不一樣,自增操做結果也不一樣,函數參數傳遞也不一樣(一個是拷貝,一個是引用傳遞)

若是返回動態內存分配的對象或者內存,必須使用指針,引用可能引發內存泄漏;(爲何??

(2) 堆和棧的區別

數據結構中,內存結構中區別在於

棧:編譯器自動分配釋放,連續,高地址向低地址,空間限制,分配速度快,函數調用中先入下一條語句位置,從右到左的參數,局部變量

堆:不連續空間,速度慢,有碎片,向高地址擴展,比較靈活,大

(3) new和delete是如何實現的,new 與 malloc的異同處

new先調用malloc,後調用構造函數,delete先調用析構後調用free;

malloc/free是函數,而new/delete是關鍵字;

new在申請內存時會自動計算所需字節數,而malloc則需咱們本身輸入申請內存空間的字節數;malloc須要本身綁定對象類型

new的bad_alloc異常

(4)volatile

程序在進行編譯的時候,編譯器會進行一系列的優化.好比,某個變量被修飾爲 const的,編譯器會在寄存器中保存這 個變量的值,可是有時候,咱們去了這個變量的地址,而後強行改變這個變量在內存中的值,這就形成告終果的不匹配,而volatile聲明 的變量就會告訴編譯器,這個變量隨時會改變,須要每次都從內從中讀取,就是不須要優化,從而避免了這個問題,其實,volatile應用更多的場景是多線程對共享資源的訪問的時候,避免編譯器的優化, 而形成多線程之間的通訊不匹配!;

explicit:禁止類的構造函數進行隱式的類型轉換

(4) C和C++的區別

c++:面向對象,class類,支持函數重載,有引用,多態,輸入輸出流

C++所有變量的默認連接屬性是外連接,而C是內鏈接;(???)

(5) C++、Java的聯繫與區別,包括語言特性、垃圾回收、應用場景等(java的垃圾回收機制)

java沒有指針,運行在JVM上,移植性強,在JVM裏面運行獲得結果,垃圾回收gc算法,豐富的插件

c++在底層和中間件上更有優點,靈活,支持多繼承,運算符重載,自動強制類型轉換

(6) Struct和class的區別

默認的數據訪問控制,class還用於定義模板參數,默認繼承方式:class私有,struct公有;大括號初始化不一樣;c中的struct不能包含函數,而c++中的能夠

(7) define 和const的區別(編譯階段、安全性、內存佔用等)

define預編譯時簡單的替換,沒有類型檢查,不能調試,可是功能也很強大,能夠用來防止頭文件重複引用;#ifndef #define #endif 

頭文件儘可能只有聲明,不要有定義。這麼作不只僅能夠減弱文件間的編譯依存關係,減小編譯帶來的時間性能消耗,更重要的是能夠防止重複定義現象的發生,防止程序崩潰。由於,若是用了條件編譯的話,也可能存在重複定義,由於頭文件中可能包含了已經定義的變量,這些變量被多個.c文件包含,編譯階段都是各單元編譯的,所以該變量在各單元是獨立的,都有地址,因此在最後main.c中可能出現二義性。解決方法是分離式編譯

const帶類型,是常量,編譯運行的時候起做用,存儲在數據段空間,不能重定義。

(8) 在C++中const和static的用法(定義,用途)

const必須賦值,class中的const成員能夠在構造函數使用初始化列表賦值;static能夠默認值,在類外初始化;

類中的const函數是爲了避免改類的成員,static函數是爲了全局訪問,本文件內,不能訪問非靜態的成員和函數,由於沒有this的概念

(11) 計算下面幾個類的大小:
class A {};: sizeof(A) = 1;  空類大小爲1B,編譯器每每會給一個空類隱含的加一個字節,這樣空類在實例化後在內存獲得了獨一無二的地址
class A { virtual Fun(){} };: sizeof(A) = 4(32位機器)/8(64位機器);  虛函數表指針的大小
class A { static int a; };: sizeof(A) = 1; 
class A { int a; };: sizeof(A) = 4;
class A { static int a; int b; };: sizeof(A) = 4;

虛函數、成員函數(包括靜態與非靜態,由於至關是共享的全局函數)和靜態數據成員都是不佔用類對象的存儲空間

(13) C++的STL介紹(這個系列也很重要,建議侯捷老師的這方面的書籍與視頻),其中包括內存管理allocator,函數,實現機理,多線程實現等

allocator是STL中的內存分配器,基於空閒列表,先分配一塊固定大小的內存池,而後實施小對象的快速分配和釋放,避免內存碎片,侷限於STL容器使用

(14) STL源碼中的hash表的實現

數組+鏈表,拉鍊法;entry【】數組,key value next

(17) vector使用的注意點及其緣由,頻繁對vector調用push_back()對性能的影響和緣由。

從新分配,注意迭代器,範圍for的使用

(18) C++中的重載和重寫的區別:

重定義發生在繼承中,從新定義了一個函數;重寫(虛函數多態關鍵):與重定義差很少,只是重寫的是虛函數;

重載是指發生在同一個類中,名稱相同,可是參數個數或者類型不一樣。

(19) C ++內存管理(熱門問題)

(20) 介紹面向對象的三大特性,而且舉例說明每個。

封裝,繼承,多態、抽象--

(21) 多態的實現(和下個問題一塊兒回答)

在基類的函數前加上virtual關鍵字,在派生類中重寫該函數,運行時將會根據對象的實際類型來調用相應的函數。若是對象類型是派生類,就調用派生類的函數;若是對象類型是基類,就調用基類的函數

虛函數表指針:有父類的,也能夠是子類的虛函數表指針,虛函數表的建立和虛表指針的初始化都在構造函數中完成

(22) C++虛函數相關(虛函數表,虛函數指針),虛函數的實現原理(熱門,重要)

(24) 析構函數通常寫成虛函數的緣由:多態需求;通常有其它虛函數的類,其析構函數也常爲虛函數
(25) 構造函數爲何通常不定義爲虛函數:對象都尚未實例化,怎麼去找虛表
(26) 構造函數或者析構函數中調用虛函數會怎樣和普通函數沒有區別,不會發生動態特性;危險,由於子類已經析構了,你還訪問子類對象
(27) 純虛函數:要求派生類必須來實現=virtual
(28) 靜態綁定和動態綁定的介紹  
29) 引用是否能實現動態綁定,爲何引用能夠實現:指針或引用是在運行期根據他們綁定的具體對象肯定(由於它們只是指代1個地址或者別名)
(30) 深拷貝和淺拷貝的區別(舉例說明深拷貝的安全性):當有動態生成的對象時,默認拷貝函數是淺拷貝,指向同一塊內存區域,析構時兩次析構,會有內存泄露

Array(){m_iCount=5;m_pArr=new int[m_iCount];}
Array(const Array &arr)
    {
        m_iCount=arr.m_iCount;
        m_pArr=arr.m_pArr;
    }
//改成
Array(const Array &arr)
      {
          m_iCount=arr.m_iCount;
          m_pArr=new int[m_iCount];
          for(int I=0;i<m_iCount;i++)
         {
             m_pArr[i]=arr.m_pArr[i];
         }
    }

  

(31) 對象複用的瞭解,零拷貝的瞭解(??)若是應用程序永遠不會對這塊數據進行修改,那麼就永遠不須要將數據拷貝到應用程序的地址空間去。在stl中string的實現相似這種策略。

是爲了下降拷貝的開銷,好比read和send的開銷其實很大,須要4次數據拷貝,4次上下文切換

咱們能夠採用零拷貝技術。linux下提供相似的系統調用主要有mmap(),sendfile(),splice().

 

(32) 介紹C++全部的構造函數:默認,普通,拷貝,賦值:默認無參,普通有參數,其實還有this指針,拷貝就是const class &A,賦值構造函數是對賦值符號的重載,若是有動態生成的對象的話,那麼它作賦值,原先的動態空間必定要被釋放掉,而後再賦上新的值,因此必須得本身重載=,實現delete。

 CExample& operator = (const CExample&); //賦值符重載  
CExample & CExample::operator = (const CExample& RightSides)  
{  
     nSize=RightSides.nSize; //複製常規成員  
    char *temp=new char [nSize]; //複製指針指向的內容   
     memcpy(temp,RightSides.pBuffer,nSize*sizeof (char ));  
  
    delete []pBuffer; //刪除原指針指向內容   (將刪除操做放在後面,避免X=X特殊狀況下,內容的丟失)  
     pBuffer=temp;    //創建新指向  
    return *this   
}  

  

(33) 什麼狀況下會調用拷貝構造函數(三種狀況):一個對象去初始化,值傳遞類,返回值是類
(34) 結構體內存對齊方式和爲何要進行內存對齊?:由於計算機每次都是讀入32位(32),因此爲了保證一次讀能直接讀出成員:大端(高地址存屁股),如何判斷用union,一個char,一個int,而後放入一個int 1,取char類型看是等於0仍是1
35) 內存泄露的定義,如何檢測與避免?:可能會有:動態分配(本身,第三方的庫);程序遞歸,隱含內存分配(vector),系統調用(好比消息隊列的溢出),多線程(不斷申請線程);解決方法:調試運行,查看崩潰前的運行信息;Valgrind工具(???);在用戶程序和運行庫中間加一層用於記錄內存分配的狀況(???)
(36) 手寫實現智能指針類(34-37我沒碰見過):
(37) 調試程序的方法:概括法、演繹法、測試法,回溯法,暴力法。設置斷點,進入調試,單步運行,進入函數,查看變量。linux gbk,win windbg
(38) 遇到coredump要怎麼調試:程序崩潰會產生core dump,通常有段錯誤或者abord。若是有設置core文件的話,就gdb test.cpp core,而後會定位到出錯的地方,能夠用bt(backtrance)或者where來查看當前調用的堆棧,而後用frame n找到第n層堆棧的信息,就能夠找到出錯的語句了;而後進一步分析,p能夠查看變量的值。
(39) 內存檢查工具的瞭解:linux可使用開源的Valgrind工具包,包含多個工具:Memcheck經常使用語檢測malloc和new這類的問題,callgrind用來檢查函數調用,cachegrind緩存使用,helgrind多線程程序中的競爭。除了valgrind還能夠用mtrace這些工具
(40) 模板的用法與適用場景:代碼可重用,泛型編程,在不知道參數類型下,函數模板和類模板
41) 成員初始化列表的概念,爲何用成員初始化列表會快一些(性能優點):使用初始化list這樣能夠直接調用成員的構造函數,不用去賦值產生臨時變量,因此更快。若是不用,可能會去調用成員的構造函數和賦值構造函數(多出來的)。
(42) 用過C11嗎,知道C11新特性嗎?(有面試官建議熟悉C11):lambda 智能指針 移動,auto,範圍for,decltype,array,forward_list,tuple,正則表達式庫,隨機數庫,bitset運算
(43) C++的調用慣例(簡單一點C++函數調用的壓棧過程):下步語句,參數右到左,局部變量
(44) C++的四種強制轉換:static,const,dynamic,rein

(45)函數模板的實例化是由編譯程序在處理函數調用時自動完成的,而類模板的實例化必須由程序員在程序中顯式地指定。


2 計算機網絡(TCP/IP)
(1) 創建TCP服務器的各個系統調用:https://blog.csdn.net/hzrandd/article/details/50973185

(2) 繼上一題,說明socket網絡編程有哪些系統調用?其中close是一次就能直接關閉的嗎,半關閉狀態是怎麼產生的?

因爲是雙向的,兩邊都要發FIN,服務器關閉socket,用close會將該socket的計數-1,若是引用仍是大於0,那麼socket端口狀態保持不變,若是爲0,會將sender緩衝中的數發出去,而後發送FIN。可能在多進程中出現半關閉,因此應該使用

shutdown(sockfd, SHUT_RDWR); close(sockfd);

shutdown不考慮描述符的引用計數,直接關閉描述符,到LAST_ACK狀態。也可選擇停止一個方向的鏈接,只停止讀或只停止寫。 

若是有多個進程共享一個套接字,close每被調用一次,計數減1,直到計數爲0時,也就是所用進程都調用了close,套接字將被釋放。

在多進程中若是一個進程調用了shutdown(sfd, SHUT_RDWR)後,其它的進程將沒法進行通訊。但,若是一個進程close(sfd)將不會影響到其它進程。

就是說可能會有多個進程共享使用一個socket。其它的系統調用有

socket(AF_INET, SOCK_STREAM, 0) AF表示地址族,初始化套接口地址結構; socket (int namespace, int style, int protocol)

客戶端:socket,bind,connect,send,recv,close

服務器:多了listen,accept

(3) 對路由協議的瞭解與介紹。內部網關協議IGP包括RIP,OSPF,和外部網關協議EGP和BGP.
(4) 路由協議所使用的算法。

D-V距離矢量算法(RIP,IGRP,EIGRP,BGP),L-S鏈路狀態算法(也稱SPF最短路徑樹算法,如ospf,isis)

(5) TCP和UDP的區別:面向鏈接,可靠字節流服務,基於可靠性技術來保證:流量控制(滑動窗口),擁塞控制(慢啓動),差錯控制(檢錯糾錯);udp面向數據報,沒有重傳
(6) TCP和UDP相關的協議與端口號:TCP:FTP-21;TELNET終端仿真-23;SMTP-25;HTTP-80;POP3-110;HTTPS加密的超文本傳輸服務-443, UDP:DNS-53,DHCP-67
(7) TCP(UDP,IP)等首部的認識(http請求報文構成):IP首部20字節,TCP固定首部也是20字節,端口號是2字節的,IP號是4字節的,UDP是8字節

IP

一、第一個4字節(也就是第一行):
(1)版本號(Version),4位;用於標識IP協議版本,IPv4是0100,IPv6是0110,也就是二進制的4和6。
(2)首部長度(Internet Header Length),4位;用於標識首部的長度,單位爲4字節,因此首部長度最大值爲:(2^4 - 1) * 4 = 60字節,但通常只推薦使用20字節的固定長度。
(3)服務類型(Type Of Service),8位;用於標識IP包的優先級,但如今並未使用。
(4)總長度(Total Length),16位;標識IP數據報的總長度,最大爲:2^16 -1 = 65535字節。
二、第二個四字節:
(1)標識(Identification),16位;用於標識IP數據報,若是由於數據鏈路層幀數據段長度限制(也就是MTU,支持的最大傳輸單元),IP數據報須要進行分片發送,則每一個分片的IP數據報標識都是一致的。
(2)標識(Flag),3位,但目前只有2位有意義;最低位爲MF,MF=1表明後面還有分片的數據報,MF=0表明當前數據報已經是最後的數據報。次低位爲DF,DF=1表明不能分片,DF=0表明能夠分片。
(3)片偏移(Fragment Offset),13位;表明某個分片在原始數據中的相對位置。
三、第三個四字節:
(1)生存時間(TTL),8位;之前表明IP數據報最大的生存時間,如今標識IP數據報能夠通過的路由器數。
(2)協議(Protocol),8位;表明上層傳輸層協議的類型,1表明ICMP,2表明IGMP,6表明TCP,17表明UDP。
(3)校驗和(Header Checksum),16位;用於驗證數據完整性,計算方法爲,首先將校驗和位置零,而後將每16位二進制反碼求和即爲校驗和,最後寫入校驗和位置。

 

 

一、第一個4字節:
(1)源端口,16位;發送數據的源進程端口
(2)目的端口,16位;接收數據的進程端口
二、第二個4字節與第三個4字節
(1)序號,32位;表明當前TCP數據段第一個字節佔整個字節流的相對位置;
(2)確認號,32位;表明接收端但願接收的數據序號,爲上次接收到數據報的序號+1,當ACK標誌位爲1時才生效。
三、第四個4字節:
(1)數據偏移,4位;實際表明TCP首部長度,最大爲60字節。
(2)6個標誌位,每一個標誌位1位;
SYN,爲同步標誌,用於數據同步;
ACK,爲確認序號,ACK=1時確認號纔有效;
FIN,爲結束序號,用於發送端提出斷開鏈接;
URG,爲緊急序號,URG=1是緊急指針有效;
PSH,指示接收方當即將數據提交給應用層,而不是等待緩衝區滿;
RST,重置鏈接。
(3)窗口值,16位;標識接收方可接受的數據字節數。詳解可參看: http://www.cnblogs.com/woaiyy/p/3554182.html
四、第五個4字節
(1)校驗和,16位;用於檢驗數據完整性。
(2)緊急指針,16位;只有當URG標識位爲1時,緊急指針纔有效。緊急指針的值與序號的相加值爲緊急數據的最後一個字節位置。用於發送緊急數據。


(8) 網頁解析的過程與實現方法

DNS-遞歸迭代解析

負載均衡:將用戶分攤到多個服務器上(Nginx是一款面向性能設計的HTTP服務器,做爲中介來分配)

Nginx默認支持 RR輪轉法 和 ip_hash(能會話粘連)法 這2種分配算法。還有url_hash法

Nginx負載均衡服務器將網頁傳遞給filters鏈處理,以後發回給咱們的瀏覽器

(9)    在瀏覽器中輸入URL後執行的所有過程(如www.baidu.com
10) 網絡層分片的緣由與具體實現

MTU(最大傳輸單元):是鏈路層的限制1500B,因此IP要分片

MSS(最大分段大小):是TCP的限制,雙方能夠協商,每每是減去兩個頭部,40B。鏈路層是以太網的是話是1460,internet是512B

UDP不分段,靠IP分片

(11) TCP的三次握手與四次揮手的詳細介紹(TCP鏈接創建與斷開是熱門問題)
12) TCP握手以及每一次握手客戶端和服務器端處於哪一個狀態(11種狀態):5+6

 


(13) 爲何使用三次握手,兩次握手可不能夠?:解決請求/答覆丟失,超時重傳致使的重複鏈接
14) TIME_WAIT的意義(爲何要等於2MSL)

最後一個ACK可能丟失,因此接收服務器的FIN,而後重傳ACK;若是當即關閉,那麼接收FIN會發送RST報文,服務器覺得鏈接異常了

(15) 超時重傳機制(不過高頻)
(16) TCP怎麼保證可靠性(面向字節流,超時重傳,應答機制,滑動窗口,擁塞控制,校驗等)?
(17) 流量控制的介紹,採用滑動窗口會有什麼問題(死鎖可能,糊塗窗口綜合徵)?

 TCP滑動窗口技術經過動態改變窗口大小來調節兩臺主機間數據傳輸。當都爲1就是中止-等待協議

考慮發送方的傳輸速率,可能每次都發1字節有效荷載的包,可能接收方每次都能從緩存中取1字節,而後聲明本身窗口有1字節

Nagle算法:發送方就把第一個數據字節先發送出去,把後面到達的數據字節都緩存起來。當發送方接收對第一個數據字符的確認後,再把發送緩存中的全部數據組裝成一個報文段再發送出去。當到達的數據已達到 發送窗口大小的一半或已達到報文段的最大長度時,就當即發送一個報文段。

Clark解決方法是隻要有數據到達就發送確認,但宣佈的窗口大小爲零,直到或者緩存空間已能放入具備最大長度的報文段,或者緩存空間的一半已經空了。另外,還能夠採用延遲確認的方法

(18) tcp滑動窗口協議
(19) 擁塞控制和流量控制的區別:流量控制是端到端的控制,擁塞控制是一個全局性的過程,涉及到全部的主機、路由器,以及與下降網絡性能有關的全部因素。
(20) TCP擁塞控制,算法名字?(極其重要)

1)慢啓動(開始是指數的),2)擁塞避免,3)擁塞發生(慢啓動或者快速恢復),4)快速恢復:門限爲當前窗口,窗口爲一半,不斷+1上升

(21) http協議與TCP聯繫

Http鏈接是一種短鏈接,是一種無狀態的鏈接。所謂的無狀態,是指瀏覽器每次向服務器發起請求的時候,不是經過一個鏈接,而是每次都創建一個新的鏈接。

(22) http/1.0和http/1.1的區別

長鏈接和請求的流水線處理;請求消息中多了Host頭域(用來標識虛擬主機,爲了實現虛擬的web服務器,實現負載均衡);帶寬優化(在請求消息中引入range頭域,避免發生斷連後要請求全部的包;加入新的狀態碼100continue,若是不肯定服務器是否可以接收大的實體時,發一個只帶頭域的請求,看返回的是100仍是401-unauthorized);消息傳遞(引入Chunkedtransfer-coding,將大的實體分紅任意大小的數據塊,都附上長度,最後用一個0長度的塊來做爲消息結束的標誌);緩存(加入了一些cache新的特性,緩存對象expire時變爲stale對象,cache不直接拋棄它們,而是與原服務器進行從新激活;增長了cache-control頭域;cache使用關鍵字來索引在磁盤中緩存的對象,而不是URL)

(23) http的請求方法有哪些?get和post的區別

GET/POST、put/delete,head/trece(head只會返回首部,能夠知道元信息,例如資源在不在,資源的狀況;trace會回顯服務器收到的請求,主要用於測試診斷),options(問服務器能支持那些功能和方法,對於特定的資源);connect(HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器)

區別:一個是拿數據,一個是傳數據;get請求沒有消息體,只能攜帶不超過2kB數據(一般),將數據放在url地址中;post有消息體,沒有數據大小限制,比get更安全

(24) http的狀態碼

第一個數字表明瞭響應的狀態。1表示消息;2表示成功;3表示重定向;4表示請求錯誤;五、6表示服務器錯誤。

100-continue;200-正常;301-(客戶請求的文檔在其餘地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL);404(not found);500-服務器遇到錯誤,沒法完成請求;503-服務不可用,服務器因爲維護或者負載過大不能響應

25) http和https的區別,由http升級爲https須要作哪些操做

安全超文本傳輸協議在http協議基礎上增長了使用SSL加密傳送信息的協議,ssl:安全套接字層;加密傳輸+身份認證的功能

https:創建安全通道,確認網站真實性; https的缺點:信任鏈可能有問題,加密範圍有限,要錢,不高效

區別:(1)端口不一樣,80和443,鏈接方式不一樣;(2)https須要請求證書(就是公鑰,包含簽發者信息,過時時間),使用對稱密鑰加密通訊;

(26) https的具體實現,怎麼確保安全性
(27) http中瀏覽器一個URL的流程,這個過程當中瀏覽器作了什麼,URL包括哪三個部分

協議+域名+端口+虛擬目錄+文件名+錨+參數(後面的能夠描述爲路徑?查詢)

(28) 一個機器可以使用的端口號上限是多少,爲何?能夠改變嗎?那若是想要用的端口超過這個限制怎麼辦?

16位,0有特殊用處,因此是65535.

(29) 對稱密碼和非對稱密碼體系

混合加密方式

(30) 數字證書的瞭解(高頻)

PKI實現的功能就是用一個你們都信任的機構CA給用戶頒發一個數字證書,證書中包含用戶的公鑰(這個公鑰能夠是用戶本身生成的提交給CA的也能夠是CA生成發給用戶的)及相關身份信息。

(31) 客戶端爲何信任第三方證書:簽名合法
(32) RSA加密算法,MD5原理(MD5不算加密算法)
(33) 單條記錄高併發訪問的優化(???)

(34) 介紹一下ping的過程,分別用到了哪些協議:https://blog.csdn.net/github_35156632/article/details/52403961

UDP-ICMP(internet 控制報文協議)-ARP(地址解析的協議,mac地址)-OSPF(開放最短路徑優先,內部網關協議)

封裝UDP-IP包,而後查看子網掩碼看是否在同網段,若是在,那麼找ARP緩存表,找不到發送ARP請求,最後轉換成數據幀,發送——接收後從IP包提取數據交給ICMP協議處理,發送ICMP應答

若是不在同網段則交給路由器處理,解析到對應的路由器mac,發送,路由器再解析到最終的mac發送

故障基本就是DNS配置不正確unkown host name,沒鏈接DNS服務器,或者路由的問題,網卡問題,IP地址不存在

(35) TCP/IP的分片粘包過程

主要是由於MSS(最大報文段長度)很難肯定,使最終數據幀的有效荷載比MTU大,進行IP的分片

粘包(UDP不會出現,由於有消息邊界): (1)發送方要等緩存區滿才發送數據;(2)接收端不及時接收緩衝區的包,形成多個包的接收;

措施:(1)編程能夠強制數據當即傳送指令push(2)優化接收方的設計,提升接受進程優先級,使接收方及時接收數據

(36) 有沒有抓過TCP包,描述一下

tcpdump是對網絡上的數據包進行截獲的包分析工具,它支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句來去掉無用的信息。

只能抓取流過本機的包

tcpdump -c 10 -nn -i eth0 tcp dst port 22   //這裏 src是源 dst是目的的意思


(37) 一個ip配置多個域名,靠什麼識別?

DNS負載均衡:一個域名對應多個IP,將負載均衡放到DNS處,其實大型網站會設置該爲第一級的負載均衡;

識別:http請求中的host域,或者是端口號識別,不一樣端口號指向不一樣的網站處理

(38) 服務器攻擊(DDos攻擊):(1)利用TCP3次握手的缺陷SYN timeout;(2)流量攻擊,對主機的攻擊。。。


3數據庫(MySQL)
數據庫我自身不是特別熟,面試的時候通常也都坦言了,因此面試官都只是問一些基礎題目。

(1) 關係型和非關係型數據庫的區別(各自優勢

關係(支持ACID,sql語句,易於維護使用方便,可是維護一致性代價高):外鍵關聯來創建表和表之間關係;非關係(key-value,海量存儲,沒有耦合可擴展,讀寫性能好):以對象的方式存儲(HBASE.MOGODB)

(2) 經常使用SQL語句(DDL,DML,DCL,TCL):數據定義,操縱,控制和事務控制語言

DML:select,insert,update,delete,merge,call,

(3) 數據庫中join的類型與區別(inner join, outer join, cross join, natural join, self join),注意適用場景和sql語句的編寫:多表的鏈接查詢

內鏈接:一個學校表 inner join一個申請表,那麼顯示全部有人申請的學校;on 後面表示條件,where進一步過濾鏈接後的條目

外鏈接:左鏈接會把全部學校列出來,補全申請的信息,若是沒有那麼字段爲null;全鏈接會把申請人的信息也補全,若是學校沒有出如今表1,表1字段置爲null;

交叉鏈接:笛卡爾積,a×b行,效率很低

天然鏈接: SELECT * FROM ORDERS O NATURAL LEFT OUTER JOIN CUSTOMERS C; 無需指定鏈接列,檢查同名列,只能select ×

4) 數據庫的索引類型:索引能夠加快檢索速度,加快錶鏈接,可是增長空間,還有維護開銷,對錶更新索引要重建,當咱們須要讀取的數據量佔整個數據量的比例較大抑或者說索引的過濾效果並非太好的時候,使用索引並不必定優於全表掃描。

ALTER TABLE people ADD INDEX lname (lname);

惟一unique索引:能夠是多列的惟一;

主鍵primary key索引

彙集索引:對正文內容按照必定規則排列的目錄稱爲彙集索引,就至關於按照拼音查字典

(5) 彙集索引和非彙集索引的區別(葉節點存儲內容)
(6) 惟一性索引和主碼索引的區別
(7) 索引的優缺點,何時使用索引,何時不能使用索引(重點)
(8) 索引的底層實現(B+樹,爲什麼不採用紅黑樹,B樹):文件很大是存在磁盤上的,IO的時間是很重要的,減小IO次數。樹的高度越大,那麼其IO次數可能越多。矮胖更好,並且B+數中只有關鍵字,一個盤塊能容納的關鍵字更多,局部性更好,另外支持範圍查找;
(9) B樹和B+樹具體實現:
(10) 索引最左前綴問題:索引index1:(a,b,c),只會走a、a,b、a,b,c 三種類型的查詢,由於索引是有序的,先根據a排序,而後根據b排序,而後c
(11) Mysql的優化(高頻,索引優化,性能優化)

查詢緩存,爲搜索字段建索引;select少用*,limit條數;固定的表長更快,使用not null

(12) 數據庫引擎介紹,innodb和myisam的特色與區別

InnoDB:有好的事務支持,行級鎖定,適用事務的場景,更新頻繁,一致性要求高的場景;myisam:表級鎖定,讀寫互相阻塞,不支持事務,適用併發低,數據修改少,一致性要求低場景;

(13) 數據庫中事務的ACID(四大特性都要可以舉例說明,理解透徹,好比原子性和一致性的關聯,隔離性很差會出現的問題)

一個事務與其餘事務隔離的程度稱爲隔離級別. 數據庫規定了多種事務隔離級別, 不一樣隔離級別對應不一樣的干擾程度, 隔離級別越高, 數據一致性就越好, 但併發性越弱

原子,一致,隔離,持久

14) 數據庫隔離性設置不一樣會出現的問題(髒讀、不可重複讀、丟失修改、幻讀):併發事務,要有鎖

髒讀:一個事務去讀了未提交的數據操做結果,可能會回滾。

虛讀:t1去讀數據後,t2改了這個數據,t1再去讀的時候讀到不同了。因此用不可重複讀來避免

幻讀:事務兩次查詢,兩次查詢中間另外事務對錶修改了,因此第二次會發現出現了或者缺乏了數據,不同了

 

(15) 數據庫的隔離級別,mysql和Oracle的隔離級別分別是什麼

Mysql 默認的事務隔離級別爲: REPEATABLE READ ,支持4種;Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE. Oracle 默認的事務隔離級別爲: READ COMMITED  Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE. Oracle 默認的事務隔離級別爲: READ COMMITED  
(16) 數據庫鏈接池的做用

 鏈接複用。經過創建一個數據庫鏈接池以及一套鏈接使用管理策略,使得一個數據庫鏈接能夠獲得高效、安全的複用,避免了數據庫鏈接頻繁創建、關閉的開銷。 getConnection 方法獲取鏈接

(17) Mysql的表空間方式,各自特色

一種是共享表空間,及多張表放在一個文件中,還有一種是獨立表(性能更好點)空間,每一個表都有獨立的數據文件(便於刪除,移動單表)。

(18) 分佈式事務:XA協議採用兩階段提交方式來管理分佈式事務

MVCC多版本的併發控制:只在讀提交和重複讀下面工做;

(19) 數據庫的範式:

20) 數據的鎖的種類,加鎖的方式:數據庫中通常是悲觀鎖,認爲數據隨時會被修改。分爲共享s鎖(存在死鎖,全部s鎖的事務都想升級成x鎖),排他x鎖(寫鎖,禁止再加任何鎖),和更新u鎖(容許其餘事務讀,可是不容許再加u和x鎖,當要被更新時升級爲x鎖)。

悲觀鎖按做用範圍分爲行鎖和表鎖

樂觀鎖:若是沒有吞吐量瓶頸仍是不用它,可能有風險

(21) 視圖的做用與使用方法(如何刪除等):
(22) 分庫分表,主從複製,讀寫分離。(我不會,也沒碰到過)
(23) 項目中哪裏用到了數據庫,怎麼用的。 個人項目中沒有用到數據庫,之前的管理系統用到過。可是不少區塊鏈客戶端是用到了google的leveldb數據庫存儲kv數據,這是開源的


4Linux基礎
Linux這一塊若是不太熟,能夠直接說,可是由於開發崗位通常都是在Linux平臺下的,因此幾個基礎問題仍是要會的。
(1) Linux的I/O模型介紹以及同步異步阻塞非阻塞的區別(超級重要)

同步:我調用一個功能,該功能沒有結束前,我死等結果。異步:不須要知道該功能結果,該功能有結果後通知我(回調通知) 

阻塞:沒有接收完數據或者沒有獲得結果以前,我不會返回。非阻塞,就是調用我(函數),我(函數)當即返回,經過select通知調用者

同步IO和異步IO的區別就在於:數據拷貝的時候進程是否阻塞;阻塞IO和非阻塞IO的區別就在於:應用程序的調用是否當即返回

5種IO模型:同步(阻塞IO,非阻塞IO(會返回錯誤,而後IO操做函數會不斷測試是否準備好,會佔用不少cpu時間),IO複用(select,poll,epoll函數,能實現多個IO操做的阻塞,同時對多個IO函數進行檢測),信號驅動IO(不阻塞,考sigio信號)),異步I/O(經過狀態、通知和回調來通知調用者的輸入輸出操做)

 

(2) 文件系統的理解(EXT4,XFS,BTRFS)

ext4 :日誌文件系統,意味着它會對文件在磁盤中的位置以及任何其它對磁盤的更改作記錄。縱觀它的全部功能,它還不支持透明壓縮、重複數據刪除或者透明加密。

ext4 性能不錯,可是支持的大小不行;btrfs有不少好用的功能(寫複製、擴展校驗、快照、清洗、自修複數據、冗餘刪除以及其它保證數據完整性的功能)
(3) 文件處理grep,awk,sed這三個命令必知必會

grep是文本過濾器,對一個或多個正則進行匹配輸出對應的行或文本,速度快,返回搜索的狀態,0成功,1搜不到,2文件不存在;*是匹配其前面的任意字符

sed是流編譯器,針對行,不改變原內容,文件讀行到緩衝區而後處理後送往屏幕。

awk:報告生成器。能按照列來處理,功能很全,有本身的語言,處理文本的編程語言工具

(4) IO複用的三種方法(select,poll,epoll高併發多鏈接時好)深刻理解,包括三者區別,內部原理實現?https://blog.csdn.net/davidsguo008/article/details/73556811

(5) Epoll的ET模式和LT模式(ET的非阻塞)
(6) 查詢進程佔用CPU的命令(注意要了解到used,buf,cache表明意義)

內存不夠-磁盤上的虛擬內存swap;內存夠,額外內存中分配出空間設置cache和buf,buf用於存修改後的數據,不急着更新到磁盤;used包含的是全部的buf和cache分配總額

查看cpu:top主要看cpu,內存使用狀況,及佔用資源最多的進程由高到低排序,關注點在於資源佔用狀況;ps主要是查看進程的,關注點在於查看須要查看的進程,cat(顯示內容) proc/statue

(7) linux的其餘常見命令(kill,find,cp等等)

kill 殺死進程,pid標識;find 在指定的目錄下查找文件,查找的方式能夠根據正則式、類型、深度、時間、大小、權限,能夠設置刪除這些文件;

cp將1個或多個文件複製到文件/目錄下;touch 建立新的空文件;chown 改變文件所屬的全部者和組
(8) shell腳本用法
(9) 硬鏈接和軟鏈接的區別:硬連接經過索引接地那來鏈接,多個文件名字指向同一索引節點,當只刪除1個鏈接不影響索引節點自己,要刪除所有鏈接

軟鏈接(符號鏈接-s):至關於快捷方式,指明位置信息,當刪除文件,鏈接無效

(10) 文件權限怎麼看(rwx):ls -l 、ll  讀/寫/可執行(針對目錄能不能進去cd)  chmod 修改權限

(11) 文件的三種時間(mtime, atime,ctime),分別在何時會改變:狀態時間修改屬性,訪問時間讀的時候,修改時間
(12) Linux監控網絡帶寬的命令,查看特定進程的佔用網絡資源狀況命令

(13)Linux內核--內核地址空間分佈和進程地址空間

直接映射區就是線性地址和物理地址存在線性轉換的關係; 動態內存映射區是內核函數vmalloc分配的;

永久內存映射區是可訪問高端內存,固定映射區每一個地址項服務於特定的用途

上面的地址都是在3G-4G之間的(32位)(就是說高地址的給os用,低的給進程用,linux一般佔1G,win要2G)

進程空間:每一個進程有一個3G大小地址空間(32位),可是這個是虛地址,每一個進程用戶空間都是徹底獨立的,訪問內核經過系統調用和中斷。實際的物理內存只有當進程真的去訪問新獲取的虛地址時,纔會產生缺頁異常,進入分配實際頁的流程。經過頁表機制。分佈是棧、堆、BSS、data、text。棧和堆生長的方向是爲了最大化空間利用率。堆區最大多是接近3G,要考慮另外的那些的大小

 

每一個進程的帶寬使用――nethogs

 


5操做系統
(1) 進程與線程的區別和聯繫:進程(資源分配、調度單位,容易管理,若是是微內核os中,調度單位是線程),線程有本身的棧段,存放局部/臨時變量,開銷小
(2) 一個進程能夠建立多少線程,和什麼有關:線程的堆棧大小,有些默認是1M;而後和進程的用戶地址空間相關,好比2G,最後剩下可能只有2027個線程能夠
(3) 一個程序從開始運行到結束的完整過程(四個過程):

預處理(.i,頭文件編譯進來,宏替換),編譯(.s,各類分析後彙編語言),彙編(.o),連接(模塊間,動態 靜態)

(4) 進程通訊方法(Linux和windows下),線程通訊方法(Linux和windows下)

管道:半雙工的流動;消息隊列:消息的鏈表,在內核中;信號量:計數器,經常使用與鎖機制;信號:比較複雜;共享內存:一個進程建立,多個進程能夠訪問,快;套接字:能夠用於不一樣機器間通訊

信號量:pv,設爲資源的數目;互斥量:信號量的一種,0/1;條件變量:一般配合互斥量一塊兒使用

 

(5) 進程調度方法詳細介紹

時間片輪轉調度算法(RR),先來先服務調度算法(FCFS),優先級調度算法(HPF),多級反饋隊列調度算法,高響應比優先調度算法

(6) 頁面置換方法詳細介紹

FIFIO,LRU,NRU(最近未使用)

(7) 可否實現一個LRU算法

棧:頭尾指針,棧底是舊的,用鏈表連接起來,雙向的,因此移走一頁的話,最壞的要改6個指針

(8) 死鎖的必要條件(怎麼檢測死鎖,解決死鎖問題)
(9) 哲學家就餐,銀行家,讀者寫者,生產者消費者(怎麼加鎖解鎖,僞代碼)
10) 海量數據的bitmap使用原理:海量處理一個bitmap,一個布隆過濾器

40億的數有一個是不包含的,那麼40億對應的比特位數空間是0.5GB,而後每一個數會置相應的位爲1,最後統計。若是隻有10MB的空間的話,就先分塊,每塊有計數器,找到缺的塊,而後用bitmap

(11) 布隆過濾器原理與優勢:k個hash產生k個點陣,而後在位圖上置爲1,比較這些點若是有0,則不包含。優勢快,缺點不能刪除元素,還有誤判率。
(12) 布隆過濾器處理大規模問題時的持久化,包括內存大小受限、磁盤換入換出問題
(13) 同步IO和異步IO
(14) 文件讀寫使用的系統調用:open,close,creat,read,write
15) 線程池的瞭解、優勢、調度處理方式和保護任務隊列的方式

池的概念:就是爲了重用,減小由於建立銷燬帶來的性能開銷;

線程池能控制最大的併發數目,提升資源利用率,便於管理和使用

(16) 怎麼回收線程
(17) 殭屍進程問題:子進程結束可是沒有等到父進程wait他,那麼他將會變爲殭屍進程。內核仍然會保留它的一些信息,這些信息會一直保留到系統爲她傳遞給它的父進程爲止,若是父進程結束了也over了/。

解決方法就是父進程wait或者waitpid;能夠用信號量機制來通知父進程回收,若是父進程很忙的話

(18) 多線程同步(尤爲是若是項目中用到了多線程,很大可能會結合討論)
(19) memcache瞭解:分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫的負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升了網站訪問的速度。存儲鍵值對的HashMap。適合對數據庫有高併發讀寫和海量數據處理的場景。
(20) 異常和中斷的區別:外部中斷,會有中斷請求,轉去幹別的事,而後回到斷點;異常是內部的中斷,基本上是程序缺陷,不少都是不能預知的
(21) 通常狀況下在Linux/windows平臺下棧空間的大小

win是編譯器決定棧的大小,記錄在可執行文件中,默認是1M。linux是os來決定的,在系統環境變量中設置, ulimit -s 命令查看修改,個人是8M

 

6設計模式和算法
設計模式通常都不會考太多,除非你明確說本身懂。我基本上就不涉及到設計模式的東西,因此只是簡要說說。固然,單例模式和簡單工廠模式的概念和使用場景仍是要知道的。
(1) 介紹熟悉的設計模式(單例,簡單工廠模式)

建立型模式:工廠、抽象工廠、單例;結構性模式:橋接、代理;行爲型模式:觀察者、命令、策略;J2EE模式:MVC

(2) 寫單例模式(餓漢模式和懶漢模式),線程安全版本
(3) MVC設計模式


算法這一塊太過龐大,幾乎都有可能,牛油們最好仍是去刷劍指offer(level 1),leetcode(若是可以刷到最高難度,算法對你來講已經不是什麼了,或者說面試對你來講簡直就是吃飯喝水的難度),左神的書《程序源代碼面試指南》(字符串,數組,dp,海量數據問題,搞定它們也就搞定面試的一半)。
下面仍是簡單的列舉一些吧(包括一些數據結構題目,只列舉簡單的,面試的算法一半不會太難,可是如今通常都是須要比較好的思惟,或者曾經接觸過這方面的題,建議就是多刷題,作題感受是刷出來的)
(1) 紅黑樹RBTREE的瞭解(平衡樹,二叉搜索樹),使用場景

avl用於搜索,插入刪除次數少場景,用在win的內核中不少;紅黑:查找,用在STL中map set,java 中的treemap,linux進程調度公平調度用於管理進程控制塊;B/B++用於文件系統、數據庫中作索引,trie用於前綴匹配,NLP中經常使用的數據結構吧
(2) 紅黑樹在STL上的應用

對於unordered的結構,紅黑樹雖然慢,可是比hash的方式省內存
(3) 瞭解並查集嗎?(低頻)

並查集用於暢通工程算法,親戚門派問題;pre{}數組用於記錄上一級是誰,兩個函數find用於查根,join用於當兩我的的掌門人不一樣的時候,將其中一個掌門人歸併到另一個掌門人門下;可使用路徑壓縮算法繼續優化
(4) 貪心算法和動態規劃的區別:貪心就是考慮當前,與後面無關;dp就是考慮全部相關狀況,把結果保存起來,而後回溯
(5) 判斷一個鏈表是否有環,如何找到這個環的起點:若是不考慮空間的話,其實只要把鏈表節點加入到hashset中去就行,若是在set已經包含了元素,那麼就是起點,有環。也能夠用雙指針快慢來作
(6) 實現一個strcpy函數(或者memcpy),若是內存可能重疊呢
(7) 實現一個循環隊列:ring buffer
(8) 排序算法(寫快排,歸併排序,堆排序),算法的時間複雜度,空間複雜度,是否穩定等
(9) 快排存在的問題,如何優化:最差狀況下很差,比較點的選擇使用隨機的方式(能夠取左中右各自3個數取中數,而後獲得3箇中數再取中數,若是這樣的話,後面的N能夠設爲9);三向切分(把相等的數也考慮進來,不讓他們再次遞歸);當劃分已經小於N時,使用插入排序,由於快排會遞歸本身
(10) 反轉一個鏈表:用3個指針遍歷一次
(11) Top K問題(能夠採起的方法有哪些,各自優勢?) 最小堆k;或者最大堆輸出k次,直接直選nk
(12) Bitmap的使用,存儲和插入方法:Bitmap是Android系統中的圖像處理的最重要類之一
(13) 二叉樹的先序、中序、後序遍歷(非遞歸實現)
(14) 二叉樹的公共祖先(簡單地說,劍指offer上的題大都是高頻題)
(15) 1-n中有多少個1:將數分爲3塊,如3141592考慮每一位,好比百位,那麼百位爲1,則分爲3141和5和92,那麼就爲3142×100個;千位是1,因此是314×1000+593;

考慮到比較的那個位,若是大於1的話。加8則至關於進位了,因此最後能夠得出該式子比較:

int countDigitOne(int n) {
    int ones = 0;
    for (long long m = 1; m <= n; m *= 10) {
        int a = n/m, b = n%m;
        ones += (a + 8) / 10 * m + (a % 10 == 1) * (b + 1);
    }
    return ones;
}

 

(16) 字典樹的理解以及在統計上的應用:根節點不包含字符,另外的節點只包含1個字符,因此1個節點只包含1個字符和幾個指針
(17) 數組的全排列:關鍵是遞歸後要從新交換回來數字,leetcode原題permutations
(18) N個骰子出現和爲m的機率:dp
(19) 海量數據問題(可參考左神的書)
(20) 一致性哈希:分佈式哈希表DHT就是用到這個,避免了用餘數的分佈式算法,服務器發生變化會致使從新算,阿里一面的那個問題,其實也可使用這個來解決。能夠選擇服務器ip或者主機名來進行哈希的映射,選第一個順時針的服務器,只須要重定位一小部分的節點就好

增長虛擬節點來優化節點太少而產生的不均衡狀況,好比將節點1加後綴進行哈希,分紅多個虛擬節點

用在緩存數據庫,redis,數據庫的水平分表這些地方

 


7智力題
我特別把智力題單獨拿出來說,是由於這一塊其實有些公司很看重(例如騰訊),可是我基本上也沒刷過這類題目,接觸很少,牛油們自行補充吧。
(1) 100層樓,只有2個雞蛋,想要判斷出那一層恰好讓雞蛋碎掉,給出策略(滴滴筆試中兩個鐵球跟這個是一類題) dp問題
(2) 毒藥問題,n拼毒藥,要快速找出哪一瓶有毒,須要幾隻小白鼠

利用校驗碼機制能夠定位,海明校驗碼,或者說讓1000瓶編號三位數,讓三隻老鼠分別喝掉全部對應位爲1的藥 (3) 博弈論問題 (4) 先手必勝策略問題:n本書,每次可以拿X-X本,怎麼拿必勝 (5) 放n只螞蟻在一條樹枝上,螞蟻與螞蟻之間碰到就各自往反方向走,問總距離或者時間。 (6) 瓶子換飲料問題:多少個瓶子可以換1瓶飲料,問最多能喝幾瓶

相關文章
相關標籤/搜索