正向代理和反向代理的區(qū)別?
正向代理和反向代理的本質(zhì)都是代為收發(fā)請(qǐng)求和響應(yīng)。
正向代理是一個(gè)位于客戶(hù)端和目標(biāo)服務(wù)器之間的代理服務(wù)器。為了從原始服務(wù)器取得內(nèi)容,客戶(hù)端向代理服務(wù)器發(fā)送一個(gè)請(qǐng)求,并且指定目標(biāo)服務(wù)器,之后代理向目標(biāo)服務(wù)器轉(zhuǎn)交并且將獲得的內(nèi)容返回給客戶(hù)端。
正向代理的情況下客戶(hù)端必須要進(jìn)行一些特別的設(shè)置才能使用。
反向代理正好相反。對(duì)于客戶(hù)端來(lái)說(shuō),反向代理就好像目標(biāo)服務(wù)器,并且客戶(hù)端不需要進(jìn)行任何設(shè)置。
客戶(hù)端向反向代理發(fā)送請(qǐng)求,接著反向代理判斷請(qǐng)求走向何處,并將請(qǐng)求轉(zhuǎn)交給客戶(hù)端,使得這些內(nèi)容就好似他自己一樣,因此客戶(hù)端并不會(huì)感知到反向代理后面的服務(wù),也不需要客戶(hù)端做任何設(shè)置,只需要把反向代理服務(wù)器當(dāng)成真正的服務(wù)器就好了。
正向代理隱藏了客戶(hù)端。(訪問(wèn)谷歌的梯子)
反向代理隱藏了服務(wù)器。(負(fù)載均衡,訪問(wèn)內(nèi)網(wǎng)服務(wù)器)
參考資料:
反向代理為何叫反向代理? <https://www.zhihu.com/question/24723688>
進(jìn)程,線程,協(xié)程?
進(jìn)程
進(jìn)程指一個(gè)正在執(zhí)行的程序,是系統(tǒng)資源分配的最小單位,一個(gè)進(jìn)程一般由以下幾部分組成:
* 程序代碼(稱(chēng)為文本段或者代碼段)
* 當(dāng)前的活動(dòng)(包括程序計(jì)數(shù)器,寄存器的內(nèi)容)
* 數(shù)據(jù)段(包括全局變量)
* 棧(包括函數(shù)參數(shù),返回地址和局部變量等臨時(shí)參數(shù))
* 堆(進(jìn)程運(yùn)行期間動(dòng)態(tài)分配的內(nèi)存)
進(jìn)程的特點(diǎn):
* 動(dòng)態(tài)性:進(jìn)程由創(chuàng)建而產(chǎn)生,由調(diào)度而執(zhí)行,因得不到資源而暫停執(zhí)行,由撤銷(xiāo)而消亡。
* 并發(fā)性:多個(gè)進(jìn)程可以在一段時(shí)間內(nèi)同時(shí)運(yùn)行。
* 獨(dú)立性:進(jìn)程是獨(dú)立運(yùn)行的基本單位。
* 異步性:進(jìn)程各自可以獨(dú)立地,以不可知地速度前進(jìn)。
線程
線程又稱(chēng)為輕量級(jí)進(jìn)程,是進(jìn)程內(nèi)的一條運(yùn)行線,是程序的實(shí)際執(zhí)行者,一個(gè)進(jìn)程至少包含一個(gè)主線程,也可以有更多的子線程。
* 使用CPU的基本單元,由線程ID,程序計(jì)數(shù)器,寄存器集合和堆棧組成。
* 同一進(jìn)程的線程共享進(jìn)程的代碼段,數(shù)據(jù)段和其他資源。
線程的特點(diǎn):
* 響應(yīng)度高:一個(gè)進(jìn)程中一個(gè)線程的阻塞不會(huì)導(dǎo)致整個(gè)進(jìn)程的阻塞。
* 資源共享:同屬一個(gè)進(jìn)程的多個(gè)線程共享這個(gè)進(jìn)程的所有資源。
* 通信簡(jiǎn)單:
* 經(jīng)濟(jì):創(chuàng)建線程所花費(fèi)的資源比較少,線程切換比進(jìn)程切換所需資源少。
* 多處理器體系結(jié)構(gòu)的利用:可以利用多個(gè)CPU執(zhí)行多個(gè)線程實(shí)現(xiàn)并發(fā)處理。
對(duì)操作系統(tǒng)來(lái)說(shuō),線程是最小的執(zhí)行單元,進(jìn)程是最小的資源管理單元。
無(wú)論進(jìn)程還是線程,都是由操作系統(tǒng)所管理的。
協(xié)程
協(xié)程,英文Coroutines,是一種比線程更加輕量級(jí)的存在。正如一個(gè)進(jìn)程可以擁有多個(gè)線程一樣,一個(gè)線程也可以擁有多個(gè)協(xié)程。
協(xié)程不是被操作系統(tǒng)內(nèi)核所管理,而完全是由程序所控制(也就是在用戶(hù)態(tài)執(zhí)行)。
參考資料:
內(nèi)存中堆和棧的區(qū)別 <https://blog.csdn.net/ironyoung/article/details/41682167>
單核CPU與多核CPU,進(jìn)程與線程,程序并發(fā)執(zhí)行? <https://cloud.tencent.com/developer/article/1456363>
漫畫(huà):什么是協(xié)程?
<https://mp.weixin.qq.com/s?src=11×tamp=1567930581&ver=1839&signature=J3g8gcr3ih99QgEHXnF0scQukmmrYoy52BnIDg3K79BSwdSRRqCDAHV1WRBySlzDU6GC2aq4kz2di88rDPVU29mltGY2kpoiZCEC5wITrdh1*pGRbtJAQUXemDSGLwBW&new=1>
goroutine背后的系統(tǒng)知識(shí) <http://www.sizeofvoid.net/goroutine-under-the-hood/>
進(jìn)程調(diào)度算法
如上圖所示,進(jìn)程是有不同的狀態(tài)的,當(dāng)有多個(gè)進(jìn)程處于就緒狀態(tài)時(shí),CPU調(diào)度程序從中選擇一個(gè)進(jìn)程將CPU分配給它。
決定選擇哪個(gè)就緒進(jìn)程去CPU運(yùn)行的部分稱(chēng)為調(diào)度程序,它所使用的算法稱(chēng)為調(diào)度算法。
先來(lái)先服務(wù)調(diào)度算法
最短作業(yè)優(yōu)先算法
* 非搶占式的:當(dāng)運(yùn)行進(jìn)程主動(dòng)放棄CPU控制權(quán)時(shí)進(jìn)行調(diào)度
* 搶占式的:
* 進(jìn)程主動(dòng)離開(kāi)CPU時(shí)調(diào)度運(yùn)行時(shí)間最短的進(jìn)程
* 當(dāng)新到達(dá)進(jìn)程的運(yùn)行時(shí)間小于正在運(yùn)行進(jìn)程的剩余運(yùn)行時(shí)間時(shí)進(jìn)行調(diào)度
高響應(yīng)比優(yōu)先算法
響應(yīng)比=(等待處理器的時(shí)間+期望服務(wù)的時(shí)間)/ 期望服務(wù)的時(shí)間
時(shí)間片輪轉(zhuǎn)算法
* 搶占式調(diào)度算法
* 時(shí)鐘每隔一段時(shí)間產(chǎn)生一個(gè)中斷,運(yùn)行狀態(tài)的進(jìn)程進(jìn)入就緒狀態(tài),用先來(lái)先服務(wù)的方法從就緒隊(duì)列中選擇一個(gè)進(jìn)程去執(zhí)行
優(yōu)先權(quán)調(diào)度算法
* 每個(gè)進(jìn)程有一個(gè)優(yōu)先權(quán),優(yōu)先權(quán)不同時(shí)調(diào)度優(yōu)先權(quán)最高的進(jìn)程,優(yōu)先權(quán)相同時(shí)按照先來(lái)先服務(wù)順序調(diào)度
* 搶占式/非搶占式
多級(jí)隊(duì)列調(diào)度
* 把就緒隊(duì)列劃分為多個(gè)獨(dú)立的隊(duì)列
* 各個(gè)隊(duì)列之間使用優(yōu)先級(jí)調(diào)度
* 同一優(yōu)先級(jí)之間使用時(shí)間片輪轉(zhuǎn)調(diào)度
多級(jí)反饋隊(duì)列調(diào)度
* 可搶占式算法
* 有多個(gè)隊(duì)列優(yōu)先級(jí)從高到低
* 進(jìn)程剛進(jìn)入系統(tǒng),進(jìn)入RQ0,執(zhí)行完一個(gè)時(shí)間片,進(jìn)入RQ1
* 最低優(yōu)先級(jí)的隊(duì)列是按照時(shí)間片輪轉(zhuǎn)法調(diào)度
虛擬內(nèi)存
虛擬存儲(chǔ)器就是指僅把作業(yè)的一部分裝入內(nèi)存就可以運(yùn)行作業(yè)的存儲(chǔ)系統(tǒng)。
它具有請(qǐng)求調(diào)入功能和置換功能,是從邏輯上對(duì)內(nèi)存容量進(jìn)行擴(kuò)充的一種存儲(chǔ)系統(tǒng)。
請(qǐng)求頁(yè)式存儲(chǔ)管理
* 一個(gè)進(jìn)程調(diào)入內(nèi)存時(shí)只調(diào)入部分頁(yè)
* 當(dāng)需要的頁(yè)面不在內(nèi)存時(shí),請(qǐng)求調(diào)入所需的頁(yè)面
* 如果內(nèi)存不足,可以把內(nèi)存中的某個(gè)頁(yè)面換出到外部輔存中
缺頁(yè)中斷
缺頁(yè):進(jìn)程執(zhí)行時(shí)要訪問(wèn)的頁(yè)面不在內(nèi)存
缺頁(yè)導(dǎo)致缺頁(yè)中斷:OS響應(yīng)缺頁(yè)中斷,把所需頁(yè)面調(diào)入內(nèi)存
缺頁(yè)置換算法
* 在缺頁(yè)發(fā)生時(shí),OS一定要在內(nèi)存中選擇一個(gè)頁(yè)面調(diào)出內(nèi)存,為要調(diào)入的頁(yè)面讓出空間
* 頁(yè)面置換算法負(fù)責(zé)選擇要淘汰的頁(yè)面
*
最優(yōu)頁(yè)面置換算法
* 在缺頁(yè)發(fā)生時(shí),在內(nèi)存中的頁(yè)面中會(huì)有一些將很快被訪問(wèn),一些卻要等待100或者1000條指令才能訪問(wèn)到
* 每個(gè)頁(yè)面都會(huì)有該頁(yè)面下次要被訪問(wèn)之前所要執(zhí)行的指令數(shù)目進(jìn)行標(biāo)記
* 置換算法淘汰標(biāo)記最大的頁(yè)面
* 這種算法最優(yōu),但是它無(wú)法實(shí)現(xiàn)。
*
先進(jìn)先出置換算法
* 在缺頁(yè)發(fā)生時(shí),置換最先進(jìn)入內(nèi)存的頁(yè)面
*
LRU置換算法(Least Recently Used 近期最少使用)
*
在置換時(shí)選擇未使用時(shí)間最長(zhǎng)的頁(yè)面
*
LRU算法的實(shí)現(xiàn):計(jì)時(shí)器
*
LRU算法的實(shí)現(xiàn):雙向鏈表
*
在訪問(wèn)頁(yè)時(shí)將此頁(yè)移動(dòng)至head
*
置換時(shí)不需要查找,替換tail的頁(yè)面
HTTP狀態(tài)碼
分類(lèi) 描述
1** 信息,服務(wù)器收到請(qǐng)求,需要請(qǐng)求者繼續(xù)執(zhí)行操作
2** 成功,操作被成功接收并處理
3** 重定向,需要進(jìn)一步的操作以完成請(qǐng)求
4** 客戶(hù)端錯(cuò)誤,請(qǐng)求包含語(yǔ)法錯(cuò)誤或者無(wú)法完成請(qǐng)求
5** 服務(wù)器錯(cuò)誤,服務(wù)器在處理請(qǐng)求的過(guò)程中發(fā)生了錯(cuò)誤
常見(jiàn)的狀態(tài)碼
狀態(tài)碼 狀態(tài)碼英文名稱(chēng) 中文描述
200 OK 請(qǐng)求成功,一般用于GET與POST請(qǐng)求
320 Found 資源臨時(shí)被移動(dòng),客戶(hù)端應(yīng)繼續(xù)使用原有URI
403 Forbidden 服務(wù)器理解客戶(hù)端的請(qǐng)求,但是拒絕執(zhí)行此請(qǐng)求
404 Not Found 服務(wù)器無(wú)法根據(jù)客戶(hù)端的請(qǐng)求找到資源
500 Internal Server Error 服務(wù)器內(nèi)部錯(cuò)誤,無(wú)法完成請(qǐng)求
502 Bad Gateway 網(wǎng)關(guān)或者代理服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從遠(yuǎn)程服務(wù)器接收到了一個(gè)無(wú)效的響應(yīng)
參考資料:
HTTP狀態(tài)碼(菜鳥(niǎo)教程) <https://www.runoob.com/http/http-status-codes.html>
HTTP和HTTPS的區(qū)別
HTTPS的特性
*
機(jī)密性
對(duì)稱(chēng)加密,非對(duì)稱(chēng)加密,混合加密
*
完整性
摘要算法
*
身份認(rèn)證,不可否認(rèn)
數(shù)字簽名(私鑰+摘要算法)
參考資料:
程序員小灰
<https://mp.weixin.qq.com/s?src=11×tamp=1568444051&ver=1851&signature=qwmEGtWCEedi2pMz0RaHwh3npopHwcWWAI1PQSpbZ0V4cCSnl7DNEMa5ojoIWL3JBiTmOXaN7IO70H0JADeBi3KRAP2TFvtUJFWz-SGtC-*7BgRjRncyUSWGCVlowGqL&new=1>
極客時(shí)間:透視HTTP協(xié)議 <https://time.geekbang.org/column/intro/100029001>
數(shù)據(jù)庫(kù)
索引
事務(wù)
算法
*
leetcode: 數(shù)據(jù)流中的第K大值
<https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/>
Golang實(shí)現(xiàn)
<https://github.com/YahuiAn/Algorithm/blob/master/LeetCode/0703.kth-largest-element-in-a-stream/kth-largest-element-in-a-stream.go>
*
斐波那契數(shù)列----有一段樓梯有n級(jí)臺(tái)階,規(guī)定每一步只能跨一級(jí)或兩級(jí),要登上第n級(jí)臺(tái)階有幾種不同的走法?
*
字符串轉(zhuǎn)數(shù)字(比如說(shuō)string類(lèi)型的123,轉(zhuǎn)化后應(yīng)該為int類(lèi)型的123)
總結(jié)
一面大概經(jīng)歷了1.30小時(shí),面試官基本是按照我簡(jiǎn)歷中項(xiàng)目所涉及的技能點(diǎn)來(lái)問(wèn)我的,所有的知識(shí)點(diǎn)都問(wèn)的很淺,真的是很基礎(chǔ)的東西,三道算法題前兩道都是說(shuō)思路,最后一道給我分享了一個(gè)騰訊文檔讓我手敲代碼,總體難度屬于簡(jiǎn)單。
熱門(mén)工具 換一換
