Python面試題(第二篇)

第二部分 網絡編程和并發(34題)

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

1、簡述 OSI 七層協議。

  1. 概念
    s
    Open System Interconnection : 開放互聯系統

  2. 圖示
    在這里插入圖片描述
    注:圖片來源:https://www.cnblogs.com/maybe2030/p/4781555.html#_label1,作者:Poll的筆記

3.粗淺理解

物理層:主要設備,中繼器、集線器,傳輸單位是比特(比特流),保證比特數據遠距離傳輸不會衰減,都能對數據進行再生和重定時。

數據鏈路層:主要設備,網卡,網橋,交換機,傳輸單位是幀,以太網協議為基礎進行傳輸。幀就是對字節的封裝,字節(byte)是由位(bit)組成的。

網絡層:主要設備,路由器,傳輸單位是報文(包),以IP協議為基礎進行傳輸,提供邏輯地址IP,選路,數據從源端到目的端的傳輸。

傳輸層:主要設備,網管,傳輸單位是數據段(段),以TCP/UDP協議為主,實現網絡不同主機上用戶進程之間的數據通信,可靠與不可靠的傳輸,傳輸層的錯誤檢驗,流量控制等。

會話層:傳輸單位是:數據,會話層管理主機之間的會話進程,即負責建立、管理、終止進程之間的會話。會話層還利用在數據中插入校驗點來實現數據的同步。如服務器驗證用戶登錄便是會話層完成額。

表示層:傳輸單位是:數據,表示層對上層數據或信息進行變換以保證一個主機應用層信息可以被另一個主機的應用程序理解。表示層的數據轉換包括數據的加密、壓縮、格式轉換等。

應用層:傳輸單位是:數據,為操作系統或網絡應用程序提供訪問網絡服務的接口。確定進程之間的性質以滿足用戶需求以及提供網絡與用戶的應用。

2、什么是C/S和B/S架構?

一、什么是C/S架構
C/S架構是第一種比較早的軟件架構,主要用于局域網內。也叫 客戶機/服務器模式。

它可以分為客戶機和服務器兩層:

第一層: 在客戶機系統上結合了界面顯示與業務邏輯;

第二層: 通過網絡結合了數據庫服務器。

簡單的說就是第一層是用戶表示層,第二層是數據庫層。

這里需要補充的是,客戶端不僅僅是一些簡單的操作,它也是會處理一些運算,業務邏輯的處理等。也就是說,客戶端也做著一些本該由服務器來做的一些事情,如圖所示:

在這里插入圖片描述
C/S架構軟件有一個特點,就是如果用戶要使用的話,需要下載一個客戶端,安裝后就可以使用。比如QQ,OFFICE軟件等。

1、C/S架構的優點:

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

