file mmap
統(tǒng)計參數(shù)只會在這里設(shè)置:
add_mm_counter(vma->vm_mm, MM_FILEPAGES, HPAGE_PMD_NR);?但是這貌似都是處理大頁的情況哪,小頁呢?
alloc_set_pte中有函數(shù):inc_mm_couter_fast(vma->vm_mm, mm_couter_file(page))?其中,mm_counter_file是在include 目錄下設(shè)置的,注意一下,這個函數(shù)返回的是頁的類型,有兩種類型,一種是:
1446 static inline int mm_counter_file(struct page *page) 1447 { 1448 if (PageSwapBacked(page)) //如果這個頁是被swap出去了,那么這個頁就是MM_SHMEMPAGES, 1449 return MM_SHMEMPAGES; 1450 return MM_FILEPAGES; 1451 } 1452SHMEMPAGES 感覺和ANON/FILE是兩種不同的考察維度呀,也就是說匿名頁和filebacked的頁都是可以當(dāng)做SHMEM來用的。好像不對啊,匿名頁就是匿名頁,如果是可以共享的,也就是說MAP_ANONYMOUS? 和 MAP_SHARED 是可以同時設(shè)置的?【結(jié)論MAP_ANONYMOUS和MAP_SHARED是不可以同時設(shè)置的】,
PRIVATE 和 SHARED 都是對于文件來說的,是說多個
[什么叫做共享內(nèi)存的頁呀: 下面這個patch中加了這個統(tǒng)計項,patch大致思想是:目前共享內(nèi)存的頁,都和file-backed的文件一起去統(tǒng)計了(實際共享內(nèi)存后面掛載的設(shè)備是/dev/zero,我們沒辦法看到共享內(nèi)存的頁了,所以這個patch就是解決的就是區(qū)分這兩種頁]
eca56ff906bdd0239485e8b47154a6e73dd9a2f3?那么下面一個問題還是沒有解決,為什么mm_counter_file中統(tǒng)計出來的page只會去統(tǒng)計MM_SHMEM / MM_FILE
?除了匿名頁之外,有兩種頁:共享內(nèi)存的頁還有文件backed的頁
MAP_ANONYMOUS 是不能單獨(dú)出現(xiàn)的
SHMEMPAGES既可以當(dāng)做
?這一部分好好講講文件系統(tǒng)的mmap file-backed
[ 一個進(jìn)程所有的頁的類型包括:匿名頁,文件backed的頁,共享內(nèi)存的頁,swap出去的頁.]
私有的文件映射如果改動的話會發(fā)生啥事情
《Linux環(huán)境編程》對該部分的解釋有亮點(diǎn),但是避重就輕,過多地去講在MAP_SHARED的情況下,內(nèi)存映射是如何完成的,比較難理解的是私有映射是如何完成的:
如果我設(shè)置了私有的映射,并且還具有寫權(quán)限,這個時候如果發(fā)生了寫,操作系統(tǒng)是如何實現(xiàn)的呢?這種情況也分明是存在的!
猜想:這個時候會發(fā)生寫時寫時復(fù)制機(jī)制,不會影響到文件的內(nèi)容:【測試程序:
https://github.com/honpey/codebox/blob/master/mmap/mmap_file_private.c】
設(shè)置了文件的MAP_PRIVATE 標(biāo)志之后,我們發(fā)現(xiàn),此時寫入的任何東西都不會保存,所以我們就大膽猜想,初始化時,是做了一個映射,但是第一次訪問之后,發(fā)生了缺頁中斷,而這個缺頁中斷的作用是從pagecache中copy一份數(shù)據(jù)到新的page中,即所謂的寫時復(fù)制!這是file-backed mmap類型的寫時復(fù)制。
這個
?
轉(zhuǎn)載于:https://www.cnblogs.com/honpey/p/7751834.html
總結(jié)
- 上一篇: 李楠:新耳机有信心击败苹果 但创业公司想
- 下一篇: noip模拟赛 遭遇