網絡IO模型--事件模型

 編寫高性能的網絡應用程序,尤其是服務器端程序或進行web服務器的調優,需要深入理解網絡IO模型。爲了更好的理解IO模型,先介紹幾個術語

1、術語

        1)同步、異步:這裏的同步、異步說法很詭異的,不用在上面糾結,只需要知道有那幾種IO模型就可以了,同步、異步就當成是組成IO模型的名稱的一部分好了。

        2)阻塞、非阻塞:指IO就緒前調用IO操作的線程是否阻塞。 
        3)文件描述符fd:Linux的內核將所有外部設備都可以看做一個文件來操作,因此網絡流的讀寫也作爲文件來操作的。
        4)IO調用:包括IO就緒階段和數據複製階段(數據從內核複製到用戶空間,數據複製是調用IO控制器完成的,調用線程期間必須阻塞)。


2、IO模型
        POSIX定義的IO模型的規定就兩種 
             ■同步IO模型:引起線程的阻塞直到IO操作完成 
             ■異步IO模型:IO操作不會引起線程阻塞 
        但我們在網上看到的UNIX的IO模型的介紹一般有5種,其實,這些都是根據編程模型不同而衍生出來的。下面分別介紹一下這5種IO模型 
        1)同步阻塞IO
           線程阻塞,直到IO就緒,才調用IO操作。java中的普通socket讀寫就是這種模式了,read方法會一直堵塞,直到有數據才返回。 
        2)同步非阻塞IO
           進行IO調用的時候,如果IO沒就緒,則直接返回錯誤碼,而不是阻塞線程。應用程序可循環調用直到IO操作完成。
        3)IO複用(多路IO就緒通知)
           內核提供系統調用,檢查有哪些fd已經就緒,已就緒的df,則進行數據複製。這種方式,根據不同的操作系統有不同的實現,linux提供了三種實現。 
           a、select調用方式,將多個fd丟給select系統調用,select對每個fd,進行判斷,發現哪些fd就緒,則修改fd的狀態,最後把包含所有fd的數組返回給應用程序,應用程序判斷每個fd,對就緒的fd進行數據複製。 
           b、poll調用方式,基本上和select方式一樣,不同在於select最多隻支持1024個文件描述符,poll則沒有限制。 
           c、epoll調用方式,和poll不同之處在於epoll採用了內存映射技術,並且epoll不是返回fd數組,而是返回一個就緒fd數量值,另外在一個數組中保存了就緒的fd(不像select和poll是所有fd),因此在性能上會好很多,java的nio就是採用這種模式實現的。 
        4)sigio(信號驅動)方式,IO就緒時,通過信號通知應用程序來複制數據,速度是很快的,但是隻會通知一次,如果應用程序不處理,或系統的錯誤(比如通知的事件隊列滿了或者輪到該通知事件通知的時候文件已經關閉了),就會發生事件丟失。而select、poll、epoll等系統調用,每次調用都會得到就緒的fd數組,不會發生丟失。 
        5)異步IO(AIO)方式,告訴操作系統要做IO操作,df就緒及數據複製都由操作系統完成,完成後通知應用程序。java 7實現了這種方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章