日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python面试题(第二篇)

發(fā)布時(shí)間:2023/12/20 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python面试题(第二篇) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第二部分 網(wǎng)絡(luò)編程和并發(fā)(34題)

    • 1、簡(jiǎn)述 OSI 七層協(xié)議。
    • 2、什么是C/S和B/S架構(gòu)?
    • 3、簡(jiǎn)述 三次握手、四次揮手的流程。
    • 4、什么是arp協(xié)議?
    • 5、TCP和UDP的區(qū)別?
    • 6、什么是局域網(wǎng)和廣域網(wǎng)?
    • 7、為何基于tcp協(xié)議的通信比基于udp協(xié)議的通信更可靠?
    • 8、什么是socket?簡(jiǎn)述基于tcp協(xié)議的套接字通信流程。
    • 9、什么是粘包?socket 中造成粘包的原因是什么?哪些情況會(huì)發(fā)生粘包現(xiàn)象?
    • 10、IO多路復(fù)用的作用?
    • 11、什么是防火墻以及作用?
    • 12、select、poll、epoll 模型的區(qū)別?
    • 13、簡(jiǎn)述 進(jìn)程、線程、協(xié)程的區(qū)別 以及應(yīng)用場(chǎng)景?
    • 14、GIL鎖是什么鬼?
    • 15、Python中如何使用線程池和進(jìn)程池?
    • 16、threading.local的作用?
    • 17、進(jìn)程之間如何進(jìn)行通信?
    • 18、什么是并發(fā)和并行?
    • 19、進(jìn)程鎖和線程鎖的作用?
    • 20、解釋什么是異步非阻塞?
    • 21、路由器和交換機(jī)的區(qū)別?
    • 22、什么是域名解析?
    • 23、如何修改本地hosts文件?
    • 24、生產(chǎn)者消費(fèi)者模型應(yīng)用場(chǎng)景及優(yōu)勢(shì)?
    • 25、什么是CDN?有什么用?
    • 26、LVS是什么及作用?
    • 27、Nginx是什么及作用?
    • 28、keepalived是什么及作用?
    • 29、haproxy是什么以及作用?
    • 30、什么是負(fù)載均衡?
    • 31、什么是rpc及應(yīng)用場(chǎng)景?
    • 32、簡(jiǎn)述 asynio模塊的作用和應(yīng)用場(chǎng)景。
    • 33、簡(jiǎn)述 gevent模塊的作用和應(yīng)用場(chǎng)景。
    • 34、twisted框架的使用和應(yīng)用?

