淘寶文件系統文件映射原理及實現

1 文件系統映射原理

1.1 文件映射應用場景

主要應用場景如下:

  • 進程間共享信息。
  • 實現文件數據從磁盤到內存的映射,極大的提升應用程序訪問文件的速度。

1.2 文件映射相關函數介紹

作用:將一個文件或者其它對象映射進內存。

  1. 使用普通文件提供的內存映射。
  2. 使用特殊文件提供匿名內存映射。

在這裏插入圖片描述
mmap函數:

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
       
int munmap(void *addr, size_t length); 

/*
參數start:指向欲映射的內存起始地址,通常設爲 NULL,代表讓系統自動選定地址,映射成功後返回該地址。

參數length:代表將文件中多大的部分映射到內存。

參數prot:映射區域的保護方式。可以爲以下幾種方式的組合:
           PROT_EXEC         執行    
           PROT_READ         讀取    
           PROT_WRITE        寫入   
           PROT_NONE         不能存取

參數flags:影響映射區域的各種特性。必須要指定MAP_SHARED 或MAP_PRIVATE。
     MAP_SHARED     - 映射區域數據與文件對應,允許其他進程共享
     MAP_PRIVATE    - 映射區域生成文件的copy,修改不同步文件
     MAP_ANONYMOUS  - 建立匿名映射。此時會忽略參數fd,不涉及文件,而且映射區域無法和其他進程共享。
     MAP_DENYWRITE  - 允許對映射區域的寫入操作,其他對文件直接寫入的操作將會被拒絕。
     MAP_LOCKED     - 將映射區域鎖定住,這表示該區域不會被置swap

參數fd:要映射到內存中的文件描述符。如果使用匿名內存映射時,即flags中設置了MAP_ANONYMOUS,fd設爲-1。有些系統不支持匿名內存映射,則可以使用fopen打開/dev/zero文件,然後對該文件進行映射,可以同樣達到匿名內存映射的效果。

參數offset:文件映射的偏移量,通常設置爲0,代表從文件最前方開始對應,offset必須是分頁大小的整數倍。 
*/

msync函數介紹:
實現磁盤文件內容於共享內存區中的內容一致,即同步操作。

//函數原型
int msync ( void * addr, size_t len, int flags)
//頭文件
#include<sys/mman.h>   

/*
addr:文件映射到進程空間的地址;
len:映射空間的大小;
flags:刷新的參數設置,可以取值MS_ASYNC/ MS_SYNC
其中:
	取值爲MS_ASYNC(異步)時,調用會立即返回,不等到更新的完成;
    取值爲MS_SYNC(同步)時,調用會等到更新完成之後返回;

返回值:成功則返回0;失敗則返回-1;
*/

mremap函數介紹:
擴大(或縮小)現有的內存映射。

//函數原型
void * mremap(void *old_address, size_t old_size , size_t new_size, int flags);

//頭文件
#include <unistd.h> 
#include <sys/mman.h>
   
/*
addr:     上一次已映射到進程空間的地址;
old_size: 舊空間的大小;
new_size: 重新映射指定的新空間大小;
flags:     取值可以是0或者MREMAP_MAYMOVE,0代表不允許內核移動映射區域,MREMAP_MAYMOVE則表示內核可以根據實際情況移動映射區域以找到一個符合new_size大小要求的內存區域

返回值:成功則返回0;失敗則返回-1;
*/

參考資料:

  1. C/C++從入門到精通-高級程序員之路【奇牛學院】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章