I/O流
-
概念
(1)c++中將資料的輸入輸出稱之為流(stream),在c++中,流被定義為類,成為流類(stream class),其定義的物件為流物件,
(2)檔案,套接字(socket),管道(pipe)等能夠進行I/O操作的物件,可以被看做為流
-
作業機制
(1)大多數檔案系統的默認I/O操作都是快取I/O,在Linux的快取I/O機制中,讀取資料時,都會將資料先拷貝到作業系統內核的緩沖區中,然后將作業系統內核緩沖區的資料拷貝到應用程式的地址空間,寫的程序則相反,
(2)快取I/O使用作業系統內核緩沖區,在一定程度上分離了應用程式空間和實際的物理設備,通過將資料寫入緩沖區后,再一次性處理,減少了讀盤的次數,從而提高了性能
I/O模型
-
同步與異步:關注的是訊息通信機制
同步(synchronous):呼叫者會一直“等待”被呼叫者回傳訊息,才能繼續執行,在此期間,呼叫者不能做其它事
異步(asynchronous):被呼叫者通過狀態、通知或回呼機制主動通知呼叫者被呼叫者的運行狀態,在此期間,呼叫者可以邊“等待”,邊做其它事
-
阻塞和非阻塞:關注呼叫者的狀態
阻塞(blocking):呼叫者一直“等待”所處的狀態
非阻塞(blocking):呼叫者能夠邊“等待”,邊做其它事的狀態
-
同步I/O
(1)阻塞式I/O:程式發出I/O請求,如果內核緩沖區為空,此時進行讀操作,那么該程式就會阻塞
(2)非阻塞式I/O:程式發出I/O請求,如果內核緩沖區為空,此時進行讀操作,此時就會立刻回傳一個錯誤
(3)I/O復用
? a. 這是一種機制,程式注冊一組檔案描述符給作業系統,監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作,表示“我要監視這些fd是否有I/O事件發生,有了就告訴程式處理”,
? b. 當多個I/O流共用一個等待機制時,該模型會阻塞行程,但是行程時阻塞在這種機制的系統呼叫上,不是阻塞在真正的I/O操作上
? c. I/O多路復用需要和非阻塞I/O一起使用,非阻塞I/O和I/O多路復用式相對獨立的,非阻塞I/O僅僅指流物件立刻回傳,不會被阻塞;而I/O多路復用只是作業系統提供的一種便利的通知機制,
(4)信號驅動式I/O
? a. 用戶行程可以通過系統呼叫注冊一個信號處理程式,然后主程式可以繼續向下執行,當有I/O操作準備就緒時,由內核通知觸發一個SIGIO信號處理程式執行,然后將用戶行程所需要的資料從內核空間拷貝到用戶空間
? b. 此模型的優勢在于等待資料報到達期間行程不被阻塞,用戶主程式可以繼續執行,只要等待來自信號處理函式的通知,
-
異步I/O
? a. 程式行程向內核發送I/O呼叫后,不用等待內核回應,可以繼續接受其他請求,內核呼叫的I/O如果不能立即回傳,內核會繼續處理其他事物,直到I/O完成后將結果通知給內核
? b. 信號驅動式IO是由內核通知我們何時啟動一個IO操作,而異步IO是由內核通知我們IO操作何時完成,
I/O復用模型
-
select
select的大致作業流程:
(1)采用陣列組織檔案描述符
(2)通過遍歷陣列的方式,監視檔案描述符的狀態(可讀,可寫,例外)
(3)如果沒有可讀/可寫的檔案描述符,行程會阻塞等待一段事件,超時就回傳
(4)當有一個可讀/可寫的檔案描述符存在時,行程會從阻塞狀態醒來
(5)進行無差別輪詢,找出能夠操作的I/O流,若處理后,會移除對應的檔案描述符
select的缺點:
(1)每次呼叫select,都需要把檔案描述符集合從用戶空間貝到內核空間,這個開銷在I/O流很多時會很大
(2)同時每次呼叫select都需要在內核遍歷傳遞進來的所檔案描述符陣列,這個開銷在I/O流很多時也很大
(3)select支持的檔案描述符數量太小了,默認是1024
-
poll
(1)采用鏈表組織檔案描述符
(2)原理和select一致
(3)只是解決了支持的檔案描述符受限的缺點
(4)select和poll都是水平觸發:找到可操作的I/O流并通知行程,但行程本次沒有處理,檔案描述符沒有被移除,下次輪詢時依舊會通知
-
epoll
作業原理:
(1)紅黑樹和就緒鏈表,紅黑樹用于管理所有的檔案描述符,就緒鏈表用于保存有事件發生的檔案描述符,
(2)接收到I/O請求,會在紅黑樹查找是否存在,不存在就添加到紅黑樹中,存在則將對應的檔案描述符放入就緒鏈表中
(3)如果就緒鏈表為空,行程則阻塞否則遍歷就緒鏈表,并通知應用行程處理檔案描述符對應的I/O
作業模式:
(1)LT模式(水平觸發):檢測到可處理的檔案描述符時,通知應用程式,應用程式可以不立即處理該事件,后續會再次通知
(2)ET模式(邊緣觸發):檢測到可處理的檔案描述符時,通知應用程式,應用程式必須立即處理該事件,如果本次不處理,則后續不再通知
參考資料
IO五種模型和select與epoll作業原理(引入nginx) - osc_1ont5xz2的個人空間 - OSCHINA - 中文開源技術交流社區
IO模型:同步、異步、阻塞、非阻塞 | 神奕的博客 (songlee24.github.io)
(3) io復用與epoll模型詳解_個人文章 - SegmentFault 思否
(3) Linux IO模式及 select、poll、epoll詳解_人云思云 - SegmentFault 思否
Linux 網路編程的5種IO模型:多路復用(select/poll/epoll) - 黃樹超 - 博客園 (cnblogs.com)
(3) 網路編程——select模型(總結)_個人文章 - SegmentFault 思否
網路編程之IO模型與Epoll - 簡書 (jianshu.com)
徹底搞懂epoll高效運行的原理 - 簡書 (jianshu.com)
如果這篇文章說不清epoll的本質,那就過來掐死我吧! (3) - 知乎 (zhihu.com)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/201477.html
標籤:Linux
上一篇:僵尸行程簡介
下一篇:centos7系統圖形界面黑屏
