亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

透徹Linux(Unix)五種IO模型

2019-11-14 12:27:26
字體:
來源:轉載
供稿:網友

IO模型

用一幅圖表示所支持的I/O模型

縱向維度是“阻塞(Blocking)”、“非阻塞(Non-blocking)”;橫向維度是“同步”、“異步”??偨Y起來是四種模型同步阻塞、同步非阻塞;異步阻塞、異步非阻塞?!禪nix網絡編程》中劃分出了“第五種”模型——“信號驅動式IO”其實屬于異步阻塞類型,這種模型的通知方式有多種多樣后面展開說明。

同步/異步、阻塞/非阻塞

從內核角度看I/O操作分為兩步:用戶層API調用;內核層完成系統調用(發起I/O請求)。所以“異步/同步”的是指API調用;“阻塞/非阻塞”是指內核完成I/O調用的模式。用一幅圖表示更加明顯

同步是指函數完成之前會一直等待;阻塞是指系統調用的時候進程會被設置為Sleep狀態直到等待的事件發生(比如有新的數據)。明白這一點之后再看這五種模型相信就會清晰很多,我們挨個分析:

同步阻塞

這種模型最為常見,用戶空間調用API(read、write)會轉化成一個I/O請求,一直等到I/O請求完成API調用才會完成。這意味著:在API調用期間用戶程序是同步的的;這個API調用會導致系統以阻塞的模式執行I/O,如果此時沒有數據則一直“等待”(放棄CPU主動掛起——Sleep狀態)(注意,對于硬盤來說是不會出現阻塞的,無論是什么時候讀它總是有數據。常見的阻塞設備是終端、網卡之類的)。

read為例子,它由三個參數組成,第一個函數是文件描述符;第二個是應用緩沖;第三個參數是需要讀取的字節數。經過系統調用會以阻塞模式執行I/O,I/O模塊讀取數據后會放入到PageCache中;最后一步是把數據從PageCache復制到應用緩沖。如果I/O請求無法得到滿足——沒有數據,則主動讓出CPU直到有數據(注意,即便系統調用讓出CPU也未必真的就讓出。read函數是同步的,所以CPU還是會被用戶空間代碼占用)。

同步非阻塞

這種模式通過調用readwrite的時候指定O_NONBLOCK參數。和“同步阻塞”模式的區別在于系統調用的時候它是以非阻塞的方式執行,無論是否有數據都會立即返回。以read為例,如果成功讀取到數據它返回讀取到的字節數;如果此時沒有數據則返回-1,同時設置errno為EAGAIN(或者EWOULDBLOCK,二者相同)。所以這種模式下我們一般會用一個“循環”不停的嘗試讀取數據,處理數據。

異步阻塞

同步模型最主要的問題是占用CPU,阻塞I/O會主動讓出CPU但是用戶空間的系統調用還是不會返回依然耗費CPU;非阻塞I/O必須不停的“輪詢”不斷嘗試讀取數據(會耗費更多CPU更加低效)。如果仔細分析同步模型霸占CPU的原因不難得出結論——都是在等待數據到來。異步模式正是意識到這一點所以把I/O讀取細化為訂閱I/O事件,實際I/O讀寫,在“訂閱I/O事件”事件部分會主動讓出CPU直到事件發生。異步模式下的I/O函數和同步模式下的I/O函數是一樣的(都是readwrite)唯一的區別是異步模式“讀”必有數據而同步模式則未必。常見的異步阻塞函數包括selectpoll,epoll,這些函數的用法需要花費相當大的篇幅介紹而這篇文章我想集中精力介紹“I/O模型”。以select為例我們看一下大致原理

異步模式下我們的API調用分為兩步,第一步是通過select訂閱讀寫事件這個函數會主動讓出CPU直到事件發生(設置為Sleep狀態,等待事件發生);select一旦返回就證明可以開始讀了所以第二部是通過read讀取數據(“讀”必有數據)。

異步阻塞模型之信號驅動

“完美主義者”看了上面的select之后會有點不爽——我還要“等待”讀寫事件(即便select會主動讓出CPU),能不能有讀寫事件的時候主動通知我?。?。借助“信號”機制我們可以實現這個,但是這并不完美而且有點弄巧成拙的意思。具體用法:通過fcntl函數設置一個F_GETFL|O_ASYNC( 曾經信號驅動I/O也叫“異步I/O”所以才有O_ASYNC的說法),當有I/O時間的時候操作系統會觸發SIGIO信號。在程序里只需要綁定SIGIO信號的處理函數就可以了。但是這里有個問題——信號處理函數由哪個進程執行呢?,答案是:“屬主”進程。操作系統只負責參數信號而實際的信號處理函數必須由用戶空間的進程實現。(這就是設置F_SETOWN為當前進程PID的原因)信號驅動性能要比selectpoll高(避免文件描述符的復制)但是缺點是致命的——*linux中信號隊列是有限制的如果操過這個數字問題就完全無法讀取數據。

