1. 程式人生 > >python 網絡編程和並發編程題

python 網絡編程和並發編程題

網絡流 模型 linux集群 ssp ack soc socket 更多 隊列

1.答:

應用層
與其它計算機進行通訊的一個應用,它是對應應用程序的通信服務的。例如,一個沒有通信功能的字處理程序就不能執行通信的代碼,從事字處理工作的程序員也不關心OSI的第7層。但是,如果添加了一個傳輸文件的選項,那麽字處理器的程序員就需要實現OSI的第7層。示例:TELNET,HTTP,FTP,NFS,SMTP等。
表示層
這一層的主要功能是定義數據格式及加密。例如,FTP允許你選擇以二進制或ASCII格式傳輸。如果選擇二進制,那麽發送方和接收方不改變文件的內容。如果選擇ASCII格式,發送方將把文本從發送方的字符集轉換成標準的ASCII後發送數據。在接收方將標準的ASCII轉換成接收方計算機的字符集。示例:加密,ASCII等。
會話層
它定義了如何開始、控制和結束一個會話,包括對多個雙向消息的控制和管理,以便在只完成連續消息的一部分時可以通知應用,從而使表示層看到的數據是連續的,在某些情況下,如果表示層收到了所有的數據,則用數據代表表示層。示例:RPC,SQL等。
傳輸層
這層的功能包括是否選擇差錯恢復協議還是無差錯恢復協議,及在同一主機上對不同應用的數據流的輸入進行復用,還包括對收到的順序不對的數據包的重新排序功能。示例:TCP,UDP,SPX。
網絡層
這層對端到端的包傳輸進行定義,它定義了能夠標識所有結點的邏輯地址,還定義了路由實現的方式和學習的方式。為了適應最大傳輸單元長度小於包長度的傳輸介質,網絡層還定義了如何將一個包分解成更小的包的分段方法。示例:IP,IPX等。
數據鏈路層
它定義了在單個鏈路上如何傳輸數據。這些協議與被討論的各種介質有關。示例:ATM,FDDI等。
物理層
OSI的物理層規範是有關傳輸介質的特這些規範通常也參考了其他組織制定的標準。連接頭、幀、幀的使用、電流、編碼及光調制等都屬於各種物理層規範中的內容。物理層常用多個規範完成對所有細節的定義。示例:Rj45,802.3等。

2.答:

C/S架構軟件(即客戶機/服務器模式)分為客戶機和服務器兩層:第一層是在客戶機系統上結合了表示與業務邏輯,第二層是通過網絡結合了數據庫服務器。簡單的說就是第一層是用戶表示層,第二層是數據庫層。客戶端和服務器直接相連,這兩個組成部分都承擔著重要的角色。

B/S架構第一層是瀏覽器(即客戶端)只有簡單的輸入輸出功能,處理極少部分的事務邏輯。由於客戶不需要安裝客戶端,只要有瀏覽器就能上網瀏覽,所以它面向的是大範圍的用戶,所以界面設計得比較簡單,通用。
第二層是WEB服務器,扮演著信息傳送的角色。當用戶想要訪問數據庫時,就會首先向WEB服務器發送請求,WEB服務器統一請求後會向數據庫服務器發送訪問數據庫的請求,這個請求是以SQL語句實現的。
第三層是數據庫服務器,它存放著大量的數據。當數據庫服務器收到了WEB服務器的請求後,會對SQL語句進行處理,並將返回的結果發送給WEB服務器,接下來,WEB服務器將收到的數據結果轉換為HTML文本形式發送給瀏覽器。

3.答:

所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立。在socket編程中,這一過程由客戶端執行connect來觸發,整個流程如下圖所示:


圖2 TCP三次握手

(1)第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
(2)第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
(3)第三次握手:Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。

所謂四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發,整個流程如下圖所示:


圖3 TCP四次揮手

由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。
(1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
(2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。
(3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

4.答:ARP (Address Resolution Protocol) 是個地址解析協議。最直白的說法是:在IP以太網中,當一個上層協議要發包時,有了該節點的IP地址,ARP就能提供該節點的MAC地址。

5.答:

1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接

2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付

Tcp通過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸。如丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。

3、UDP具有較好的實時性,工作效率比TCP高,適用於對高速傳輸和實時性有較高的通信或廣播通信。

4.每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信

5、TCP對系統資源要求較多,UDP對系統資源要求較少。

6.答:什麽是廣域網(WAN、公網、外網),什麽是局域網(LAN、私網、內網)?
廣域網(WAN),就是我們通常所說的Internet,它是一個遍及全世界的網絡。 局域網(LAN),相對於廣域網(WAN)而言,主要是指在小範圍內的計算機互聯網絡。這個“小範圍”可以是一個家庭,一所學校,一家公司,或者是一個政府部門。 BT中常常提到的公網、外網,即廣域網(WAN);BT中常常提到私網、內網,即局域網(LAN)。

廣域網上的每一臺電腦(或其他網絡設備)都有一個或多個廣域網IP地址(或者說公網、外網IP地址),廣域網IP地址一般要到ISP處交費之後才能申請到,廣域網IP地址不能重復;局域網(LAN)上的每一臺電腦(或其他網絡設備)都有一個或多個局域網IP地址(或者說私網、內網IP地址),局域網IP地址是局域網內部分配的,不同局域網的IP地址可以重復,不會相互影響。

7.答:

TCP的可靠保證,是它的三次握手雙向機制,這一機制保證校驗了數據,保證了他的可靠性。而UDP就沒有了,udp信息發出後,不驗證是否到達對方,所以不可靠。

8.答:

Socket 又稱”套接字”,是系統提供的用於網絡通信的方法.它的是指並不是一種協議,沒有規定計算機應當怎麽傳遞信息,只是給程序員提供了一個發送消息的接口,程序員能使用這個接口同的方法,發送與接收消息.Socket 描述了一個 IP,端口對.它簡化了程序員的操作,知道對方的 IP以及 port 就可以給對方發送消息,再由服務器處理發送的這些消息,Socket 包含了通信的雙發,即客戶端與服務端.

TCP編程的服務器端一般步驟是:
  1、創建一個socket,用函數socket(); SOCKET SocketListen =socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
  2、設置socket屬性,用函數setsockopt(); * 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind(); SOCKET_ERROR = bind(SocketListen,(const sockaddr*)&addr,sizeof(addr))
  4、開啟監聽,用函數listen(); SOCKET_ERROR == listen(SocketListen,2)
  5、接收客戶端上來的連接,用函數accept(); SOCKET SocketWaiter = accept(SocketListen,

_Out_ struct sockaddr *addr

_Inout_ int *addrlen);
  6、收發數據,用函數send()和recv(),或者read()和write();
  7、關閉網絡連接; closesocket(SocketListen);closesocket(SocketWaiter);
  8、關閉監聽;
SOCK_STREAM這種的特點是面向連接的,即每次收發數據之前必須通過connect建立連接,而SOCK_DGRAM這種是User Datagram Protocol協議的網絡通訊,它是無連接的,不可靠的。
TCP編程的客戶端一般步驟是:
  1、創建一個socket,用函數socket();
  2、設置socket屬性,用函數setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
  4、設置要連接的對方的IP地址和端口等屬性;
  5、連接服務器,用函數connect();
  6、收發數據,用函數send()和recv(),或者read()和write();
  7、關閉網絡連接;

int send(

_In_ SOCKET s, //向哪個socket發送,accept返回的socket。

_In_ const char *buf,

_In_ int len,

_In_ int flags

);

9.答:

粘包:多個數據包被連續存儲於連續的緩存中,在對數據包進行讀取時由於無法確定發生方的發送邊界,而采用某一估測值大小來進行數據讀出,若雙方的size不一致時就會使指發送方發送的若幹包數據到接收方接收時粘成一包,從接收緩沖區看,後一包數據的頭緊接著前一包數據的尾。

出現粘包現象的原因是多方面的,它既可能由發送方造成,也可能由接收方造成。發送方引起的粘包是由TCP協議本身造成的,TCP為提高傳輸效率,發送方往往要收集到足夠多的數據後才發送一包數據。若連續幾次發送的數據都很少,通常TCP會根據優化算法把這些數據合成一包後一次發送出去,這樣接收方就收到了粘包數據。接收方引起的粘包是由於接收方用戶進程不及時接收數據,從而導致粘包現象。這是因為接收方先把收到的數據放在系統接收緩沖區,用戶進程從該緩沖區取數據,若下一包數據到達時前一包數據尚未被用戶進程取走,則下一包數據放到系統接收緩沖區時就接到前一包數據之後,而用戶進程根據預先設定的緩沖區大小從系統接收緩沖區取數據,這樣就一次取到了多包數據。分包是指在出現粘包的時候我們的接收方要進行分包處理。(在長連接中都會出現) 數據包的邊界發生錯位,導致讀出錯誤的數據分包,進而曲解原始數據含義。

當時短連接的情況下,不用考慮粘包的情況
2.如果發送數據無結構,如文件傳輸,這樣發送方只管發送,接收方只管接收存儲就ok,也不用考慮粘包
3.如果雙方建立連接,需要在連接後一段時間內發送不同結構數據
處理方式:
接收方創建一預處理線程,對接收到的數據包進行預處理,將粘連的包分開
註:粘包情況有兩種,一種是粘在一起的包都是完整的數據包,另一種情況是粘在一起的包有不完整的包

10.答:

  IO多路復用是指內核一旦發現進程指定的一個或者多個IO條件準備讀取,它就通知該進程。IO多路復用適用如下場合:

  (1)當客戶處理多個描述字時(一般是交互式輸入和網絡套接口),必須使用I/O復用。

  (2)當一個客戶同時處理多個套接口時,而這種情況是可能的,但很少出現。

  (3)如果一個TCP服務器既要處理監聽套接口,又要處理已連接套接口,一般也要用到I/O復用。

  (4)如果一個服務器即要處理TCP,又要處理UDP,一般要使用I/O復用。

  (5)如果一個服務器要處理多個服務或多個協議,一般要使用I/O復用。

  與多進程和多線程技術相比,I/O多路復用技術的最大優勢是系統開銷小,系統不必創建進程/線程,也不必維護這些進程/線程,從而大大減小了系統的開銷。

11.答:

    1. 什麽是防火墻
      防火墻是指設置在不同網絡(如可信任的企業內部網和不可信的公共網)或網絡安全域之間的一系列部件的組合。 它可通過監測、限制、更改跨越防火墻的數據流,盡可能地對外部屏蔽網絡內部的信息、結構和運行狀況, 以此來實現網絡的安全保護。
      在邏輯上,防火墻是一個分離器,一個限制器,也是一個分析器,有效地監控了內部網和Internet之間的任何活動, 保證了內部網絡的安全。
      2.使用Firewall的益處
      保護脆弱的服務
      通過過濾不安全的服務,Firewall可以極大地提高網絡安全和減少子網中主機的風險。例如, Firewall可以禁止NIS、NFS服務通過,Firewall同時可以拒絕源路由和ICMP重定向封包。
      控制對系統的訪問
      Firewall可以提供對系統的訪問控制。如允許從外部訪問某些主機,同時禁止訪問另外的主機。例如, Firewall允許外部訪問特定的Mail Server和Web Server。
      集中的安全管理
      Firewall對企業內部網實現集中的安全管理,在Firewall定義的安全規則可以運行於整個內部網絡系統, 而無須在內部網每臺機器上分別設立安全策略。Firewall可以定義不同的認證方法, 而不需要在每臺機器上分別安裝特定的認證軟件。外部用戶也只需要經過一次認證即可訪問內部網。
      增強的保密性
      使用Firewall可以阻止攻擊者獲取攻擊網絡系統的有用信息,如Figer和DNS。
      記錄和統計網絡利用數據以及非法使用數據
      Firewall可以記錄和統計通過Firewall的網絡通訊,提供關於網絡使用的統計數據,並且,Firewall可以提供統計數據, 來判斷可能的攻擊和探測。
      策略執行
      Firewall提供了制定和執行網絡安全策略的手段。未設置Firewall時,網絡安全取決於每臺主機的用戶。

12.答:

select本質上是通過設置或者檢查存放fd標誌位的數據結構來進行下一步處理。
這樣所帶來的缺點是:

1 單個進程可監視的fd數量被限制

2 需要維護一個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結構時復制開銷大

3 對socket進行掃描時是線性掃描

poll本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,然後查詢每個fd對應的設備狀態,如果設備就緒則在設備等待隊列中加入一項並繼續遍歷,

如果遍歷完所有fd後沒有發現就緒設備,則掛起當前進程,直到設備就緒或者主動超時,被喚醒後它又要再次遍歷fd。這個過程經歷了多次無謂的遍歷。

它沒有最大連接數的限制,原因是它是基於鏈表來存儲的,但是同樣有一個缺點:大量的fd的數組被整體復制於用戶態和內核地址空間之間,而不管這樣的復制是不是有意義。

poll還有一個特點是“水平觸發”,如果報告了fd後,沒有被處理,那麽下次poll時會再次報告該fd。

epoll支持水平觸發和邊緣觸發,最大的特點在於邊緣觸發,它只告訴進程哪些fd剛剛變為就需態,並且只會通知一次。

在前面說到的復制問題上,epoll使用mmap減少復制開銷。

還有一個特點是,epoll使用“事件”的就緒通知方式,通過epoll_ctl註冊fd,一旦該fd就緒,內核就會采用類似callback的回調機制來激活該fd,epoll_wait便可以收到通知

13.答:

1.線程和進程:
線程是屬於進程的,線程運行在進程空間內,同一進程所產生的線程共享同一內存空間,當進程退出時該進程所產生的線程都會被強制退出並清除。線程可與屬於同一進程的其它線程共享進程所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在運行中必不可少的信息(如程序計數器、一組寄存器和棧)。
2.線程、進程與協程:
線程和進程的操作是由程序觸發系統接口,最後的執行者是系統;協程的操作則是程序員
協程存在的意義:對於多線程應用,CPU通過切片的方式來切換線程間的執行,線程切換時需要耗時(保持狀態,下次繼續)。協程,則只使用一個線程,在一個線程中規定某個代碼塊執行順序。
協程的適用場景: 當程序中存在大量不需要CPU的操作時(IO),適用於協程;

14. 答:

GIL即全局解釋器鎖,全局解釋器鎖的存在,在同一時間內,python解釋器只能運行一個線程的代碼,這大大影響了python多線程的性能。而這個解釋器鎖由於歷史原因,現在幾乎無法消除。

python GIL 之所以會影響多線程等性能,是因為在多線程的情況下,只有當線程獲得了一個全局鎖的時候,那麽該線程的代碼才能運行,而全局鎖只有一個,所以使用python多線程,在同一時刻也只有一個線程在運行,因此在即使在多核的情況下也只能發揮出單核的性能。

15.答:Threadpool 和ProcessPool模塊。

16. 答:Threading.local可以創建一個對象,每個線程都可以對他讀寫屬性,但不會互相影響

17.答:進程間通信(IPC,Interprocess communication),方法包括管道(PIPE)、消息排隊、旗語、共用內存以及套接字(Socket)。

18.答:並發是指一個處理器同時處理多個任務。
並行是指多個處理器或者是多核的處理器同時處理多個不同的任務。
並發是邏輯上的同時發生(simultaneous),而並行是物理上的同時發生。

19. 答: 線程鎖:大家都不陌生,主要用來給方法、代碼塊加鎖。當某個方法或者代碼塊使用鎖時,那麽在同一時刻至多僅有有一個線程在執行該段代碼。當有多個線程訪問同一對象的加鎖方法/代碼塊時,同一時間只有一個線程在執行,其余線程必須要等待當前線程執行完之後才能執行該代碼段。但是,其余線程是可以訪問該對象中的非加鎖代碼塊的。

  進程鎖:也是為了控制同一操作系統中多個進程訪問一個共享資源,只是因為程序的獨立性,各個進程是無法控制其他進程對資源的訪問的,但是可以使用本地系統的信號量控制(操作系統基本知識)。

20.答:Asynchronous I/O, or non-blocking I/O, is a form of input/output processing that permits other processing to continue before the transmission has finished

21. 答:

(1)工作層次不同   

最初的的交換機是工作在OSI/RM開放體系結構的數據鏈路層,也就是第二層,而路由器一開始就設計工作在OSI模型的網絡層。由於交換機工作在OSI的第二層(數據鏈路層),所以它的工作原理比較簡單,而路由器工作在OSI的第三層(網絡層),可以得到更多的協議信息,路由器可以做出更加智能的轉發決策。   
(2)數據轉發所依據的對象不同   

交換機是利用物理地址或者說MAC地址來確定轉發數據的目的地址。而路由器則是利用不同網絡的ID號(即IP地址)來確定數據轉發的地址。IP地址是在軟件中實現的,描述的是設備所在的網絡,有時這些第三層的地址也稱為協議地址或者網絡地址。MAC地址通常是硬件自帶的,由網卡生產商來分配的,而且已經固化到了網卡中去,一般來說是不可更改的。而IP地址則通常由網絡管理員或系統自動分配。   
(3)傳統的交換機只能分割沖突域,不能分割廣播域;而路由器可以分割廣播域由交換機連接的網段仍屬於同一個廣播域,廣播數據包會在交換機連接的所有網段上傳播,在某些情況下會導致通信擁擠和安全漏洞。連接到路由器上的網段會被分配成不同的廣播域,廣播數據不會穿過路由器。雖然第三層以上交換機具有VLAN功能,也可以分割廣播域,但是各子廣播域之間是不能通信交流的,它們之間的交流仍然需要路由器。   
(4)路由器提供了防火墻的服務  

路由器僅僅轉發特定地址的數據包,不傳送不支持路由協議的數據包傳送和未知目標網絡數據包的傳送,從而可以防止廣播風暴。    

22.答:

域名解析是把域名指向網站空間IP,讓人們通過註冊的域名可以方便地訪問到網站的一種服務。IP地址是網絡上標識站點的數字地址,為了方便記憶,采用域名來代替IP地址標識站點地址。域名解析就是域名到IP地址的轉換過程。域名的解析工作由DNS服務器完成。

23. 答:

hosts 文件所在位置

c:/windows/system32/drivers/etc/hosts

左下角 搜索框 搜索 cmd

彈出命令框
輸入
ipconfig /displaydns

顯示所有 dns內容

ipconfig /flushdns

刷新所有 dns內容

24. 答:

生產者與消費者模式是通過一個容器來解決生產者與消費者的強耦合關系,生產者與消費者之間不直接進行通訊,而是利用阻塞隊列來進行通訊,生產者生成數據後直接丟給阻塞隊列,消費者需要數據則從阻塞隊列獲取,實際應用中,生產者與消費者模式則主要解決生產者與消費者生產與消費的速率不一致的問題,達到平衡生產者與消費者的處理能力,而阻塞隊列則相當於緩沖區。

還有一個比較典型的例子便是日誌的記錄,多線程產生日誌,但寫日誌由於文件獨占,不能多線程來寫,於是我們就可以把線程壓入隊列,由日誌線程來讀取隊列數據,完成寫日誌的操作。

25. 答:

CDN的全稱是Content Delivery Network,即內容分發網絡。其基本思路是盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度。

26. 答:

LVS 是 Linux Virtual Server ,Linux 虛擬服務器;是一個虛擬的服務器集群【多臺機器 LB IP】。LVS 集群分為三層結構:

負載調度器(load balancer):它是整個LVS 集群對外的前端機器,負責將client請求發送到一組服務器[多臺LB IP]上執行,而client端認為是返回來一個同一個IP【通常把這個IP 稱為虛擬IP/VIP】

服務器池(server pool):一組真正執行client 請求的服務器,一般是我們的web服務器;除了web,還有FTP,MAIL,DNS

共享存儲(shared stored):它為 server pool 提供了一個共享的存儲區,很容易讓服務器池擁有相同的內容,提供相同的服務

27.答:

1、靜態HTTP服務器

首先,Nginx是一個HTTP服務器,可以將服務器上的靜態文件(如HTML、圖片)通過HTTP協議展現給客戶端。

2、反向代理服務器

什麽是反向代理?

客戶端本來可以直接通過HTTP協議訪問某網站應用服務器,網站管理員可以在中間加上一個Nginx,客戶端請求Nginx,Nginx請求應用服務器,然後將結果返回給客戶端,此時Nginx就是反向代理服務器。

3、負載均衡

當網站訪問量非常大,網站站長開心賺錢的同時,也攤上事兒了。因為網站越來越慢,一臺服務器已經不夠用了。於是將同一個應用部署在多臺服務器上,將大量用戶的請求分配給多臺機器處理。同時帶來的好處是,其中一臺服務器萬一掛了,只要還有其他服務器正常運行,就不會影響用戶使用。

4、虛擬主機

有的網站訪問量大,需要負載均衡。然而並不是所有網站都如此出色,有的網站,由於訪問量太小,需要節省成本,將多個網站部署在同一臺服務器上。

例如將www.aaa.com和www.bbb.com兩個網站部署在同一臺服務器上,兩個域名解析到同一個IP地址,但是用戶通過兩個域名卻可以打開兩個完全不同的網站,互相不影響,就像訪問兩個服務器一樣,所以叫兩個虛擬主機。

5、FastCGI

Nginx本身不支持PHP等語言,但是它可以通過FastCGI來將請求扔給某些語言或框架處理(例如PHP、Python、Perl)。

28. 答:

eepalived是一個類似於Layer2,4,7交換機制的軟件。是Linux集群管理中保證集群高可用的一個服務軟件,其功能是用來防止單點故障。



keepalived的工作原理:

keepalived是基於VRRP協議實現的保證集群高可用的一個服務軟件,主要功能是實現真機的故障隔離和負載均衡器間的失敗切換,防止單點故障。在了解keepalived原理之前先了解一下VRRP協議。



VRRP協議:Virtual Route Redundancy Protocol虛擬路由冗余協議。是一種容錯協議,保證當主機的下一跳路由出現故障時,由另一臺路由器來代替出現故障的路由器進行工作,從而保持網絡通信的連續性和可靠性。

29. 答:

HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。

HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

HAProxy實現了一種事件驅動, 單一進程模型,此模型支持非常大的並發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千並發連接。事件驅動模型因為在有更好的資源和時間管理的用戶空間(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是為什麽他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。

30. 答:

負載平衡也稱負載共享,是指對系統中的負載情況進行動態調整,以盡量消除或減少系統中各節點負載不均衡的現象。具體實現方法是將過載節點上的任務轉移到其他輕載節點上,盡可能實現系統各節點的負載平衡,從而提高系統的吞吐量。負載共享有利於統籌管理分布式系統中的各種資源,便於利用共享信息及其服務機制擴大系統的處理能力。
動態負載共享策略是指把系統中各節點上已有的負載作為參考信息,在運行過程中,根據系統中各節點的負載狀況,隨時調整負載的分配,使各節點盡可能保持負載的平衡。

31.答:

調用本地服務一樣調用遠程服務,而讓調用者對網絡通信這些細節透明,那麽將大大提高生產力,比如服務消費方在執行helloWorldService.sayHello(“test”)時,實質上調用的是遠端的服務。這種方式其實就是RPC(Remote Procedure Call Protocol)

RPC調用的流程:

1)服務消費方(client)調用以本地調用方式調用服務;

2)client stub接收到調用後負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;

3)client stub找到服務地址,並將消息發送到服務端;

4)server stub收到消息後進行解碼;

