美團後臺開發工程師一面知識點總結
正向代理和反向代理的區別?
正向代理和反向代理的本質都是代為收發請求和響應。
正向代理是一個位於客戶端和目標伺服器之間的代理伺服器。為了從原始伺服器取得內容,客戶端向代理伺服器傳送一個請求,並且指定目標伺服器,之後代理向目標伺服器轉交併且將獲得的內容返回給客戶端。正向代理的情況下客戶端必須要進行一些特別的設定才能使用。
反向代理正好相反。對於客戶端來說,反向代理就好像目標伺服器,並且客戶端不需要進行任何設定。客戶端向反向代理髮送請求,接著反向代理判斷請求走向何處,並將請求轉交給客戶端,使得這些內容就好似他自己一樣,因此客戶端並不會感知到反向代理後面的服務,也不需要客戶端做任何設定,只需要把反向代理伺服器當成真正的伺服器就好了。
正向代理隱藏了客戶端。(訪問谷歌的梯子)
反向代理隱藏了伺服器。(負載均衡,訪問內網伺服器)
參考資料:
反向代理為何叫反向代理?
程序,執行緒,協程?
程序
程序指一個正在執行的程式,是系統資源分配的最小單位,一個程序一般由以下幾部分組成:
- 程式程式碼(稱為文字段或者程式碼段)
- 當前的活動(包括程式計數器,暫存器的內容)
- 資料段(包括全域性變數)
- 棧(包括函式引數,返回地址和區域性變數等臨時引數)
- 堆(程序執行期間動態分配的記憶體)
程序的特點:
- 動態性:程序由建立而產生,由排程而執行,因得不到資源而暫停執行,由撤銷而消亡。
- 併發性:多個程序可以在一段時間內同時執行。
- 獨立性:程序是獨立執行的基本單位。
- 非同步性:程序各自可以獨立地,以不可知地速度前進。
執行緒
執行緒又稱為輕量級程序,是程序內的一條執行線,是程式的實際執行者,一個程序至少包含一個主執行緒,也可以有更多的子執行緒。
- 使用CPU的基本單元,由執行緒ID,程式計數器,暫存器集合和堆疊組成。
- 同一程序的執行緒共享程序的程式碼段,資料段和其他資源。
執行緒的特點:
- 響應度高:一個程序中一個執行緒的阻塞不會導致整個程序的阻塞。
- 資源共享:同屬一個程序的多個執行緒共享這個程序的所有資源。
- 通訊簡單:
- 經濟:建立執行緒所花費的資源比較少,執行緒切換比程序切換所需資源少。
- 多處理器體系結構的利用:可以利用多個CPU執行多個執行緒實現併發處理。
對作業系統來說,執行緒是最小的執行單元,程序是最小的資源管理單元。
無論程序還是執行緒,都是由作業系統所管理的。
協程
協程,英文Coroutines,是一種比執行緒更加輕量級的存在。正如一個程序可以擁有多個執行緒一樣,一個執行緒也可以擁有多個協程。
協程不是被作業系統核心所管理,而完全是由程式所控制(也就是在使用者態執行)。
參考資料:
記憶體中堆和棧的區別
單核CPU與多核CPU,程序與執行緒,程式併發執行?
漫畫:什麼是協程?
goroutine背後的系統知識
程序排程演算法
如上圖所示,程序是有不同的狀態的,當有多個程序處於就緒狀態時,CPU排程程式從中選擇一個程序將CPU分配給它。
決定選擇哪個就緒程序去CPU執行的部分稱為排程程式,它所使用的演算法稱為排程演算法。
先來先服務排程演算法
最短作業優先演算法
- 非搶佔式的:當執行程序主動放棄CPU控制權時進行排程
- 搶佔式的:
- 程序主動離開CPU時排程執行時間最短的程序
- 當新到達程序的執行時間小於正在執行程序的剩餘執行時間時進行排程
高響應比優先演算法
響應比=(等待處理器的時間+期望服務的時間)/ 期望服務的時間
時間片輪轉演算法
- 搶佔式排程演算法
- 時鐘每隔一段時間產生一箇中斷,執行狀態的程序進入就緒狀態,用先來先服務的方法從就緒佇列中選擇一個程序去執行
優先權排程演算法
- 每個程序有一個優先權,優先權不同時排程優先權最高的程序,優先權相同時按照先來先服務順序排程
- 搶佔式/非搶佔式
多級佇列排程
- 把就緒佇列劃分為多個獨立的佇列
- 各個佇列之間使用優先順序排程
- 同一優先順序之間使用時間片輪轉排程
多級反饋佇列排程
- 可搶佔式演算法
- 有多個佇列優先順序從高到低
- 程序剛進入系統,進入RQ0,執行完一個時間片,進入RQ1
- 最低優先順序的佇列是按照時間片輪轉法排程
虛擬記憶體
虛擬儲存器就是指僅把作業的一部分裝入記憶體就可以執行作業的儲存系統。
它具有請求調入功能和置換功能,是從邏輯上對記憶體容量進行擴充的一種儲存系統。
請求頁式儲存管理
- 一個程序調入記憶體時只調入部分頁
- 當需要的頁面不在記憶體時,請求調入所需的頁面
- 如果記憶體不足,可以把記憶體中的某個頁面換出到外部輔存中
缺頁中斷
缺頁:程序執行時要訪問的頁面不在記憶體
缺頁導致缺頁中斷:OS響應缺頁中斷,把所需頁面調入記憶體
缺頁置換演算法
- 在缺頁發生時,OS一定要在記憶體中選擇一個頁面調出記憶體,為要調入的頁面讓出空間
- 頁面置換演算法負責選擇要淘汰的頁面
最優頁面置換演算法
- 在缺頁發生時,在記憶體中的頁面中會有一些將很快被訪問,一些卻要等待100或者1000條指令才能訪問到
- 每個頁面都會有該頁面下次要被訪問之前所要執行的指令數目進行標記
- 置換演算法淘汰標記最大的頁面
- 這種演算法最優,但是它無法實現。
先進先出置換演算法
- 在缺頁發生時,置換最先進入記憶體的頁面
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的特性
機密性
對稱加密,非對稱加密,混合加密
完整性
摘要演算法
身份認證,不可否認
數字簽名(私鑰+摘要演算法)
參考資料:
程式設計師小灰
極客時間:透視HTTP協議
資料庫
索引
事務
演算法
leetcode: 資料流中的第K大值
Golang實現
斐波那契數列----有一段樓梯有n級臺階,規定每一步只能跨一級或兩級,要登上第n級臺階有幾種不同的走法?
字串轉數字(比如說string型別的123,轉化後應該為int型別的123)
總結
一面大概經歷了1.30小時,面試官基本是按照我簡歷中專案所涉及的技能點來問我的,所有的知識點都問的很淺,真的是很基礎的東西,三道演算法題前兩道都是說思路,最後一道給我分享了一個騰訊文件讓我手敲程式碼,總體難度屬於簡單