作業系統下常見的四種網路I O模型詳解

2021-10-10 11:03:57 字數 1719 閱讀 2367

作業系統中,常見的i/o模型包括以下幾種:

一般情況下,作業系統中所有的socket預設的是阻塞的,當使用者呼叫了系統套接字recvfrom的時候,核心會就會進入i/o的第乙個階段,就是準備資料,對於網路i/o來說,這時候還有許多資料並未到達,那麼核心就需要等待所有的資料到來,這時候使用者程序將會被阻塞住,直到資料全部到來,核心將資料從緩衝區拷貝到使用者記憶體,然後核心返回資料。阻塞式i/o的特點是i/o執行的兩個階段(資料準備階段以及核心將資料複製的階段)使用者程序都被阻塞住。

相比於阻塞式i/o,非阻塞式i/o做了一些改進,呼叫套接字recvform的時候在核心準備資料的階段,如果資料沒有準備好,使用者程序不會立刻被阻塞而是,會立即反饋給使用者乙個error資訊,那麼使用者就可以輪詢的呼叫recvform監聽核心,如果使用者的資料都準備好了,且這時候使用者剛好呼叫了recvform,那麼會立即將資料從核心緩衝區拷貝到使用者程序中。在不斷輪詢的過程中,會耗費大量的cpu資源。

i/o多路復用時使用最為廣泛的一種技術,可以通過單個程序監聽多個i/o事件。通過select / poll / epoll 這些函式輪詢的訪問i/o事件,如果某個i/o事件到達了,那麼就會通知使用者程序。

select / poll / epoll的區別

select的方式

首先需要明確的一點就是,呼叫select的時候,整個使用者的程序也會被阻塞。select是通過輪詢的方式遍歷存放i/o事件描述符的資料結構完成對每個i/o事件的監聽;且單個程序監聽的i/o事件的數量也有很大的限制,32bit機器預設的是2014,而64位機器則預設的是2048,同時,通過輪詢的訪問存放i/o事件描述符的資料結構的方法是非常耗費cpu資源的一種方式,使用者空間於核心空間之間複製的成本是非常高的。

poll的方式

poll的本質與select是沒有多大差距的,它將使用者傳入的陣列拷貝到核心空間,然後查詢每個i/o事件描述符對應的裝置狀態,如果裝置就緒則在裝置等待佇列中加入一項並繼續遍歷,如果遍歷完所有i/o事件描述符後沒有發現就緒裝置,則掛起當前程序,直到裝置就緒或者主動超時,被喚醒後它又要再次遍歷。

epoll的方式

epoll支援水平觸發和邊緣觸發,最大的特點在於邊緣觸發,它只告訴程序哪些i/o事件描述符剛剛變為就需態,並且只會通知一次。沒有最大併發連線的限制,能開啟的fd的上限遠大於1024(1g的記憶體上能監聽約10萬個埠,效率提公升,不是輪詢的方式,不會隨著fd數目的增加效率下降。只有活躍可用的fd才會呼叫callback函式;

即epoll最大的優點就在於它只管你「活躍」的連線,而跟連線總數無關,因此在實際的網路環境中,epoll的效率就會遠遠高於select和poll。記憶體拷貝,利用mmap()檔案對映記憶體加速與核心空間的訊息傳遞;即epoll使用mmap減少複製開銷。

非同步i/o

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

作業系統四種排程演算法

一 實驗目的 1 掌握程序排程的任務 機制和方式。2 熟練掌握程序程序排程的演算法的原理。二 實驗內容 1 實現 短作業優先排程演算法 2 實現 先到先服務排程演算法 3 實現 非搶占式高響應比優先排程演算法 4 實現 搶占式高響應比優先排程演算法 三 實驗 實驗全部 見附件code.txt 實驗的...

常見的四種網路程式設計方式

1 isapi程式設計 mfc中支援isapi的類有 2 cgi程式設計 cgi的工作原理介紹 cgi common gateway inte ce 是乙個web伺服器提供資訊服務的標準介面,通過這樣乙個介面,web伺服器能夠執行程式,並將程式輸出的資訊返回給瀏覽器。因為在web網上的資料都是靜態的...

Python 檔案IO的四種讀寫操作

1.str 轉字串儲存 eval 轉資料型別讀取 d with open test.txt w as file file.write str d 轉字串儲存 with open test.txt r as file f file.read f eval f 轉資料型別讀取 print f,type ...