《UNIX環境網路程式設計》讀書筆記之I O復用

2021-06-29 08:44:57 字數 2505 閱讀 4682

1.i/o復用使用在下列網路應用場合:

a.當客戶處理多個描述符(通常是互動式輸入和網路套接字)時,必須使用i/o復用。

b.如果乙個tcp伺服器既要處理監聽套接字,又要處理已連線套接字,一般就要使用i/o復用。

c.如果乙個伺服器既要處理tcp,又要處理udp,就要用到i/o復用

d.如果乙個伺服器要處理多個服務或多個協議,一般就要使用i/o復用。

2.i/o模型

unix有5種可用的i/o模型:(1)阻塞式i/o。(2)非阻塞式i/o。(3)i/o復用(select/poll)。(4)訊號驅動式i/o(sigio)。(5)非同步i/o。

(1)阻塞式i/o

採用阻塞式i/o模型時,預設情況下,所有的套接字都是阻塞的。以資料報套接字為例子,我們有如下情形:

程序呼叫recvfrom系統呼叫,直到資料準備好後才結束阻塞。

(2)非阻塞式i/o

程序可以把乙個套接字設定成非阻塞。當套接字被設定成非阻塞式時,當i/o阻塞時,程序不進入睡眠狀態,而是直接返回乙個錯誤。具體情形如下:

當程序採用非阻塞式i/o時,程序需要持續地輪詢核心,檢視某個操作有沒有準備好。這種模型會占用大量的cpu資源,但也會偶爾用到。

(3)i/o復用模型

有了i/o復用,我們就可以呼叫select或poll,阻塞在這兩個系統呼叫中的某乙個上,而不是阻塞在真正的i/o系統呼叫上。下圖概括展示了i/o復用模型。

我們阻塞與select呼叫,等待監聽的任一資料報套接字變為可讀。當select返回套接字可讀這一條件時,我們呼叫recvfrom把所有資料報複製到應用程序緩衝區。

(4)訊號驅動式i/o模型

我們也可以用訊號,讓核心在描述符就緒時傳送sigio訊號通知我們。我們稱這種模型為訊號驅動式i/o,下圖是它的概要展示。

我們首先開啟套接字的訊號驅動式i/o功能,並通過sigaction系統安裝乙個訊號處理函式。該系統呼叫立即返回,我們的程序繼續工作,不被阻塞。當資料報準備好讀取時,核心就為該程序產生乙個sigio訊號。我們隨後在訊號處理函式中呼叫recvfrom讀取資料報。

(5)非同步i/o模型

工作機制:告知核心啟動某個操作,並讓核心在整個操作完成後通知我們。這種模型與訊號驅動模型的區別在於:訊號驅動是i/o是由核心通知我們何時可以啟動乙個i/o。而非同步i/o模型是由核心通知我們i/o何時完成。

(5)各種i/o模型的比較

5種i/o模型的比較如下圖所示:

術語定義:

同步i/o操作:導致請求程序阻塞,知道i/o完成;

非同步i/o操作:不導致請求程序阻塞。

根據定義可知,前四種i/o模型都是同步操作,只有非同步i/o模型為為非同步i/o操作。

3.select函式

select允許程序指示核心等待多個事件中的任何乙個發生,並只在有乙個或多個事件發生或經歷一段指定的時間之後才喚醒它。也就是說,我們呼叫select告知核心對哪個描述符(不侷限於套接字)感興趣以及等待多長時間。

例如:

select的函式原型如下:

maxfdp1引數指定待測試的描述符個數,timeout指定等待的時間。readset指定我們讓核心測試讀、寫和異常條件的描述符。

4.poll函式

poll函式提供與select類似的功能,它的函式原型如下:

第乙個引數指向乙個結構陣列。該陣列每乙個都是乙個pollfd結構,用於指定測試某個給定描述符fd的條件。

要測試的成員由events指定,函式在相應的revents成員中返回該描述符的狀態(每個描述符都有兩個變數,乙個為呼叫值,另乙個為返回結果,從而避免值-結果引數)。下圖指出了用於指定events標誌以及測試revents標誌的一些常值。

unix 環境高階程式設計 讀書筆記

unix環境高階程式設計 讀書筆記 第8章exit和 exit區別 exit會直接進入核心,不會關閉io流。程序基本控制函式還有 wait,fork,exec。atexit 程式正常退出時呼叫,如果因為signal退出則不能呼叫。功能 註冊函式可以完成一些清理工作,比如全域性log類,可以不設定析構...

unix環境高階程式設計 讀書筆記

檔案 unix支援在不同程序之間共享開啟的檔案。核心使用三種資料結構表示開啟的檔案 原子操作 一般而言,原子操作指的是由多步組成的操作。如果該操作原子的執行,要麼執行完所有步,要麼一步也不執行,不可能只執行所有步驟的乙個子集。2 注意 原子操作函式 pread,pwrite pread 相當於呼叫r...

讀書筆記之UNIX環境高階程式設計 11

執行緒 1.像每個程序有乙個程序id一樣,每個執行緒也有乙個執行緒id。程序id在整個系統中是唯一的,程序id相同,但執行緒id不同,執行緒id只在它所屬的程序環境有效 2.每個程序只有乙個控制線程即main執行緒 3.執行緒建立時並不能保證哪個執行緒會先執行 是新建立的執行緒還是呼叫執行緒 4.主...