免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Linux network I/O
userphoto

2019.02.12

關注

對于傳統(tǒng)的操作系統(tǒng)來說,普通的 I/O 操作一般會被內核緩存,這種 I/O 被稱作緩存 I/O。緩存 I/O 又被稱作標準 I/O,大多數(shù)文件系統(tǒng)的默認 I/O 操作都是緩存 I/O。在 Linux 的緩存 I/O 機制中,操作系統(tǒng)會將 I/O 的數(shù)據(jù)緩存在文件系統(tǒng)的頁緩存( page cache )中,也就是說,數(shù)據(jù)會先被拷貝到操作系統(tǒng)內核的緩沖區(qū)中,然后才會從操作系統(tǒng)內核的緩沖區(qū)拷貝到應用程序的地址空間。



(1) 對于讀操作來說,當應用程序嘗試讀取某塊數(shù)據(jù)的時候,如果這塊數(shù)據(jù)已經(jīng)存放在了頁緩存中,那么這塊數(shù)據(jù)就可以立即返回給應用程序,而不需要經(jīng)過實際的物理讀盤操作。當然,如果數(shù)據(jù)在應用程序讀取之前并未被存放在頁緩存中,那么就需要先將數(shù)據(jù)從磁盤讀到頁緩存中去。一個典型的讀取磁盤中數(shù)據(jù)的流程圖如下所示: 


(2) 對于寫操作來說,應用程序也會將數(shù)據(jù)先寫到頁緩存中去,數(shù)據(jù)是否被立即寫到磁盤上去取決于應用程序所采用的寫操作機制:如果用戶采用的是同步寫機制( synchronous writes ), 那么數(shù)據(jù)會立即被寫回到磁盤上,應用程序會一直等到數(shù)據(jù)被寫完為止;如果用戶采用的是延遲寫機制( deferred writes ),那么應用程序就完全不需要等到數(shù)據(jù)全部被寫回到磁盤,數(shù)據(jù)只要被寫到頁緩存中去就可以了。在延遲寫機制的情況下,操作系統(tǒng)會定期地將放在頁緩存中的數(shù)據(jù)刷到磁盤上。與異步寫機制( asynchronous writes )不同的是,延遲寫機制在數(shù)據(jù)完全寫到磁盤上的時候不會通知應用程序,而異步寫機制在數(shù)據(jù)完全寫到磁盤上的時候是會返回給應用程序的。所以延遲寫機制本身是存在數(shù)據(jù)丟失的風險的,而異步寫機制則不會有這方面的擔心。


緩存 I/O 優(yōu)點:



  • 緩存 I/O 使用了操作系統(tǒng)內核緩沖區(qū),在一定程度上分離了應用程序空間和實際的物理設備。緩存 I/O 可以減少讀盤的次數(shù),從而提高性能。






緩存I/O缺點:



  • 在緩存 I/O 機制中,DMA 方式可以將數(shù)據(jù)直接從磁盤讀到頁緩存中,或者將數(shù)據(jù)從頁緩存直接寫回到磁盤上,而不能直接在應用程序地址空間和磁盤之間進行數(shù)據(jù)傳輸,這樣的話,數(shù)據(jù)在傳輸過程中需要在應用程序地址空間和頁緩存之間進行多次數(shù)據(jù)拷貝操作,這些數(shù)據(jù)拷貝操作所帶來的 CPU 以及內存開銷是非常大的。對于某些特殊的應用程序來說,避開操作系統(tǒng)內核緩沖區(qū)而直接在應用程序地址空間和磁盤之間傳輸數(shù)據(jù)會比使用操作系統(tǒng)內核緩沖區(qū)獲取更好的性能。






2 Linux環(huán)境下的network I/O



網(wǎng)絡IO的本質就是socket的讀取,socket在linux系統(tǒng)被抽象為流,IO可以理解為對流的操作。文章開始的時候也提到了,對于一次IO訪問(以read為例),數(shù)據(jù)會先被拷貝到操作系統(tǒng)內核的緩沖區(qū),然后才會從操作系統(tǒng)內核的緩沖區(qū)拷貝到應用程序的地址空間中。







所以說,當一個read操作發(fā)生時,它會經(jīng)歷兩個階段: 

第一個階段:等待數(shù)據(jù)準備。 

第二個階段:將數(shù)據(jù)從內核拷貝到進程中 

對于socket流而言: 

第一步:通常涉及等待網(wǎng)絡上的數(shù)據(jù)分組到達,然后復制到內核的某個緩沖區(qū)。 

第二步:把數(shù)據(jù)從內核緩沖區(qū)復制到應用進程緩沖區(qū)。


Linux環(huán)境下的五種IO Modle: blocking IO, nonblocking IO, IO multiplexing, signal driven IO, asynchronous IO. 其中前四種比較常見。


(1) blocking IO 

在阻塞IO模型中,從調用系統(tǒng)函數(shù)獲取數(shù)據(jù)開始到得到數(shù)據(jù),當前的進程或者線程始終是處于阻塞狀態(tài)的,也就是什么都不干,直到等完數(shù)據(jù)準備好和將數(shù)據(jù)搬遷到用戶空間為止:




 


1) 用戶首先發(fā)出系統(tǒng)調用函數(shù)希望獲取數(shù)據(jù); 

2) 系統(tǒng)調用會進入內核檢查是否有數(shù)據(jù)準備完畢,如果沒有就一直等待; 

3) 當數(shù)據(jù)準備完畢的時候會將數(shù)據(jù)拷貝到用戶空間; 

4) 拷貝完畢返回一個獲取數(shù)據(jù)成功的返回值來告訴用戶可以進行數(shù)據(jù)的處理了;在此期間,用戶進程或者線程一直是處于阻塞狀態(tài)的,無論是等待數(shù)據(jù)還是進行數(shù)據(jù)的拷貝;


