2011-03-21 84 views
5

在Mac OS X上,vm_allocate()允許創建可清除內存區域。當檢測到內存壓力時,該區域可能隨時被內核收回(除了被鎖定時)。這對於緩存數據等是有用的。Linux上的可清除內存區域

我想知道Linux(內核2.6)上是否存在類似的機制。谷歌搜索引導我瞭解Android上的一些信息,討論可以清除的共享內存的分配情況,但是我還沒有看到關於在真正的Linux上使用API​​的討論。對mmapshmat等手冊頁的回顧顯示沒有設置可清除區域的標誌。此功能在Linux上可用嗎?

如何在Android此功能的筆記在這裏:

MemoryFile Reference

MemoryFile Sample

謝謝!

+0

從XNU http://fxr.watson.org/fxr/source/osfmk/vm/vm_object.c?v=xnu-1228;im=bigexcerpts#L5265 – osgx 2011-03-21 15:04:12

+0

感謝您的格式化修復位的代碼@osgx。 XNU代碼的確是我在OS X下看到的。 – 2011-03-21 15:10:18

+0

你可以添加一些關於android討論的鏈接嗎? – osgx 2011-03-21 15:38:14

回答

2

2.6.39-rc1中有這樣的類似系統。這就是所謂的 「先驗記憶」:

更新:在維基百科也有簡短的介紹:https://en.wikipedia.org/wiki/Transcendent_memory

在計算中,超驗記憶(aka「tmem」)是Dan Magenheimer探索的一個概念。 超越內存是一類未知且動態可變大小的內存,只能由內核間接尋址,可以配置爲永久或「短暫」(意味着它將在一段時間內,但可能會消失警告),並且仍然足夠快,可以同步訪問

可以將超越性內存視爲具有一些有趣特徵的RAM磁盤:沒人知道它有多大,寫入磁盤可能不會成功,寫入磁盤的數據可能會消失,然後再次讀回。乍看之下,它可能看起來像是一種相對無用的設備,但希望超越記憶能在幾種情況下提高性能。 [1] [2]在Linux內核2.6.39中引入。[1] [2] Oracle公司的Dan Magenheimer執行。 Xen 4.0在管理程序中支持tmem。

+0

這看起來像可以工作。只是需要等待2.6.39穩定我猜:) – 2011-04-01 18:14:59

+0

感謝您的引用。我想知道爲什麼地球上這篇文章被從維基百科中刪除:「文章大部分是複製品,缺乏多樣的來源,可能不值得注意」。對我來說,這是一個相當晦澀的理由。 – 2015-05-01 15:50:25

0

似乎(盡我所能),沒有類似的界面可以用於Linux的用戶空間。

可清除內存集成到蘋果的Mach微內核中。並且他們通過專利http://www.faqs.org/patents/app/20090024809(美國專利7831784)保護該技術。

有一些類似的,由內核本身使用 - 磁盤緩存(頁面緩存)。它緩存頁面,由FS支持。如果需要更多的內存,它們(如果不是髒的)可以被刪除。更多關於這是http://www.westnet.com/~gsmith/content/linux-pdflush.htm

此外,由於馬上內存區域有madvise()MADV_DONTNEED標誌(http://linux.die.net/man/2/madvise),但是這將釋放(清除)。

+1

我寫了一個快速測試程序來測試'madvise()',並看到了與您所提到的相同的結果。 pdflush的東西似乎是在內核中,並不提供給用戶空間。不知道是否添加後續問題是合適的,但是你會推薦如何嘗試使用'vm_allocate()'來實現緩存設置?訣竅是讓受影響的區域在系統內存壓力下被丟棄 - 但當然是在用戶空間中,只有在內核試圖分配內容之後才能通知,而不是在分配時纔會通知。 – 2011-03-21 17:36:32

+0

我只能寫出(或查找)一個特殊的虛擬文件系統,它允許在內存中存儲數據,但不會將數據備份(存儲)在任何物理設備上,僅存儲在頁面緩存中。 – osgx 2011-03-21 23:44:40

+0

像這樣的文件系統必須在內核中,就像上面提到的磁盤緩存一樣,不是嗎?對於這個應用程序(用戶空間應用程序),自定義文件系統有點矯枉過正。感謝您的幫助和想法! – 2011-03-22 12:56:42

1

我從來沒有聽說過Linux的這種功能。

在Linux中,內存可以在任何時候換出。如果它是一個文件支持的內存映射,那麼它可以寫入磁盤併發布而不是交換。

您可能最接近的是定期檢查當前的內存使用情況並自行釋放高速緩存,或者使用Linux內核修補以低內存通知程序來發送信號或文件句柄當內存壓力很高時的事件。

我說補丁的內核,因爲我不認爲資源通知程序的任何提議已被接受到主線內核。 Here was one attempt.

使用帶有跟蹤事件的新內核,您可能會掛鉤內存壓力跟蹤並以此方式執行此操作。儘管如此,它對其他Linux內核版本來說並不是特別便攜。

1

感謝您的鏈接!我挖掘代碼達到ashmem_pin_region函數。在設備上的http://www.google.com/codesearch/p?hl=en#2wSbThBwwIw/libcutils/ashmem-dev.c&q=ashmem_pin_region&exact_package=git://android.git.kernel.org/platform/system/core.git&sa=N&cd=1&ct=rc&l=76

和主機無操作一個ioctlioctl(fd, ASHMEM_PIN, &pin);):http://www.google.com/codesearch/p?hl=en#2wSbThBwwIw/libcutils/ashmem-host.c&q=ashmem_pin_region&exact_package=git://android.git.kernel.org/platform/system/core.git&sa=N&cd=2&ct=rc&l=86

,這裏是一個核心部分/kernel/msm.git›mm›ashmem.chttp://www.google.com/codesearch/p?hl=en#KMCRKdMbI4g/mm/ashmem.c&q=ASHMEM_PIN&exact_package=git://android.git.kernel.org/kernel/msm.git&sa=N&cd=1&ct=rc&l=463

ASHMEM似乎是谷歌擴展:http://cs736-android.pbworks.com/w/page/5834465/ASHMEMhttp://elinux.org/Android_Kernel_Features它不在主線。

有一個(失敗的)嘗試推動它(首先 - 記錄器,並解釋來自格雷格「KH」在2009年11月28日星期六下午9:58,主題「Re:[PATCH 0/2 ] staging/android fixes「)。還有一個代碼項目建議的谷歌夏季:http://elinux.org/Mainline_Android_kernel_functionality(這個頁面有一個有用的鏈接和格雷格KH關於谷歌的Android補丁和Linux的良好演示文稿。)

+1

這就是我曾經擔心的,該功能出現在Android上,因爲Google已將它放在那裏。感謝您挖掘該信息! – 2011-03-22 12:43:47

+1

ashmem-like功能:POSIX_FADV_VOLATILE http://lwn.net/Articles/468896/(2011) – osgx 2014-08-31 04:14:27

+0

這正是我想要的。不幸的是,從3.13開始,它不在主線內核中。 – 2014-09-20 04:37:55