異步非阻塞

這種模型是最“省事”的模型,系統調用完成之后就只要坐等數據就可以了。是不是特別爽?其實不然,問題出在實現上。Linux上的AIO兩個實現版本,POSIX的實現最爛(藍色巨人的鍋)性能很差而且是基于“事件驅動”還會出現“信號隊列不足”的問題(所以它就偷偷的創建線程,導致線程也不可控了);一個是Linux自己實現的(redhat貢獻)Native AIO。Native AIO主要涉及到的兩個函數io_submit設置需要I/O動作(讀、寫,數據大小,應用緩沖區等);io_getevents等待I/O動作完成。沒錯,即便你的整個I/O行為是非阻塞的還是需要有一個辦法知道數據是否讀取/寫入成功。

注意圖中,內核不再為I/O分配PageCache,所有的數據必須有用戶自己讀取到應用緩沖中維護。所以AIO一定是和“直接I/O”配合使用。AIO針對網卡設備的意義不大,首先它的實現本質上和epoll差不多;其次它在Linux中的作用更多的是用于磁盤I/O(異步非阻塞可以不用多線程就造成大量的I/O請求便于I/O模塊“合并”優化會提高整體I/O的吞吐率——而且對CPU開銷比較少)。在Nginx中用了一個技巧,可以實現AIO和epoll聯動,AIO讀取到數據后觸發epoll發送數據。(這個特性是非常尷尬的,如果是磁盤文件完全可以用sendfile搞定)。

Direct I/O和Buffered I/O

Linux在進行I/O操作的時候會先把數據放到PageCache中然后通過“內存映射”的方式返回給應用程序,這樣做的好處是可以預讀數據也能在多個進程讀取相同數據的時候起到Cache的作用。應用程序不能直接使用PageCache中的數據,通常是復制到一塊“用戶空間”的內存中再使用。

Direct I/O是指數據不落在PageCache,直接從設備讀取到數據后放到用戶空間中

Buffered I/O是指數據競購PageCache

同步I/O只能使用Buffered I/O;異步阻塞I/O可以Buffered I/O也可以使用Direct I/O;異步非阻塞I/O只能使用Direct I/O

Zero Copy

考慮從磁盤讀取文件經過網卡發送出去,會有四次內存復制:1. DMA會復制磁盤數據到內核空間,2. 應用程序復制內核空間的數據到用戶空間;3. 應用程序用戶空間的數據復制到Socket緩沖(內核空間);4. 協議棧把數據復制到網卡的中發送。簡單來說Zero Copy就是節省這個過程中的內存復制次數。有幾種做法:

Direct I/O直接把磁盤數據復制到內核空間;但是Direct I/O沒有辦法直接把數據放到網卡中——必須要經過協議棧。所以可以節省一次內存復制;

sendfile,磁盤數據通過DMA讀取到內核空間后直接交給TCP/ip協議棧;真正的不需要內存復制;