2 安全性能可以很容易保證。(因為只有兩層的傳輸,而不是中間有很多層。

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

2、C/S架構的缺點:

可以將QQ作為類比:

1 適用面窄,通常用于局域網中。

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

3 維護成本高,發生一次升級,則所有客戶端的程序都需要改變。

二、什么是B/S架構
B/S架構的全稱為Browser/Server,即瀏覽器/服務器結構。

Browser指的是Web瀏覽器,極少數事務邏輯在前端實現,但主要事務邏輯在服務器端實現。

B/S架構的系統無須特別安裝,只有Web瀏覽器即可。

其實就是我們前端現在做的一些事情,大部分的邏輯交給后臺來實現,我們前端大部分是做一些數據渲染,請求等比較少的邏輯。

B/S架構的分層:

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

第一層表現層:主要完成用戶和后臺的交互及最終查詢結果的輸出功能。

第二層邏輯層:主要是利用服務器完成客戶端的應用邏輯功能。

第三層數據層:主要是接受客戶端請求后獨立進行各種運算。

如圖所示:
在這里插入圖片描述

B/S架構的優點:

1、客戶端無需安裝,有Web瀏覽器即可。
2、BS架構可以直接放在廣域網上,通過一定的權限控制實現多客戶訪問的目的,交互性較強。
3、BS架構無需升級多個客戶端,升級服務器即可。可以隨時更新版本,而無需用戶重新下載啊什么的。

B/S架構的缺點:

1、在跨瀏覽器上,BS架構不盡如人意。
2、表現要達到CS程序的程度需要花費不少精力。
3、在速度和安全性上需要花費巨大的設計成本,這是BS架構的最大問題。
4、客戶端服務器端的交互是請求-響應模式,通常需要刷新頁面,這并不是客戶樂意看到的。(在Ajax風行后此問題得到了一定程度的緩解)

三、B/S架構的幾種形式
第一種:客戶端-服務器-數據庫
在這里插入圖片描述
這個應該是我們平時比較常用的一種模式:

1、客戶端向服務器發起Http請求

2、服務器中的web服務層能夠處理Http請求

3、服務器中的應用層部分調用業務邏輯,調用業務邏輯上的方法

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

第二種:客戶端-web服務器-應用服務器-數據庫
在這里插入圖片描述
類似于第一種方法,只是將web服務和應用服務解耦

1 客戶端向web服務器發起Http請求

2 web服務能夠處理Http請求,并且調用應用服務器暴露在外的RESTFUL接口

3 應用服務器的RESTFUL接口被調用,會執行對應的暴露方法.如果有必要和數據庫進行數據交互,應用服務器會和數據庫進行交互后,將json數據返回給web服務器

4 web服務器將模版+數據組合渲染成html返回給客戶端

第三種方法:客戶端-負載均衡器(Nginx)-中間服務器(Node)-應用服務器-數據庫

這種模式一般用在有大量的用戶,高并發的應用中。
在這里插入圖片描述
1、整正暴露在外的不是真正web服務器的地址,而是負載均衡器器的地址

2、客戶向負載均衡器發起Http請求

3、負載均衡器能夠將客戶端的Http請求均勻的轉發給Node服務器集群

4、Node服務器接收到Http請求之后,能夠對其進行解析,并且能夠調用應用服務器暴露在外的RESTFUL接口

5、應用服務器的RESTFUL接口被調用,會執行對應的暴露方法.如果有必要和數據庫進行數據交互,應用服務器會和數據庫進行交互后,將json數據返回給Node

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

7、反向代理服務器將對應html返回給客戶端

Nginx的優點有:

1、它能夠承受、高并發的大量的請求,然后將這些請求均勻的轉發給內部的服務器,分攤壓力.

2、反向代理能夠解決跨域引起的問題,因為Nginx,Node,應用服務器,數據庫都處于內網段中。

3、Nginx非常擅長處理靜態資源(img,css,js,video),所以也經常作為靜態資源服務器,也就是我們平時所說的CDN

比如:前一個用戶訪問index.html, 經過Nginx-Node-應用服務器-數據庫鏈路之后,Nginx會把index.html返回給用戶,并且會把index.html緩存在Nginx上,

下一個用戶再想請求index.html的時候,請求Nginx服務器,Nginx發現有index.html的緩存,于是就不用去請求Node層了,會直接將緩存的頁面(如果沒過期的話)返回給用戶。

四、發展前景

1、 C/S和B/S各有優勢,C/S在圖形的表現能力上以及運行的速度上肯定是強于B/S模式的,不過缺點就是他需要運行專門的客戶端,而且更重要的是它不能跨平臺,用c++在windows下寫的程序肯定是不能在linux下跑的。

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

3、簡述 三次握手、四次揮手的流程。

TCP三次握手與四次揮手過程
首先,客戶端與服務器均處于未連接狀態,并且是客戶端主動向服務器請求建立連接:

客戶端將報文段中的SYN=1,并選擇一個seq=x,(即該請求報文的序號為x) 將這個報文發送到服務器。此時,客戶端進入同步已發送狀態(SYN-SEND).SYN報文段不能攜帶數據,但是要消耗掉一個序號。
服務器收到請求報文后,若同意建立連接,則回復報文中,SYN=1,ACK=1,并選擇一個seq = y,且報文中確認號為x+1,序號為y .此時服務器進入同步已接收狀態(SYN-RCVD)

客戶端收到服務器的同步確認后,對服務器發送確認的確認。將ACK=1,確認號為y+1,而報文首部的序號為x+1,將該報文發出后,客戶端進入已連接狀態(ESTABLISHED)。

服務器收到客戶端的確認后,也進入已連接狀態。
以上即三次握手

為何使用三次握手機制:
假設如下異常情況:

客戶端向服務器發送了第一條請求報文,但是該報文并未在網絡中被丟棄,而是長時間阻滯在某處,而客戶端收不到服務器確認,以為該報文丟失,于是重新發送該報文,這次的報文成功到達服務器,如果不使用三次握手,則服務器只需對該報文發出確認,就建立了一個連接。而在這個連接建立,并釋放后,第一次發送的,阻滯在網絡中的報文到達了服務器,服務器以為是客戶端又重新發送了一個連接請求(實際上在客戶端那里,該連接早已失效),就又向客戶端發送一個確認,但客戶端認為他沒有發送該請求報文,因此不理睬服務器發送的確認,而服務器以為又建立了一個新的連接,于是一直等待A發來數據,造成了服務器資源的浪費,并且會產生安全隱患。因此,若使用三次握手機制,服務器發送了該確認后,收不到客戶端的確認,也就知道并沒有建立連接,因此不會將資源浪費在這種沒有意義的等待上。
在這里插入圖片描述
在這里插入圖片描述

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

連接的釋放較連接的建立復雜。

現假設客戶端與服務器均處于連接建立狀態,客戶端主動斷開連接:

1.客戶端向服務器發送FIN報文:FIN=1,序號seq=上一個最后傳輸的字節序號+1=u,發送后,客戶端進入FIN-WAIT-1狀態。

2.服務器接收到該報文后,發送一個確認報文:令ACK=1,確認序號ack = u+1,自己的報文序號seq=v,發送后,服務器進入CLOSE-WAIT狀態。

3.此時TCP連接進入連接半關閉狀態,服務器可能還會向客戶端發送一些數據。

4.客戶端收到來自服務器的確認之后,進入FIN-WAIT-2狀態。等待服務器發送連接釋放報文。

5.如果服務器已經沒有要發送的數據,則釋放TCP連接,向客戶端發送報文:令FIN=1,ACK=1,確認號ack =u+1,自己的序號seq = w(w可能等于v也可能大于v),服務器進入LAST-ACK狀態。

6.客戶端收到服務器的連接釋放報文后,對該報文發出確認,令ACK=1,確認號ack=w+1,自己的序號seq=u+1,發送此報文后,等待2個msl時間后,進入CLOSED狀態。

7.服務器收到客戶端的確認后,也進入CLOSED狀態并撤銷傳輸控制塊。

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

服務器狀態變化:未連接----->SYN-RCVD----->ESTABLISHED----->CLOSE-WAIT----->LAST-ACK----->CLOSED

通俗描述3次握手就是

A對B說:我的序號是x,我要向你請求連接;(第一次握手,發送SYN包,然后進入SYN-SEND狀態)

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

A聽到B說同意建立連接之后,對A說:與確認你同意與我連接(ack=y+1,ACK=1,seq=x+1)。(第三次握手,A已進入ESTABLISHED狀態)

B聽到A的確認之后,也進入ESTABLISHED狀態。

描述四次揮手就是:

1.A與B交談結束之后,A要結束此次會話,對B說:我要關閉連接了(seq=u,FIN=1)。(第一次揮手,A進入FIN-WAIT-1)

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

3.A收到B的確認后,等了一段時間,因為B可能還有話要對他說。(此時A進入FIN-WAIT-2)

4.B說完了他要說的話(只是可能還有話說)之后,對A說,我要關閉連接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次揮手)
5.A收到B要結束連接的消息后說:已收到你要關閉連接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次揮手,然后A進入CLOSED)
6.B收到A的確認后,也進入CLOSED。
在這里插入圖片描述
最簡單的理解
一:建立TCP連接:三次握手協議

客戶端:我要對你講話,你能聽到嗎;
服務端:我能聽到;而且我也要對你講話,你能聽到嗎;
客戶端:我也能聽到。
…….
互相開始通話
………

二:關閉TCP連接:四次握手協議

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

4、什么是arp協議?

鏈接地址點擊進入

5、TCP和UDP的區別?

鏈接地址點擊進入

6、什么是局域網和廣域網?

正如題目所問,平時我們經常會聽到這些熟悉的名詞,但是當別人問我們他們之間到底有什么區別時,卻發現自己也解釋不清楚,不知道怎么去回答。下面本文將去探索他們是什么,相互之間有什么區別。

局域網:(Local Area Network,LAN), 局域網是一個局部范圍的計算組,比如家庭網絡就是一個小型的局域網,里面包含電腦、手機和平板等,他們共同連接到你家的路由器上。又比如學校的機房就是一個局域網,里面有幾百幾千臺電腦,當機房無法上外網時,但是電腦之間仍可以通信,你們可以通過這個局域網來打CS 、玩紅警。理論上,局域網是封閉的,并不可以上外網,可以只有兩臺電腦,也可以有上萬臺。

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

以太網:(Ethernet),以太網可以看成是一種實現局域網通信的技術標準,是目前最廣泛的局域網技術。以太網的運行速率有10Mbps,100Mbps,1Gbps,10Gbps的,它的傳輸介質有的是雙絞線,有的是光纖。 簡單的說,以太網就是在局域網內,把附近的設備連接起來,可以進行通訊。

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

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

tcp協議一定是先建好雙向鏈接,發一個數據包要得到確認才算發送完成,沒有收到就一直給你重發;udp協議沒有鏈接存在,udp直接丟數據,不管你有沒有收到。

TCP的可靠保證,是它的三次握手雙向機制,這一機制保證校驗了數據,保證了他的可靠性。

而UDP就沒有了,udp信息發出后,不驗證是否到達對方,所以不可靠。

不過UDP的速度是TCP比不了的,而且UDP的反應速度更快,QQ就是用UDP協議傳輸的,HTTP是用TCP協議傳輸的,不用我說什么,自己體驗一下就能發現區別了。

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

8、什么是socket?簡述基于tcp協議的套接字通信流程。

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

可以用來實現不同虛擬機或不同計算機之間的通信。

在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,并綁定到一個端口上,不同的端口對應于不同的服務。

基于tcp 協議的套接字通信流程:

1). 服務器先用 socket 函數來建立一個套接字,用這個套接字完成通信的監聽。
2). 用 bind 函數來綁定一個端口號和 IP 地址。因為本地計算機可能有多個網址和 IP,每一個 IP 和端口有多個端口。需要指定一個 IP 和端口進行監聽。
3). 服務器調用 listen 函數,使服務器的這個端口和 IP 處于監聽狀態,等待客戶機的連接。
4). 客戶機用 socket 函數建立一個套接字,設定遠程 IP 和端口。
5). 客戶機調用 connect 函數連接遠程計算機指定的端口。
6). 服務器用 accept 函數來接受遠程計算機的連接,建立起與客戶機之間的通信。
7). 建立連接以后,客戶機用 write 函數向 socket 中寫入數據。也可以用 read 函數讀取服務器發送來的數據。
8). 服務器用 read 函數讀取客戶機發送來的數據,也可以用 write 函數來發送數據。
9). 完成通信以后,用 close 函數關閉 socket 連接。

注:搬運與 https://www.cnblogs.com/Rivend/p/12047299.html

9、什么是粘包?socket 中造成粘包的原因是什么?哪些情況會發生粘包現象?

只有TCP有粘包現象,UDP永遠不會粘包!

粘包:在接收數據時,一次性多接收了其它請求發送來的數據(即多包接收)。如,對方第一次發送hello,第二次發送world,
   在接收時,應該收兩次,一次是hello,一次是world,但事實上是一次收到helloworld,一次收到空,這種現象叫粘包。

原因
粘包問題主要還是因為接收方不知道消息之間的界限,不知道一次性提取多少字節的數據所造成的。

什么情況會發生:

1、發送端需要等緩沖區滿才發送出去,造成粘包(發送數據時間間隔很短,數據很小,會合到一起,產生粘包)

2、接收方不及時接收緩沖區的包,造成多個包接收(客戶端發送了一段數據,服務端只收了一小部分,服務端下次再收的時候還是從緩沖區拿上次遺留的數據,產生粘包)

解決方案:

一個思路是發送之前,先打個招呼,告訴對方自己要發送的字節長度,這樣對方可以根據長度判斷什么時候終止接受。
注:搬運與 https://www.cnblogs.com/Rivend/p/12047330.html
參考鏈接:點擊進入https://blog.csdn.net/Nice07/article/details/83515660

10、IO多路復用的作用?

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

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

一、防火墻的基本概念

古時候,人們常在寓所之間砌起一道磚墻,一旦火災發生,它能夠防止火勢蔓延到別的寓所。

現在,如果一個網絡接到了Internet上面,它的用戶就可以訪問外部世界并與之通信。但同時,外部世界也同樣可以訪問該網絡并與之交互。

為安全起見,可以在該網絡和Internet之間插入一個中介系統,豎起一道安全屏障。

這道屏障的作用是阻斷來自外部通過網絡對本網絡的威脅和入侵,提供扼守本網絡的安全和審計的唯一關卡,它的作用與古時候的防火磚墻有類似之處,因此我們把這個屏障就叫做“防火墻”。

在電腦中,防火墻是一種裝置,它是由軟件或硬件設備組合而成,通常處于企業的內部局域網與Internet之間,限制Internet用戶對內部網絡的訪問以及管理內部用戶訪問外界的權限。

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

防火墻是一種被動的技術,因為它假設了網絡邊界的存在,它對內部的非法訪問難以有效地控制。因此防火墻只適合于相對獨立的網絡,例如企業內部的局域網絡等。

1.過濾不安全服務

基于這個準則,防火墻應封鎖所有信息流,然后對希望提供的安全服務逐項開放,對不安全的服務或可能有安全隱患的服務一律扼殺在萌芽之中。

這是一種非常有效實用的方法,可以造成一種十分安全的環境,因為只有經過仔細挑選的服務才能允許用戶使用。

2.過濾非法用戶和訪問特殊站點

基于這個準則,防火墻應先允許所有的用戶和站點對內部網絡的訪問,然后網絡管理員按照IP地址對未授權的用戶或不信任的站點進行逐項屏蔽。

這種方法構成了一種更為靈活的應用環境,網絡管理員可以針對不同的服務面向不同的用戶開放,也就是能自由地設置各個用戶的不同訪問權限。
參考鏈接:https://www.cnblogs.com/Rivend/p/12052499.html

12、select、poll、epoll 模型的區別?

POLL模型

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

功能:用來創建epoll實例,,創建一個epoll的句柄。(注意:最后要關閉epoll的句柄)

參數size:當創建好這個句柄后,它就是會占用一個fd值,在linux下如果查看/proc/進程id/fd/,是能夠看到這個fd的,所以在使用完epoll后,必須調用close()關閉,否則可能導致fd被耗盡。

函數描述:epoll_create返回的是一個文件描述符,也就是說epoll是以特殊文件的方式體現給用戶,size提示操作系統,用戶可能使用多少個文件描述符,該參數已廢棄,填寫一個大于0的正整數

返回值:大于0:成功,-1:出錯

epoll_ctl
功能:用來增加或移除被epoll所監聽的文件描述符,epoll的事件注冊函數(epoll在這里先注冊要監聽的事件類型)

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

op:EPOLL_CTL_ADD向epoll監聽集合當中添加socket描述符

EPOLL_CTL_DEL從epoll監聽當中刪除socket描述符

EPOLL_CTL_MOD修改

fd socket描述符,對TCP來說就是accept函數的返回值

