簡體   English   中英

如何分配操作系統可以回收的內存緩沖區,以便在Mac OS X內核擴展中進行緩存?

[英]How do I allocate memory buffers which may be reclaimed by the OS for caching in a Mac OS X kernel extension?

根據我閱讀的文檔和xnu源代碼,我了解到Mac OS X使用統一緩沖區緩存(UBC)緩存文件 I / O. UBC根據可用的RAM增長盡可能大,但UBC頁面是內存越來越緊張時首先被犧牲的頁面。

在我的驅動程序中,我處理各種磁盤元數據。 我希望能夠使用UBC或類似的機制來保持MRU緩存這些數據以加快速度,同時讓內核能夠在需要時收回內存。 然而,元數據不代表文件數據,因此不直接落入UBC的域。 是否有我可以使用的低級機制,或者我可以以某種方式僅使用UBC中處理緩沖區本身的部分?

我目前正在尋找HFS +源代碼,試圖弄清楚它是否以及如何緩存文件系統元數據,盡管沒有太大的成功。

主要的替代方案當然是為緩存保留特定的內存區域並進行自己的LRU剔除。 我可以選擇一個固定的緩存大小或者使用某種啟發式方法,但是當RAM豐富時它總是會占用太少的內存,而當它沒有時它會占用太多的內存。

更新:

在搜索了一些之后,我發現可以使用kIOMemoryPurgeable選項創建IOBufferMemoryDescriptor實例。 這允許你在其上調用IOMemoryDescriptor::setPurgeable()來標記內存“公平游戲”以便丟棄。 我會嘗試並用結果更新問題。

你是對的。 在請求內存時將kIOMemoryPurgeable設置為其中一個選項。 它從非易失性開始,可以被分頁,但不會被丟棄。

當你想讓操作系統丟棄它時,調用setPurgeable(kIOMemoryPurgeableVolatile, &oldState ); 如有必要,操作系統將丟棄它,而不是將其分頁到磁盤。

要訪問內存時,必須調用setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState ); 並檢查if(oldState != kIOMemoryPurgeableEmpty)如果內存仍然可用則為true,如果已被丟棄則為false。

如果你遇到任何捕獲,我會很高興聽到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM