美團後台開發工程師一面知識點總結

  • 2019 年 10 月 3 日
  • 筆記

正向代理和反向代理的區別?

正向代理和反向代理的本質都是代為收發請求和響應。

正向代理是一個位於客戶端和目標伺服器之間的代理伺服器。為了從原始伺服器取得內容,客戶端向代理伺服器發送一個請求,並且指定目標伺服器,之後代理向目標伺服器轉交並且將獲得的內容返回給客戶端。正向代理的情況下客戶端必須要進行一些特別的設置才能使用。

反向代理正好相反。對於客戶端來說,反向代理就好像目標伺服器,並且客戶端不需要進行任何設置。客戶端向反向代理髮送請求,接著反向代理判斷請求走向何處,並將請求轉交給客戶端,使得這些內容就好似他自己一樣,因此客戶端並不會感知到反向代理後面的服務,也不需要客戶端做任何設置,只需要把反向代理伺服器當成真正的伺服器就好了。

正向代理隱藏了客戶端。(訪問Google的梯子)

反向代理隱藏了伺服器。(負載均衡,訪問內網伺服器)

參考資料:

反向代理為何叫反向代理?

進程,執行緒,協程?

進程

進程指一個正在執行的程式,是系統資源分配的最小單位,一個進程一般由以下幾部分組成:

  • 程式程式碼(稱為文本段或者程式碼段)
  • 當前的活動(包括程式計數器,暫存器的內容)
  • 數據段(包括全局變數)
  • 棧(包括函數參數,返回地址和局部變數等臨時參數)
  • 堆(進程運行期間動態分配的記憶體)

進程的特點:

  • 動態性:進程由創建而產生,由調度而執行,因得不到資源而暫停執行,由撤銷而消亡。
  • 並發性:多個進程可以在一段時間內同時運行。
  • 獨立性:進程是獨立運行的基本單位。
  • 非同步性:進程各自可以獨立地,以不可知地速度前進。

執行緒

執行緒又稱為輕量級進程,是進程內的一條運行線,是程式的實際執行者,一個進程至少包含一個主執行緒,也可以有更多的子執行緒。

  • 使用CPU的基本單元,由執行緒ID,程式計數器,暫存器集合和堆棧組成。
  • 同一進程的執行緒共享進程的程式碼段,數據段和其他資源。

執行緒的特點:

  • 響應度高:一個進程中一個執行緒的阻塞不會導致整個進程的阻塞。
  • 資源共享:同屬一個進程的多個執行緒共享這個進程的所有資源。
  • 通訊簡單:
  • 經濟:創建執行緒所花費的資源比較少,執行緒切換比進程切換所需資源少。
  • 多處理器體系結構的利用:可以利用多個CPU執行多個執行緒實現並發處理。

對作業系統來說,執行緒是最小的執行單元,進程是最小的資源管理單元。

無論進程還是執行緒,都是由作業系統所管理的。

協程

協程,英文Coroutines,是一種比執行緒更加輕量級的存在。正如一個進程可以擁有多個執行緒一樣,一個執行緒也可以擁有多個協程。

協程不是被作業系統內核所管理,而完全是由程式所控制(也就是在用戶態執行)。

參考資料:

記憶體中堆和棧的區別

單核CPU與多核CPU,進程與執行緒,程式並發執行?

漫畫:什麼是協程?

goroutine背後的系統知識

進程調度演算法

五状态进程模型

如上圖所示,進程是有不同的狀態的,當有多個進程處於就緒狀態時,CPU調度程式從中選擇一個進程將CPU分配給它。

決定選擇哪個就緒進程去CPU運行的部分稱為調度程式,它所使用的演算法稱為調度演算法。

先來先服務調度演算法

最短作業優先演算法

  • 非搶佔式的:當運行進程主動放棄CPU控制權時進行調度
  • 搶佔式的:
    • 進程主動離開CPU時調度運行時間最短的進程
    • 當新到達進程的運行時間小於正在運行進程的剩餘運行時間時進行調度

高響應比優先演算法

響應比=(等待處理器的時間+期望服務的時間)/ 期望服務的時間