除此之外還可以利用splice、mmap做一些優化,根據不同的設備需要采用不同的方式此處不再展開。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线视频九色| 欧美电影院免费观看| 亚洲国产精久久久久久久| 北条麻妃一区二区三区中文字幕| 7m第一福利500精品视频| 北条麻妃在线一区二区| 视频一区视频二区国产精品| 91精品国产91久久久久久| 国产精品视频精品视频| 91成品人片a无限观看| 91色视频在线观看| 亚洲欧美日韩天堂一区二区| 国产精品男人的天堂| 国产aaa精品| 欧美电影免费观看高清完整| 欧亚精品中文字幕| 精品毛片三在线观看| 国产有码在线一区二区视频| 国产视频在线观看一区二区| 色噜噜狠狠狠综合曰曰曰88av| 国产精品嫩草影院一区二区| 精品一区电影国产| 欧美日韩中国免费专区在线看| 日韩欧美在线国产| 久久久精品美女| 国产精品久久久久久久久久久久| 国产精品久久久久免费a∨| 日本精品久久电影| 欧美一级大片在线免费观看| 九九热精品在线| 亚洲最大福利视频| 激情懂色av一区av二区av| 欧美日韩国产色视频| 久久久久在线观看| 成人有码视频在线播放| 亚洲欧美中文日韩在线| 国产亚洲精品va在线观看| 国产国语videosex另类| 精品亚洲一区二区三区| 国产精品视频资源| 亚洲第一精品夜夜躁人人躁| 国产精品免费久久久久影院| 国产精品网站视频| 91在线视频免费| 日韩精品在线免费观看视频| 国产精品白丝jk喷水视频一区| 日韩av免费在线看| 久久最新资源网| 亚洲а∨天堂久久精品喷水| 综合136福利视频在线| 狠狠色香婷婷久久亚洲精品| 国产精品一区二区三| 欧美亚洲激情在线| 国产精品美女午夜av| 日韩国产欧美区| 亚洲天堂av在线免费| 国产乱人伦真实精品视频| 国产精品jizz在线观看麻豆| 欧美福利视频在线观看| 亚洲美女自拍视频| 91国产精品视频在线| 亚洲国产欧美一区二区三区久久| 亚洲国产精品美女| 亚洲色图国产精品| 91免费福利视频| 中文字幕在线国产精品| 欧美激情精品久久久久久大尺度| 日韩网站在线观看| 91久久中文字幕| 俺去亚洲欧洲欧美日韩| 在线观看视频亚洲| 日韩黄色高清视频| 国产成人精品在线视频| 国内免费久久久久久久久久久| 久久精品国产v日韩v亚洲| 色午夜这里只有精品| 最新国产成人av网站网址麻豆| 久久91亚洲精品中文字幕| 亚洲精品自产拍| 欧美在线观看日本一区| 中文字幕不卡av| 亚洲精品美女免费| 欧美裸体男粗大视频在线观看| 狠狠躁夜夜躁久久躁别揉| 欧美老女人性生活| 亚洲美女免费精品视频在线观看| 国产成人av网| 中文字幕在线观看日韩| 亚洲无线码在线一区观看| 萌白酱国产一区二区| 2021久久精品国产99国产精品| 九九热精品视频国产| 欧美日韩亚洲国产一区| 亚洲激情第一页| 一本一本久久a久久精品牛牛影视| 亚洲视频网站在线观看| 国产精品青青在线观看爽香蕉| 亚洲国产97在线精品一区| 亚洲精品久久久久国产| 成人性生交大片免费看视频直播| 亚洲成人a级网| 亚洲欧洲国产一区| 欧美大学生性色视频| 国产福利视频一区| 国产在线999| 欧美精品www| 欧美洲成人男女午夜视频| 亚洲www永久成人夜色| 91精品综合久久久久久五月天| 亚洲欧美制服第一页| 亚洲毛片一区二区| 97视频网站入口| 欧美另类老肥妇| 欧美贵妇videos办公室| 91久久国产婷婷一区二区| 日韩精品亚洲元码| 亚洲精品电影久久久| 最近2019好看的中文字幕免费| 欧美裸体xxxx极品少妇| 91免费国产网站| 亚洲在线观看视频| 中文在线资源观看视频网站免费不卡| 久久久91精品国产一区不卡| 亚洲999一在线观看www| 亚洲男人天天操| 亚洲国产日韩精品在线| 日韩欧美精品网址| 国产精品久久久久久久美男| 26uuu另类亚洲欧美日本老年| 亚洲欧美成人在线| 日韩免费精品视频| 在线亚洲午夜片av大片| 亚洲成人网在线观看| 亚洲日韩中文字幕在线播放| 国产精品精品一区二区三区午夜版| 日韩久久午夜影院| 亚洲电影免费观看| 国产成人精品视频在线| 国产亚洲精品久久久久久牛牛| 久久777国产线看观看精品| 国产精品成人一区| 欧美交受高潮1| 国产成人精品a视频一区www| 欧美亚洲午夜视频在线观看| 国产一区私人高清影院| 97色在线观看免费视频| 国产视频亚洲精品| 日韩av最新在线观看| 国产精品偷伦免费视频观看的| 日韩性生活视频| 国产成人黄色av| 91免费人成网站在线观看18| 亚洲国产美女久久久久| 精品久久香蕉国产线看观看gif| 欧美激情综合亚洲一二区| 亚洲精品av在线| 欧美丰满片xxx777| 欧美黑人一级爽快片淫片高清| 久久影院模特热| 国产欧美日韩精品在线观看| 久久精品人人爽| 精品国产一区二区三区在线观看| 最新91在线视频| 岛国av午夜精品|