event 在向epoll監聽集合當中添加socket描述符的同時,為描述符綁定一個觸發事件

event可以是以下宏的集合:

EPOLLIN:表示對應的文件描述符可以讀(包括對端socket正常關閉)

EPOLLOUT:表示對應的文件描述符可以寫;

EPOLLPRI:表示對應的文件描述符有緊急的數據可以讀

EPOLLERR:表示對應的文件描述符發生錯誤

EPOLLHUP:表示對應的文件描述符被掛斷

EPOLLET:將EPOLL設為邊緣觸發模式,這是相對于水平觸發來說的

EPOLLONESHOT:只監聽一次事件,當監聽完這次事件之后,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到EPOLL隊列里。

返回值:0:成功 -1:出錯

epoll_wait

功能:用來等待發生在監聽描述符上的事件的產生,類似于select調用。(等待epfd_所代表的epoll實例中監聽的事件發生,events指針返回已經準備好的事件,最多有maxevents個,參數maxevents必須大于零)

參數:epfd:標識epoll的文件描述符

     events:用來從內核得到事件的集合maxevents:告知內核這個events有多大,這個maxevents的值不能大于創建epoll—_create()時的sizetimeout:是超時時間

返回值:return>0,發生事件個數 =0 時間到 -1 出錯

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

epoll的優點:

1、支持一個進程打開大數目的socket描述符(FD)

select最不能忍受的是一個進程所打開的FD是有一定限制的,由FD_SETSIZE設置,默認值是1024,對于那些需要支持的上萬連接數目的IM服務器來說顯然太少了。不過epoll則沒有這個限制,它所支持的FD上限是最大可以打開文件的數目,這個數字遠大于1024,比如,在1GB內存的機器上大約是10萬左右,具體數目可以cat/pro/sys/fs/file-max查看,一般來說這個數目和系統內存關系很大。

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

傳統的select/poll另一個致命弱點就是當你擁有一個很大的socket集合,不過由于網絡延時,任一時間只有部分的socket是“活躍”的,但是select/poll每次調用都會線性掃描全部的集合,導致效率呈現線性下降,而epoll不存在此問題。

3.使用mmap加速內核與用戶空間的消息傳遞

epoll是通過內核于用戶空間mmap同一塊內存實現的

epoll、poll、select三者的區別與比較:

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

select,poll每次調用都要把fd集合從用戶態網內核態拷貝一次,而epoll只要拷貝一次。

下面列出如下表格來進行比較:
在這里插入圖片描述

總結:I/O多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒,能夠通知程序進行相應的讀寫操作。select、poll、epoll都是I/O多路復用的機制。但select、poll、epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負責進行讀寫,異步I/O的實現會負責把數據從內核拷貝到用戶空間。
————————————————
版權聲明:本文為CSDN博主「weixin_42904113」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42904113/article/details/97647412

13、簡述 進程、線程、協程的區別 以及應用場景?

1.進程是計算器最小資源分配單位 .

2.線程是CPU調度的最小單位 .

3.進程切換需要的資源很最大,效率很低 .

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

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

6.多進程、多線程根據cpu核數不一樣可能是并行的,但是協程是在一個線程中 所以是并發.

進程:

一個運行的程序(代碼)就是一個進程,沒有運行的代碼叫程序,進程是系統資源分配的最小單位,進程擁有自己獨立的內存空間,所以進程間數據不共享,開銷大。

線程:

調度執行的最小單位,也叫執行路徑,不能獨立存在,依賴進程存在一個進程至少有一個線程,叫主線程,而多個線程共享內存(數據共享,共享全局變量),從而極大地提高了程序的運行效率。

協程:

是一種用戶態的輕量級線程,協程的調度完全由用戶控制。

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

協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操作棧則基本沒有內核切換的開銷,

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

14、GIL鎖是什么鬼?

全局解釋鎖,每次只能一個線程獲得cpu的使用權:為了線程安全,也就是為了解決多線程之間的數據完整性和狀態同步而加的鎖,因為我們知道線程之間的數據是共享的。

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

15、Python中如何使用線程池和進程池?

為什么要有進程池?進程池的概念。

在程序實際處理問題過程中,忙時會有成千上萬的任務需要被執行,閑時可能只有零星任務。

那么在成千上萬個任務需要被執行的時候,我們就需要去創建成千上萬個進程么?首先,創建進程需要消耗時間,銷毀進程也需要消耗時間。

第二即便開啟了成千上萬的進程,操作系統也不能讓他們同時執行,這樣反而會影響程序的效率。

因此我們不能無限制的根據任務開啟或者結束進程。那么我們要怎么做呢?

在這里,要給大家介紹一個進程池的概念,定義一個池子,在里面放上固定數量的進程,有需求來了,就拿一個池中的進程來處理任務,

等到處理完畢,進程并不關閉,而是將進程再放回進程池中繼續等待任務。如果有很多任務需要執行,池中的進程數量不夠,任務就要等待之前的進程執行任務完畢歸來,

拿到空閑進程才能繼續執行。也就是說,池中進程的數量是固定的,那么同一時間最多有固定數量的進程在運行。這樣不會增加操作系統的調度難度,還節省了開閉進程的時間,也一定程度上能夠實現并發效果。

from multiprocessing import Pool
from multiprocessing import Process
import time
import osdef func(n):print("子進程開始: %s"%n, os.getpid())time.sleep(1)print("子進程結束: %s" % n, os.getpid())if __name__ == "__main__":# 開啟了5個進程pool = Pool(5)for i in range(10):# 正常情況下先執行5個start 后執行5個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 = []# 定義一個線程池(默認 不要超過cup個數*5)
tpool = ThreadPoolExecutor(max_workers=5)for i in range(20):# 傳值(開啟20個子線程)t = tpool.submit(func, i)t_lst.append(t)# 相當于 close + join
tpool.shutdown()print("主線程")for t in t_lst:# t.result() 接受返回值print("\033[31m ==== \033[0m", t.result())

16、threading.local的作用?

**threading.local()這個方法的特點用來保存一個全局變量,但是這個全局變量只有在當前線程才能訪問,如果你在開發多線程應用的時候 需要每個線程保存一個單獨的數據供當前線程操作,可以考慮使用這個方法,簡單有效。**舉例:每個子線程使用全局對象a,但每個線程定義的屬性a.xx是該線程獨有的,Python提供了 threading.local 類,將這個類實例化得到一個全局對象,但是不同的線程使用這個對象存儲的數據其它線程不可見(本質上就是不同的線程使用這個對象時為其創建一個獨立的字典)。

基本概念:同一進程內的內存棧是全局的。

threading.local本質上是對全局字典對象管理類的一個封裝,

