天天看點

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. 圖示
    Python面試題(第二篇)
    注:圖檔來源: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架構是第一種比較早的軟體架構,主要用于區域網路内。也叫 客戶機/伺服器模式。

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

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

第二層: 通過網絡結合了資料庫伺服器。

簡單的說就是第一層是使用者表示層,第二層是資料庫層。

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

Python面試題(第二篇)

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架構有三層,分别為:

第一層表現層:主要完成使用者和背景的互動及最終查詢結果的輸出功能。

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

第三層資料層:主要是接受用戶端請求後獨立進行各種運算。

如圖所示:

Python面試題(第二篇)

B/S架構的優點:

1、用戶端無需安裝,有Web浏覽器即可。

2、BS架構可以直接放在廣域網上,通過一定的權限控制實作多客戶通路的目的,互動性較強。

3、BS架構無需更新多個用戶端,更新伺服器即可。可以随時更新版本,而無需使用者重新下載下傳啊什麼的。

B/S架構的缺點:

1、在跨浏覽器上,BS架構不盡如人意。

2、表現要達到CS程式的程度需要花費不少精力。

3、在速度和安全性上需要花費巨大的設計成本,這是BS架構的最大問題。

4、用戶端伺服器端的互動是請求-響應模式,通常需要重新整理頁面,這并不是客戶樂意看到的。(在Ajax風行後此問題得到了一定程度的緩解)

三、B/S架構的幾種形式

第一種:用戶端-伺服器-資料庫

Python面試題(第二篇)

這個應該是我們平時比較常用的一種模式:

1、用戶端向伺服器發起Http請求

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

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

4、如果有必要,伺服器會和資料庫進行資料交換. 然後将模版+資料渲染成最終的Html, 返送給用戶端

第二種:用戶端-web伺服器-應用伺服器-資料庫

Python面試題(第二篇)

類似于第一種方法,隻是将web服務和應用服務解耦

1 用戶端向web伺服器發起Http請求

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

3 應用伺服器的RESTFUL接口被調用,會執行對應的暴露方法.如果有必要和資料庫進行資料互動,應用伺服器會和資料庫進行互動後,将json資料傳回給web伺服器

4 web伺服器将模版+資料組合渲染成html傳回給用戶端

第三種方法:用戶端-負載均衡器(Nginx)-中間伺服器(Node)-應用伺服器-資料庫

這種模式一般用在有大量的使用者,高并發的應用中。

Python面試題(第二篇)

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發來資料,造成了伺服器資源的浪費,并且會産生安全隐患。是以,若使用三次握手機制,伺服器發送了該确認後,收不到用戶端的确認,也就知道并沒有建立連接配接,是以不會将資源浪費在這種沒有意義的等待上。

Python面試題(第二篇)
Python面試題(第二篇)

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。

Python面試題(第二篇)

最簡單的了解

一:建立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_setreadfds,//監控的所有讀檔案描述符集合

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_setset);

#測試某個檔案描述符是否在某個集合中

int FD_ISSET(int fd,fd_setset)

#向某個檔案描述符集合中加入檔案描述符

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()時的size

     timeout:是逾時時間
           

傳回值: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隻要拷貝一次。

下面列出如下表格來進行比較:

Python面試題(第二篇)

總結: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 os

def 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個end
        p = Process(target=func,args=(i,))
        p.start()
           

線程池的使用

import time
from concurrent.futures import ThreadPoolExecutor


def func(n):
    print(n)
    time.sleep(1)
    return n * 10


t_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 threading

local = threading.local()

def func(n):
    print(threading.current_thread())
    local.val = n
    time.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 的語句

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

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

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

mkfifo  test
           

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

接下來我們用一個程序向這個管道裡面寫資料,然後有另外一個程序把裡面的資料讀出來。

這個時候管道的内容沒有被讀出的話,那麼這個指令就會一直停在這裡,隻有當另外一個程序把 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的情況下,才會出現真正意義上的『同時進行』。

并發與并行

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

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

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

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

Python面試題(第二篇)

是以,并發是指在一段時間内宏觀上多個程式同時運作。并行指的是同一個時刻,多個任務确實真的在同時運作。

并發和并行的差別

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

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

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

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

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

Python面試題(第二篇)

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
           
Python面試題(第二篇)

2.linux

# linux系統hosts檔案位置
[[email protected] etc]# cat /etc/hosts
           
Python面試題(第二篇)

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

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

産 生資料的子產品,就形象地稱為生産者;而處理資料的子產品,就稱為消費者。

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

結構圖如下:

Python面試題(第二篇)

生産者消費者模型的優點:

1、解耦

假設生産者和消費者分别是兩個類。

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

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

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

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

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

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

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

2、支援并發

由于生産者與消費者是兩個獨立的并發體,他們之間是用緩沖區作為橋梁連接配接,生産者隻需要往緩沖區裡丢資料,

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

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

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

3、支援忙閑不均

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

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

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

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

應用場景:

使用多線程,在做爬蟲的時候,生産者用着産生url連結,消費者用于擷取url資料,在隊列的幫助下可以使用多線程加快爬蟲速度。

import time
import threading
import Queue
import urllib2
 
class Consumer(threading.Thread):
  def __init__(self, queue):
    threading.Thread.__init__(self)
    self._queue = queue
 
  def run(self):
    while True:
      content = self._queue.get()
      print content
      if isinstance(content, str) and content == 'quit':
        break
      response = 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 workers
 
if __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