網路與併發

2021-07-05 14:08:42 字數 2058 閱讀 9457

accept是阻塞的。

recv和recvfrom,都有兩種模式,阻塞和非阻塞,可以通過ioctl函式來設定。阻塞模式是一直等待直到有資料到達,非阻塞模式是立即返回,需要通過訊息,非同步事件等來查詢完成狀態。

linux下執行 ulimit -n 輸出 1024,說明對於乙個程序而言最多只能開啟1024個檔案(所以select就做了1024的限制)。

在linux下,socket描述符其實就是檔案描述符,每乙個tcp連線都要佔乙個檔案描述符,它和硬碟檔案及其它io裝置共享取值空間,因為0,1,2分別預留給了標準輸入,標準輸出和標準錯誤,因此socket描述符最小從3開始,若程式在訪問socket的同時還會訪問磁碟檔案或其它io裝置,將會用掉一部分檔案描述符,導致socket描述符不再連續,但所有開啟的io裝置描述符加在一起,則嚴格表現為連續遞增(這就是為什麼select可以用連續的1024個位元來標識監控的連線)。

系統用乙個四元組來唯一標識乙個tcp連線:。

服務端監聽某個埠,accept返回的新的tcp連線,這個新的tcp連線使用的仍然是監聽的那個埠。再來乙個新的客戶端,伺服器上根本不需要再開乙個埠,就用原來的埠就行了。乙個埠上可以維持幾乎無數多個tcp連線,只要硬體資源足夠。

那如何處理多個客戶端的tcp請求呢,乙個方法是來乙個新的客戶端就開乙個程序/執行緒,另乙個方法是使用i/o多路復用。

os記好哪個埠的資料提交到哪個應用,並記錄每個程序所使用的檔案描述符和tcp連線的對應關係。

說到底,埠號不過是為了方便os將資料交給應用而使用的區分方式。

對於乙個network io (這裡我們以read舉例),它會涉及到兩個系統物件,乙個是呼叫這個io的process (or thread),另乙個就是系統核心(kernel)。當乙個read操作發生時,它會經歷兩個階段:

1 等待資料準備 (waiting for the data to be ready)

2 將資料從核心拷貝到程序中 (copying the data from the kernel to the process)

記住這兩點很重要,因為這些io model的區別就是在兩個階段上各有不同的情況。

blocking i/o

在linux中,預設情況下所有的socket都是blocking,乙個典型的讀操作流程大概是這樣:

linux下,可以通過設定socket使其變為non-blocking。當對乙個non-blocking socket執行讀操作時,流程是這個樣子:

i/o multiplexing

select/epoll的好處就在於單個process就可以同時處理多個網路連線的i/o。它的基本原理就是select/epoll這個function會不斷的輪詢所負責的所有socket,當某個socket有資料到達了,就通知使用者程序。它的流程如圖:

執行select後,process被select阻塞的。

asynchronous i/o

linux下的asynchronous i/o其實用得很少。先看一下它的流程:

使用者程序發起read操作之後,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它收到乙個asynchronous read之後,首先它會立刻返回,所以不會對使用者程序產生任何block。然後,kernel會等待資料準備完成,然後將資料拷貝到使用者記憶體,當這一切都完成之後,kernel會給使用者程序傳送乙個signal,告訴它read操作完成了。

基於socket的udp和tcp程式設計介紹

socket api

網路程式設計釋疑之:單台伺服器上的併發tcp連線數可以有多少

linux和windows下socket控制代碼(描述符)的分配策略

io - 同步,非同步,阻塞,非阻塞

多執行緒網路併發

from socket import from threading import thread import sys 客戶端處理 defhandle c print 客戶端 c.getpeername while true data c.recv 1024 if not data break pri...

網路程式設計 併發程式設計

01 網路程式設計 軟體開發架構 osi七層協議 乙太網協議 ip 埠 tcp udp 02 tcp的三次握手四次揮手理解及面試題 03 socket套接字使用 tcp連線通訊迴圈 tcp粘包問題 struct模組 tcp傳送檔案 04 udp協議 tcp udp基於socketserver的併發 ...

併發與並行

做併發程式設計之前,必須首先理解什麼是併發,什麼是並行,什麼是併發程式設計,什麼是並行程式設計。併發 concurrency 和並行 parallellism 是 解釋一 並行是指兩個或者多個事件在同一時刻發生 而併發是指兩個或多個事件在同一時間間隔發生。解釋二 並行是在不同實體上的多個事件,併發是...