內部自動為每個線程維護一個空間(字典),用于當前存取屬于自己的值。保證線程之間的數據隔離。

主要的目的是線程之間的數據隔離。

當然,自己寫也不是不可以,但開發的一個宗旨是不必重復造輪子。

案例源碼:

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()

實質上local.val = n等效于local._local__impl.dicts[‘thread_id’][‘val’] = n

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

17、進程之間如何進行通信?

1、管道
我們來看一條 Linux 的語句

netstat -tulnp | grep 8080

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

并且這種通信方式是單向的,只能把第一個命令的輸出作為第二個命令的輸入,如果進程之間想要互相通信的話,那么需要創建兩個管道。

居然有匿名管道,那也意味著有命名管道,下面我們來創建一個命名管道。

mkfifo  test

這條命令創建了一個名字為 test 的命名管道。

接下來我們用一個進程向這個管道里面寫數據,然后有另外一個進程把里面的數據讀出來。

echo "this is a pipe" > test   // 寫數據

這個時候管道的內容沒有被讀出的話,那么這個命令就會一直停在這里,只有當另外一個進程把 test 里面的內容讀出來的時候這條命令才會結束。接下來我們用另外一個進程來讀取

cat < test  // 讀數據

我們可以看到,test 里面的數據被讀取出來了。上一條命令也執行結束了。

從上面的例子可以看出,管道的通知機制類似于緩存,就像一個進程把數據放在某個緩存區域,然后等著另外一個進程去拿,并且是管道是單向傳輸的。

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

所以管道不適合頻繁通信的進程。當然,他也有它的優點,例如比較簡單,能夠保證我們的數據已經真的被其他進程拿走了。我們平時用 Linux 的時候,也算是經常用。

2、消息隊列
那我們能不能把進程的數據放在某個內存之后就馬上讓進程返回呢?無需等待其他進程來取就返回呢?

答是可以的,我們可以用消息隊列的通信模式來解決這個問題,例如 a 進程要給 b 進程發送消息,只需要把消息放在對應的消息隊列里就行了,b 進程需要的時候再去對應的
消息隊列里取出來。同理,b 進程要個 a 進程發送消息也是一樣。這種通信方式也類似于緩存吧。

這種通信方式有缺點嗎?答是有的,如果 a 進程發送的數據占的內存比較大,并且兩個進程之間的通信特別頻繁的話,消息隊列模型就不大適合了。因為 a 發送的數據很大的話,意味**發送消息(拷貝)**這個過程需要花很多時間來讀內存。

哪有沒有什么解決方案呢?答是有的,請繼續往下看。

3、共享內存
共享內存這個通信方式就可以很好著解決拷貝所消耗的時間了。

這個可能有人會問了,每個進程不是有自己的獨立內存嗎?兩個進程怎么就可以共享一塊內存了?

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

4、信號量
共享內存最大的問題是什么?沒錯,就是多進程競爭內存的問題,就像類似于我們平時說的線程安全問題。如何解決這個問題?這個時候我們的信號量就上場了。

信號量的本質就是一個計數器,用來實現進程之間的互斥與同步。例如信號量的初始值是 1,然后 a 進程來訪問內存1的時候,我們就把信號量的值設為 0,然后進程b 也要來訪問內存1的時候,看到信號量的值為 0 就知道已經有進程在訪問內存1了,這個時候進程 b 就會訪問不了內存1。所以說,信號量也是進程之間的一種通信方式。

5、Socket
上面我們說的共享內存、管道、信號量、消息隊列,他們都是多個進程在一臺主機之間的通信,那兩個相隔幾千里的進程能夠進行通信嗎?

答是必須的,這個時候 Socket 這家伙就派上用場了,例如我們平時通過瀏覽器發起一個 http 請求,然后服務器給你返回對應的數據,這種就是采用 Socket 的通信方式了。

總結
所以,進程之間的通信方式有:

1、管道
2、消息隊列
3、共享內存
4、信號量
5、Socket

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

18、什么是并發和并行?

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

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

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

并發(Concurrent),
在操作系統中,是指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行。

就想前面提到的操作系統的時間片分時調度。打游戲和聽音樂兩件事情在同一個時間段內都是在同一臺電腦上完成了從開始到結束的動作。那么,就可以說聽音樂和打游戲是并發的。

并行
并行(Parallel),當系統有一個以上CPU時,當一個CPU執行一個進程時,另一個CPU可以執行另一個進程,兩個進程互不搶占CPU資源,可以同時進行,這種方式我們稱之為并行(Parallel)。

這里面有一個很重要的點,那就是系統要有多個CPU才會出現并行。在有多個CPU的情況下,才會出現真正意義上的『同時進行』。

并發與并行
我們兩個人在吃午飯。你在吃飯的整個過程中,吃了米飯、吃了蔬菜、吃了牛肉。吃米飯、吃蔬菜、吃牛肉這三件事其實就是并發執行的。

對于你來說,整個過程中看似是同時完成的的。但其實你是在吃不同的東西之間來回切換的。

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

我們兩個人之間的吃飯就是并行的。兩個人之間可以在同一時間點一起吃牛肉,或者一個吃牛肉,一個吃蔬菜。之間是互不影響的。

在這里插入圖片描述
所以,并發是指在一段時間內宏觀上多個程序同時運行。并行指的是同一個時刻,多個任務確實真的在同時運行。

并發和并行的區別

并發,指的是多個事情,在同一時間段內同時發生了。

并行,指的是多個事情,在同一時間點上同時發生了。

并發的多個任務之間是互相搶占資源的。

并行的多個任務之間是不互相搶占資源的、

只有在多CPU的情況中,才會發生并行。否則,看似同時發生的事情,其實都是并發執行的。

在這里插入圖片描述

19、進程鎖和線程鎖的作用?

線程鎖:
 多線程可以同時運行多個任務但是當多個線程同時訪問共享數據時,可能導致數據不同步,甚至錯誤! so,不使用線程鎖, 可能導致錯誤

大家都不陌生,主要用來給方法、代碼塊加鎖。當某個方法或者代碼塊使用鎖時,那么在同一時刻至多僅有有一個線程在執行該段代碼。

當有多個線程訪問同一對象的加鎖方法/代碼塊時,同一時間只有一個線程在執行,其余線程必須要等待當前線程執行完之后才能執行該代碼段。但是,其余線程是可以訪問該對象中的非加鎖代碼塊的。

進程鎖:
也是為了控制同一操作系統中多個進程訪問一個共享資源,

只是因為程序的獨立性,各個進程是無法控制其他進程對資源的訪問的,

但是可以使用本地系統的信號量控制(操作系統基本知識)

