(1)同步io
在作業系統中,程式執行的空間分為核心空間和使用者空間,使用者空間所有對io操作的**(如檔案的讀寫、socket的收發等)都會通過系統呼叫進入核心空間完成實際的操作。
cpu的速度遠快於硬碟、網路等io。在乙個執行緒中,cpu執行**的速度極快,然而,一旦遇到io操作,如讀寫檔案、傳送網路資料時,就需要等待io操作完成,才能繼續進行下一步操作,這種情況稱為同步io.
(2)非同步io
當程式需要對 i/o 進行操作時,它只發出 i/o 操作的指令,並不等待 i/o 操作的結果,然後就去執行其他**了。一段時間後,當 i/o 返回結果時,再通知 cpu 進行處理。這樣子使用者空間中的程式不需要等待核心空間中的 i/o 完成實際操作,就可執行其他任務,提高 cpu 的利用率。
簡單來說就是,使用者不需要等待核心完成實際對 io的讀寫操作就直接返回了。
(3)阻塞io
在 linux 中,預設情況下所有的 socket 都是阻塞的,乙個典型的讀操作流程大概是這樣:
當使用者程序呼叫了 read()/recvfrom() 等系統呼叫函式,它會進入核心空間中,當這個網路i/o 沒有資料的時候,核心就要等待資料的到來,而在使用者程序這邊,整個程序會被阻塞,直到核心空間返回資料。當核心空間的資料準備好了,它就會將資料從核心空間中拷貝到使用者空間,此時使用者程序才解除阻塞的的狀態,重新執行起來。
所以,阻塞 i/o 的特點就是在io 執行的兩個階段(使用者空間與核心空間)都被阻塞了。
(4)非阻塞io
linux 下,可以通過設定 socket 使其變為非阻塞模式,這種情況下,當核心空間並無資料的時候,它會馬上返回結果而不會阻塞,此時使用者程序可以根據這個結果自由配置,比如繼續請求資料,或者不再繼續請求。當對乙個非阻塞 socket 執行讀操作時,流程是這個樣子:
所以,非阻塞 i/o 的特點是使用者程序需要不斷的主動詢問核心空間的資料準備好了沒有。
(5)多路復用io
多路復用 i/o 就是我們說的 select,poll,epoll 等操作,復用的好處就在於單個程序就可
以同時處理多個網路連線的 i/o,能實現這種功能的原理就是select、poll、epoll 等函式
會不斷的 輪詢它們所負責的所有 socket ,當某個 socket 有資料到達了,就通知使用者程序。
一般來說 i/o 復用多用於以下情況:
與多程序和多執行緒技術相比,i/o 多路復用技術的最大優勢是系統開銷小,系統不必建立程序/執行緒,也不必維護這些程序/執行緒,從而大大減小了系統的開銷。但 select,poll,epoll 本質上都是同步 i/o,因為他們都需要 在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是 阻塞的,而 非同步 i/o 則無需自己負責進行讀寫,非同步 i/o 的實現會負責把資料從核心拷貝到使用者空間.
1、select
select, poll和epoll的區別
我只用過select select 最不能忍受的是乙個程序所開啟的fd是有一定限制的,由fd setsize設定,預設值是2048。對於那些需要支援的上萬連線數目的im伺服器來說顯然太少了,select要掃瞄各個檔案描述符,而epool採用mmap更高效 select 系統呼叫提供乙個機制來實現同步...
select poll和epoll的區別
select,poll,epoll都是io多路復用的機制。i o多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒 一般是讀就緒或者寫就緒 能夠通知程式進行相應的讀寫操作。select僅僅知道i o事件發生的檔案描述符的數量,但並不知道是哪幾個 1 時間複雜度 o n 2 優點 跨平台支...
select,poll和epoll的API複習筆記
環境 centos7 xshell 前言 select poll epoll 的區別一定要清楚 select 優點是跨平台,而poll相對其沒有1024檔案描述符的限制,共有的缺點是 1.每次監聽都需要將監聽的資訊從應用層拷貝到核心。2.返回變化的檔案描述符的個數,具體哪個檔案描述符變化需要遍歷。3...