理解網絡I/O

網絡I/O模型

1,概念:

I/O,就是input/output,也就是輸入輸出。
    比如對一個文件,一個socket 的寫入/讀取就是一個i/o

磁盤i/o,操作文件的i/o,比如給文件寫入數據,讀取數據
網絡i/o,對一個socket連接的i/o,比如一個tcp連接,客戶端和服務端的寫入,讀取

注意:本文的I/O模型只討論網絡I/O

2,五大I/O模型

1總覽

對於網絡I/O操作,抽象了五大I/O模型,分別是
    1,阻塞I/O
    2,非阻塞I/O
    3,I/O多路複用
    4,信號驅動I/O
    5,異步I/O

2詳情

1,阻塞I/O (blocking i/o)

    應用程序在發出接收數據請求(recvfrom)後,如果數據沒有準備就緒,則當前進程會一直
    等待到數據準備就緒後再開始處理數據。等待期間進程是阻塞的,不能幹其他事情,整個過程中
    就是傻傻等待的狀態。也是最簡單的一種I/O模型

    生活實例:
        一個人在釣魚,魚沒有上鉤的時候,人一直在傻傻等待。

2,非阻塞I/O (non-blocking i/o)

    應用程序在發出數據接收請求後,會把當前套接字設置爲非阻塞,也就是說當前請求能否接收到
    數據都不會阻塞接下來需要執行的任務。
    如果要獲取到數據,需要客戶端後續不斷輪詢請求直到接收到數據。

    生活實例:
        一個人把魚竿扔進水裏之後,玩手機去了,每隔一段時間看看魚上鉤了沒有

3,I/O多路複用 (multiplexing i/o)

    I/O多路複用,比如有多個socket連接發出了接收數據的請求,按照正常的阻塞i/o的話,會按照
    順序等待這些socket一個一個數據就緒之後,逐個返回。多路複用的話,服務端會在當前進程輪詢
    管理這些socket,再把可用socket返回數據。不可用的socket輪詢繼續監聽。

    注意這些socket連接是非阻塞的,但是當前維護socket的進程會阻塞。也就是說socket都不可用
    的時候,就會阻塞等到第一個可用socket的出現

    生活實例:
        十個魚竿扔到水裏,然後看着哪個魚竿上鉤了,就釣哪條。

4,信號驅動I/O (signal-driven i/o)

    但應用程序發送數據接受請求同時會給當前請求註冊一個信號函數。然後當前程序執行後續操作,
    等到數據準備就緒後,內核就會給應用程序發送一個信號,便可以執行信號函數中的操作(信號函
    數中處理接收數據的事情)

    生活實例:
        給魚竿裝一個傳感器,玩手機去了,魚上鉤的時候傳感器響了,然後再把魚拉上來

5,異步I/O

    前面四種I/O複用模型都是同步的,區別於異步I/O模型。
    應用程序發送一個接受數據請求,告知系統內核並且讓內核做整個(I/O)操作,操作完成後通知應用程序。

    這裏和信號模型有點像,具體的區別就是,信號模型下,數據就緒後通知應用程序,讓應用程序來
    完成I/O操作。而異步,是通知應用程序我已經完成了I/O操作,也就是應用程序和發起的i/o操作
    是異步完成的,應用程序做自己的事情,內核幫助應用程序完成i/o操作。

    生活實例:
        異步實現要依賴底層支持,類似生活實例中釣魚就需要一個團隊的支持,把團隊比作操作系統
        內核,把魚竿仍水裏之後就玩手機去了,團隊成員幫你釣魚,釣上來魚之後,告訴你一聲。魚
        釣出來了。你看,你接下來執行的任務和釣魚完全是異步的。這就是異步I/O
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章