Linux作業系統:快速記憶體操作技術(轉)
Linux作業系統:快速記憶體操作技術(轉)[@more@]我們總希望能在核心空間和使用者空間自由交換資料,傳統的方式是採用核心提供的vma機制,透過copy_to/from_user之類的方法來實現。這對於高速資料塊傳送是不可取的。
其實kswapd有時交換資料至外存時,效能相當差,一般而言,你的PC主存並不見得就用盡了,而且很多應用並是你所關心的,但卻實實在在消耗你的計算資源,此時,你可能會想到採用實地址操作你的應用(儘管有MMU的支援),在uClinux中,當沒有MMU時,工作起來是挺爽的。
最方便的,最高效的,無非是實地址下,操作實體記憶體,相當於DMA。儘管Linux 2.6核心在VMA方面的效能要優於2.4,但swap機制有一定的缺限。在VxWorks中,對記憶體的管理是很細緻且精確的。如果你在Linux下申請大塊記憶體操作時,當觸發kswap快速交換回主存時,你會發現你的計算機
哪一段時間,幾乎要休息幾分鐘,儘管你看起來free輸出的頁面已經很多了,但此時的外存幾乎一直忙著,且CPU負荷相當重,這時也可能你根本就沒做任何操作。
有沒有辦法既在VMA機制下工作,又能直接處理主存資料呢?
回答是肯定的:
核心啟動後,會將主存對映為/dev/mem,當我們在VMA中申請一塊邏輯區間後,將轉換的實體地址傳與使用者空間,使用者空間就可以線性操作這段區間了,直接採用mmap就可以在物理主存中讀寫。
還有更快的方式嗎?不採用mmap行嗎?
當然有,當VMA將物理區塊地址及大小傳與使用者空間後,使用者完全可以採用地址讀寫模式,這幾近於機器指令操作了。(可以獨立於OS之外)
此種實現方式很簡單,首先開啟/dev/mem,直接定位至VMA傳上來的地址就可以操作了,無需mmap。通知使用者空間,可以採用procfs/sysfs等。
強烈建議:在邊界控制上,一定要精確細緻,不推薦初學者採用,一旦越界,可能引起“Kernel Panic”
更有可能就DOWN了。
對於此實現方式,建議參考mapper(LDD3)程式。
同時,也可以用mapper檢查讀寫是否正確。
新的IA32中,PAGE_SIZE = 4K MAX_ORDER = 11
gfp最大申請4M線性邏輯空間,減去PAGE_OFFSET即可得到實體地址。
如果採用了HIMEM和NUMA,請參見Kernel關於記憶體對映的演算法。
當主存達到1G或超過時,請減小使用者空間大小。
隨著硬體技術的發展,VMA在主存相當大時,可以考慮進行修正,完全可以集中採用物理對映方式。沒必要交換了。否則,反而影響效能。
32位平臺,如果主存2G,採用SWAP會使得效能有較大下降。
而在大容量資料傳輸時,也不可能採用SWAP方式的,不允許換出。
建議Linus在VMA中加入程式分類,不平類別的應用,分配不同的記憶體塊。
小資料PAGE_SIZE = 4K/大資料4M/128M
地址模式全轉換為64位,相容32位,當應用於Embedded系統時,直接使用32位模式。
如將做成多個微系統,不同微核,執行不同應用(不同的程式管理,記憶體管理,檔案管理),只是介面可以統一,不同標誌而已。
其實kswapd有時交換資料至外存時,效能相當差,一般而言,你的PC主存並不見得就用盡了,而且很多應用並是你所關心的,但卻實實在在消耗你的計算資源,此時,你可能會想到採用實地址操作你的應用(儘管有MMU的支援),在uClinux中,當沒有MMU時,工作起來是挺爽的。
最方便的,最高效的,無非是實地址下,操作實體記憶體,相當於DMA。儘管Linux 2.6核心在VMA方面的效能要優於2.4,但swap機制有一定的缺限。在VxWorks中,對記憶體的管理是很細緻且精確的。如果你在Linux下申請大塊記憶體操作時,當觸發kswap快速交換回主存時,你會發現你的計算機
哪一段時間,幾乎要休息幾分鐘,儘管你看起來free輸出的頁面已經很多了,但此時的外存幾乎一直忙著,且CPU負荷相當重,這時也可能你根本就沒做任何操作。
有沒有辦法既在VMA機制下工作,又能直接處理主存資料呢?
回答是肯定的:
核心啟動後,會將主存對映為/dev/mem,當我們在VMA中申請一塊邏輯區間後,將轉換的實體地址傳與使用者空間,使用者空間就可以線性操作這段區間了,直接採用mmap就可以在物理主存中讀寫。
還有更快的方式嗎?不採用mmap行嗎?
當然有,當VMA將物理區塊地址及大小傳與使用者空間後,使用者完全可以採用地址讀寫模式,這幾近於機器指令操作了。(可以獨立於OS之外)
此種實現方式很簡單,首先開啟/dev/mem,直接定位至VMA傳上來的地址就可以操作了,無需mmap。通知使用者空間,可以採用procfs/sysfs等。
強烈建議:在邊界控制上,一定要精確細緻,不推薦初學者採用,一旦越界,可能引起“Kernel Panic”
更有可能就DOWN了。
對於此實現方式,建議參考mapper(LDD3)程式。
同時,也可以用mapper檢查讀寫是否正確。
新的IA32中,PAGE_SIZE = 4K MAX_ORDER = 11
gfp最大申請4M線性邏輯空間,減去PAGE_OFFSET即可得到實體地址。
如果採用了HIMEM和NUMA,請參見Kernel關於記憶體對映的演算法。
當主存達到1G或超過時,請減小使用者空間大小。
隨著硬體技術的發展,VMA在主存相當大時,可以考慮進行修正,完全可以集中採用物理對映方式。沒必要交換了。否則,反而影響效能。
32位平臺,如果主存2G,採用SWAP會使得效能有較大下降。
而在大容量資料傳輸時,也不可能採用SWAP方式的,不允許換出。
建議Linus在VMA中加入程式分類,不平類別的應用,分配不同的記憶體塊。
小資料PAGE_SIZE = 4K/大資料4M/128M
地址模式全轉換為64位,相容32位,當應用於Embedded系統時,直接使用32位模式。
如將做成多個微系統,不同微核,執行不同應用(不同的程式管理,記憶體管理,檔案管理),只是介面可以統一,不同標誌而已。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-950406/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux作業系統記憶體淺析Linux作業系統記憶體
- 探索Linux 作業系統記憶體模型和管理-1(轉)Linux作業系統記憶體模型
- 探索Linux 作業系統記憶體模型和管理8(轉)Linux作業系統記憶體模型
- 作業系統-記憶體管理作業系統記憶體
- 作業系統——記憶體管理作業系統記憶體
- linux作業系統修改共享記憶體的簡單方法(轉)Linux作業系統記憶體
- Linux作業系統記憶體管理的原始碼實現(轉)Linux作業系統記憶體原始碼
- Linux 作業系統技術使用總結 (轉)Linux作業系統
- 作業系統記憶體管理概述作業系統記憶體
- 作業系統記憶體管理-原理作業系統記憶體
- 【作業系統】記憶體管理概述作業系統記憶體
- WindowsXP作業系統記憶體最佳化指南(轉)Windows作業系統記憶體
- 清華大學-作業系統學習筆記(五)--- 虛擬記憶體技術作業系統筆記記憶體
- linux查詢作業系統資訊(CPU、記憶體、硬碟)Linux作業系統記憶體硬碟
- 作業系統的虛擬記憶體作業系統記憶體
- 作業系統-記憶體、檔案管理作業系統記憶體
- Linux作業系統中記憶體buffer和cache的區別(轉載)Linux作業系統記憶體
- MySQL記憶體管理,記憶體分配器和作業系統MySql記憶體作業系統
- 作業系統——記憶體管理學習筆記作業系統記憶體筆記
- HP-UX作業系統的記憶體UX作業系統記憶體
- windows作業系統支援的最大記憶體Windows作業系統記憶體
- 計算機作業系統——虛擬記憶體與實體記憶體計算機作業系統記憶體
- Linux作業系統中記憶體buffer和cache的區別Linux作業系統記憶體
- 作業系統的記憶體管理你知道嗎作業系統記憶體
- 淺談作業系統對記憶體的管理作業系統記憶體
- 無線技術在Linux作業系統中的應用(轉)Linux作業系統
- 作業系統(八) -- 記憶體的分段與分頁作業系統記憶體
- 作業系統——記憶體連續分配管理方式作業系統記憶體
- Android 作業系統的記憶體回收機制Android作業系統記憶體
- Linux作業系統中備份恢復技術的應用(轉)Linux作業系統
- 華納雲:Linux作業系統的記憶體管理方法是什麼Linux作業系統記憶體
- 新手看招:掌握Linux系統記憶體管理(轉)Linux記憶體
- linux kernel記憶體碎片防治技術Linux記憶體
- 記憶體瘋狂換頁!CPU怒批作業系統記憶體作業系統
- 作業系統思考 第六章 記憶體管理作業系統記憶體
- SQL Server記憶體遭遇作業系統程式壓榨案例SQLServer記憶體作業系統
- 作業系統HugePage配置導致記憶體驟降探究作業系統記憶體
- 作業系統的記憶體對齊機制學習筆記作業系統記憶體筆記