時間片輪轉演算法

  • 搶佔式調度演算法
  • 時鐘每隔一段時間產生一個中斷,運行狀態的進程進入就緒狀態,用先來先服務的方法從就緒隊列中選擇一個進程去執行

優先權調度演算法

  • 每個進程有一個優先權,優先權不同時調度優先權最高的進程,優先權相同時按照先來先服務順序調度
  • 搶佔式/非搶佔式

多級隊列調度

  • 把就緒隊列劃分為多個獨立的隊列
  • 各個隊列之間使用優先順序調度
  • 同一優先順序之間使用時間片輪轉調度

多級回饋隊列調度

  • 可搶佔式演算法
  • 有多個隊列優先順序從高到低
  • 進程剛進入系統,進入RQ0,執行完一個時間片,進入RQ1
  • 最低優先順序的隊列是按照時間片輪轉法調度

虛擬記憶體

虛擬存儲器就是指僅把作業的一部分裝入記憶體就可以運行作業的存儲系統。

它具有請求調入功能和置換功能,是從邏輯上對記憶體容量進行擴充的一種存儲系統。

請求頁式存儲管理

  • 一個進程調入記憶體時只調入部分頁
  • 當需要的頁面不在記憶體時,請求調入所需的頁面
  • 如果記憶體不足,可以把記憶體中的某個頁面換出到外部輔存中

缺頁中斷

缺頁:進程執行時要訪問的頁面不在記憶體

缺頁導致缺頁中斷:OS響應缺頁中斷,把所需頁面調入記憶體

缺頁置換演算法

  • 在缺頁發生時,OS一定要在記憶體中選擇一個頁面調出記憶體,為要調入的頁面讓出空間
  • 頁面置換演算法負責選擇要淘汰的頁面
  1. 最優頁面置換演算法

    • 在缺頁發生時,在記憶體中的頁面中會有一些將很快被訪問,一些卻要等待100或者1000條指令才能訪問到
    • 每個頁面都會有該頁面下次要被訪問之前所要執行的指令數目進行標記
    • 置換演算法淘汰標記最大的頁面
    • 這種演算法最優,但是它無法實現。
  2. 先進先出置換演算法

    • 在缺頁發生時,置換最先進入記憶體的頁面
  3. LRU置換演算法(Least Recently Used 近期最少使用)

    • 在置換時選擇未使用時間最長的頁面

    • LRU演算法的實現:計時器

    • LRU演算法的實現:雙向鏈表

      • 在訪問頁時將此頁移動至head

      • 置換時不需要查找,替換tail的頁面

HTTP狀態碼

分類 描述
1** 資訊,伺服器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或者無法完成請求
5** 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤

常見的狀態碼

狀態碼 狀態碼英文名稱 中文描述
200 OK 請求成功,一般用於GET與POST請求
320 Found 資源臨時被移動,客戶端應繼續使用原有URI
403 Forbidden 伺服器理解客戶端的請求,但是拒絕執行此請求
404 Not Found 伺服器無法根據客戶端的請求找到資源
500 Internal Server Error 伺服器內部錯誤,無法完成請求
502 Bad Gateway 網關或者代理伺服器嘗試執行請求時,從遠程伺服器接收到了一個無效的響應

參考資料:

HTTP狀態碼(菜鳥教程)

HTTP和HTTPS的區別

HTTPS的特性

  1. 機密性

    對稱加密,非對稱加密,混合加密

  2. 完整性

    摘要演算法

  3. 身份認證,不可否認

    數字簽名(私鑰+摘要演算法)

參考資料:

漫畫:什麼是HTTPS協議

極客時間:透視HTTP協議

資料庫

索引

事務

演算法

  1. leetcode: 數據流中的第K大值

    Golang實現

  2. leetcode: 爬樓梯

    Golang實現

  3. 字元串轉數字(比如說string類型的123,轉化後應該為int類型的123)

總結

一面大概經歷了1.30小時,面試官基本是按照我簡歷中項目所涉及的技能點來問我的,所有的知識點都問的很淺,真的是很基礎的東西,三道演算法題前兩道都是說思路,最後一道給我分享了一個騰訊文檔讓我手敲程式碼,總體難度屬於簡單。

Tags: