點我查看祕籍連載編程
用戶進程想要執行IO操做時(例如想要讀磁盤數據、向磁盤寫數據、讀鍵盤的輸入等等),因爲用戶進程工做在用戶模式下,它沒有執行這些操做的權限,只能經過發起對應的系統調用請求操做系統幫忙完成這些操做。這裏由於系統調用產生中斷將陷入到內核,進行一次上下文切換操做。操作系統
內核進程幫忙執行IO操做時,因爲IO操做相比於CPU來講是極慢的操做,CPU不該該等待在這個過程當中,而是切換到其它進程上去執行其它任務。這裏再次涉及到一次上下文切換:從內核態回到用戶態的其它進程。blog
DMA要求硬件的支持,須要在硬件中集成一個小型的「CPU」,好比如今的機械硬盤、固態硬盤、網卡等硬件都帶有DMA功能,這樣操做系統要執行IO操做時,直接將相關指令發送給這些DMA硬件,DMA處理器負責IO操做,而操做系統這時能夠放棄CPU,讓CPU去執行其它進程。例如對於讀磁盤文件時,操做系統將相關指令以及數據應寫在哪一個內存地址發送給DMA硬件後,由DMA硬件去讀寫數據到指定內存地址,當IO操做完成後,DMA硬件經過總線發送一個硬件中斷給CPU,因而陷入到內核態(這裏涉及了一次上下文切換),內核就知道了IO已經完成,因而將Kernel Buffer數據拷貝到用戶進程的IO Buffer,並準備調度用戶進程(再次上下文切換)。進程
假如不使用DMA硬件的話,那麼IO操做過程當中,操做系統將屢次參與,負責將硬件數據讀入或讀出內存,操做系統參與意味着要陷入到內核態,而且獲取CPU控制權,這也意味着要進行大量的上下文切換以及佔用大量CPU資源。內存
而使用DMA後,只有4次必要的上下文切換,且IO操做的過程當中徹底不須要消耗CPU資源。資源
除了DMA,還有更高級的RDMA(Remote Direct Memory Access)機制,它須要操做系統和硬件的支持,還須要編寫RDMA方式的代碼。get
前面介紹緩衝空間時提到過,通常狀況下,每一個用戶進程要讀、寫數據,都會通過兩個必要的緩衝層:內核空間的Kernel Buffer、用戶空間的IO Buffer。例如讀文件數據時,先將數據拷貝到內核的緩衝空間(page cache),而後陷入內核,內核將該緩衝空間數據拷貝到用戶空間的緩衝空間(IO Buffer),當調度到用戶進程時,用戶進程從本身的緩衝空間讀取數據。io
DMA機制並無繞過這兩個緩衝層,但使用RDMA機制,程序能夠直接繞過Kernel Buffer,內核發現是RDMA操做後,直接告訴RDMA硬件將讀取的數據(寫操做也同樣)寫入到用戶空間的IO Buffer,而不須要先拷貝到Kernel Buffer,再拷貝到IO Buffer。雖然RDMA機制相比DMA不會減小上下文切換次數,可是它減小了內存數據拷貝的過程,至關因而使用了O_DIRECT標記的直接IO技術。硬件
DMA和RDMA兩種技術對好比圖:RDMA通常實如今網卡上,但出於方便理解,下圖直接使用磁盤來描述權限
像這種繞過內核功能的技術,一般稱爲內核旁路(Kernel Bypass),RDMA技術內核旁路的是一種,還有像TOE也是內核旁路的一種。
雖然RDMA比較優秀,可是它須要硬件、操做系統和代碼的同時支持,對編程而言是一個比較大的衝擊,因此目前使用的很是少。