1. 程式人生 > >每天3分鐘作業系統修煉祕籍(14):IO操作和DMA、RDMA

每天3分鐘作業系統修煉祕籍(14):IO操作和DMA、RDMA

點我檢視祕籍連載

I/O操作和DMA、RDMA

使用者程序想要執行IO操作時(例如想要讀磁碟資料、向磁碟寫資料、讀鍵盤的輸入等等),由於使用者程序工作在使用者模式下,它沒有執行這些操作的許可權,只能通過發起對應的系統呼叫請求作業系統幫忙完成這些操作。這裡因為系統呼叫產生中斷將陷入到核心,進行一次上下文切換操作。

核心程序幫忙執行IO操作時,由於IO操作相比於CPU來說是極慢的操作,CPU不應該等待在這個過程中,而是切換到其它程序上去執行其它任務。這裡再次涉及到一次上下文切換:從核心態回到使用者態的其它程序。

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方式的程式碼。

前面介紹緩衝空間時提到過,一般情況下,每個使用者程序要讀、寫資料,都會經過兩個必要的緩衝層:核心空間的Kernel Buffer、使用者空間的IO Buffer。例如讀檔案資料時,先將資料拷貝到核心的緩衝空間(page cache),然後陷入核心,核心將該緩衝空間資料拷貝到使用者空間的緩衝空間(IO Buffer),當排程到使用者程序時,使用者程序從自己的緩衝空間讀取資料。

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比較優秀,但是它需要硬體、作業系統和程式碼的同時支援,對程式設計而言是一個比較大的衝擊,所以目前使用的非常少