5)server stub根據解碼結果調用本地的服務;

6)本地服務執行並將結果返回給server stub;

7)server stub將返回結果打包成消息並發送至消費方;

8)client stub接收到消息,並進行解碼;

9)服務消費方得到最終結果。

32. 答:

asyncio模塊提供了一種關於事件循環的框架。事件循環就是等待一些任務發生,然後執行相應的事件。它也會處理例如IO操作或者系統事件。asyncio實際中有好幾種循環實現方式。模塊默認使用的方式是其所運行的操作系統上最有效的方式。如果你願意,你也可以顯式地選擇其它事件循環方式。一個事件循環就是當事件A發生時,函數B共同起作用。

設想這樣一個場景,服務器等待用戶訪問並請求一些資源,例如網頁。如果這個網站不是非常知名的網站,這個服務器將會在很長的時間內處於空閑狀態。但是,一旦某個時間用戶點擊了這個網站,服務器就需要作出響應。這個響應就是事件處理。當一個用戶下載網頁,服務器將會去檢查並調用一個或者多個事件句柄。一旦這些事件句柄完成相應的處理,它們需要將控制交回給事件循環。為了在Python中完成這個任務,asyncio使用協程。

協程是一個特殊的函數,可以將控制交回給它的調用函數,但是並不丟失它的狀態。協程是一個消費者函數,並且是生成器的擴展。協程相比線程最大的優勢就是執行協程時不需要占用太多內存。你需要註意的是,當你調用一個協程函數,它並沒有真正執行。相反,它將會返回一個協程對象,你可以將這個協程對象傳遞給事件循環,然後可以立即或者稍後執行它。

當你在使用asyncio模塊時,另一個你可能會執行的是future。future就是一個可以表示還沒有結束的任務結果的對象。你的事件循環可以觀察future對象並等待它們結束。當一個future結束時,它被設置為已完成。asyncio模塊也支持鎖和信號。

33. 答:

gevent是第三方庫,通過greenlet實現協程,其基本思想是:當一個greenlet遇到IO操作時,比如訪問網絡,就自動切換到其他的greenlet,等到IO操作完成,再在適當的時候切換回來繼續執行。由於IO操作非常耗時,經常使程序處於等待狀態,有了gevent為我們自動切換協程,就保證總有greenlet在運行,而不是等待IO。

由於切換是在IO操作時自動完成,所以gevent需要修改Python自帶的一些標準庫,這一過程在啟動時通過monkey patch完成

使用gevent,可以獲得極高的並發性能,但gevent只能在Unix/Linux下運行,在Windows下不保證正常安裝和運行。

由於gevent是基於IO切換的協程,所以最神奇的是,我們編寫的Web App代碼,不需要引入gevent的包,也不需要改任何代碼,僅僅在部署的時候,用一個支持gevent的WSGI服務器,立刻就獲得了數倍的性能提升。

34. 答:

Twisted應用的基本問題,可說是“一個中心,兩個基本點”,即:

以“事件”event為中心,以"建立連接"connect和“定義反饋“callback為基本點。

Twisted 對event 的管理機制,可劃分為後臺和前臺兩種形式。

後臺的管理,是Twisted 框架的內在機制,自動運行,對程序員透明無須幹預,在程序文本中不見其蹤跡。

前臺的管理,是Twisted 授權程序員,在程序文本中顯式寫碼來實現。程序員的工作,主要是按照既定的方式,實現 event。我們所關心、所用到的,是這部分東西(API)。

python 網絡編程和並發編程題