更新時間:2020-12-21 17:49:05 來源:動力節點 瀏覽1419次
在實際應用中,數據操作通常分為輸入和輸出,那么以輸入為例,在操作系統中,一個數據的輸入通常分為兩個過程:等待數據準備好和將準備好的數據從內核拷貝到用戶空間。我們先來看看5種Linux網絡I/O模型分別是什么?
1.阻塞I/O
2.非阻塞I/O
3.I/O多路復用
4.信號驅動I/O
5.異步I/O
下面我們來具體分析這5種Linux網絡I/O模型:
1、阻塞IO模型
學習過操作系統的知識后,可以知道:不管是網絡IO還是磁盤IO,對于讀操作而言,都是等到網絡的某個數據分組到達后/數據準備好后,將數據拷貝到內核空間的緩沖區中,再從內核空間拷貝到用戶空間的緩沖區。
此處需要一個清新的腦回路,我就是程序,我想要全家桶,于是發起了系統調用,而后廚加工的過程就是在做數據準備和拷貝工作。全家桶最終到手,數據終于從內核空間拷貝到了用戶空間。
阻塞IO的執行過程是進程進行系統調用,等待內核將數據準備好并復制到用戶態緩沖區后,進程放棄使用CPU并一直阻塞在此,直到數據準備好。
2、非阻塞IO模型
同步阻塞 I/O 的一種效率稍低的變種是非阻塞 I/O。在這種模型中,設備是以非阻塞的形式打開的。這意味著 I/O 操作不會立即完成,read操作可能會返回一個錯誤代碼,說明這個命令不能立即滿足(EAGAIN 或 EWOULDBLOCK)
每次應用程序詢問內核是否有數據準備好。如果就緒,就進行拷貝操作;如果未就緒,就不阻塞程序,內核直接返回未就緒的返回值,等待用戶程序下一個輪詢。
非阻塞IO模型
大致經歷兩個階段:
等待數據階段:未阻塞, 用戶進程需要盲等,不停的去輪詢內核。
數據復制階段:阻塞,此時進行數據復制。
在這兩個階段中,用戶進程只有在數據復制階段被阻塞了,而等待數據階段沒有阻塞,但是用戶進程需要盲等,不停地輪詢內核,看數據是否準備好。
3.IO多路復用模型
I/O 復用有時又被稱為 事件驅動 I/O, 它的最大優勢在于,我們可以將感興趣的多個I/O事件(更精確的說,應該是 I/O 所對應的文件描述符)注冊到 select/poll/epoll/kqueue 之中某一個系統調用上(很多時候,這些系統調用又被稱為多路復用器。假設此時我們選擇了 select() )。此后,調用進程會阻塞在 select() 系統調用之上(而不是阻塞在真正的 I/O 系統調用(如 read(), write() 等)上)。select() 會負責監視所有已注冊的 I/O 事件,一旦有任意一個事件的數據準備好,那么 select() 會立即返回,此時我們的用戶進程便能夠進行數據的復制操作。
總而言之,I/O 復用的優點就在于可以同時等待多個I/O事件;而缺點是會進行兩次系統調用(一次 select(), 一次 read() )。
4.信號驅動IO模型
在這種模型下,我們首先開啟套接字的信號驅動式I/O功能,并通過sigaction系統調用安裝一個信號處理函數。改系統調用將立即返回,我們的進程繼續工作,也就是說他沒有被阻塞。當數據報準備好讀取時,內核就為該進程產生一個SIGIO信號。我們隨后就可以在信號處理函數中調用read讀取數據報,并通知主循環數據已經準備好待處理,也可以立即通知主循環,讓它讀取數據報。當數據報準備好的時候,內核會向應用程序發送一個信號,進程對信號進行捕捉,并且調用信號處理函數來獲取數據報。
5.異步IO模型
異步 I/O 模型是一種處理與 I/O 重疊進行的模型。讀請求會立即返回,說明 read 請求已經成功發起了。在后臺完成讀操作時,應用程序然后會執行其他處理操作。當 read 的響應到達時,就會產生一個信號或執行一個基于線程的回調函數來完成這次 I/O 處理過程。
異步I/O執行的兩個階段都不會阻塞讀寫操作,由內核完成。完成后內核將數據放到指定的緩沖區,通知應用程序來取。
通過以上的介紹,我想大家5種Linux網絡I/O模型有了一定的了解和認識,而且也了解到了5種Linux網絡I/O模型每種模型的優缺點,Linux同步 I/O 總會有阻塞的過程,這就是“同步”最本質的特征。而Linux異步 I/O 的最大特點在于用戶進程均不阻塞。用戶進程告知內核啟動某一 I/O 操作, 并讓內核全權代為執行(包括等待數據及拷貝數據至用戶空間),此后用戶進程可以立即執行其它的任何操作。等到所有 I/O 過程執行完成后, 內核會通知用戶進程。由此可見,在整個過程中,用戶進程均不阻塞。讓我們攜手本站的Linux教程,更加透徹的學習Linux中的各種知識吧!
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習