優點:保證資源同步
缺點:有等待肯定會慢
原文鏈接:w.cnblogs.com/Rivend/p/12058156.html

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

在IO和網絡編程中,我們經常看到幾個概念:同步、異步、阻塞、非阻塞。

同步和異步
  同步和異步是針對應用程序和內核的交互而言的,同步指的是用戶進程觸發IO 操作并等待或者輪詢的去查看IO 操作是否就緒,而異步是指用戶進程觸發IO 操作以后便開始做自己的事情,而當IO 操作已經完成的時候會得到IO 完成的通知。

阻塞和非阻塞
  阻塞和非阻塞是針對于進程在訪問數據的時候,根據IO操作的就緒狀態來采取的不同方式,說白了是一種讀取或者寫入操作方法的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入方法會立即返回一個狀態值。

理解方式
  乍一看這四個概念的解釋會瞬間感到頭大,也經常講同步異步等同于阻塞非阻塞,其實,區分他們非常簡單。

同步異步與阻塞非阻塞的主要區別是針對對象不同。

同步異步是針對調用者來說的,調用者發起一個請求后,一直干等被調用者的反饋就是同步,不必等去做別的事就是異步。
  阻塞非阻塞是針對被調用者來說的,被調用者收到一個請求后,做完請求任務后才給出反饋就是阻塞,收到請求直接給出反饋再去做任務就是非阻塞。

在公交站等公交

對調用者-乘客而言:

1,一直干望著公交來的方向,就是同步。

2,不望著公交來的方向,掏出筆記本改bug,聽公交站廣播是否到車,就是異步。

對被動用者-公交系統而言:

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

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

21、路由器和交換機的區別?

第一,使用交換機上網是分別撥號,各自使用自己的寬帶賬號,大家上網互不影響。而路由器是共用一個寬帶賬號,大家上網會相互影響。

第二,交換機工作在中繼層,交換機根據MAC地址尋址。路由器工作在網絡層,根據IP地址尋址。

第三,交換機可以使連接它的多臺電腦組成局域網,如果還有代理服務器的話還可以實現同時上網功能,但是交換機沒有路由器的自動識別數據包發送和到達地址的功能。

第四,路由器提供了防火墻的服務。路由器僅僅轉發特定地址的數據包,不傳送不支持路由協議的數據包傳送。

22、什么是域名解析?

域名解析也稱為域名指向、服來務器設置、域名配置、反向ip注冊等。簡單地說,將一個可記憶的域名解析為一個ip,服務由dns服務器完成,dns服務器將域名解析為一個ip地址,并將一個子目錄綁定到ip地址主機上知的域名。

域名解析就像在移動電話上使用對方的姓名來表示對方的電話號碼一樣,因為它很容易記道住。Dns是文本到ip號碼的解析。
域名解析的過程詳解

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

1.window7修改本地hosts文件

# window7系統hosts文件位置
C:\Windows\System32\drivers\etc

在這里插入圖片描述
2.linux

# linux系統hosts文件位置
[root@localhost etc]# cat /etc/hosts

在這里插入圖片描述

24、生產者消費者模型應用場景及優勢?

在 工作中,大家可能會碰到這樣一種情況:某個模塊負責產生數據,這些數據由另一個模塊來負責處理(此處的模塊是廣義的,可以是類、函數、線程、進程等)。

產 生數據的模塊,就形象地稱為生產者;而處理數據的模塊,就稱為消費者。

在生產者與消費者之間在加個緩沖區,我們形象的稱之為倉庫,生產者負責往倉庫了進商 品,而消費者負責從倉庫里拿商品,這就構成了生產者消費者模型。

結構圖如下:
在這里插入圖片描述
生產者消費者模型的優點:

1、解耦

假設生產者和消費者分別是兩個類。

如果讓生產者直接調用消費者的某個方法,那么生產者對于消費者就會產生依賴(也就是耦合)。

將來如果消費者的代碼發生變化, 可能會影響到生產者。而如果兩者都依賴于某個緩沖區,兩者之間不直接依賴,耦合也就相應降低了。

舉個例子,我們去郵局投遞信件,如果不使用郵筒(也就是緩沖區),你必須得把信直接交給郵遞員。

有同學會說,直接給郵遞員不是挺簡單的嘛?其實不簡單,你必須 得認識誰是郵遞員,才能把信給他(光憑身上穿的制服,萬一有人假冒,就慘了)。

這就產生和你和郵遞員之間的依賴(相當于生產者和消費者的強耦合)。

萬一哪天郵遞員換人了,你還要重新認識一下(相當于消費者變化導致修改生產者代碼)。

而郵筒相對來說比較固定,你依賴它的成本就比較低(相當于和緩沖區之間的弱耦合)。

2、支持并發

由于生產者與消費者是兩個獨立的并發體,他們之間是用緩沖區作為橋梁連接,生產者只需要往緩沖區里丟數據,

就可以繼續生產下一個數據,而消費者只需要從緩沖區了拿數據即可,這樣就不會因為彼此的處理速度而發生阻塞。

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

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

3、支持忙閑不均

緩沖區還有另一個好處。如果制造數據的速度時快時慢,緩沖區的好處就體現出來了。

當數據制造快的時候,消費者來不及處理,未處理的數據可以暫時存在緩沖區中。 等生產者的制造速度慢下來,消費者再慢慢處理掉。

為了充分復用,我們再拿寄信的例子來說事。假設郵遞員一次只能帶走1000封信。萬一某次碰上情人節(也可能是圣誕節)送賀卡,

需要寄出去的信超過1000封,這時 候郵筒這個緩沖區就派上用場了。郵遞員把來不及帶走的信暫存在郵筒中,等下次過來 時再拿走。

應用場景:

使用多線程,在做爬蟲的時候,生產者用著產生url鏈接,消費者用于獲取url數據,在隊列的幫助下可以使用多線程加快爬蟲速度。

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的全稱是內容分發網絡,比如我們客戶端向服務器請求一個數據,當這個數據很大,請求頻繁,而且服務器距離客戶端很遠這樣是不是很浪費資源,浪費大量的帶寬,嚴重時候還會造成網絡阻塞。而且這樣響應時間非常慢。

   CDN主要由負載均衡,和高速緩存服務器組成。其中分為中心部分和邊緣部分。中心部分就是負責全局負載均衡,當客戶端發送請求,首先會訪問中心CDN,經過全局負載均衡,根據用戶請求的ip 地址,一定的算法,然后算出距離用戶最近,用戶接入量最少得CDN緩存服務器,這樣是不是相當于走了捷徑。因為cdn是介于客戶端和請求服務器之間的一個緩存服務器,有一點點像redis緩存。當然第一次請求的時候,cdn沒有緩存的話,cdn也會請求一次服務器,然后根據服務器返回的數據一方面留給自己緩存作為備用,另一方面也返回給客戶端,好像現在像騰訊網,阿里云都有提供cdn服務器。而且域名配置服務器時候,就可以配到cdn。而且現在應用也很多,比如網絡教學,金融,證券,不允許有過多延遲和數據較大的應用。這就是我大致了解的cdn ,content delivery network ,內容分發網絡。CDN的全稱是Content Delivery Network,即內容分發網絡。其基本思路是盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度。

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

