有關後臺開發的複習知識點
推薦必讀書籍:
C++語言基礎類:《C++ primer plus》或《C++ primer》、《Effective C++》、《STL原始碼剖析》
演算法類:《程式設計珠璣》、《劍指offer》、《演算法設計與分析》(王秋芬,清華大學出版社)
計算機基礎類:《計算機網路》(謝希仁)、、《後臺開發核心技術與應用實踐》(徐曉鑫)、《資料結構》(嚴蔚敏,清華大學出版社)
作業系統類:《計算機作業系統》(湯小丹)
程式連結類:《程式設計師的自我修養》
Linux程式設計類:《UNIX網路程式設計》、《UNIX環境高階程式設計》、《鳥哥的LINUX私房菜》
資料庫類:《MySQL必知必會》、《高效能MySQL》(只看前四章即可)
C++知識點
- C++中函式過載的呼叫過程
- 函式模板的實現方式
- 常指標和指向常量的指標的區別
- 引用的底層是如何實現的,以及與指標的區別
- New、delete和malloc、free的區別
- C++是如何管理記憶體的
- 行內函數的特點
- 類的大小,空類的大小
- 類預設有哪些函式、C++11中預設有哪些函式
- 建構函式和解構函式的呼叫順序
- Virtual關鍵的三個作用
- 動態多型的實現方法
- Struct和class的區別
- C++11做了哪些更新
- 4種智慧指標的作用(auto_ptr、shared_ptr、unique_ptr和weak_ptr)
- C++中的4中強制轉換方法(dynamic_cast、const_cast、static_cast和reinterpret_cast)
- 左值的概念
- 右值引用的概念
- 移動語義和右值建構函式、右值賦值函式的概念
- Strlen和sizeof的區別
- 儲存資料時大端和小端的概念,以及如何判斷計算機儲存是採用大端還是小端
- Extern關鍵字在C++中的使用的含義
- 為什麼建構函式不能宣告為虛擬函式,為什麼解構函式要宣告為虛擬函式
- 靜態連結和動態連結的區別
- 虛擬函式的實現方法
- STL是如何對記憶體進行管理的
後臺開發主要技術:
- STL底層原理實現
- 預處理、編譯、彙編、連結、建立靜態庫、使用靜態庫、建立靜態庫、使用動態庫
- Makefile的撰寫
- ELF檔案的格式:.text、.data、.bss、.rec、.symtab、.strtab
- Strace的使用:strace -coTp
- Gdb的使用:l、b、16/func、r、n、p i、bt、finish、q
- Valgrind的使用
- TCP協議:TCP頭部、TCP狀態流轉、超時重傳、滑動視窗、擁塞控制
- TCP網路程式設計API
- IO模型:阻塞模型、非阻塞模型、多路複用模型、訊號驅動式、非同步
- 多執行緒:建立與結束、互斥鎖、條件變數、訊號量、讀寫鎖
- 程序:建立與結束(fork、vfork、exec、exit、_exit、abort)、孤兒程序、殭屍程序(wait、waitpid)、守護程序
- 程序間的通訊:訊號、管道(無名管道、命令)、訊號量、訊息佇列、共享記憶體
- HTTP協議
計算機網路知識點
- TCP報頭格式
16位源埠、16位目的埠、32位序列號、32位確認號、16位檢驗和、16位緊急視窗指標
- UDP報頭格式
源埠、目的埠、使用者資料包長度和檢驗和
- TCP/UDP區別(不僅是巨集觀上的,最好能根據各自的機制講解清楚)
TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線
TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
Tcp通過校驗和,重傳控制,序號標識,滑動視窗、確認應答實現可靠傳輸。如丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。
UDP具有較好的實時性,工作效率比TCP高,適用於對高速傳輸和實時性有較高的通訊或廣播通訊。
每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊
TCP對系統資源要求較多,UDP對系統資源要求較少。
- HTTP狀態碼(最好結合使用場景,比如在快取命中時使用哪個)
狀態碼 類別 原因短語
1XX Informational(資訊性狀態碼) 接收的請求正在處理
100表明到目前為止都很正常,客戶端可以繼續傳送請求
2XX Success(成功狀態碼) 請求正常處理完畢
200OK
3XX Redirection(重定向狀態碼) 需要進行附加操作以完成請求
301永久重定向、302臨時重定向。永久重定向和臨時重定向的區別
4XX Client Error(客戶端錯誤狀態碼) 伺服器無法處理請求
403請求被拒絕、404請求未發現
5XX Server Error(伺服器錯誤狀態碼) 伺服器處理請求出錯
500伺服器正在執行請求時發生錯誤
- HTTP協議(一些報頭欄位的作用,如cace-control、keep-alive)
有 4 種類型的首部欄位:通用首部欄位、請求首部欄位、響應首部欄位和實體首部欄位。
通用首部欄位:Cache-Control、
請求首部欄位:Host:請求資源所在的伺服器、Accept:使用者代理可處理的媒體型別
響應首部欄位:Location:令客戶端重定向至指定URL、server:HTTP伺服器的安裝
實體首部欄位:Content-language:實體主體的自然語言、Content-length實體主體大小
請求報文頭格式:
開始行:方法 URL 版本 CRLF
首部行:首部欄位名: 值CRLF
首部欄位名: 值CRLF
.
.
.
實體主體: 實體主體
響應報文頭格式:
開始行:版本 狀態碼 短語 CRLF
首部行:首部欄位名: 值CRLF
首部欄位名: 值CRLF
.
.
.
實體主體: 實體主體
- OSI協議、TCP/IP協議以及每層對應的協議。
- SESSION機制、cookie機制
Cookie 是伺服器傳送給客戶端的資料,該資料會被儲存在瀏覽器中,並且客戶端的下一次請求報文會包含該資料。通過 Cookie 可以讓伺服器知道兩個請求是否來自於同一個客戶端,從而實現保持登入狀態等功能。Cookie大小、數量有限制,Cookie是存在客戶端可能被禁用、刪除、篡改,是不安全的。Cookie如果很大,每次請求都需帶上影響傳輸效率。
Session 是伺服器用來跟蹤使用者的一種手段,每個 Session 都有一個唯一標識:Session ID。當伺服器建立了一個 Session 時,給客戶端傳送的響應報文包含了 Set-Cookie 欄位,其中有一個名為 sid 的鍵值對,這個鍵值對就是 Session ID。客戶端收到後就把 Cookie 儲存在瀏覽器中,並且之後傳送的請求報文都包含 Session ID。HTTP 就是通過 Session 和 Cookie 這兩種方式一起合作來實現跟蹤使用者狀態的,Session 用於伺服器端,Cookie 用於客戶端。Session不做特殊處理容易失效、過期、丟失或者Session過多導致伺服器記憶體溢位。
- TCP三次握手、四次揮手(這個問題真的要回答吐了,不過真的是面試官最喜歡問的,建議每天手擼一遍,而且不只是每次請求的過程,各種FIN_WAIT、TIME_WAIT狀態也要掌握)。
假設 A 為客戶端,B 為伺服器端。
首先 B 處於 LISTEN(監聽)狀態,等待客戶的連線請求。
A 向 B 傳送連線請求報文段,SYN=1,ACK=0,選擇一個初始的序號 x。
B 收到連線請求報文段,如果同意建立連線,則向 A 傳送連線確認報文段,SYN=1,ACK=1,確認號為 x+1,同時也選擇一個初始的序號 y。
A 收到 B 的連線確認報文段後,還要向 B 發出確認,確認號為 y+1,序號為 x+1。
B 收到 A 的確認後,連線建立。
四次揮手
A 傳送連線釋放報文段,FIN=1。
B 收到之後發出確認,此時 TCP 屬於半關閉狀態,B 能向 A 傳送資料但是 A 不能向 B 傳送資料。
當 B 要不再需要連線時,傳送連線釋放請求報文段,FIN=1。
A 收到後發出確認,進入 TIME-WAIT 狀態,等待 2MSL 時間後釋放連線。
B 收到 A 的確認後釋放連線。
- 開啟網頁到頁面顯示之間的過程(涵蓋了各個方面,DNS解析過程,Nginx請求轉發、連線建立和保持過程、瀏覽器內容渲染過程,考慮的越詳細越好)。
有了 HTTP 伺服器的 IP 地址之後,主機就能夠生成 TCP 套接字,該套接字將用於向 Web 伺服器傳送 HTTP GET 報文。
在生成 TCP 套接字之前,必須先與 HTTP 伺服器進行三次握手來建立連線。生成一個具有目的埠 80 的 TCP SYN 報文段,並向 HTTP 伺服器傳送該報文段。
HTTP 伺服器收到該報文段之後,生成 TCP SYNACK 報文段,發回給主機。
連線建立之後,瀏覽器生成 HTTP GET 報文,並交付給 HTTP 伺服器。
HTTP 伺服器從 TCP 套接字讀取 HTTP GET 報文,生成一個 HTTP 響應報文,將 Web 頁面內容放入報文主體中,發回給主機。
瀏覽器收到 HTTP 響應報文後,抽取出 Web 頁面內容,之後進行渲染,顯示 Web 頁面。
- http和https區別,https在請求時額外的過程,https是如何保證資料安全的
http是超文字傳輸協議,HTTPs 並不是新協議,而是 HTTP 先和 SSL(Secure Sockets Layer)通訊,再由 SSL 和 TCP 通訊。也就是說 HTTPs 使用了隧道進行通訊。通過使用 SSL,HTTPs 具有了加密、認證和完整性保護。HTTPs 採用混合的加密機制,使用公開金鑰加密用於傳輸對稱金鑰,之後使用對稱金鑰加密進行通訊。
HTTPS協議需要到CA申請證書,一般免費證書少需要交費;HTTP是超文字傳輸協議,資訊是明文傳輸,HTTPS則是具有安全性的SSL加密傳輸協議;HTTP使用80埠,HTTPS使用443埠;HTTP的連線簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的,可進行加密傳輸、身份認證的網路協議。
SSL包含的動作:
- 驗證伺服器
- 允許客戶端和伺服器選擇加密演算法和密碼,確保雙方都支援
- 驗證客戶端
- 使用公鑰加密技術來生成共享加密資料
- 建立一個加密的SSL連結
- 基於該SSL連結傳遞HTTP請求
- IP地址子網劃分
通過在主機號欄位中拿一部分作為子網號,把兩級 IP 地址劃分為三級 IP 地址。注意,外部網路看不到子網的存在。
IP 地址 ::= {< 網路號 >, < 子網號 >, < 主機號 >}
- POST和GET區別
當前網路請求中,絕大部分使用的是 GET 方法。POST 主要用來更新資源。
GET 和 POST 的請求都能使用額外的引數,但是 GET 的引數是以查詢字串出現在 URL 中,而 POST 的引數儲存在內容實體中。
GET 方法是安全的,而 POST 卻不是,因為 POST 的目的是傳送實體主體內容,這個內容可能是使用者上傳的表單資料,上傳成功之後,伺服器可能把這個資料儲存到資料庫中,因此狀態也就發生了改變。
HEAD:向伺服器索要與Get請求相一致的響應,只不過響應體將不會被返回
PUT:向指定資源位置上傳其最新內容
- DNS解析過程
主機向本地域名伺服器解析的過程採用遞迴,而本地域名伺服器向其它域名伺服器解析可以使用遞迴和迭代兩種方式。
迭代的方式下,本地域名伺服器向一個域名伺服器解析請求解析之後,結果返回到本地域名伺服器,然後本地域名伺服器繼續向其它域名伺服器請求解析;而遞迴的方式下,結果不是直接返回的,而是繼續向前請求解析,最後的結果才會返回。
- http1.1與http12.0的區別
HTTP/2.0 使用多路複用技術,使用同一個 TCP 連線來處理多個請求。
HTTP/1.1 的首部帶有大量資訊,而且每次都要重複傳送。HTTP/2.0 要求通訊雙方各自快取一份首部欄位表,從而避免了重複傳輸。
在客戶端請求一個資源時,會把相關的資源一起傳送給客戶端,客戶端就不需要再次發起請求了。例如客戶端請求 index.html 頁面,服務端就把 index.js 一起發給客戶端。
HTTP/1.1 的解析是基於文字的,而 HTTP/2.0 採用二進位制格式。
- 地址解析協議ARP
- 15. 交換機和路由器的區別
資料庫知識點
- 事務四大特性(ACID)
原子性(Atomicity)
事務被視為不可分割的最小單元,要麼全部提交成功,要麼全部失敗回滾。
一致性(Consistency)
事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對一個數據的讀取結果都是相同的。
隔離性(Isolation)
一個事務所做的修改在最終提交以前,對其它事務是不可見的。
永續性(Durability)
一旦事務提交,則其所做的修改將會永遠儲存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。可以通過資料庫備份和恢復來保證永續性。
- 資料庫隔離級別,每個級別會引發什麼問題,mysql預設是哪個級別
未提交讀(READ UNCOMMITTED)
事務中的修改,即使沒有提交,對其它事務也是可見的。
提交讀(READ COMMITTED)
一個事務只能讀取已經提交的事務所做的修改。換句話說,一個事務所做的修改在提交之前對其它事務是不可見的。
可重複讀(REPEATABLE READ)
保證在同一個事務中多次讀取同樣資料的結果是一樣的。
可序列化(SERIALIXABLE)
強制事務序列執行。
Mysql預設可重讀級別
- MYSQL的兩種儲存引擎區別(事務、鎖級別等等),各自的適用場景
InnoDB 是 MySQL 預設的事務型儲存引擎,只有在需要 InnoDB 不支援的特性時,才考慮使用其它儲存引擎。
採用 MVCC 來支援高併發,並且實現了四個標準的隔離級別,預設級別是可重複讀。
表是基於聚簇索引建立的,它對主鍵的查詢效能有很高的提升。
MyISAM 提供了大量的特性,包括全文索引、壓縮、空間函式(GIS)等。但 MyISAM 不支援事務和行級鎖,而且崩潰後無法安全恢復。
只能對整張表加鎖,而不是針對行。
事務:InnoDB 是事務型的。
備份:InnoDB 支援線上熱備份。
崩潰恢復:MyISAM 崩潰後發生損壞的概率比 InnoDB 高很多,而且恢復的速度也更慢。
併發:MyISAM 只支援表級鎖,而 InnoDB 還支援行級鎖。
其它特性:MyISAM 支援全文索引,地理空間索引。
- 資料庫的優化(從sql語句優化和索引兩個部分回答)
減少返回的列
慢查詢主要是因為訪問了過多資料,除了訪問過多行之外,也包括訪問過多列。最好不要使用 SELECT * 語句,要根據需要選擇查詢的列。
減少返回的行
最好使用 LIMIT 語句來取出想要的那些行。還可以建立索引來減少條件語句的全表掃描。
Explain
用來分析 SQL 語句。
獨立的列
在進行查詢時,索引列不能是表示式的一部分,也不能是函式的引數,否則無法使用索引。
字首索引
對於 BLOB、TEXT 和 VARCHAR 型別的列,必須使用字首索引,只索引開始的部分字元。
多列索引
在需要使用多個列作為條件進行查詢時,使用多列索引比使用多個單列索引效能更好。
索引列的順序
讓選擇性最強的索引列放在前面
- 索引有B+索引和hash索引,各自的區別
- B+索引資料結構,和B樹的區別
- 索引的分類(主鍵索引、唯一索引),最左字首原則,哪些情況索引會失效
- 聚集索引和非聚集索引區別。
- 有哪些鎖(樂觀鎖悲觀鎖),select時怎麼加排它鎖
共享鎖、排他鎖
一個事務對資料物件 A 加了 X 鎖,就可以對 A 進行讀取和更新。加鎖期間其它事務不能對 A 加任何鎖。
一個事務對資料物件 A 加了 S 鎖,可以對 A 進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對 A 加 S 鎖,但是不能加 X 鎖。
- 關係型資料庫和非關係型資料庫區別
資料庫 |
特性 |
關係型資料庫 |
1、關係型資料庫,是指採用了關係模型來組織 |
非關係型資料庫 |
1、使用鍵值對儲存資料; |
- 瞭解nosql
- 資料庫三正規化,根據某個場景設計資料表(可以通過手繪ER圖)
第一正規化 (1NF)
屬性不可分;
第二正規化 (2NF)
每個非主屬性完全函式依賴於鍵碼。可以通過分解來滿足。
第三正規化 (3NF)
非主屬性不傳遞依賴於鍵碼。
- 資料庫的主從複製
- 使用explain優化sql和索引
- long_query怎麼解決
- 內連線、外連線、交叉連線、笛卡兒積等
作業系統知識點
- 記憶體的頁面置換演算法
最佳法
先進先出
最近最久未使用
時鐘
- 程序排程算
批處理系統中的排程
-
- 先來先服務
排程最先進入就緒佇列的作業。
有利於長作業,但不利於短作業,因為短作業必須一直等待前面的長作業執行完畢才能執行,而長作業又需要執行很長時間,造成了短作業等待時間過長。
1.2 短作業優先
排程估計執行時間最短的作業。
長作業有可能會餓死,處於一直等待短作業執行完畢的狀態。因為如果一直有短作業到來,那麼長作業永遠得不到排程。
1.3 最短剩餘時間優先
互動式系統中的排程
2.1 優先順序排程
響應比 = (等待時間 + 要求服務時間) / 要求服務時間
這種排程演算法主要是為了解決短作業優先排程演算法長作業可能會餓死的問題,因為隨著等待時間的增長,響應比也會越來越高。
2.2 時間片輪轉
將所有就緒程序按 FCFS 的原則排成一個佇列,每次排程時,把 CPU 時間分配給隊首程序,該程序可以執行一個時間片。當時間片用完時,由計時器發出時鐘中斷,排程程式便停止該程序的執行,並將它送往就緒佇列的末尾,同時繼續把 CPU 時間分配給隊首的程序。
時間片輪轉演算法的效率和時間片的大小有很大關係。因為程序切換都要儲存程序的資訊並且載入新程序的資訊,如果時間片太小,會導致程序切換得太頻繁,在程序切換上就會花過多時間。
2.3 多級反饋佇列
如果一個程序需要執行 100 個時間片,如果採用輪轉排程演算法,那麼需要交換 100 次。多級佇列是為這種需要連續執行多個時間片的程序考慮,它設定了多個佇列,每個佇列時間片大小都不同,例如 1,2,4,8,..。程序在第一個佇列沒執行完,就會被移到下一個佇列。這種方式下,之前的程序只需要交換 7 次。
每個佇列優先權也不同,最上面的優先權最高。因此只有上一個佇列沒有程序在排隊,才能排程當前佇列上的程序。
實時系統中的排程
實時系統要求一個服務請求在一個確定時間內得到響應。
分為硬實時和軟實時,前者必須滿足絕對的截止時間,後者可以容忍一定的超時。
- 程序間通訊方式
訊號、訊號集、管道、訊息佇列、資訊量、共享記憶體
- 程序執行緒區別
擁有資源:程序是資源分配的基本單位,但是執行緒不擁有資源,執行緒可以訪問隸屬程序的資源。
排程:執行緒是獨立排程的基本單位,在同一程序中,執行緒的切換不會引起程序切換,從一個程序內的執行緒切換到另一個程序中的執行緒時,會引起程序切換。
系統開銷:由於建立或撤銷程序時,系統都要為之分配或回收資源,如記憶體空間、I/O 裝置等,所付出的開銷遠大於建立或撤銷執行緒時的開銷。類似地,在進行程序切換時,涉及當前執行程序 CPU 環境的儲存及新排程程序 CPU 環境的設定,而執行緒切換時只需儲存和設定少量暫存器內容,開銷很小。
通訊方面:程序間通訊 (IPC) 需要程序同步和互斥手段的輔助,以保證資料的一致性。而執行緒間可以通過直接讀/寫同一程序中的資料段(如全域性變數)來進行通訊。
- 執行緒之間的通訊
互斥鎖、條件變數、訊號量
- 死鎖的條件
互斥:每個資源要麼已經分配給了一個程序,要麼就是可用的。
佔有和等待:已經得到了某個資源的程序可以再請求新的資源。
不可搶佔:已經分配給一個程序的資源不能強制性地被搶佔,它只能被佔有它的程序顯式地釋放。
環路等待:有兩個或者兩個以上的程序組成一條環路,該環路中的每個程序都在等待下一個程序所佔有的資源。
利用搶佔恢復
利用回滾恢復
通過殺死程序恢復
- 緩衝區溢位是什麼?有什麼危害?出現原因?
在計算機內部,輸入資料通常被存放在一個臨時空間內,這個臨時存放的空間就被稱為緩衝區,緩衝區的長度事先已經被程式或者作業系統定義好了。向緩衝區內填充資料,如果資料的長度很長,超過了緩衝區本身的容量,那麼資料就會溢位儲存空間,而這些溢位的資料還會覆蓋在合法的資料上,這就是緩衝區和緩衝區溢位的道理。
可以利用堆疊溢位,在函式返回時改變返回程式的地址,讓其跳轉到任意地址,帶來的危害一種是程式崩潰導致拒絕服務, 另外一種就是跳轉並且執行一段惡意程式碼。
- 孤兒程序、殭屍程序和守護程序
孤兒程序
如果父程序先退出,子程序還沒退出那麼子程序將被 託孤給init程序,這是子程序的父程序就是init程序(1號程序).其實還是很好理解的.
程序終止後進入僵死狀態(zombie),等待告知父程序自己終止,後才能完全消失.但是如果一個程序已經終止了,但是其父程序還沒有獲取其狀態,那麼這個程序就稱之為殭屍程序.
守護程序就是在後臺執行,不與任何終端關聯的程序,通常情況下守護程序在系統啟動時就在執行,它們以root使用者或者其他特殊使用者(apache和postfix)執行,並能處理一些系統級的任務.
下面介紹一下建立守護程序的步驟
- 呼叫fork(),建立新程序,它會是將來的守護程序.
- 在父程序中呼叫exit,保證子程序不是程序組長
- 呼叫setsid()建立新的會話區
- 將當前目錄改成跟目錄(如果把當前目錄作為守護程序的目錄,當前目錄不能被解除安裝他作為守護程序的工作目錄)
- 將標準輸入,標註輸出,標準錯誤重定向到/dev/null
- 什麼時候使用程序,什麼時候使用執行緒
- 需要頻繁建立銷燬的優先使用執行緒
- 需要進行大量計算的優先使用執行緒
- 強相關的處理用執行緒,弱相關的處理用程序
- 可能要擴充套件到多機分佈的用程序,多核分佈的用執行緒
Linux系統知識點
- 硬連結和軟連線區別
建立符號連結的命令:ln –s 目標檔案 連結檔案;
可以對目錄建立符號連結;刪除一個符號連結不會對原檔案產生影響。
建立硬連結的命令:ln 目標檔案 連結檔案;
硬連結是已存在檔案的另一個名字。建立硬連結之前,目標檔案必須存在。刪除原始檔後,通過硬連結依然可以找回原始檔
- kill用法,某個程序殺不掉的原因(進入核心態,忽略kill訊號)
殭屍程序、忽略了kill訊號
- linux用過的命令
- 系統管理命令(如檢視記憶體使用、網路情況)
Free、ifconfig
- 管道的使用 |
- grep的使用,一定要掌握,每次都會問在檔案中查詢
- shell指令碼
- find命令
- awk使用