1、簡(jiǎn)述 OSI 七層協(xié)議。

  • 概念
    s
    Open System Interconnection : 開(kāi)放互聯(lián)系統(tǒng)

  • 圖示

    注:圖片來(lái)源:https://www.cnblogs.com/maybe2030/p/4781555.html#_label1,作者:Poll的筆記

  • 3.粗淺理解

    物理層:主要設(shè)備,中繼器、集線器,傳輸單位是比特(比特流),保證比特?cái)?shù)據(jù)遠(yuǎn)距離傳輸不會(huì)衰減,都能對(duì)數(shù)據(jù)進(jìn)行再生和重定時(shí)。

    數(shù)據(jù)鏈路層:主要設(shè)備,網(wǎng)卡,網(wǎng)橋,交換機(jī),傳輸單位是幀,以太網(wǎng)協(xié)議為基礎(chǔ)進(jìn)行傳輸。幀就是對(duì)字節(jié)的封裝,字節(jié)(byte)是由位(bit)組成的。

    網(wǎng)絡(luò)層:主要設(shè)備,路由器,傳輸單位是報(bào)文(包),以IP協(xié)議為基礎(chǔ)進(jìn)行傳輸,提供邏輯地址IP,選路,數(shù)據(jù)從源端到目的端的傳輸。

    傳輸層:主要設(shè)備,網(wǎng)管,傳輸單位是數(shù)據(jù)段(段),以TCP/UDP協(xié)議為主,實(shí)現(xiàn)網(wǎng)絡(luò)不同主機(jī)上用戶進(jìn)程之間的數(shù)據(jù)通信,可靠與不可靠的傳輸,傳輸層的錯(cuò)誤檢驗(yàn),流量控制等。

    會(huì)話層:傳輸單位是:數(shù)據(jù),會(huì)話層管理主機(jī)之間的會(huì)話進(jìn)程,即負(fù)責(zé)建立、管理、終止進(jìn)程之間的會(huì)話。會(huì)話層還利用在數(shù)據(jù)中插入校驗(yàn)點(diǎn)來(lái)實(shí)現(xiàn)數(shù)據(jù)的同步。如服務(wù)器驗(yàn)證用戶登錄便是會(huì)話層完成額。

    表示層:傳輸單位是:數(shù)據(jù),表示層對(duì)上層數(shù)據(jù)或信息進(jìn)行變換以保證一個(gè)主機(jī)應(yīng)用層信息可以被另一個(gè)主機(jī)的應(yīng)用程序理解。表示層的數(shù)據(jù)轉(zhuǎn)換包括數(shù)據(jù)的加密、壓縮、格式轉(zhuǎn)換等。

    應(yīng)用層:傳輸單位是:數(shù)據(jù),為操作系統(tǒng)或網(wǎng)絡(luò)應(yīng)用程序提供訪問(wèn)網(wǎng)絡(luò)服務(wù)的接口。確定進(jìn)程之間的性質(zhì)以滿足用戶需求以及提供網(wǎng)絡(luò)與用戶的應(yīng)用。

    2、什么是C/S和B/S架構(gòu)?

    一、什么是C/S架構(gòu)
    C/S架構(gòu)是第一種比較早的軟件架構(gòu),主要用于局域網(wǎng)內(nèi)。也叫 客戶機(jī)/服務(wù)器模式。

    它可以分為客戶機(jī)和服務(wù)器兩層:

    第一層: 在客戶機(jī)系統(tǒng)上結(jié)合了界面顯示與業(yè)務(wù)邏輯;

    第二層: 通過(guò)網(wǎng)絡(luò)結(jié)合了數(shù)據(jù)庫(kù)服務(wù)器。

    簡(jiǎn)單的說(shuō)就是第一層是用戶表示層,第二層是數(shù)據(jù)庫(kù)層。

    這里需要補(bǔ)充的是,客戶端不僅僅是一些簡(jiǎn)單的操作,它也是會(huì)處理一些運(yùn)算,業(yè)務(wù)邏輯的處理等。也就是說(shuō),客戶端也做著一些本該由服務(wù)器來(lái)做的一些事情,如圖所示:


    C/S架構(gòu)軟件有一個(gè)特點(diǎn),就是如果用戶要使用的話,需要下載一個(gè)客戶端,安裝后就可以使用。比如QQ,OFFICE軟件等。

    1、C/S架構(gòu)的優(yōu)點(diǎn):

    1 C/S架構(gòu)的界面和操作可以很豐富。(客戶端操作界面可以隨意排列,滿足客戶的需要)

    2 安全性能可以很容易保證。(因?yàn)橹挥袃蓪拥膫鬏?#xff0c;而不是中間有很多層。

    3 由于只有一層交互,因此響應(yīng)速度較快。(直接相連,中間沒(méi)有什么阻隔或岔路,比如QQ,每天那么多人在線,也不覺(jué)得慢)

    2、C/S架構(gòu)的缺點(diǎn):

    可以將QQ作為類比:

    1 適用面窄,通常用于局域網(wǎng)中。

    2 用戶群固定。由于程序需要安裝才可使用,因此不適合面向一些不可知的用戶。

    3 維護(hù)成本高,發(fā)生一次升級(jí),則所有客戶端的程序都需要改變。

    二、什么是B/S架構(gòu)
    B/S架構(gòu)的全稱為Browser/Server,即瀏覽器/服務(wù)器結(jié)構(gòu)。

    Browser指的是Web瀏覽器,極少數(shù)事務(wù)邏輯在前端實(shí)現(xiàn),但主要事務(wù)邏輯在服務(wù)器端實(shí)現(xiàn)。

    B/S架構(gòu)的系統(tǒng)無(wú)須特別安裝,只有Web瀏覽器即可。

    其實(shí)就是我們前端現(xiàn)在做的一些事情,大部分的邏輯交給后臺(tái)來(lái)實(shí)現(xiàn),我們前端大部分是做一些數(shù)據(jù)渲染,請(qǐng)求等比較少的邏輯。

    B/S架構(gòu)的分層:

    與C/S架構(gòu)只有兩層不同的是,B/S架構(gòu)有三層,分別為:

    第一層表現(xiàn)層:主要完成用戶和后臺(tái)的交互及最終查詢結(jié)果的輸出功能。

    第二層邏輯層:主要是利用服務(wù)器完成客戶端的應(yīng)用邏輯功能。

    第三層數(shù)據(jù)層:主要是接受客戶端請(qǐng)求后獨(dú)立進(jìn)行各種運(yùn)算。

    如圖所示:

    B/S架構(gòu)的優(yōu)點(diǎn):

    1、客戶端無(wú)需安裝,有Web瀏覽器即可。
    2、BS架構(gòu)可以直接放在廣域網(wǎng)上,通過(guò)一定的權(quán)限控制實(shí)現(xiàn)多客戶訪問(wèn)的目的,交互性較強(qiáng)。
    3、BS架構(gòu)無(wú)需升級(jí)多個(gè)客戶端,升級(jí)服務(wù)器即可。可以隨時(shí)更新版本,而無(wú)需用戶重新下載啊什么的。

    B/S架構(gòu)的缺點(diǎn):

    1、在跨瀏覽器上,BS架構(gòu)不盡如人意。
    2、表現(xiàn)要達(dá)到CS程序的程度需要花費(fèi)不少精力。
    3、在速度和安全性上需要花費(fèi)巨大的設(shè)計(jì)成本,這是BS架構(gòu)的最大問(wèn)題。
    4、客戶端服務(wù)器端的交互是請(qǐng)求-響應(yīng)模式,通常需要刷新頁(yè)面,這并不是客戶樂(lè)意看到的。(在Ajax風(fēng)行后此問(wèn)題得到了一定程度的緩解)

    三、B/S架構(gòu)的幾種形式
    第一種:客戶端-服務(wù)器-數(shù)據(jù)庫(kù)

    這個(gè)應(yīng)該是我們平時(shí)比較常用的一種模式:

    1、客戶端向服務(wù)器發(fā)起Http請(qǐng)求

    2、服務(wù)器中的web服務(wù)層能夠處理Http請(qǐng)求

    3、服務(wù)器中的應(yīng)用層部分調(diào)用業(yè)務(wù)邏輯,調(diào)用業(yè)務(wù)邏輯上的方法

    4、如果有必要,服務(wù)器會(huì)和數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交換. 然后將模版+數(shù)據(jù)渲染成最終的Html, 返送給客戶端

    第二種:客戶端-web服務(wù)器-應(yīng)用服務(wù)器-數(shù)據(jù)庫(kù)

    類似于第一種方法,只是將web服務(wù)和應(yīng)用服務(wù)解耦

    1 客戶端向web服務(wù)器發(fā)起Http請(qǐng)求

    2 web服務(wù)能夠處理Http請(qǐng)求,并且調(diào)用應(yīng)用服務(wù)器暴露在外的RESTFUL接口

    3 應(yīng)用服務(wù)器的RESTFUL接口被調(diào)用,會(huì)執(zhí)行對(duì)應(yīng)的暴露方法.如果有必要和數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交互,應(yīng)用服務(wù)器會(huì)和數(shù)據(jù)庫(kù)進(jìn)行交互后,將json數(shù)據(jù)返回給web服務(wù)器

    4 web服務(wù)器將模版+數(shù)據(jù)組合渲染成html返回給客戶端

    第三種方法:客戶端-負(fù)載均衡器(Nginx)-中間服務(wù)器(Node)-應(yīng)用服務(wù)器-數(shù)據(jù)庫(kù)

    這種模式一般用在有大量的用戶,高并發(fā)的應(yīng)用中。

    1、整正暴露在外的不是真正web服務(wù)器的地址,而是負(fù)載均衡器器的地址

    2、客戶向負(fù)載均衡器發(fā)起Http請(qǐng)求

    3、負(fù)載均衡器能夠?qū)⒖蛻舳说腍ttp請(qǐng)求均勻的轉(zhuǎn)發(fā)給Node服務(wù)器集群

    4、Node服務(wù)器接收到Http請(qǐng)求之后,能夠?qū)ζ溥M(jìn)行解析,并且能夠調(diào)用應(yīng)用服務(wù)器暴露在外的RESTFUL接口

    5、應(yīng)用服務(wù)器的RESTFUL接口被調(diào)用,會(huì)執(zhí)行對(duì)應(yīng)的暴露方法.如果有必要和數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交互,應(yīng)用服務(wù)器會(huì)和數(shù)據(jù)庫(kù)進(jìn)行交互后,將json數(shù)據(jù)返回給Node

    6、Node層將模版+數(shù)據(jù)組合渲染成html返回反向代理服務(wù)器

    7、反向代理服務(wù)器將對(duì)應(yīng)html返回給客戶端

    Nginx的優(yōu)點(diǎn)有:

    1、它能夠承受、高并發(fā)的大量的請(qǐng)求,然后將這些請(qǐng)求均勻的轉(zhuǎn)發(fā)給內(nèi)部的服務(wù)器,分?jǐn)倝毫?

    2、反向代理能夠解決跨域引起的問(wèn)題,因?yàn)镹ginx,Node,應(yīng)用服務(wù)器,數(shù)據(jù)庫(kù)都處于內(nèi)網(wǎng)段中。

    3、Nginx非常擅長(zhǎng)處理靜態(tài)資源(img,css,js,video),所以也經(jīng)常作為靜態(tài)資源服務(wù)器,也就是我們平時(shí)所說(shuō)的CDN

    比如:前一個(gè)用戶訪問(wèn)index.html, 經(jīng)過(guò)Nginx-Node-應(yīng)用服務(wù)器-數(shù)據(jù)庫(kù)鏈路之后,Nginx會(huì)把index.html返回給用戶,并且會(huì)把index.html緩存在Nginx上,

    下一個(gè)用戶再想請(qǐng)求index.html的時(shí)候,請(qǐng)求Nginx服務(wù)器,Nginx發(fā)現(xiàn)有index.html的緩存,于是就不用去請(qǐng)求Node層了,會(huì)直接將緩存的頁(yè)面(如果沒(méi)過(guò)期的話)返回給用戶。

    四、發(fā)展前景

    1、 C/S和B/S各有優(yōu)勢(shì),C/S在圖形的表現(xiàn)能力上以及運(yùn)行的速度上肯定是強(qiáng)于B/S模式的,不過(guò)缺點(diǎn)就是他需要運(yùn)行專門的客戶端,而且更重要的是它不能跨平臺(tái),用c++在windows下寫(xiě)的程序肯定是不能在linux下跑的。

    2、B/S模式就,它不需要專門的客戶端,只要瀏覽器,而瀏覽器是隨操作系統(tǒng)就有的,方便就是他的優(yōu)勢(shì)了。
    而且,B/S是基于網(wǎng)頁(yè)語(yǔ)言的、與操作系統(tǒng)無(wú)關(guān),所以跨平臺(tái)也是它的優(yōu)勢(shì),而且以后隨著網(wǎng)頁(yè)語(yǔ)言以及瀏覽器的進(jìn)步,
    B/S在表現(xiàn)能力上的處理以及運(yùn)行的速度上會(huì)越來(lái)越快,它的缺點(diǎn)將會(huì)越來(lái)越少。尤其是HTML5的普及,在圖形的渲染方面以及音頻、文件的處理上已經(jīng)非常強(qiáng)大了。
    不過(guò),C/S架構(gòu)也有著不可替代的作用。
    ————————————————
    版權(quán)聲明:本文為CSDN博主「雪飛_海」的原創(chuàng)文章
    原文鏈接:https://blog.csdn.net/sea_snow/article/details/81187804

    3、簡(jiǎn)述 三次握手、四次揮手的流程。

    TCP三次握手與四次揮手過(guò)程
    首先,客戶端與服務(wù)器均處于未連接狀態(tài),并且是客戶端主動(dòng)向服務(wù)器請(qǐng)求建立連接:

    客戶端將報(bào)文段中的SYN=1,并選擇一個(gè)seq=x,(即該請(qǐng)求報(bào)文的序號(hào)為x) 將這個(gè)報(bào)文發(fā)送到服務(wù)器。此時(shí),客戶端進(jìn)入同步已發(fā)送狀態(tài)(SYN-SEND).SYN報(bào)文段不能攜帶數(shù)據(jù),但是要消耗掉一個(gè)序號(hào)。
    服務(wù)器收到請(qǐng)求報(bào)文后,若同意建立連接,則回復(fù)報(bào)文中,SYN=1,ACK=1,并選擇一個(gè)seq = y,且報(bào)文中確認(rèn)號(hào)為x+1,序號(hào)為y .此時(shí)服務(wù)器進(jìn)入同步已接收狀態(tài)(SYN-RCVD)

    客戶端收到服務(wù)器的同步確認(rèn)后,對(duì)服務(wù)器發(fā)送確認(rèn)的確認(rèn)。將ACK=1,確認(rèn)號(hào)為y+1,而報(bào)文首部的序號(hào)為x+1,將該報(bào)文發(fā)出后,客戶端進(jìn)入已連接狀態(tài)(ESTABLISHED)。

    服務(wù)器收到客戶端的確認(rèn)后,也進(jìn)入已連接狀態(tài)。
    以上即三次握手

    為何使用三次握手機(jī)制:
    假設(shè)如下異常情況:

    客戶端向服務(wù)器發(fā)送了第一條請(qǐng)求報(bào)文,但是該報(bào)文并未在網(wǎng)絡(luò)中被丟棄,而是長(zhǎng)時(shí)間阻滯在某處,而客戶端收不到服務(wù)器確認(rèn),以為該報(bào)文丟失,于是重新發(fā)送該報(bào)文,這次的報(bào)文成功到達(dá)服務(wù)器,如果不使用三次握手,則服務(wù)器只需對(duì)該報(bào)文發(fā)出確認(rèn),就建立了一個(gè)連接。而在這個(gè)連接建立,并釋放后,第一次發(fā)送的,阻滯在網(wǎng)絡(luò)中的報(bào)文到達(dá)了服務(wù)器,服務(wù)器以為是客戶端又重新發(fā)送了一個(gè)連接請(qǐng)求(實(shí)際上在客戶端那里,該連接早已失效),就又向客戶端發(fā)送一個(gè)確認(rèn),但客戶端認(rèn)為他沒(méi)有發(fā)送該請(qǐng)求報(bào)文,因此不理睬服務(wù)器發(fā)送的確認(rèn),而服務(wù)器以為又建立了一個(gè)新的連接,于是一直等待A發(fā)來(lái)數(shù)據(jù),造成了服務(wù)器資源的浪費(fèi),并且會(huì)產(chǎn)生安全隱患。因此,若使用三次握手機(jī)制,服務(wù)器發(fā)送了該確認(rèn)后,收不到客戶端的確認(rèn),也就知道并沒(méi)有建立連接,因此不會(huì)將資源浪費(fèi)在這種沒(méi)有意義的等待上。

    TCP連接的釋放(四次揮手)

    連接的釋放較連接的建立復(fù)雜。

    現(xiàn)假設(shè)客戶端與服務(wù)器均處于連接建立狀態(tài),客戶端主動(dòng)斷開(kāi)連接:

    1.客戶端向服務(wù)器發(fā)送FIN報(bào)文:FIN=1,序號(hào)seq=上一個(gè)最后傳輸?shù)淖止?jié)序號(hào)+1=u,發(fā)送后,客戶端進(jìn)入FIN-WAIT-1狀態(tài)。

    2.服務(wù)器接收到該報(bào)文后,發(fā)送一個(gè)確認(rèn)報(bào)文:令A(yù)CK=1,確認(rèn)序號(hào)ack = u+1,自己的報(bào)文序號(hào)seq=v,發(fā)送后,服務(wù)器進(jìn)入CLOSE-WAIT狀態(tài)。

    3.此時(shí)TCP連接進(jìn)入連接半關(guān)閉狀態(tài),服務(wù)器可能還會(huì)向客戶端發(fā)送一些數(shù)據(jù)。

    4.客戶端收到來(lái)自服務(wù)器的確認(rèn)之后,進(jìn)入FIN-WAIT-2狀態(tài)。等待服務(wù)器發(fā)送連接釋放報(bào)文。

    5.如果服務(wù)器已經(jīng)沒(méi)有要發(fā)送的數(shù)據(jù),則釋放TCP連接,向客戶端發(fā)送報(bào)文:令FIN=1,ACK=1,確認(rèn)號(hào)ack =u+1,自己的序號(hào)seq = w(w可能等于v也可能大于v),服務(wù)器進(jìn)入LAST-ACK狀態(tài)。

    6.客戶端收到服務(wù)器的連接釋放報(bào)文后,對(duì)該報(bào)文發(fā)出確認(rèn),令A(yù)CK=1,確認(rèn)號(hào)ack=w+1,自己的序號(hào)seq=u+1,發(fā)送此報(bào)文后,等待2個(gè)msl時(shí)間后,進(jìn)入CLOSED狀態(tài)。

    7.服務(wù)器收到客戶端的確認(rèn)后,也進(jìn)入CLOSED狀態(tài)并撤銷傳輸控制塊。

    客戶端狀態(tài)變化:未連接----->SYN-SEND----->ESTABLISHED----->FIN-WAIT-1----->FIN-WAIT-2----->TIME-WAIT----->CLOSED

    服務(wù)器狀態(tài)變化:未連接----->SYN-RCVD----->ESTABLISHED----->CLOSE-WAIT----->LAST-ACK----->CLOSED

    通俗描述3次握手就是

    A對(duì)B說(shuō):我的序號(hào)是x,我要向你請(qǐng)求連接;(第一次握手,發(fā)送SYN包,然后進(jìn)入SYN-SEND狀態(tài))

    B聽(tīng)到之后對(duì)A說(shuō):我的序號(hào)是y,期待你下一句序號(hào)是x+1的話(意思就是收到了序號(hào)為x的話,即ack=x+1),同意建立連接。(第二次握手,發(fā)送ACK-SYN包,然后進(jìn)入SYN-RCVD狀態(tài))

    A聽(tīng)到B說(shuō)同意建立連接之后,對(duì)A說(shuō):與確認(rèn)你同意與我連接(ack=y+1,ACK=1,seq=x+1)。(第三次握手,A已進(jìn)入ESTABLISHED狀態(tài))

    B聽(tīng)到A的確認(rèn)之后,也進(jìn)入ESTABLISHED狀態(tài)。

    描述四次揮手就是:

    1.A與B交談結(jié)束之后,A要結(jié)束此次會(huì)話,對(duì)B說(shuō):我要關(guān)閉連接了(seq=u,FIN=1)。(第一次揮手,A進(jìn)入FIN-WAIT-1)

    2.B收到A的消息后說(shuō):確認(rèn),你要關(guān)閉連接了。(seq=v,ack=u+1,ACK=1)(第二次揮手,B進(jìn)入CLOSE-WAIT)

    3.A收到B的確認(rèn)后,等了一段時(shí)間,因?yàn)锽可能還有話要對(duì)他說(shuō)。(此時(shí)A進(jìn)入FIN-WAIT-2)

    4.B說(shuō)完了他要說(shuō)的話(只是可能還有話說(shuō))之后,對(duì)A說(shuō),我要關(guān)閉連接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次揮手)
    5.A收到B要結(jié)束連接的消息后說(shuō):已收到你要關(guān)閉連接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次揮手,然后A進(jìn)入CLOSED)
    6.B收到A的確認(rèn)后,也進(jìn)入CLOSED。

    最簡(jiǎn)單的理解
    一:建立TCP連接:三次握手協(xié)議

    客戶端:我要對(duì)你講話,你能聽(tīng)到嗎;
    服務(wù)端:我能聽(tīng)到;而且我也要對(duì)你講話,你能聽(tīng)到嗎;
    客戶端:我也能聽(tīng)到。
    …….
    互相開(kāi)始通話
    ………

    二:關(guān)閉TCP連接:四次握手協(xié)議

    客戶端:我說(shuō)完了,我要閉嘴了;
    服務(wù)端:我收到請(qǐng)求,我要閉耳朵了;
    (客戶端收到這個(gè)確認(rèn),于是安心地閉嘴了。)
    …….
    服務(wù)端還沒(méi)傾訴完自己的故事,于是繼續(xù)嘮嘮叨叨向客戶端說(shuō)了半天,直到說(shuō)完為止
    …….
    服務(wù)端:我說(shuō)完了,我也要閉嘴了;
    客戶端:我收到請(qǐng)求,我要閉耳朵了;(事實(shí)上,客戶端為了保證這個(gè)確認(rèn)包成功送達(dá),等待了兩個(gè)最大報(bào)文生命周期后,才閉上耳朵。)
    (服務(wù)端收到這個(gè)確認(rèn),于是安心地閉嘴了。)
    ————————————————
    版權(quán)聲明:本文為CSDN博主「lizmit」的原創(chuàng)文章
    原文鏈接:https://blog.csdn.net/qq_35216516/article/details/80554575

    4、什么是arp協(xié)議?

    鏈接地址點(diǎn)擊進(jìn)入

    5、TCP和UDP的區(qū)別?

    鏈接地址點(diǎn)擊進(jìn)入

    6、什么是局域網(wǎng)和廣域網(wǎng)?

    正如題目所問(wèn),平時(shí)我們經(jīng)常會(huì)聽(tīng)到這些熟悉的名詞,但是當(dāng)別人問(wèn)我們他們之間到底有什么區(qū)別時(shí),卻發(fā)現(xiàn)自己也解釋不清楚,不知道怎么去回答。下面本文將去探索他們是什么,相互之間有什么區(qū)別。

    局域網(wǎng):(Local Area Network,LAN), 局域網(wǎng)是一個(gè)局部范圍的計(jì)算組,比如家庭網(wǎng)絡(luò)就是一個(gè)小型的局域網(wǎng),里面包含電腦、手機(jī)和平板等,他們共同連接到你家的路由器上。又比如學(xué)校的機(jī)房就是一個(gè)局域網(wǎng),里面有幾百幾千臺(tái)電腦,當(dāng)機(jī)房無(wú)法上外網(wǎng)時(shí),但是電腦之間仍可以通信,你們可以通過(guò)這個(gè)局域網(wǎng)來(lái)打CS 、玩紅警。理論上,局域網(wǎng)是封閉的,并不可以上外網(wǎng),可以只有兩臺(tái)電腦,也可以有上萬(wàn)臺(tái)。

    廣域網(wǎng):(WAN,Wide Area Network),廣域網(wǎng)的范圍就比較大了,可以把你家和別人家、各個(gè)省、各個(gè)國(guó)家連接起來(lái)相互通信。廣域網(wǎng)和局域網(wǎng)都是從范圍的角度來(lái)劃分的,廣域網(wǎng)也可以看成是很多個(gè)局域網(wǎng)通過(guò)路由器等相互連接起來(lái)。

    以太網(wǎng):(Ethernet),以太網(wǎng)可以看成是一種實(shí)現(xiàn)局域網(wǎng)通信的技術(shù)標(biāo)準(zhǔn),是目前最廣泛的局域網(wǎng)技術(shù)。以太網(wǎng)的運(yùn)行速率有10Mbps,100Mbps,1Gbps,10Gbps的,它的傳輸介質(zhì)有的是雙絞線,有的是光纖。 簡(jiǎn)單的說(shuō),以太網(wǎng)就是在局域網(wǎng)內(nèi),把附近的設(shè)備連接起來(lái),可以進(jìn)行通訊。

    互聯(lián)網(wǎng):(Internet),互聯(lián)網(wǎng)可以看成是局域網(wǎng)、廣域網(wǎng)等組成的一個(gè)最大的網(wǎng)絡(luò),它可以把世界上各個(gè)地方的網(wǎng)路都連接起來(lái),個(gè)人、政府、學(xué)校、企業(yè),只要你能想到的,都包含在內(nèi)。互聯(lián)網(wǎng)是一種寬泛的概念,是一個(gè)極其龐大的網(wǎng)絡(luò)。
    ————————————————
    版權(quán)聲明:本文為CSDN博主「夜風(fēng)~」的原創(chuàng)文章
    原文鏈接:https://blog.csdn.net/u014470361/article/details/79231787

    7、為何基于tcp協(xié)議的通信比基于udp協(xié)議的通信更可靠?

    tcp協(xié)議一定是先建好雙向鏈接,發(fā)一個(gè)數(shù)據(jù)包要得到確認(rèn)才算發(fā)送完成,沒(méi)有收到就一直給你重發(fā);udp協(xié)議沒(méi)有鏈接存在,udp直接丟數(shù)據(jù),不管你有沒(méi)有收到。

    TCP的可靠保證,是它的三次握手雙向機(jī)制,這一機(jī)制保證校驗(yàn)了數(shù)據(jù),保證了他的可靠性。

    而UDP就沒(méi)有了,udp信息發(fā)出后,不驗(yàn)證是否到達(dá)對(duì)方,所以不可靠。

    不過(guò)UDP的速度是TCP比不了的,而且UDP的反應(yīng)速度更快,QQ就是用UDP協(xié)議傳輸?shù)?#xff0c;HTTP是用TCP協(xié)議傳輸?shù)?#xff0c;不用我說(shuō)什么,自己體驗(yàn)一下就能發(fā)現(xiàn)區(qū)別了。

    再有就是UDP和TCP的目的端口不一樣(這句話好象是多余的),而且兩個(gè)協(xié)議不在同一層,TCP在三層,UDP不是在四層就是七層。
    注:搬運(yùn)與 https://www.cnblogs.com/Rivend/p/12038675.html

    8、什么是socket?簡(jiǎn)述基于tcp協(xié)議的套接字通信流程。

    什么是 socket?簡(jiǎn)述基于 tcp 協(xié)議的套接字通信流程?
    Socket的英文原義是"孔"或"插座"。通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄,

    可以用來(lái)實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。

    在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開(kāi)一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)。

    基于tcp 協(xié)議的套接字通信流程:

    1). 服務(wù)器先用 socket 函數(shù)來(lái)建立一個(gè)套接字,用這個(gè)套接字完成通信的監(jiān)聽(tīng)。
    2). 用 bind 函數(shù)來(lái)綁定一個(gè)端口號(hào)和 IP 地址。因?yàn)楸镜赜?jì)算機(jī)可能有多個(gè)網(wǎng)址和 IP,每一個(gè) IP 和端口有多個(gè)端口。需要指定一個(gè) IP 和端口進(jìn)行監(jiān)聽(tīng)。
    3). 服務(wù)器調(diào)用 listen 函數(shù),使服務(wù)器的這個(gè)端口和 IP 處于監(jiān)聽(tīng)狀態(tài),等待客戶機(jī)的連接。
    4). 客戶機(jī)用 socket 函數(shù)建立一個(gè)套接字,設(shè)定遠(yuǎn)程 IP 和端口。
    5). 客戶機(jī)調(diào)用 connect 函數(shù)連接遠(yuǎn)程計(jì)算機(jī)指定的端口。
    6). 服務(wù)器用 accept 函數(shù)來(lái)接受遠(yuǎn)程計(jì)算機(jī)的連接,建立起與客戶機(jī)之間的通信。
    7). 建立連接以后,客戶機(jī)用 write 函數(shù)向 socket 中寫(xiě)入數(shù)據(jù)。也可以用 read 函數(shù)讀取服務(wù)器發(fā)送來(lái)的數(shù)據(jù)。
    8). 服務(wù)器用 read 函數(shù)讀取客戶機(jī)發(fā)送來(lái)的數(shù)據(jù),也可以用 write 函數(shù)來(lái)發(fā)送數(shù)據(jù)。
    9). 完成通信以后,用 close 函數(shù)關(guān)閉 socket 連接。

    注:搬運(yùn)與 https://www.cnblogs.com/Rivend/p/12047299.html

    9、什么是粘包?socket 中造成粘包的原因是什么?哪些情況會(huì)發(fā)生粘包現(xiàn)象?

    只有TCP有粘包現(xiàn)象,UDP永遠(yuǎn)不會(huì)粘包!

    粘包:在接收數(shù)據(jù)時(shí),一次性多接收了其它請(qǐng)求發(fā)送來(lái)的數(shù)據(jù)(即多包接收)。如,對(duì)方第一次發(fā)送hello,第二次發(fā)送world,
       在接收時(shí),應(yīng)該收兩次,一次是hello,一次是world,但事實(shí)上是一次收到helloworld,一次收到空,這種現(xiàn)象叫粘包。

    原因
    粘包問(wèn)題主要還是因?yàn)榻邮辗讲恢老⒅g的界限,不知道一次性提取多少字節(jié)的數(shù)據(jù)所造成的。

    什么情況會(huì)發(fā)生:

    1、發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去,造成粘包(發(fā)送數(shù)據(jù)時(shí)間間隔很短,數(shù)據(jù)很小,會(huì)合到一起,產(chǎn)生粘包)

    2、接收方不及時(shí)接收緩沖區(qū)的包,造成多個(gè)包接收(客戶端發(fā)送了一段數(shù)據(jù),服務(wù)端只收了一小部分,服務(wù)端下次再收的時(shí)候還是從緩沖區(qū)拿上次遺留的數(shù)據(jù),產(chǎn)生粘包)

    解決方案:

    一個(gè)思路是發(fā)送之前,先打個(gè)招呼,告訴對(duì)方自己要發(fā)送的字節(jié)長(zhǎng)度,這樣對(duì)方可以根據(jù)長(zhǎng)度判斷什么時(shí)候終止接受。
    注:搬運(yùn)與 https://www.cnblogs.com/Rivend/p/12047330.html
    參考鏈接:點(diǎn)擊進(jìn)入https://blog.csdn.net/Nice07/article/details/83515660

    10、IO多路復(fù)用的作用?

    參考鏈接:https://blog.csdn.net/SkydivingWang/article/details/74917897

    11、什么是防火墻以及作用?

    一、防火墻的基本概念

    古時(shí)候,人們常在寓所之間砌起一道磚墻,一旦火災(zāi)發(fā)生,它能夠防止火勢(shì)蔓延到別的寓所。

    現(xiàn)在,如果一個(gè)網(wǎng)絡(luò)接到了Internet上面,它的用戶就可以訪問(wèn)外部世界并與之通信。但同時(shí),外部世界也同樣可以訪問(wèn)該網(wǎng)絡(luò)并與之交互。

    為安全起見(jiàn),可以在該網(wǎng)絡(luò)和Internet之間插入一個(gè)中介系統(tǒng),豎起一道安全屏障。

    這道屏障的作用是阻斷來(lái)自外部通過(guò)網(wǎng)絡(luò)對(duì)本網(wǎng)絡(luò)的威脅和入侵,提供扼守本網(wǎng)絡(luò)的安全和審計(jì)的唯一關(guān)卡,它的作用與古時(shí)候的防火磚墻有類似之處,因此我們把這個(gè)屏障就叫做“防火墻”。

    在電腦中,防火墻是一種裝置,它是由軟件或硬件設(shè)備組合而成,通常處于企業(yè)的內(nèi)部局域網(wǎng)與Internet之間,限制Internet用戶對(duì)內(nèi)部網(wǎng)絡(luò)的訪問(wèn)以及管理內(nèi)部用戶訪問(wèn)外界的權(quán)限。

    換言之,防火墻是一個(gè)位于被認(rèn)為是安全和可信的內(nèi)部網(wǎng)絡(luò)與一個(gè)被認(rèn)為是不那么安全和可信的外部網(wǎng)絡(luò)(通常是Internet)之間的一個(gè)封鎖工具。

    防火墻是一種被動(dòng)的技術(shù),因?yàn)樗僭O(shè)了網(wǎng)絡(luò)邊界的存在,它對(duì)內(nèi)部的非法訪問(wèn)難以有效地控制。因此防火墻只適合于相對(duì)獨(dú)立的網(wǎng)絡(luò),例如企業(yè)內(nèi)部的局域網(wǎng)絡(luò)等。

    1.過(guò)濾不安全服務(wù)

    基于這個(gè)準(zhǔn)則,防火墻應(yīng)封鎖所有信息流,然后對(duì)希望提供的安全服務(wù)逐項(xiàng)開(kāi)放,對(duì)不安全的服務(wù)或可能有安全隱患的服務(wù)一律扼殺在萌芽之中。

    這是一種非常有效實(shí)用的方法,可以造成一種十分安全的環(huán)境,因?yàn)橹挥薪?jīng)過(guò)仔細(xì)挑選的服務(wù)才能允許用戶使用。

    2.過(guò)濾非法用戶和訪問(wèn)特殊站點(diǎn)

    基于這個(gè)準(zhǔn)則,防火墻應(yīng)先允許所有的用戶和站點(diǎn)對(duì)內(nèi)部網(wǎng)絡(luò)的訪問(wèn),然后網(wǎng)絡(luò)管理員按照IP地址對(duì)未授權(quán)的用戶或不信任的站點(diǎn)進(jìn)行逐項(xiàng)屏蔽。

    這種方法構(gòu)成了一種更為靈活的應(yīng)用環(huán)境,網(wǎng)絡(luò)管理員可以針對(duì)不同的服務(wù)面向不同的用戶開(kāi)放,也就是能自由地設(shè)置各個(gè)用戶的不同訪問(wèn)權(quán)限。
    參考鏈接:https://www.cnblogs.com/Rivend/p/12052499.html

    12、select、poll、epoll 模型的區(qū)別?

    POLL模型

    Poll功能:監(jiān)測(cè)文件描述符上,是否有某些事件發(fā)生
    1.函數(shù):
    #include<poll.h>
    int poll(struct pollfd fds,unsigned int nfds,int timeout);
    參數(shù):
    (1)fds:是一個(gè)poll函數(shù)監(jiān)聽(tīng)的struct pollfd結(jié)構(gòu)類型的數(shù)組,每一個(gè)元素中,包含了三部分內(nèi)容:文件描述符,監(jiān)聽(tīng)的事件集合,返回的事件集合。
    pollfd結(jié)構(gòu)體定義如下:
    struct pollfd
    {
    int fd; //文件描述符(scoket描述符)
    short events; //等待的事件
    short revents; //實(shí)際發(fā)生了的事件
    };
    event和revent的取值是一樣的,常用的事件:
    POLLIN 有數(shù)據(jù)可讀
    POLLOUT 寫(xiě)數(shù)據(jù)不會(huì)導(dǎo)致堵塞
    POLLMSGIGPOLL 消息可用
    POLLERR 指定的文件描述發(fā)生錯(cuò)誤
    nfds:和select函數(shù)的第一個(gè)參數(shù)相同,最大scoket描述符+1
    timeout:表示poll函數(shù)的超時(shí)時(shí)間,單位是毫秒(ms)
    注意:timeout==0 代表立即返回
    timeout>0 代表等待指定的毫秒數(shù)后,返回
    timeout<0 代表永不過(guò)期,就是阻塞
    poll的返回值:==0 等待超時(shí)
    >0 正常返回
    ==-1 錯(cuò)誤
    2.和select的區(qū)別
    poll沒(méi)有socket的FD_SETSIZE(1024)個(gè)數(shù)的限制
    poll不用每次不會(huì)清理監(jiān)測(cè)的socket的集合
    不同與select使用三個(gè)位圖來(lái)表示三個(gè)fdset的方式,poll使用一個(gè)Pollfd的指針實(shí)現(xiàn)。
    3.poll的缺點(diǎn)
    poll中監(jiān)聽(tīng)的文件描述符數(shù)目增多時(shí),則:
    和select函數(shù)一樣,poll返回后,需要輪詢pollfd來(lái)獲取就緒的描述符
    每次調(diào)poll都需要大量的pollfd結(jié)構(gòu)從用戶態(tài)拷貝到內(nèi)核中。
    同時(shí)連接的大量客戶端在一時(shí)刻只有很少的處于就緒狀態(tài),因此隨著監(jiān)視的描述符數(shù)量的增長(zhǎng),其效率也會(huì)線性下降。
    select模型:
    select用于IO復(fù)用,用于監(jiān)視多個(gè)文件描述符的集合,判斷是否有符合條件的事件發(fā)生。
    函數(shù)select可以先對(duì)需要操作的文件描述符進(jìn)行查詢,查看是否目標(biāo)文件描述符可以進(jìn)行讀寫(xiě)或者錯(cuò)誤操作,然后當(dāng)文件描述符滿足操作的條件的時(shí)候才進(jìn)行真正的IO操作
    函數(shù)原型如下:
    int select(int nfds,//nfds最大文件描述符+1
    fd_setreadfds,//監(jiān)控的所有讀文件描述符集合
    fd_set *writes,//寫(xiě)集合
    fd_set exceptfds //異常集合
    struct timeval timeout);//超長(zhǎng)時(shí)間
    返回值:>0正常(正常情況下返回就緒的文件描述符個(gè)數(shù))
    =0 超時(shí)
    =-1 發(fā)生錯(cuò)誤(select被某個(gè)信號(hào)中斷它將返回-1并設(shè)置errno為EINTR)
    EBADF 文件描述詞為無(wú)效的或該文件已關(guān)閉
    EINTR 此調(diào)用被信號(hào)所中斷
    EINVAL 參數(shù)n為負(fù)值
    #從某個(gè)文件描述符的集合中取出某個(gè)文件描述符
    void FD_CLR(int fd,fd_setset);
    #測(cè)試某個(gè)文件描述符是否在某個(gè)集合中
    int FD_ISSET(int fd,fd_setset)
    #向某個(gè)文件描述符集合中加入文件描述符
    void FD_SET(int fd,fd_set *set);
    #清理文件描述符集合
    void FD_ZERO(fd_set *set);
    注意:文件描述符的集合存在最大的限制,其最大值為FD_SETSIZE=1024
    優(yōu)點(diǎn):與多進(jìn)程多線程技術(shù)相比,I/O多路復(fù)用技術(shù)的最大優(yōu)勢(shì)是系統(tǒng)開(kāi)銷小,系統(tǒng)不必創(chuàng)建進(jìn)程,線程,也不必維護(hù)這些進(jìn)城線程,從而大大減小了系統(tǒng)的開(kāi)銷。I/O多路復(fù)用就是通過(guò)一種機(jī)制,一個(gè)進(jìn)程可以監(jiān)視多個(gè)描述符,一旦某個(gè)描述符就緒(一般是寫(xiě)就緒或讀就緒),能通知程序進(jìn)行相應(yīng)的讀寫(xiě)操作。
    epoll模型:
    epoll是select和poll的增強(qiáng)版本,相對(duì)于select和poll來(lái)說(shuō),epoll更加靈活,沒(méi)有描述符限制。epoll用一個(gè)文件描述符管理多個(gè)描述符,將用戶關(guān)系的文件描述符的事件存放到一個(gè)內(nèi)核的一個(gè)事件表中,這樣在用戶空間和內(nèi)核空間的copy只需一次。
    epoll相關(guān)的函數(shù):
    #include <sys/epoll.h>
    int epoll_create(int size);
    int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event):
    int epoll_wait(int epfd,struct epoll_event *events,int maxevents,int timeout)
    epoll_create

    功能:用來(lái)創(chuàng)建epoll實(shí)例,,創(chuàng)建一個(gè)epoll的句柄。(注意:最后要關(guān)閉epoll的句柄)

    參數(shù)size:當(dāng)創(chuàng)建好這個(gè)句柄后,它就是會(huì)占用一個(gè)fd值,在linux下如果查看/proc/進(jìn)程id/fd/,是能夠看到這個(gè)fd的,所以在使用完epoll后,必須調(diào)用close()關(guān)閉,否則可能導(dǎo)致fd被耗盡。

    函數(shù)描述:epoll_create返回的是一個(gè)文件描述符,也就是說(shuō)epoll是以特殊文件的方式體現(xiàn)給用戶,size提示操作系統(tǒng),用戶可能使用多少個(gè)文件描述符,該參數(shù)已廢棄,填寫(xiě)一個(gè)大于0的正整數(shù)

    返回值:大于0:成功,-1:出錯(cuò)

    epoll_ctl
    功能:用來(lái)增加或移除被epoll所監(jiān)聽(tīng)的文件描述符,epoll的事件注冊(cè)函數(shù)(epoll在這里先注冊(cè)要監(jiān)聽(tīng)的事件類型)

    參數(shù):epfd :epoll上下文描述符,就是epoll_create函數(shù)的返回值

    op:EPOLL_CTL_ADD向epoll監(jiān)聽(tīng)集合當(dāng)中添加socket描述符

    EPOLL_CTL_DEL從epoll監(jiān)聽(tīng)當(dāng)中刪除socket描述符

    EPOLL_CTL_MOD修改

    fd socket描述符,對(duì)TCP來(lái)說(shuō)就是accept函數(shù)的返回值

    event 在向epoll監(jiān)聽(tīng)集合當(dāng)中添加socket描述符的同時(shí),為描述符綁定一個(gè)觸發(fā)事件

    event可以是以下宏的集合:

    EPOLLIN:表示對(duì)應(yīng)的文件描述符可以讀(包括對(duì)端socket正常關(guān)閉)

    EPOLLOUT:表示對(duì)應(yīng)的文件描述符可以寫(xiě);

    EPOLLPRI:表示對(duì)應(yīng)的文件描述符有緊急的數(shù)據(jù)可以讀

    EPOLLERR:表示對(duì)應(yīng)的文件描述符發(fā)生錯(cuò)誤

    EPOLLHUP:表示對(duì)應(yīng)的文件描述符被掛斷

    EPOLLET:將EPOLL設(shè)為邊緣觸發(fā)模式,這是相對(duì)于水平觸發(fā)來(lái)說(shuō)的

    EPOLLONESHOT:只監(jiān)聽(tīng)一次事件,當(dāng)監(jiān)聽(tīng)完這次事件之后,如果還需要繼續(xù)監(jiān)聽(tīng)這個(gè)socket的話,需要再次把這個(gè)socket加入到EPOLL隊(duì)列里。

    返回值:0:成功 -1:出錯(cuò)

    epoll_wait

    功能:用來(lái)等待發(fā)生在監(jiān)聽(tīng)描述符上的事件的產(chǎn)生,類似于select調(diào)用。(等待epfd_所代表的epoll實(shí)例中監(jiān)聽(tīng)的事件發(fā)生,events指針?lè)祷匾呀?jīng)準(zhǔn)備好的事件,最多有maxevents個(gè),參數(shù)maxevents必須大于零)

    參數(shù):epfd:標(biāo)識(shí)epoll的文件描述符

    events:用來(lái)從內(nèi)核得到事件的集合maxevents:告知內(nèi)核這個(gè)events有多大,這個(gè)maxevents的值不能大于創(chuàng)建epoll—_create()時(shí)的sizetimeout:是超時(shí)時(shí)間

    返回值:return>0,發(fā)生事件個(gè)數(shù) =0 時(shí)間到 -1 出錯(cuò)

    該函數(shù)返回需要處理的事件數(shù)目,如返回0表示已超時(shí)。

    epoll的優(yōu)點(diǎn):

    1、支持一個(gè)進(jìn)程打開(kāi)大數(shù)目的socket描述符(FD)

    select最不能忍受的是一個(gè)進(jìn)程所打開(kāi)的FD是有一定限制的,由FD_SETSIZE設(shè)置,默認(rèn)值是1024,對(duì)于那些需要支持的上萬(wàn)連接數(shù)目的IM服務(wù)器來(lái)說(shuō)顯然太少了。不過(guò)epoll則沒(méi)有這個(gè)限制,它所支持的FD上限是最大可以打開(kāi)文件的數(shù)目,這個(gè)數(shù)字遠(yuǎn)大于1024,比如,在1GB內(nèi)存的機(jī)器上大約是10萬(wàn)左右,具體數(shù)目可以cat/pro/sys/fs/file-max查看,一般來(lái)說(shuō)這個(gè)數(shù)目和系統(tǒng)內(nèi)存關(guān)系很大。

    2.IO效率不隨FD數(shù)目增加而線性下降

    傳統(tǒng)的select/poll另一個(gè)致命弱點(diǎn)就是當(dāng)你擁有一個(gè)很大的socket集合,不過(guò)由于網(wǎng)絡(luò)延時(shí),任一時(shí)間只有部分的socket是“活躍”的,但是select/poll每次調(diào)用都會(huì)線性掃描全部的集合,導(dǎo)致效率呈現(xiàn)線性下降,而epoll不存在此問(wèn)題。

    3.使用mmap加速內(nèi)核與用戶空間的消息傳遞

    epoll是通過(guò)內(nèi)核于用戶空間mmap同一塊內(nèi)存實(shí)現(xiàn)的

    epoll、poll、select三者的區(qū)別與比較:

    select、poll實(shí)現(xiàn)需要自己不斷輪詢所有fd集合,直到設(shè)備就緒,此段時(shí)間,它們可能多次睡眠與喚醒交替進(jìn)行。epoll雖需要調(diào)用epoll_wait不斷輪詢就緒鏈表,也會(huì)經(jīng)歷多次睡眠和喚醒交替,但是它是設(shè)備就緒時(shí),調(diào)用回調(diào)函數(shù),就把就緒fd放入就緒鏈表中,并喚醒在epoll_wait中進(jìn)入睡眠的進(jìn)程。雖然都要睡眠和喚醒交替,但是select和poll在醒著時(shí)要遍歷整個(gè)fd集合,而epoll在醒著時(shí)只要判斷一下就緒鏈表是否為空就行了(可以節(jié)省大量的CPU時(shí)間)。

    select,poll每次調(diào)用都要把fd集合從用戶態(tài)網(wǎng)內(nèi)核態(tài)拷貝一次,而epoll只要拷貝一次。

    下面列出如下表格來(lái)進(jìn)行比較:

    總結(jié):I/O多路復(fù)用就通過(guò)一種機(jī)制,可以監(jiān)視多個(gè)描述符,一旦某個(gè)描述符就緒,能夠通知程序進(jìn)行相應(yīng)的讀寫(xiě)操作。select、poll、epoll都是I/O多路復(fù)用的機(jī)制。但select、poll、epoll本質(zhì)上都是同步I/O,因?yàn)樗麄兌夹枰谧x寫(xiě)事件就緒后自己負(fù)責(zé)進(jìn)行讀寫(xiě),也就是說(shuō)這個(gè)讀寫(xiě)過(guò)程是阻塞的,而異步I/O則無(wú)需自己負(fù)責(zé)進(jìn)行讀寫(xiě),異步I/O的實(shí)現(xiàn)會(huì)負(fù)責(zé)把數(shù)據(jù)從內(nèi)核拷貝到用戶空間。
    ————————————————
    版權(quán)聲明:本文為CSDN博主「weixin_42904113」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
    原文鏈接:https://blog.csdn.net/weixin_42904113/article/details/97647412

    13、簡(jiǎn)述 進(jìn)程、線程、協(xié)程的區(qū)別 以及應(yīng)用場(chǎng)景?

    1.進(jìn)程是計(jì)算器最小資源分配單位 .

    2.線程是CPU調(diào)度的最小單位 .

    3.進(jìn)程切換需要的資源很最大,效率很低 .

    4.線程切換需要的資源一般,效率一般(當(dāng)然了在不考慮GIL的情況下) .

    5.協(xié)程切換任務(wù)資源很小,效率高(協(xié)程本身并不存在,是程序員通過(guò)控制IO操作完成) .

    6.多進(jìn)程、多線程根據(jù)cpu核數(shù)不一樣可能是并行的,但是協(xié)程是在一個(gè)線程中 所以是并發(fā).

    進(jìn)程:

    一個(gè)運(yùn)行的程序(代碼)就是一個(gè)進(jìn)程,沒(méi)有運(yùn)行的代碼叫程序,進(jìn)程是系統(tǒng)資源分配的最小單位,進(jìn)程擁有自己獨(dú)立的內(nèi)存空間,所以進(jìn)程間數(shù)據(jù)不共享,開(kāi)銷大。

    線程:

    調(diào)度執(zhí)行的最小單位,也叫執(zhí)行路徑,不能獨(dú)立存在,依賴進(jìn)程存在一個(gè)進(jìn)程至少有一個(gè)線程,叫主線程,而多個(gè)線程共享內(nèi)存(數(shù)據(jù)共享,共享全局變量),從而極大地提高了程序的運(yùn)行效率。

    協(xié)程:

    是一種用戶態(tài)的輕量級(jí)線程,協(xié)程的調(diào)度完全由用戶控制。

    協(xié)程擁有自己的寄存器上下文和棧。

    協(xié)程調(diào)度切換時(shí),將寄存器上下文和棧保存到其他地方,在切回來(lái)的時(shí)候,恢復(fù)先前保存的寄存器上下文和棧,直接操作棧則基本沒(méi)有內(nèi)核切換的開(kāi)銷,

    可以不加鎖的訪問(wèn)全局變量,所以上下文的切換非常快。
    原文鏈接:https://www.cnblogs.com/Rivend/p/12052550.html

    14、GIL鎖是什么鬼?

    全局解釋鎖,每次只能一個(gè)線程獲得cpu的使用權(quán):為了線程安全,也就是為了解決多線程之間的數(shù)據(jù)完整性和狀態(tài)同步而加的鎖,因?yàn)槲覀冎谰€程之間的數(shù)據(jù)是共享的。

    大神講解:http://cenalulu.github.io/python/gil-in-python/

    15、Python中如何使用線程池和進(jìn)程池?

    為什么要有進(jìn)程池?進(jìn)程池的概念。

    在程序?qū)嶋H處理問(wèn)題過(guò)程中,忙時(shí)會(huì)有成千上萬(wàn)的任務(wù)需要被執(zhí)行,閑時(shí)可能只有零星任務(wù)。

    那么在成千上萬(wàn)個(gè)任務(wù)需要被執(zhí)行的時(shí)候,我們就需要去創(chuàng)建成千上萬(wàn)個(gè)進(jìn)程么?首先,創(chuàng)建進(jìn)程需要消耗時(shí)間,銷毀進(jìn)程也需要消耗時(shí)間。

    第二即便開(kāi)啟了成千上萬(wàn)的進(jìn)程,操作系統(tǒng)也不能讓他們同時(shí)執(zhí)行,這樣反而會(huì)影響程序的效率。

    因此我們不能無(wú)限制的根據(jù)任務(wù)開(kāi)啟或者結(jié)束進(jìn)程。那么我們要怎么做呢?

    在這里,要給大家介紹一個(gè)進(jìn)程池的概念,定義一個(gè)池子,在里面放上固定數(shù)量的進(jìn)程,有需求來(lái)了,就拿一個(gè)池中的進(jìn)程來(lái)處理任務(wù),

    等到處理完畢,進(jìn)程并不關(guān)閉,而是將進(jìn)程再放回進(jìn)程池中繼續(xù)等待任務(wù)。如果有很多任務(wù)需要執(zhí)行,池中的進(jìn)程數(shù)量不夠,任務(wù)就要等待之前的進(jìn)程執(zhí)行任務(wù)完畢歸來(lái),

    拿到空閑進(jìn)程才能繼續(xù)執(zhí)行。也就是說(shuō),池中進(jìn)程的數(shù)量是固定的,那么同一時(shí)間最多有固定數(shù)量的進(jìn)程在運(yùn)行。這樣不會(huì)增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開(kāi)閉進(jìn)程的時(shí)間,也一定程度上能夠?qū)崿F(xiàn)并發(fā)效果。

    from multiprocessing import Pool from multiprocessing import Process import time import osdef func(n):print("子進(jìn)程開(kāi)始: %s"%n, os.getpid())time.sleep(1)print("子進(jìn)程結(jié)束: %s" % n, os.getpid())if __name__ == "__main__":# 開(kāi)啟了5個(gè)進(jìn)程pool = Pool(5)for i in range(10):# 正常情況下先執(zhí)行5個(gè)start 后執(zhí)行5個(gè)endp = Process(target=func,args=(i,))p.start()

    線程池的使用

    import time from concurrent.futures import ThreadPoolExecutordef func(n):print(n)time.sleep(1)return n * 10t_lst = []# 定義一個(gè)線程池(默認(rèn) 不要超過(guò)cup個(gè)數(shù)*5) tpool = ThreadPoolExecutor(max_workers=5)for i in range(20):# 傳值(開(kāi)啟20個(gè)子線程)t = tpool.submit(func, i)t_lst.append(t)# 相當(dāng)于 close + join tpool.shutdown()print("主線程")for t in t_lst:# t.result() 接受返回值print("\033[31m ==== \033[0m", t.result())

    16、threading.local的作用?

    **threading.local()這個(gè)方法的特點(diǎn)用來(lái)保存一個(gè)全局變量,但是這個(gè)全局變量只有在當(dāng)前線程才能訪問(wèn),如果你在開(kāi)發(fā)多線程應(yīng)用的時(shí)候 需要每個(gè)線程保存一個(gè)單獨(dú)的數(shù)據(jù)供當(dāng)前線程操作,可以考慮使用這個(gè)方法,簡(jiǎn)單有效。**舉例:每個(gè)子線程使用全局對(duì)象a,但每個(gè)線程定義的屬性a.xx是該線程獨(dú)有的,Python提供了 threading.local 類,將這個(gè)類實(shí)例化得到一個(gè)全局對(duì)象,但是不同的線程使用這個(gè)對(duì)象存儲(chǔ)的數(shù)據(jù)其它線程不可見(jiàn)(本質(zhì)上就是不同的線程使用這個(gè)對(duì)象時(shí)為其創(chuàng)建一個(gè)獨(dú)立的字典)。

    基本概念:同一進(jìn)程內(nèi)的內(nèi)存棧是全局的。

    threading.local本質(zhì)上是對(duì)全局字典對(duì)象管理類的一個(gè)封裝,

    內(nèi)部自動(dòng)為每個(gè)線程維護(hù)一個(gè)空間(字典),用于當(dāng)前存取屬于自己的值。保證線程之間的數(shù)據(jù)隔離。

    主要的目的是線程之間的數(shù)據(jù)隔離。

    當(dāng)然,自己寫(xiě)也不是不可以,但開(kāi)發(fā)的一個(gè)宗旨是不必重復(fù)造輪子。

    案例源碼:

    import time import threadinglocal = threading.local()def func(n):print(threading.current_thread())local.val = ntime.sleep(2)print(n)for i in range(10):t = threading.Thread(target=func,args=(i,))t.start()

    實(shí)質(zhì)上local.val = n等效于local._local__impl.dicts[‘thread_id’][‘val’] = n

    另外需要注意的是local類重寫(xiě)了取值方法。
    搬運(yùn)與:https://www.cnblogs.com/insane-Mr-Li/p/12092029.html

    17、進(jìn)程之間如何進(jìn)行通信?

    1、管道
    我們來(lái)看一條 Linux 的語(yǔ)句

    netstat -tulnp | grep 8080

    學(xué)過(guò) Linux 命名的估計(jì)都懂這條語(yǔ)句的含義,其中”|“是管道的意思,它的作用就是把前一條命令的輸出作為后一條命令的輸入。在這里就是把 netstat -tulnp 的輸出結(jié)果作為 grep 8080 這條命令的輸入。如果兩個(gè)進(jìn)程要進(jìn)行通信的話,就可以用這種管道來(lái)進(jìn)行通信了,并且我們可以知道這條豎線是沒(méi)有名字的,所以我們把這種通信方式稱之為匿名管道。

    并且這種通信方式是單向的,只能把第一個(gè)命令的輸出作為第二個(gè)命令的輸入,如果進(jìn)程之間想要互相通信的話,那么需要?jiǎng)?chuàng)建兩個(gè)管道。

    居然有匿名管道,那也意味著有命名管道,下面我們來(lái)創(chuàng)建一個(gè)命名管道。

    mkfifo test

    這條命令創(chuàng)建了一個(gè)名字為 test 的命名管道。

    接下來(lái)我們用一個(gè)進(jìn)程向這個(gè)管道里面寫(xiě)數(shù)據(jù),然后有另外一個(gè)進(jìn)程把里面的數(shù)據(jù)讀出來(lái)。

    echo "this is a pipe" > test // 寫(xiě)數(shù)據(jù)

    這個(gè)時(shí)候管道的內(nèi)容沒(méi)有被讀出的話,那么這個(gè)命令就會(huì)一直停在這里,只有當(dāng)另外一個(gè)進(jìn)程把 test 里面的內(nèi)容讀出來(lái)的時(shí)候這條命令才會(huì)結(jié)束。接下來(lái)我們用另外一個(gè)進(jìn)程來(lái)讀取

    cat < test // 讀數(shù)據(jù)

    我們可以看到,test 里面的數(shù)據(jù)被讀取出來(lái)了。上一條命令也執(zhí)行結(jié)束了。

    從上面的例子可以看出,管道的通知機(jī)制類似于緩存,就像一個(gè)進(jìn)程把數(shù)據(jù)放在某個(gè)緩存區(qū)域,然后等著另外一個(gè)進(jìn)程去拿,并且是管道是單向傳輸?shù)摹?/p>

    這種通信方式有什么缺點(diǎn)呢?顯然,這種通信方式效率低下,你看,a 進(jìn)程給 b 進(jìn)程傳輸數(shù)據(jù),只能等待 b 進(jìn)程取了數(shù)據(jù)之后 a 進(jìn)程才能返回。

    所以管道不適合頻繁通信的進(jìn)程。當(dāng)然,他也有它的優(yōu)點(diǎn),例如比較簡(jiǎn)單,能夠保證我們的數(shù)據(jù)已經(jīng)真的被其他進(jìn)程拿走了。我們平時(shí)用 Linux 的時(shí)候,也算是經(jīng)常用。

    2、消息隊(duì)列
    那我們能不能把進(jìn)程的數(shù)據(jù)放在某個(gè)內(nèi)存之后就馬上讓進(jìn)程返回呢?無(wú)需等待其他進(jìn)程來(lái)取就返回呢?

    答是可以的,我們可以用消息隊(duì)列的通信模式來(lái)解決這個(gè)問(wèn)題,例如 a 進(jìn)程要給 b 進(jìn)程發(fā)送消息,只需要把消息放在對(duì)應(yīng)的消息隊(duì)列里就行了,b 進(jìn)程需要的時(shí)候再去對(duì)應(yīng)的
    消息隊(duì)列里取出來(lái)。同理,b 進(jìn)程要個(gè) a 進(jìn)程發(fā)送消息也是一樣。這種通信方式也類似于緩存吧。

    這種通信方式有缺點(diǎn)嗎?答是有的,如果 a 進(jìn)程發(fā)送的數(shù)據(jù)占的內(nèi)存比較大,并且兩個(gè)進(jìn)程之間的通信特別頻繁的話,消息隊(duì)列模型就不大適合了。因?yàn)?a 發(fā)送的數(shù)據(jù)很大的話,意味**發(fā)送消息(拷貝)**這個(gè)過(guò)程需要花很多時(shí)間來(lái)讀內(nèi)存。

    哪有沒(méi)有什么解決方案呢?答是有的,請(qǐng)繼續(xù)往下看。

    3、共享內(nèi)存
    共享內(nèi)存這個(gè)通信方式就可以很好著解決拷貝所消耗的時(shí)間了。

    這個(gè)可能有人會(huì)問(wèn)了,每個(gè)進(jìn)程不是有自己的獨(dú)立內(nèi)存嗎?兩個(gè)進(jìn)程怎么就可以共享一塊內(nèi)存了?

    我們都知道,系統(tǒng)加載一個(gè)進(jìn)程的時(shí)候,分配給進(jìn)程的內(nèi)存并不是實(shí)際物理內(nèi)存,而是虛擬內(nèi)存空間。那么我們可以讓兩個(gè)進(jìn)程各自拿出一塊虛擬地址空間來(lái),然后映射到相同的物理內(nèi)存中,這樣,兩個(gè)進(jìn)程雖然有著獨(dú)立的虛擬內(nèi)存空間,但有一部分卻是映射到相同的物理內(nèi)存,這就完成了內(nèi)存共享機(jī)制了。

    4、信號(hào)量
    共享內(nèi)存最大的問(wèn)題是什么?沒(méi)錯(cuò),就是多進(jìn)程競(jìng)爭(zhēng)內(nèi)存的問(wèn)題,就像類似于我們平時(shí)說(shuō)的線程安全問(wèn)題。如何解決這個(gè)問(wèn)題?這個(gè)時(shí)候我們的信號(hào)量就上場(chǎng)了。

    信號(hào)量的本質(zhì)就是一個(gè)計(jì)數(shù)器,用來(lái)實(shí)現(xiàn)進(jìn)程之間的互斥與同步。例如信號(hào)量的初始值是 1,然后 a 進(jìn)程來(lái)訪問(wèn)內(nèi)存1的時(shí)候,我們就把信號(hào)量的值設(shè)為 0,然后進(jìn)程b 也要來(lái)訪問(wèn)內(nèi)存1的時(shí)候,看到信號(hào)量的值為 0 就知道已經(jīng)有進(jìn)程在訪問(wèn)內(nèi)存1了,這個(gè)時(shí)候進(jìn)程 b 就會(huì)訪問(wèn)不了內(nèi)存1。所以說(shuō),信號(hào)量也是進(jìn)程之間的一種通信方式。

    5、Socket
    上面我們說(shuō)的共享內(nèi)存、管道、信號(hào)量、消息隊(duì)列,他們都是多個(gè)進(jìn)程在一臺(tái)主機(jī)之間的通信,那兩個(gè)相隔幾千里的進(jìn)程能夠進(jìn)行通信嗎?

    答是必須的,這個(gè)時(shí)候 Socket 這家伙就派上用場(chǎng)了,例如我們平時(shí)通過(guò)瀏覽器發(fā)起一個(gè) http 請(qǐng)求,然后服務(wù)器給你返回對(duì)應(yīng)的數(shù)據(jù),這種就是采用 Socket 的通信方式了。

    總結(jié)
    所以,進(jìn)程之間的通信方式有:

    1、管道
    2、消息隊(duì)列
    3、共享內(nèi)存
    4、信號(hào)量
    5、Socket

    講到這里也就完結(jié)了,之前我看進(jìn)程之間的通信方式的時(shí)候,也算是死記硬背,并沒(méi)有去理解他們之間的關(guān)系,優(yōu)缺點(diǎn),為什么會(huì)有這種通信方式。所以最近花點(diǎn)時(shí)間去研究了一下,
    整理了這篇文章,相信看完這篇文章,你就可以更好著理解各種通信方式的由來(lái)的。
    ————————————————
    版權(quán)聲明:本文為CSDN博主「帥地」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
    原文鏈接:https://blog.csdn.net/m0_37907797/article/details/103188294

    18、什么是并發(fā)和并行?

    做并發(fā)編程之前,必須首先理解什么是并發(fā),什么是并行,什么是并發(fā)編程,什么是并行編程。

    并發(fā)(concurrency)和并行(parallellism)是:

    解釋一:并行是指兩個(gè)或者多個(gè)事件在同一時(shí)刻發(fā)生;而并發(fā)是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔發(fā)生。
    解釋二:并行是在不同實(shí)體上的多個(gè)事件,并發(fā)是在同一實(shí)體上的多個(gè)事件。
    解釋三:在一臺(tái)處理器上“同時(shí)”處理多個(gè)任務(wù),在多臺(tái)處理器上同時(shí)處理多個(gè)任務(wù)。如hadoop分布式集群
    所以并發(fā)編程的目標(biāo)是充分的利用處理器的每一個(gè)核,以達(dá)到最高的處理性能

    并發(fā)(Concurrent),
    在操作系統(tǒng)中,是指一個(gè)時(shí)間段中有幾個(gè)程序都處于已啟動(dòng)運(yùn)行到運(yùn)行完畢之間,且這幾個(gè)程序都是在同一個(gè)處理機(jī)上運(yùn)行。

    就想前面提到的操作系統(tǒng)的時(shí)間片分時(shí)調(diào)度。打游戲和聽(tīng)音樂(lè)兩件事情在同一個(gè)時(shí)間段內(nèi)都是在同一臺(tái)電腦上完成了從開(kāi)始到結(jié)束的動(dòng)作。那么,就可以說(shuō)聽(tīng)音樂(lè)和打游戲是并發(fā)的。

    并行
    并行(Parallel),當(dāng)系統(tǒng)有一個(gè)以上CPU時(shí),當(dāng)一個(gè)CPU執(zhí)行一個(gè)進(jìn)程時(shí),另一個(gè)CPU可以執(zhí)行另一個(gè)進(jìn)程,兩個(gè)進(jìn)程互不搶占CPU資源,可以同時(shí)進(jìn)行,這種方式我們稱之為并行(Parallel)。

    這里面有一個(gè)很重要的點(diǎn),那就是系統(tǒng)要有多個(gè)CPU才會(huì)出現(xiàn)并行。在有多個(gè)CPU的情況下,才會(huì)出現(xiàn)真正意義上的『同時(shí)進(jìn)行』。

    并發(fā)與并行
    我們兩個(gè)人在吃午飯。你在吃飯的整個(gè)過(guò)程中,吃了米飯、吃了蔬菜、吃了牛肉。吃米飯、吃蔬菜、吃牛肉這三件事其實(shí)就是并發(fā)執(zhí)行的。

    對(duì)于你來(lái)說(shuō),整個(gè)過(guò)程中看似是同時(shí)完成的的。但其實(shí)你是在吃不同的東西之間來(lái)回切換的。

    還是我們兩個(gè)人吃午飯。在吃飯過(guò)程中,你吃了米飯、蔬菜、牛肉。我也吃了米飯、蔬菜和牛肉。

    我們兩個(gè)人之間的吃飯就是并行的。兩個(gè)人之間可以在同一時(shí)間點(diǎn)一起吃牛肉,或者一個(gè)吃牛肉,一個(gè)吃蔬菜。之間是互不影響的。


    所以,并發(fā)是指在一段時(shí)間內(nèi)宏觀上多個(gè)程序同時(shí)運(yùn)行。并行指的是同一個(gè)時(shí)刻,多個(gè)任務(wù)確實(shí)真的在同時(shí)運(yùn)行。

    并發(fā)和并行的區(qū)別

    并發(fā),指的是多個(gè)事情,在同一時(shí)間段內(nèi)同時(shí)發(fā)生了。

    并行,指的是多個(gè)事情,在同一時(shí)間點(diǎn)上同時(shí)發(fā)生了。

    并發(fā)的多個(gè)任務(wù)之間是互相搶占資源的。

    并行的多個(gè)任務(wù)之間是不互相搶占資源的、

    只有在多CPU的情況中,才會(huì)發(fā)生并行。否則,看似同時(shí)發(fā)生的事情,其實(shí)都是并發(fā)執(zhí)行的。

    19、進(jìn)程鎖和線程鎖的作用?

    線程鎖:
     多線程可以同時(shí)運(yùn)行多個(gè)任務(wù)但是當(dāng)多個(gè)線程同時(shí)訪問(wèn)共享數(shù)據(jù)時(shí),可能導(dǎo)致數(shù)據(jù)不同步,甚至錯(cuò)誤! so,不使用線程鎖, 可能導(dǎo)致錯(cuò)誤

    大家都不陌生,主要用來(lái)給方法、代碼塊加鎖。當(dāng)某個(gè)方法或者代碼塊使用鎖時(shí),那么在同一時(shí)刻至多僅有有一個(gè)線程在執(zhí)行該段代碼。

    當(dāng)有多個(gè)線程訪問(wèn)同一對(duì)象的加鎖方法/代碼塊時(shí),同一時(shí)間只有一個(gè)線程在執(zhí)行,其余線程必須要等待當(dāng)前線程執(zhí)行完之后才能執(zhí)行該代碼段。但是,其余線程是可以訪問(wèn)該對(duì)象中的非加鎖代碼塊的。

    進(jìn)程鎖:
    也是為了控制同一操作系統(tǒng)中多個(gè)進(jìn)程訪問(wèn)一個(gè)共享資源,

    只是因?yàn)槌绦虻莫?dú)立性,各個(gè)進(jìn)程是無(wú)法控制其他進(jìn)程對(duì)資源的訪問(wèn)的,

    但是可以使用本地系統(tǒng)的信號(hào)量控制(操作系統(tǒng)基本知識(shí))

    優(yōu)點(diǎn):保證資源同步
    缺點(diǎn):有等待肯定會(huì)慢
    原文鏈接:w.cnblogs.com/Rivend/p/12058156.html

    20、解釋什么是異步非阻塞?

    在IO和網(wǎng)絡(luò)編程中,我們經(jīng)常看到幾個(gè)概念:同步、異步、阻塞、非阻塞。

    同步和異步
      同步和異步是針對(duì)應(yīng)用程序和內(nèi)核的交互而言的,同步指的是用戶進(jìn)程觸發(fā)IO 操作并等待或者輪詢的去查看IO 操作是否就緒,而異步是指用戶進(jìn)程觸發(fā)IO 操作以后便開(kāi)始做自己的事情,而當(dāng)IO 操作已經(jīng)完成的時(shí)候會(huì)得到IO 完成的通知。

    阻塞和非阻塞
      阻塞和非阻塞是針對(duì)于進(jìn)程在訪問(wèn)數(shù)據(jù)的時(shí)候,根據(jù)IO操作的就緒狀態(tài)來(lái)采取的不同方式,說(shuō)白了是一種讀取或者寫(xiě)入操作方法的實(shí)現(xiàn)方式,阻塞方式下讀取或者寫(xiě)入函數(shù)將一直等待,而非阻塞方式下,讀取或者寫(xiě)入方法會(huì)立即返回一個(gè)狀態(tài)值。

    理解方式
      乍一看這四個(gè)概念的解釋會(huì)瞬間感到頭大,也經(jīng)常講同步異步等同于阻塞非阻塞,其實(shí),區(qū)分他們非常簡(jiǎn)單。

    同步異步與阻塞非阻塞的主要區(qū)別是針對(duì)對(duì)象不同。

    同步異步是針對(duì)調(diào)用者來(lái)說(shuō)的,調(diào)用者發(fā)起一個(gè)請(qǐng)求后,一直干等被調(diào)用者的反饋就是同步,不必等去做別的事就是異步。
      阻塞非阻塞是針對(duì)被調(diào)用者來(lái)說(shuō)的,被調(diào)用者收到一個(gè)請(qǐng)求后,做完請(qǐng)求任務(wù)后才給出反饋就是阻塞,收到請(qǐng)求直接給出反饋再去做任務(wù)就是非阻塞。

    在公交站等公交

    對(duì)調(diào)用者-乘客而言:

    1,一直干望著公交來(lái)的方向,就是同步。

    2,不望著公交來(lái)的方向,掏出筆記本改bug,聽(tīng)公交站廣播是否到車,就是異步。

    對(duì)被動(dòng)用者-公交系統(tǒng)而言:

    1,公交站有廣播的就是非阻塞的。

    2,公交站沒(méi)有廣播的就是阻塞的。
      
    原文鏈接;https://www.cnblogs.com/Rivend/p/12065474.htmlv

    21、路由器和交換機(jī)的區(qū)別?

    第一,使用交換機(jī)上網(wǎng)是分別撥號(hào),各自使用自己的寬帶賬號(hào),大家上網(wǎng)互不影響。而路由器是共用一個(gè)寬帶賬號(hào),大家上網(wǎng)會(huì)相互影響。

    第二,交換機(jī)工作在中繼層,交換機(jī)根據(jù)MAC地址尋址。路由器工作在網(wǎng)絡(luò)層,根據(jù)IP地址尋址。

    第三,交換機(jī)可以使連接它的多臺(tái)電腦組成局域網(wǎng),如果還有代理服務(wù)器的話還可以實(shí)現(xiàn)同時(shí)上網(wǎng)功能,但是交換機(jī)沒(méi)有路由器的自動(dòng)識(shí)別數(shù)據(jù)包發(fā)送和到達(dá)地址的功能。

    第四,路由器提供了防火墻的服務(wù)。路由器僅僅轉(zhuǎn)發(fā)特定地址的數(shù)據(jù)包,不傳送不支持路由協(xié)議的數(shù)據(jù)包傳送。

    22、什么是域名解析?

    域名解析也稱為域名指向、服來(lái)務(wù)器設(shè)置、域名配置、反向ip注冊(cè)等。簡(jiǎn)單地說(shuō),將一個(gè)可記憶的域名解析為一個(gè)ip,服務(wù)由dns服務(wù)器完成,dns服務(wù)器將域名解析為一個(gè)ip地址,并將一個(gè)子目錄綁定到ip地址主機(jī)上知的域名。

    域名解析就像在移動(dòng)電話上使用對(duì)方的姓名來(lái)表示對(duì)方的電話號(hào)碼一樣,因?yàn)樗苋菀子浀雷 ns是文本到ip號(hào)碼的解析。
    域名解析的過(guò)程詳解

    23、如何修改本地hosts文件?

    1.window7修改本地hosts文件

    # window7系統(tǒng)hosts文件位置 C:\Windows\System32\drivers\etc


    2.linux

    # linux系統(tǒng)hosts文件位置 [root@localhost etc]# cat /etc/hosts

    24、生產(chǎn)者消費(fèi)者模型應(yīng)用場(chǎng)景及優(yōu)勢(shì)?

    在 工作中,大家可能會(huì)碰到這樣一種情況:某個(gè)模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個(gè)模塊來(lái)負(fù)責(zé)處理(此處的模塊是廣義的,可以是類、函數(shù)、線程、進(jìn)程等)。

    產(chǎn) 生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者。

    在生產(chǎn)者與消費(fèi)者之間在加個(gè)緩沖區(qū),我們形象的稱之為倉(cāng)庫(kù),生產(chǎn)者負(fù)責(zé)往倉(cāng)庫(kù)了進(jìn)商 品,而消費(fèi)者負(fù)責(zé)從倉(cāng)庫(kù)里拿商品,這就構(gòu)成了生產(chǎn)者消費(fèi)者模型。

    結(jié)構(gòu)圖如下:

    生產(chǎn)者消費(fèi)者模型的優(yōu)點(diǎn):

    1、解耦

    假設(shè)生產(chǎn)者和消費(fèi)者分別是兩個(gè)類。

    如果讓生產(chǎn)者直接調(diào)用消費(fèi)者的某個(gè)方法,那么生產(chǎn)者對(duì)于消費(fèi)者就會(huì)產(chǎn)生依賴(也就是耦合)。

    將來(lái)如果消費(fèi)者的代碼發(fā)生變化, 可能會(huì)影響到生產(chǎn)者。而如果兩者都依賴于某個(gè)緩沖區(qū),兩者之間不直接依賴,耦合也就相應(yīng)降低了。

    舉個(gè)例子,我們?nèi)ム]局投遞信件,如果不使用郵筒(也就是緩沖區(qū)),你必須得把信直接交給郵遞員。

    有同學(xué)會(huì)說(shuō),直接給郵遞員不是挺簡(jiǎn)單的嘛?其實(shí)不簡(jiǎn)單,你必須 得認(rèn)識(shí)誰(shuí)是郵遞員,才能把信給他(光憑身上穿的制服,萬(wàn)一有人假冒,就慘了)。

    這就產(chǎn)生和你和郵遞員之間的依賴(相當(dāng)于生產(chǎn)者和消費(fèi)者的強(qiáng)耦合)。

    萬(wàn)一哪天郵遞員換人了,你還要重新認(rèn)識(shí)一下(相當(dāng)于消費(fèi)者變化導(dǎo)致修改生產(chǎn)者代碼)。

    而郵筒相對(duì)來(lái)說(shuō)比較固定,你依賴它的成本就比較低(相當(dāng)于和緩沖區(qū)之間的弱耦合)。

    2、支持并發(fā)

    由于生產(chǎn)者與消費(fèi)者是兩個(gè)獨(dú)立的并發(fā)體,他們之間是用緩沖區(qū)作為橋梁連接,生產(chǎn)者只需要往緩沖區(qū)里丟數(shù)據(jù),

    就可以繼續(xù)生產(chǎn)下一個(gè)數(shù)據(jù),而消費(fèi)者只需要從緩沖區(qū)了拿數(shù)據(jù)即可,這樣就不會(huì)因?yàn)楸舜说奶幚硭俣榷l(fā)生阻塞。

    接上面的例子,如果我們不使用郵筒,我們就得在郵局等郵遞員,直到他回來(lái),

    我們把信件交給他,這期間我們啥事兒都不能干(也就是生產(chǎn)者阻塞),或者郵遞員得挨家挨戶問(wèn),誰(shuí)要寄信(相當(dāng)于消費(fèi)者輪詢)。

    3、支持忙閑不均

    緩沖區(qū)還有另一個(gè)好處。如果制造數(shù)據(jù)的速度時(shí)快時(shí)慢,緩沖區(qū)的好處就體現(xiàn)出來(lái)了。

    當(dāng)數(shù)據(jù)制造快的時(shí)候,消費(fèi)者來(lái)不及處理,未處理的數(shù)據(jù)可以暫時(shí)存在緩沖區(qū)中。 等生產(chǎn)者的制造速度慢下來(lái),消費(fèi)者再慢慢處理掉。

    為了充分復(fù)用,我們?cè)倌眉男诺睦觼?lái)說(shuō)事。假設(shè)郵遞員一次只能帶走1000封信。萬(wàn)一某次碰上情人節(jié)(也可能是圣誕節(jié))送賀卡,

    需要寄出去的信超過(guò)1000封,這時(shí) 候郵筒這個(gè)緩沖區(qū)就派上用場(chǎng)了。郵遞員把來(lái)不及帶走的信暫存在郵筒中,等下次過(guò)來(lái) 時(shí)再拿走。

    應(yīng)用場(chǎng)景:

    使用多線程,在做爬蟲(chóng)的時(shí)候,生產(chǎn)者用著產(chǎn)生url鏈接,消費(fèi)者用于獲取url數(shù)據(jù),在隊(duì)列的幫助下可以使用多線程加快爬蟲(chóng)速度。

    import time import threading import Queue import urllib2class Consumer(threading.Thread):def __init__(self, queue):threading.Thread.__init__(self)self._queue = queuedef run(self):while True:content = self._queue.get()print contentif isinstance(content, str) and content == 'quit':breakresponse = urllib2.urlopen(content)print 'Bye byes!'def Producer():urls = ['http://211.103.242.133:8080/Disease/Details.aspx?id=2258','http://211.103.242.133:8080/Disease/Details.aspx?id=2258','http://211.103.242.133:8080/Disease/Details.aspx?id=2258','http://211.103.242.133:8080/Disease/Details.aspx?id=2258']queue = Queue.Queue()worker_threads = build_worker_pool(queue, 4)start_time = time.time()for url in urls:queue.put(url)for worker in worker_threads:queue.put('quit')for worker in worker_threads:worker.join()print 'Done! Time taken: {}'.format(time.time() - start_time)def build_worker_pool(queue, size):workers = []for _ in range(size):worker = Consumer(queue)worker.start()workers.append(worker)return workersif __name__ == '__main__':Producer()

    25、什么是CDN?有什么用?

    CDN的全稱是內(nèi)容分發(fā)網(wǎng)絡(luò),比如我們客戶端向服務(wù)器請(qǐng)求一個(gè)數(shù)據(jù),當(dāng)這個(gè)數(shù)據(jù)很大,請(qǐng)求頻繁,而且服務(wù)器距離客戶端很遠(yuǎn)這樣是不是很浪費(fèi)資源,浪費(fèi)大量的帶寬,嚴(yán)重時(shí)候還會(huì)造成網(wǎng)絡(luò)阻塞。而且這樣響應(yīng)時(shí)間非常慢。

    CDN主要由負(fù)載均衡,和高速緩存服務(wù)器組成。其中分為中心部分和邊緣部分。中心部分就是負(fù)責(zé)全局負(fù)載均衡,當(dāng)客戶端發(fā)送請(qǐng)求,首先會(huì)訪問(wèn)中心CDN,經(jīng)過(guò)全局負(fù)載均衡,根據(jù)用戶請(qǐng)求的ip 地址,一定的算法,然后算出距離用戶最近,用戶接入量最少得CDN緩存服務(wù)器,這樣是不是相當(dāng)于走了捷徑。因?yàn)閏dn是介于客戶端和請(qǐng)求服務(wù)器之間的一個(gè)緩存服務(wù)器,有一點(diǎn)點(diǎn)像redis緩存。當(dāng)然第一次請(qǐng)求的時(shí)候,cdn沒(méi)有緩存的話,cdn也會(huì)請(qǐng)求一次服務(wù)器,然后根據(jù)服務(wù)器返回的數(shù)據(jù)一方面留給自己緩存作為備用,另一方面也返回給客戶端,好像現(xiàn)在像騰訊網(wǎng),阿里云都有提供cdn服務(wù)器。而且域名配置服務(wù)器時(shí)候,就可以配到cdn。而且現(xiàn)在應(yīng)用也很多,比如網(wǎng)絡(luò)教學(xué),金融,證券,不允許有過(guò)多延遲和數(shù)據(jù)較大的應(yīng)用。這就是我大致了解的cdn ,content delivery network ,內(nèi)容分發(fā)網(wǎng)絡(luò)。CDN的全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。其基本思路是盡可能避開(kāi)互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié),使內(nèi)容傳輸?shù)母臁⒏€(wěn)定。通過(guò)在網(wǎng)絡(luò)各處放置節(jié)點(diǎn)服務(wù)器所構(gòu)成的在現(xiàn)有的互聯(lián)網(wǎng)基礎(chǔ)之上的一層智能虛擬網(wǎng)絡(luò),CDN系統(tǒng)能夠?qū)崟r(shí)地根據(jù)網(wǎng)絡(luò)流量和各節(jié)點(diǎn)的連接、負(fù)載狀況以及到用戶的距離和響應(yīng)時(shí)間等綜合信息將用戶的請(qǐng)求重新導(dǎo)向離用戶最近的服務(wù)節(jié)點(diǎn)上。其目的是使用戶可就近取得所需內(nèi)容,解決 Internet網(wǎng)絡(luò)擁擠的狀況,提高用戶訪問(wèn)網(wǎng)站的響應(yīng)速度。

    目前的CDN服務(wù)主要應(yīng)用于證券、金融保險(xiǎn)、ISP、ICP、網(wǎng)上交易、門戶網(wǎng)站、大中型公司、網(wǎng)絡(luò)教學(xué)等領(lǐng)域。另外在行業(yè)專網(wǎng)、互聯(lián)網(wǎng)中都可以用到,甚至可以對(duì)局域網(wǎng)進(jìn)行網(wǎng)絡(luò)優(yōu)化。利用CDN,這些網(wǎng)站無(wú)需投資昂貴的各類服務(wù)器、設(shè)立分站點(diǎn),特別是流媒體信息的廣泛應(yīng)用、遠(yuǎn)程教學(xué)課件等消耗帶寬資源多的媒體信息,應(yīng)用CDN網(wǎng)絡(luò),把內(nèi)容復(fù)制到網(wǎng)絡(luò)的最邊緣,使內(nèi)容請(qǐng)求點(diǎn)和交付點(diǎn)之間的距離縮至最小,從而促進(jìn)Web站點(diǎn)性能的提高,具有重要的意義。CDN 網(wǎng)絡(luò)的建設(shè)主要有企業(yè)建設(shè)的CDN網(wǎng)絡(luò),為企業(yè)服務(wù);IDC的CDN網(wǎng)絡(luò),主要服務(wù)于IDC和增值服務(wù);網(wǎng)絡(luò)運(yùn)營(yíng)上主建的CDN網(wǎng)絡(luò),主要提供內(nèi)容推送服務(wù);CDN網(wǎng)絡(luò)服務(wù)商,專門建設(shè)的CDN用于做服務(wù),用戶通過(guò)與CDN機(jī)構(gòu)進(jìn)行合作,CDN負(fù)責(zé)信息傳遞工作,保證信息正常傳輸,維護(hù)傳送網(wǎng)絡(luò),而網(wǎng)站只需要內(nèi)容維護(hù),不再需要考慮流量問(wèn)題。

    CDN的網(wǎng)絡(luò)架構(gòu)

    CDN網(wǎng)絡(luò)架構(gòu)主要由兩大部分,分為中心和邊緣兩部分,中心指CDN網(wǎng)管中心和DNS重定向解析中心,負(fù)責(zé)全局負(fù)載均衡,設(shè)備系統(tǒng)安裝在管理中心機(jī)房,邊緣主要指異地節(jié)點(diǎn),CDN分發(fā)的載體,主要由Cache和負(fù)載均衡器等組成。

    當(dāng)用戶訪問(wèn)加入CDN服務(wù)的網(wǎng)站時(shí),域名解析請(qǐng)求將最終交給全局負(fù)載均衡DNS進(jìn)行處理。全局負(fù)載均衡DNS通過(guò)一組預(yù)先定義好的策略,將當(dāng)時(shí)最接近用戶的節(jié)點(diǎn)地址提供給用戶,使用戶能夠得到快速的服務(wù)。同時(shí),它還與分布在世界各地的所有CDNC節(jié)點(diǎn)保持通信,搜集各節(jié)點(diǎn)的通信狀態(tài),確保不將用戶的請(qǐng)求分配到不可用的CDN節(jié)點(diǎn)上,實(shí)際上是通過(guò)DNS做全局負(fù)載均衡。

    對(duì)于普通的Internet用戶來(lái)講,每個(gè)CDN節(jié)點(diǎn)就相當(dāng)于一個(gè)放置在它周圍的WEB。通過(guò)全局負(fù)載均衡DNS的控制,用戶的請(qǐng)求被透明地指向離他最近的節(jié)點(diǎn),節(jié)點(diǎn)中CDN服務(wù)器會(huì)像網(wǎng)站的原始服務(wù)器一樣,響應(yīng)用戶的請(qǐng)求。由于它離用戶更近,因而響應(yīng)時(shí)間必然更快。

    每個(gè)CDN節(jié)點(diǎn)由兩部分組成:負(fù)載均衡設(shè)備和高速緩存服務(wù)器

    負(fù)載均衡設(shè)備負(fù)責(zé)每個(gè)節(jié)點(diǎn)中各個(gè)Cache的負(fù)載均衡,保證節(jié)點(diǎn)的工作效率;同時(shí),負(fù)載均衡設(shè)備還負(fù)責(zé)收集節(jié)點(diǎn)與周圍環(huán)境的信息,保持與全局負(fù)載DNS的通信,實(shí)現(xiàn)整個(gè)系統(tǒng)的負(fù)載均衡。

    高速緩存服務(wù)器(Cache)負(fù)責(zé)存儲(chǔ)客戶網(wǎng)站的大量信息,就像一個(gè)靠近用戶的網(wǎng)站服務(wù)器一樣響應(yīng)本地用戶的訪問(wèn)請(qǐng)求。

    CDN的管理系統(tǒng)是整個(gè)系統(tǒng)能夠正常運(yùn)轉(zhuǎn)的保證。它不僅能對(duì)系統(tǒng)中的各個(gè)子系統(tǒng)和設(shè)備進(jìn)行實(shí)時(shí)監(jiān)控,對(duì)各種故障產(chǎn)生相應(yīng)的告警,還可以實(shí)時(shí)監(jiān)測(cè)到系統(tǒng)中總的流量和各節(jié)點(diǎn)的流量,并保存在系統(tǒng)的數(shù)據(jù)庫(kù)中,使網(wǎng)管人員能夠方便地進(jìn)行進(jìn)一步分析。通過(guò)完善的網(wǎng)管系統(tǒng),用戶可以對(duì)系統(tǒng)配置進(jìn)行修改。

    理論上,最簡(jiǎn)單的CDN網(wǎng)絡(luò)有一個(gè)負(fù)責(zé)全局負(fù)載均衡的DNS和各節(jié)點(diǎn)一臺(tái)Cache,即可運(yùn)行。DNS支持根據(jù)用戶源IP地址解析不同的IP,實(shí)現(xiàn)就近訪問(wèn)。為了保證高可用性等,需要監(jiān)視各節(jié)點(diǎn)的流量、健康狀況等。一個(gè)節(jié)點(diǎn)的單臺(tái)Cache承載數(shù)量不夠時(shí),才需要多臺(tái)Cache,多臺(tái)Cache同時(shí)工作,才需要負(fù)載均衡器,使Cache群協(xié)同工作。
    ————————————————
    版權(quán)聲明:本文為CSDN博主「X_Ming_H」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
    原文鏈接:https://blog.csdn.net/xmh594603296/article/details/81435821

    26、LVS是什么及作用?

    一.LVS是什么?
    LVS的英文全稱是Linux Virtual Server,即Linux虛擬服務(wù)器。它是我們國(guó)家的章文嵩博士的一個(gè)開(kāi)源項(xiàng)目。在linux內(nèi)存2.6中,它已經(jīng)成為內(nèi)核的一部分,在此之前的內(nèi)核版本則需要重新編譯內(nèi)核。
    二.LVS能干什么?
    LVS主要用于多服務(wù)器的負(fù)載均衡。它工作在網(wǎng)絡(luò)層,可以實(shí)現(xiàn)高性能,高可用的服務(wù)器集群技術(shù)。它廉價(jià),可把許多低性能的服務(wù)器組合在一起形成一個(gè)超級(jí)服務(wù)器。它易用,配置非常簡(jiǎn)單,且有多種負(fù)載均衡的方法。它穩(wěn)定可靠,即使在集群的服務(wù)器中某臺(tái)服務(wù)器無(wú)法正常工作,也不影響整體效果。另外可擴(kuò)展性也非常好。

    27、Nginx是什么及作用?

    1 nginx是什么?Welcome to nginx!
    nginx是一款免費(fèi)開(kāi)源的高性能HTTP服務(wù)器及反向代理服務(wù)器(Reverse Proxy)

    2 nginx優(yōu)點(diǎn)及常用web服務(wù)器產(chǎn)品
    靜態(tài)web服務(wù)軟件

    1 Apache 中小型web服務(wù)的主流優(yōu)點(diǎn):運(yùn)行速度快,性能穩(wěn)定,擴(kuò)展豐富缺點(diǎn):以進(jìn)程為結(jié)構(gòu)基礎(chǔ),消耗cpu,性能下降2 Lighttpd 開(kāi)源輕量級(jí)web服務(wù)器軟件優(yōu)點(diǎn):1 安全,快速,兼容性好,靈活2 低開(kāi)銷,低CPU使用率3 支持大多數(shù)apache的重要功能缺點(diǎn): 功能存在不足,部分代碼缺陷(如對(duì)proxy功能不完善)

    動(dòng)態(tài)web服務(wù)軟件

    1 Microsoft IIS 微軟旗下產(chǎn)品優(yōu)點(diǎn):可靠、安全、性能和擴(kuò)展能力強(qiáng)缺點(diǎn):部署成本高2 Tomcat(公貓) Sun公司旗下產(chǎn)品優(yōu)點(diǎn):部署安裝方便,系統(tǒng)占有率低,主要的Servlet和JSP容器缺點(diǎn):功能少,無(wú)法滿足復(fù)雜業(yè)務(wù)場(chǎng)景

    nginx優(yōu)點(diǎn)

    1 高并發(fā)連接2 內(nèi)存消耗少3 穩(wěn)定性高

    3 Nginx 版本信息
    nginx官網(wǎng)有三個(gè)版本

    1 stable version 穩(wěn)定版(企業(yè)用)2 mainline version 開(kāi)發(fā)版(個(gè)人用)3 Legacy versions 歷史版

    4 Nginx功能特性
    1.處理靜態(tài)文件,索引文件以及自動(dòng)索引

    2.反向代理加速(無(wú)緩存),簡(jiǎn)單的負(fù)載均衡和容錯(cuò)3.FastCGI,簡(jiǎn)單的負(fù)載均衡和容錯(cuò)4.模塊化的結(jié)構(gòu)。過(guò)濾器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。在SSI過(guò)濾 器中,到同一個(gè) proxy 或者 FastCGI 的多個(gè)子請(qǐng)求并發(fā)處理5.SSL 和 TLS SNI 支持6.IMAP/POP3代理服務(wù)功7.使用外部 HTTP 認(rèn)證服務(wù)器重定向用戶到 IMAP/POP3 后端8.使用外部 HTTP 認(rèn)證服務(wù)器認(rèn)證用戶后連接重定向到內(nèi)部的 SMTP 后端

    5 Nginx主要功能
    1 nginx可作為HTTP代理服務(wù)和反向代理

    2 nginx可作為負(fù)載均衡3 nginx可作為Web緩存

    ————————————————
    版權(quán)聲明:本文為CSDN博主「VictoryKingLIU」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
    原文鏈接:https://blog.csdn.net/VictoryKingLIU/article/details/91784881

    28、keepalived是什么及作用?

    大神講解,點(diǎn)擊進(jìn)入

    29、haproxy是什么以及作用?

    HAProxy 是一款提供高可用性、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理軟件,支持虛擬主機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。

    HAProxy特別適用于那些負(fù)載特大的web站點(diǎn),這些站點(diǎn)通常又需要會(huì)話保持或七層處理。

    HAProxy運(yùn)行在時(shí)下的硬件上,完全可以支持?jǐn)?shù)以萬(wàn)計(jì)的 并發(fā)連接。

    并且它的運(yùn)行模式使得它可以很簡(jiǎn)單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。

    (作用: 高可用性,負(fù)載平衡和用于TCP和基于http的應(yīng)用程序的代理)
    原文鏈接:
    https://www.cnblogs.com/Rivend/p/12075870.html

    30、什么是負(fù)載均衡?

    Load balancing,即負(fù)載均衡,是一種計(jì)算機(jī)技術(shù),用來(lái)在多個(gè)計(jì)算機(jī)(計(jì)算機(jī)集群)、網(wǎng)絡(luò)連接、CPU、磁盤驅(qū)動(dòng)器或其他資源中分配負(fù)載,以達(dá)到最優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過(guò)載的目的。
    參考鏈接https://www.cnblogs.com/fanBlog/p/10936190.html

    31、什么是rpc及應(yīng)用場(chǎng)景?

    l鏈接地址:http://www.manongjc.com/article/72153.html

    32、簡(jiǎn)述 asynio模塊的作用和應(yīng)用場(chǎng)景。

    asyncio是Python 3.4版本引入的標(biāo)準(zhǔn)庫(kù),直接內(nèi)置了對(duì)異步IO的支持。
    asyncio的編程模型就是一個(gè)消息循環(huán)。我們從asyncio模塊中直接獲取一個(gè)EventLoop的引用,然后把需要執(zhí)行的協(xié)程扔到EventLoop中執(zhí)行,就實(shí)現(xiàn)了異步IO。

    作者:把早晨六點(diǎn)的太陽(yáng)留給我
    鏈接:https://www.jianshu.com/p/17fe7ab54263

    33、簡(jiǎn)述 gevent模塊的作用和應(yīng)用場(chǎng)景。

    當(dāng)一個(gè)greenlet遇到IO操作時(shí),比如訪問(wèn)網(wǎng)絡(luò),就自動(dòng)切換到其他的greenlet,等到IO操作完成,再在適當(dāng)?shù)臅r(shí)候切換回來(lái)繼續(xù)執(zhí)行。由于IO操作非常耗時(shí),經(jīng)常使程序處于等待狀態(tài),有了gevent為我們自動(dòng)切換協(xié)程,就保證總有g(shù)reenlet在運(yùn)行,而不是等待IO。
    由于切換是在IO操作時(shí)自動(dòng)完成,所以gevent需要修改Python自帶的一些標(biāo)準(zhǔn)庫(kù),這一過(guò)程在啟動(dòng)時(shí)通過(guò)monkey patch完成:

    作者:把早晨六點(diǎn)的太陽(yáng)留給我
    鏈接:https://www.jianshu.com/p/17fe7ab54263

    34、twisted框架的使用和應(yīng)用?

    Twisted是用Python實(shí)現(xiàn)的基于事件驅(qū)動(dòng)的網(wǎng)絡(luò)引擎框架,Twisted支持許多常見(jiàn)的傳輸及應(yīng)用層協(xié)議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一樣,Twisted也具有“內(nèi)置電池”(batteries-included)的特點(diǎn)。Twisted對(duì)于其支持的所有協(xié)議都帶有客戶端和服務(wù)器實(shí)現(xiàn),同時(shí)附帶有基于命令行的工具,使得配置和部署產(chǎn)品級(jí)的Twisted應(yīng)用變得非常方便。

    作者:把早晨六點(diǎn)的太陽(yáng)留給我
    鏈接:https://www.jianshu.com/p/17fe7ab54263

    總結(jié)

    以上是生活随笔為你收集整理的Python面试题(第二篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。