CDN的網絡架構

CDN網絡架構主要由兩大部分,分為中心和邊緣兩部分,中心指CDN網管中心和DNS重定向解析中心,負責全局負載均衡,設備系統安裝在管理中心機房,邊緣主要指異地節點,CDN分發的載體,主要由Cache和負載均衡器等組成。

當用戶訪問加入CDN服務的網站時,域名解析請求將最終交給全局負載均衡DNS進行處理。全局負載均衡DNS通過一組預先定義好的策略,將當時最接近用戶的節點地址提供給用戶,使用戶能夠得到快速的服務。同時,它還與分布在世界各地的所有CDNC節點保持通信,搜集各節點的通信狀態,確保不將用戶的請求分配到不可用的CDN節點上,實際上是通過DNS做全局負載均衡。

對于普通的Internet用戶來講,每個CDN節點就相當于一個放置在它周圍的WEB。通過全局負載均衡DNS的控制,用戶的請求被透明地指向離他最近的節點,節點中CDN服務器會像網站的原始服務器一樣,響應用戶的請求。由于它離用戶更近,因而響應時間必然更快。

每個CDN節點由兩部分組成:負載均衡設備和高速緩存服務器

負載均衡設備負責每個節點中各個Cache的負載均衡,保證節點的工作效率;同時,負載均衡設備還負責收集節點與周圍環境的信息,保持與全局負載DNS的通信,實現整個系統的負載均衡。

高速緩存服務器(Cache)負責存儲客戶網站的大量信息,就像一個靠近用戶的網站服務器一樣響應本地用戶的訪問請求。

CDN的管理系統是整個系統能夠正常運轉的保證。它不僅能對系統中的各個子系統和設備進行實時監控,對各種故障產生相應的告警,還可以實時監測到系統中總的流量和各節點的流量,并保存在系統的數據庫中,使網管人員能夠方便地進行進一步分析。通過完善的網管系統,用戶可以對系統配置進行修改。

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

26、LVS是什么及作用?

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

27、Nginx是什么及作用?

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

2 nginx優點及常用web服務器產品
靜態web服務軟件

                1 Apache   中小型web服務的主流優點:運行速度快,性能穩定,擴展豐富缺點:以進程為結構基礎,消耗cpu,性能下降2  Lighttpd  開源輕量級web服務器軟件優點:1 安全,快速,兼容性好,靈活2 低開銷,低CPU使用率3 支持大多數apache的重要功能缺點: 功能存在不足,部分代碼缺陷(如對proxy功能不完善)

動態web服務軟件

                  1  Microsoft IIS   微軟旗下產品優點:可靠、安全、性能和擴展能力強缺點:部署成本高2  Tomcat(公貓)  Sun公司旗下產品優點:部署安裝方便,系統占有率低,主要的Servlet和JSP容器缺點:功能少,無法滿足復雜業務場景

nginx優點

                  1 高并發連接2 內存消耗少3  穩定性高

3 Nginx 版本信息
nginx官網有三個版本

                    1    stable version       穩定版(企業用)2     mainline version   開發版(個人用)3     Legacy versions   歷史版

4 Nginx功能特性
1.處理靜態文件,索引文件以及自動索引

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

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

                2 nginx可作為負載均衡3 nginx可作為Web緩存

————————————————
版權聲明:本文為CSDN博主「VictoryKingLIU」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/VictoryKingLIU/article/details/91784881

28、keepalived是什么及作用?

大神講解,點擊進入

29、haproxy是什么以及作用?

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

HAProxy特別適用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。

HAProxy運行在時下的硬件上,完全可以支持數以萬計的 并發連接。

并且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

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

30、什么是負載均衡?

Load balancing,即負載均衡,是一種計算機技術,用來在多個計算機(計算機集群)、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。
參考鏈接https://www.cnblogs.com/fanBlog/p/10936190.html

31、什么是rpc及應用場景?

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

32、簡述 asynio模塊的作用和應用場景。

asyncio是Python 3.4版本引入的標準庫,直接內置了對異步IO的支持。
asyncio的編程模型就是一個消息循環。我們從asyncio模塊中直接獲取一個EventLoop的引用,然后把需要執行的協程扔到EventLoop中執行,就實現了異步IO。

作者:把早晨六點的太陽留給我
鏈接:https://www.jianshu.com/p/17fe7ab54263

33、簡述 gevent模塊的作用和應用場景。

當一個greenlet遇到IO操作時,比如訪問網絡,就自動切換到其他的greenlet,等到IO操作完成,再在適當的時候切換回來繼續執行。由于IO操作非常耗時,經常使程序處于等待狀態,有了gevent為我們自動切換協程,就保證總有greenlet在運行,而不是等待IO。
由于切換是在IO操作時自動完成,所以gevent需要修改Python自帶的一些標準庫,這一過程在啟動時通過monkey patch完成:

作者:把早晨六點的太陽留給我
鏈接:https://www.jianshu.com/p/17fe7ab54263

34、twisted框架的使用和應用?

Twisted是用Python實現的基于事件驅動的網絡引擎框架,Twisted支持許多常見的傳輸及應用層協議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一樣,Twisted也具有“內置電池”(batteries-included)的特點。Twisted對于其支持的所有協議都帶有客戶端和服務器實現,同時附帶有基于命令行的工具,使得配置和部署產品級的Twisted應用變得非常方便。

作者:把早晨六點的太陽留給我
鏈接:https://www.jianshu.com/p/17fe7ab54263

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454253.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

noip模擬賽 radius

分析&#xff1a;這道題實在是不好想&#xff0c;一個可以騙分的想法是假定要求的那個點在中心點上,可以騙得不少分.但是在邊上的點要怎么確定呢&#xff1f;理論復雜度O(&#xfe62;無窮).答案一定是和端點有關的&#xff0c;涉及到最大值最小&#xff0c;考慮二分最大值&…

來自IT公司速查手冊的各大IT公司薪資和待遇內幕

