天天看點

swap、page、mmap和Ashmem

【swap 和 page】Linux系統通過2種方法進行記憶體管理,“調頁算法(page)”,“交換技術(swap)”。調頁算法是将記憶體中最近不常使用的頁面換到磁盤上,把常使用的頁面(活動頁面)保留在記憶體中供程序使用。交換技術是系統将整個程序,而不是部分頁面,全部換到磁盤上。

【swap 和 page】Linux的swap分區:交換空間是專門用于臨時存儲記憶體的一塊磁盤空間,通常在頁面排程和交換程序資料時使用。

【swap 和 page】頁面排程通常容易和交換的概念混淆,頁面排程是指把一個程序所占記憶體的空閑部分傳輸到磁盤上,而交換是指當系統中實際的記憶體已不夠滿足新的配置設定需求時,把整個程序傳輸到磁盤上,交換活動通常意味着記憶體不足。

【mmap】mmap映射記憶體必須是頁面大小的整數倍。mmap系統調用使得程序之間通過映射同一個普通檔案實作共享記憶體。

【mmap】Ashmem與mmap稍有不同的是,Ashmem與cache shrinker關聯起來,可以在适當時機去回收這些共享記憶體,這點比較智能,而mmap是做不到的。

【mmap】mmap:是一種共享記憶體的系統。假如:A程序的記憶體空間範圍0X0000~0XFFFF,B程序的記憶體空間範圍0X0000~0XFFFF,他們兩個程序想共同共享一個檔案或一段空間時,可以使用mmap(比如都想讀取硬碟上的c.txt,txt内容為”123”),首先另外開辟第三個記憶體空間(3個位元組),将硬碟上的c.txt映射到這個記憶體空間中,使此記憶體空間有了這個c.txt,再将A、B程序分别映射至這個記憶體空間,則現在A程序的核心空間範圍為0X0000~0XFFFF+4,B程序的核心空間範圍為0X0000~0XFFFF+4。那麼此時A、B程序都擁有了共同的記憶體空間,即可以互相共享共同記憶體空間裡的内容了;當然,如果建立mmap時也可以指定是可讀還是可寫,如果A或B改變了共同記憶體空間的值,将c.txt内容改為了”234”的話,硬碟上的c.txt内容仍然為123,若想改變,則得調用msync實作硬碟和共享記憶體區的同步。

傳統的檔案通路:程序讀一個檔案的某一頁,要将該頁從磁盤讀到高速緩沖區中(個人了解:進入核心空間), 程序再将資料從高速緩沖區讀到自己的位址空間(個人了解:進入使用者空間)。

改進的檔案通路:程序A和程序B都将該頁映射到自己的位址空間, 當程序A第一次通路該頁中的資料時, 它生成一缺頁中斷. 核心此時讀入這一頁到記憶體并更新頁表使之指向它.以後, 當程序B通路同一頁面而出現缺頁中斷時, 該頁已經在, 核心隻需要将程序B的頁表登記項指向次頁即可。

每個程序都有記憶體頁表;

繼續閱讀