(2) nonblocking IO 

和阻塞式的IO模型不同,當發(fā)出了系統(tǒng)調用的時候,如果這時候數(shù)據(jù)還沒有準備好,進程或線程并不會進入阻塞模式一直等待,而是會反復輪詢“數(shù)據(jù)好沒…數(shù)據(jù)好沒…數(shù)據(jù)好沒…”,這是比較耗CPU資源的,而當數(shù)據(jù)準備好之后會和阻塞IO模型一樣進行數(shù)據(jù)的拷貝:



1) 首先用戶發(fā)出系統(tǒng)調用,去向內核申請獲取想要的數(shù)據(jù); 

2) 內核檢查發(fā)現(xiàn)數(shù)據(jù)還沒準備好,就會返回一個錯誤值; 

3) 用戶接收到錯誤值并不甘心,就會反復反復詢問內核是否有數(shù)據(jù)準備好; 

4) 內核一直檢查直到有數(shù)據(jù)準備完畢,進行數(shù)據(jù)的搬遷,這時用戶會進入阻塞等待狀態(tài)等待數(shù)據(jù)拷貝完畢; 

5) 數(shù)據(jù)提取到用戶空間之后會返回一個成功狀態(tài)通知用戶數(shù)據(jù)完畢,這時用戶就可以進行數(shù)據(jù)的處理了;


(3) IO multiplexing 

既然是復用,說明一次性可以管理或處理多個IO,主要是靠select函數(shù)或者poll(epoll)函數(shù)來完成;這些函數(shù)同樣會阻塞進程,但是和阻塞式IO不同的是IO復用模型可以一次性阻塞多個IO操作。同時,kernel會“監(jiān)視”所有select負責的socket,當任何一個socket中的數(shù)據(jù)準備好了,select就會返回。這個時候用戶進程再調用read操作,將數(shù)據(jù)從kernel拷貝到用戶進程。




 


1) 用戶首先調用select或者poll函數(shù)對多個IO接口操作進行檢測,同時會使進程或者線程阻塞; 

2) 當有至少一個IO接口響應的時候,系統(tǒng)就會通知內核調用相應的函數(shù)來獲取數(shù)據(jù); 

3) 這時內核將數(shù)據(jù)拷貝遷移至內核空間,進程或者線程仍然處于阻塞狀態(tài); 

4) 數(shù)據(jù)就緒,返回一個成功值告訴用戶可以處理數(shù)據(jù)了;


(4) signal driven IO 

用戶首先注冊一個處理IO信號的信號處理函數(shù),當數(shù)據(jù)還沒準備好的時候進程或者線程并不阻塞,當數(shù)據(jù)準備好的時候用戶進程或者線程會收到一個信號SIGIO,這時候就會調用信號處理函數(shù),在信號處理函數(shù)中調用IO函數(shù)操作數(shù)據(jù),完成之后通知用戶:




 


1) 用戶程序中事先注冊好一個對于SIGIO的信號處理函數(shù); 

2) 當數(shù)據(jù)準備完畢的時候會向用戶進程或者線程發(fā)送一個SIGIO信號,這時信號就會被捕捉; 

3) 捕捉信號之后就會執(zhí)行用戶自定義的一個信號處理函數(shù),并且在函數(shù)中調用系統(tǒng)函數(shù)去獲取數(shù)據(jù); 

4) 獲取數(shù)據(jù)同樣會將數(shù)據(jù)進行拷貝到用戶空間,這時進程或者線程仍然會被阻塞; 

5) 當數(shù)據(jù)準備完畢同樣會通知用戶,之后就可以進行數(shù)據(jù)的處理了;


(5) asynchronous IO 

對于異步的IO模型來說,數(shù)據(jù)的等待和搬遷都不由當前的進程或者線程來處理,調用相應系統(tǒng)函數(shù)之后就會直接返回繼續(xù)執(zhí)行,因此當前用戶程并不會被阻塞,當數(shù)據(jù)已經(jīng)在用戶空間準備就緒之后會以狀態(tài)、通知或者回調來告訴用戶可以進行數(shù)據(jù)的處理了:



1) 用戶程序調用aio_read函數(shù),告訴內核描述字、緩沖區(qū)指針、緩沖區(qū)大小、文件偏移以及通知的方式,之后便立即返回; 

2) 這時內核相應的數(shù)據(jù)操作組件會進行數(shù)據(jù)的等待和搬遷,期間用戶程序并不受影響繼續(xù)執(zhí)行; 

3) 當數(shù)據(jù)都已經(jīng)在用戶空間準備就緒之后就會通過在函數(shù)中預留的通知方式來通知用戶程序處理數(shù)據(jù);


總結: 

從上面的分析中不難發(fā)現(xiàn),在對于數(shù)據(jù)的獲取過程中都是進行了兩個主要的部分:數(shù)據(jù)的等待和數(shù)據(jù)的搬遷;除此相同點之外,下面就總結一下各種IO模型的區(qū)別: 


從上面的比較可以發(fā)現(xiàn):前四種IO模型也就是阻塞IO、非阻塞IO、IO復用和信號驅動IO模型都是同步的,只有最后一種是異步的異步IO模型;默認情況下所創(chuàng)建出來的socket都是以阻塞的形式,比如網(wǎng)絡通信中的recvfrom和sendto,或者read和write等函數(shù)都是以阻塞的方式來實現(xiàn)的。







本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Linux 中直接 I/O 機制的介紹
磁盤IO:緩存IO、直接IO、內存映射
linux 同步IO: sync、fsync與fdatasync
《構建高性能web站點》筆記
【底層原理】用戶進程緩沖區(qū)和內核緩沖區(qū)
一些存儲的基本概念
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服