來自IT公司速查手冊的各大IT公司薪資和待遇內幕 &#xff08;轉載于 http://xuchaoyi99.cnblogs.com/ &#xff09; 編號 1. 杭州 諾基亞 2. 南京 趨勢科技 Trend 3. 北京 聯想&#xff08;北京&#xff09;有限公司 4. 深圳 華為 5. 深圳 中興通訊 6. 上海 SAP 7.…

Docker 精通之 Dockerfile

Docker 精通系列 Docker 精通之入門Docker 精通之微服務Docker 精通之常用命令Docker 精通之 Dockerfile 1.基本說明 Dockfile 是一個用于編寫 docker 鏡像生成過程的文件&#xff0c;其有特定的語法。在一個文件夾中&#xff0c;如果有一個名字為 Dockfile 的文件&#xff0c…

c語言中int的取值范圍_c語言入門(1)

c語言入門C語言一經出現就以其功能豐富、表達能力強、靈活方便、應用面廣等特點迅速在全世界普及和推廣。C語言不但執行效率高而且可移植性好&#xff0c;可以用來開發應用軟件、驅動、操作系統等。C語言也是其它眾多高級語言的鼻祖語言&#xff0c;所以說學習C語言是進入編程世…

vue : 無法將“vue”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正確, 然后再試一次。

vue : 無法將“vue”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff0c;請確保路徑正確&#xff0c; 然后再試一次。 報錯原因&#xff1a; 沒有安裝腳手架vue-cli 解決方法&#xff1a;安裝腳手架vue-cli npm inst…

session的生命周期

session的生命周期分為創建、活動、銷毀三個階段 創建一個新的會話不代表舊的會話就銷毀了 session.invalidate()方法可以銷毀當前會話 在page1中寫上這個方法再打開網頁 說明該會話被銷毀了出現了錯誤 我們把這個方法寫在所有代碼段的下面 再打開這個網頁 刷新網頁 這個sessio…

虛擬化與網絡

本文轉自Grodd51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog.51cto.com/juispan/1959791&#xff0c;如需轉載請自行聯系原作者

算法基礎之搜索和經典排序

目錄 簡介 搜索算法 二分法查找 排序算法 冒泡排序&#xff08;Bubble Sort&#xff09; 選擇排序&#xff08;Selection Sort&#xff09; 插入排序&#xff08;Insert Sort&#xff09; 快速排序&#xff08;Quick Sort&#xff09; 歸并排序&#xff08;Merge Sort…

IT人不要一直做技術

發表于&#xff1a;2009-03-04 09:51:44 樓主IT人不要一直做技術 【引子】感覺這篇文章很有深意&#xff0c;正是我所想說的話。希望大家有借鑒。 【原文】 我現在是自己做&#xff0c;但我此前有多年在從事軟件開發工作&#xff0c;當回過頭來想一想自己&#xff0c;覺得特別…

背景寬高隨文本變化_中科大提出ContourNet:更準確的任意形狀場景文本檢測新方法...

點擊上方“CVer”&#xff0c;選擇加"星標"置頂重磅干貨&#xff0c;第一時間送達本文轉載自&#xff1a;CSIG文檔圖像分析與識別專委會本文簡要介紹2020年被CVPR錄用的論文“ContourNet: Taking a Further Step toward Accurate Arbitrary-shaped Scene Text Detect…

python 類、模塊、包的區別

學習python的時候&#xff0c;碰到了import 和 from xx import xx的問題&#xff0c; 為了弄清楚什么是 module 和package &#xff0c;這篇文章講解的不錯&#xff01;&#xff01; 原文&#xff1a; http://www.cnblogs.com/kex1n/p/5977051.html --------------------------…

Hadoop MapReduce概念學習系列之MPI和MapReduce(十三)

在當前最流行的高性能并行體系結構中比較常用的并行編程環境分為兩類:消息傳遞和共享存儲。MPI是基于消息傳遞的經典代表&#xff0c;是消息傳遞井行程序設計的標準&#xff0c;用于構建高可靠的、可伸縮的、靈活的分布式應用程消息傳遞井行處理開銷比較大&#xff0c;適合于大…

算法面試題匯總(更新中)

1、根據數字返回相應位置數字 def get_digit(num, i):# i0 個位 1 十位 2 百位...return num // (10 ** i) % 10# print(get_digit(12345, 6)) 2、列表反轉&#xff0c;不用內置函數 def reverse_list(li):n len(li)for i in range(n // 2):li[i], li[n-i-1] li[n-i-1], …

在python中os_在Python中使用os.execvp

我有一個關于在 Python中使用os.execvp的問題.我有以下用于創建參數列表的代碼&#xff1a; args [ "java" , classpath , "-Djava.library.path" lib_path() , ea , "-Xmx1000m" , "-server" , "code_swarm" , params ] …

WEBGL學習【四】模型視圖矩陣

<html lang"zh-CN"><!--服務器運行地址&#xff1a;http://127.0.0.1:8080/webgl/LearnNeHeWebGL/NeHeWebGL4.html--> <head><title>NeHes WebGL</title><meta charset"UTF-8"/><!--引入需要的庫文件--><scr…

使用Jmeter對mysql進行性能測試入門

使用Jmeter對mysql進行性能測試入門 第一步&#xff1a;測試環境準備&#xff1a; 1&#xff09;、mysql> select version(); ----------- | version() | ----------- | 5.5.13 | ----------- ms數據庫數據&#xff1a; mysql> select count(*) from account; ----------…

算法基礎之數據結構

whats the 數據結構 數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成。 簡單來說&#xff0c;數據結構就是設計數據以何種方式組織并存儲在計算機中。 比如&#xff1a;列表、集合與字典等都是一種數據結構。 通常情況下&#xff…

soap接口怎么不返回tuple python_Python 中的接口

Python 是動態類型語言, 只在運行時做 Duck Typing 檢查.利: 靈活, 方便弊: 代碼混亂, 缺少規范標準自帶兩類接口支持: abc 和 typing.Protocol, 有他們協助給天馬行空的程序員套上枷鎖, Python 的大工程才可以"上道"abcabc 就是 Abstract Base Class, 虛基類. 跟 Ja…

java 第11次作業:你能看懂就說明你理解了——this關鍵字

this 代表當前對象 轉載于:https://www.cnblogs.com/qingyundian/p/7736699.html

c#多線程操作界面控件的簡單實現

一個小功能&#xff0c;早有人實現了。自己在一個項目中用到&#xff0c;覺得有必要記錄一下&#xff0c;寫下來。代碼 從上面你可能已經看出如何多線程操作同一個控件的&#xff0c;就是通過一個委托&#xff0c;然后定義委托方法&#xff0c;判斷控件的InvokeRequired屬性&am…