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