除零中断是什么意思?_百万并发「零拷贝」技术系列之初探门径
Wiki對零拷貝的定義
"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another.
零拷貝(Zero-copy)是指在計算機執行操作時,CPU 不需要將數據從一塊內存拷貝到另一塊內存,減少拷貝次數可以提高性能。
在操作系統層面來說零拷貝是指不需要將數據從內核空間復制到用戶空間,而Netty、Kafka等框架都因零拷貝而聞名著稱,技術來不得半點馬虎和一知半解,本著知其然知其所以然的態度,本系列為你揭秘其中原委和解決方案。
計算機組成
計算機是由硬件、內核和上層應用組成,通過它們在功能上由下而上的層層傳遞給用戶提供各種服務,如下圖所示。為了便于獨立開發、調試和維護,采用了高內聚低耦合分層設計思想:內核負責對硬件直接操作,在封裝硬件操作的同時給上層應用提供功能接口,承上啟下;上層應用調用內核接口為用戶提供業務服務。每一層都使用較低層提供的功能而不必知道其實現細節,只需了解其接口能做什么即可。
實際上隨著時間的演進和功能的不斷豐富,內核體積變得龐大不易管理,所以現代的操作系統基本都采用微內核的設計思想:把內核模塊化,將非基礎模塊從內核中移除,把這些非基礎模塊實現為系統應用,甚至用戶應用,從而減少內核的體積和復雜度,使其功能更聚焦。
微內核設計的好處頗多:
然而微內核究竟包括哪些基礎模塊,實際上每個操作系統的處理并不相同,并沒有定論和標準,但一般至少會包括進程、內存管理和通訊功能。
上層應用包含了系統應用和用戶應用:系統應用一般跟隨系統發行版而來,但也是通過調用內核接口開發的,一般是用于系統管理;用戶應用是用戶自行開發的應用,一般是為了實現自己的業務邏輯。但上層應用一般都采用高級語言來編寫,為了降低復雜性和高效,高級語言對內核接口進行了封裝,提供了編程語言類庫,比如C語言的標準庫、Java的JDK等。
用戶空間和內核空間
用戶進程不能直接操作硬件,只有通過內核提供的接口來操作,而為了確保內核的正常、安全地運行,不會因上層應用的異常導致內核陷入災難,就必須區分內核代碼執行和用戶定義代碼執行,也就是所謂的雙重模式即:內核態和用戶態。當用戶程序正在執行,系統處于用戶態,當用戶程序需要調用內核功能,它必須通過系統調用的形式轉換為內核態執行。一般是通過硬件支持來區分兩種模式的,在硬件中增加了一個模式bit位:0代表內核態,1代表用戶態。
系統通過引導程序,裝入內核處于內核態,緊接著開始執行用戶進程進入用戶態(模式位為1),一旦遇到中斷或系統調用,則又從用戶態進入內核態(模式位為0),內核處理完后返回用戶進程進入用戶態(模式位為1),如上圖。
進程是操作系統資源分配的最小單元,進程在執行上有用戶態和內核態,那么虛擬內存也分為了用戶空間和內核空間,供用戶態和內核態的進程使用。比如32位的操作系統內存可以高達4G,把最高的1G字節(虛擬內存地址0xC0000000~0xFFFFFFFF)供內核使用,稱為內核空間,而將較低的3G字節(虛擬內存地址 從0x00000000到0xBFFFFFFF)供上層應用使用,稱為用戶空間。
虛擬內存是相對于物理內存而言,操作系統會對物理內存進行映射和抽象,軟件的所有操作都是對虛擬內存而言,也可以理解為物理內存映射為用戶空間和內核空間。
當進程由用戶態進行進入內核態,系統需要保存當前運行在CPU中進程的上下文,從而能在其處理完畢后轉換為用戶態時能恢復其上下文,這一任務稱為上下文切換(context switch)。上下文切換在計算機執行期間會比較頻繁,只要牽涉到內核態和用戶態的轉換就會涉及到上下文切換。所謂的上下文究竟是指什么呢?上下文從其英文context可知,是進行運行的環境,它包括進程的狀態、計數器、全局變量、臨時數據如函數參數、返回地址、局部變量等,還可能包括運行期間動態分配的內存堆(heap)。頻繁的上下文切換,對數據的保存和恢復操作過于頻繁,對性能的影響特別顯著。
示例
為了全面理解用戶空間、內核空間、用戶態、內核態,我們舉個例子來說明:讀取文件內容并通過Socket發送。
由于用戶進程無法直接操作硬件,因此用戶進程首先需要通過系統調用(System Call)來調用內核接口,此時的事件流如下
由上圖流程可知會經歷4次上下文切換,而它的數據會也經歷了4次拷貝,數據流向如下
什么是DMA
所有的硬件是通過控制器連接到計算機總總線,傳統的中斷式I/O方式是把數據拷貝到控制器寄存器,控制器再以中斷的方式通知CPU拷貝到內存。由于這種方式頻繁的中斷,導致大量占用CPU時間片。DMA是Direct Memory Access的縮寫,中文稱之為直接存儲器訪問。它的使用方式是CPU通知DMA控制器進行I/O后CPU就被解脫出來做別的事情了,數據的拷貝過程都是由DMA來操作完成,數據拷貝完成后DMA控制器以中斷的方式通知CPU。
寫在最后
本篇我們了解了用戶態、內核態、用戶空間、內核空間的概念,而且從事件流和數據流我們也找到了提高性能的優化方向:降低拷貝和上下文切換次數,下一篇我們將揭曉優化方案。
相關閱讀
緩存穿透、緩存擊穿、緩存雪崩看這篇就夠了
一口氣講透一致性哈希(Hash),助力「碼農變身」
漫畫 | 架構設計中的那些事
Java中異常處理的9個最佳實踐
Intellij IDEA必備插件,提高效率的“七種武器”
接住嘍,送你個裝B的技能:JDK動態代理
給“小白”漫畫+圖示講解MyBatis原理,就問香不香
總結
以上是生活随笔為你收集整理的除零中断是什么意思?_百万并发「零拷贝」技术系列之初探门径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse lombok插件安装_便
- 下一篇: goland go test_Go单元测