linux支援虛擬記憶體:
記憶體:記憶體條
物理記憶體 實際存在
程式中的記憶體
虛擬記憶體 os對映出來的
直接對映
檔案對映
提速:
檔案io操作 耗時長
記憶體操作 耗時短
mmap函式可以把檔案對映成虛擬記憶體,像操作記憶體一樣去操作檔案。
mmap函式可以直接對映一塊虛擬記憶體。
#include
void *mmap(//
void *start, //對映出來的虛擬記憶體的首位址,設定為null表示由核心來設定,建議設定為null
size_t length, //對映出來的虛擬記憶體的位元組數
int prot, //
int flags, //對映記憶體的訪問方式
int fd, //檔案描述符
off_t offset); //偏移量設定 0
prot:保護 許可權 protect
prot_read 記憶體頁可以讀訪問
prot_write 記憶體頁可以寫訪問
flags:
map_shared 同一檔案的多個程序共享
map_private 乙個程序可以訪問
map_anonymous 不是把檔案對映成虛擬記憶體而是直接對映虛擬記憶體
int munmap(
void *start,
size_t length);
頁也是記憶體的單位之一 位元組
頁:4k 4096byte
虛擬對映記憶體以頁為單位對映。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
程式設計:
1.建立檔案 open
2.修改檔案大小 ftruncate
#include
#include
int truncate(const char *path,
off_t length);
int ftruncate(
int fd,
off_t length);
3.開啟檔案
4.把檔案對映成虛擬記憶體
5.使用虛擬記憶體
6.釋放虛擬記憶體
7.關閉檔案
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
把檔案對映成虛擬記憶體
#include #include #include #include struct student;
int main();
fd = open("student.dat",o_rdonly);
/* read(fd,&stu,sizeof(stu));
printf("%s,%d,%c,%g\n",stu.name,stu.age,stu.***,stu.score);
*/ struct student* p = mmap(null,sizeof(stu),prot_read|prot_write,map_private,fd,0);
printf("%s,%d,%c,%g\n",p->name,p->age,p->***,p->score);
return 0;
}
建立新檔案對映成虛擬記憶體
#include #include //open
#include //%m exit
#include //strlen strcpy
#include //mmap
struct student;
int main();
int fd;
struct student* p = null;
int r;
//1建立檔案
fd = open("student.dat",o_rdwr|o_creat|o_excl,0666);
if(-1 == fd)
printf("open error:%m\n"),exit(-1);
printf("open %m\n");
//2修改檔案大小
r = ftruncate(fd,sizeof(stu));
if(r)
printf("ftruncate error:%m\n"),close(fd),unlink("student.dat"),exit(-1);
printf("ftruncate %m\n");
//3不需要再開啟了
//4把檔案對映成虛擬記憶體
p = (struct student*)mmap(null,sizeof(stu),prot_read|prot_write,map_shared,fd,0);
if(p == (struct student*)-1)
printf("mmap error:%m\n"),close(fd),unlink("student.dat"),exit(-1);
printf("mmap %m\n");
//5使用虛擬記憶體
strcpy(p->name,stu.name);
p->age = stu.age;
p->*** = stu.***;
p->score = stu.score;
//6釋放記憶體
munmap(p,sizeof(stu));
//7關閉檔案
close(fd);
return 0;
}
Linux虛擬記憶體
linux採用虛擬段頁式儲存方式來管理記憶體,程式的基本邏輯儲存單元,也可以說是程式段。linux中有四個段,段,資料段,bss段,堆疊段。虛擬位址從低到高依次是 段,資料段,bss段,堆疊段。其中 段為程式本身 二進位制指令 資料段為 中初始化了的全域性變數和靜態變數,bss段為為初始化的全域性變...
Linux虛擬記憶體
一 虛擬記憶體 1 系統會為每個程序分4g的虛擬記憶體空間。32個0 32個1 位址範圍。2 使用者只能使用虛擬位址,無法直接使用物理記憶體。3 虛擬位址與物理記憶體進行對映才能使用,否則就會產生段錯誤。4 虛擬位址與物理記憶體的對映由作業系統動態維護。5 讓使用者使用虛擬位址一方面為了安全,另一方...
虛擬記憶體與物理記憶體
作業系統有虛擬記憶體與物理記憶體的概念。問題 32位的作業系統中,每個程序有4gb 不是一定 的記憶體是真實存在的嗎?答 不是,是虛擬記憶體 問題 32位的作業系統中,每個程序有4gb 不是一定 的記憶體是物理記憶體嗎?答 不是,如果每個程序都存在4gb的話,作業系統根本處理不過來 問題 虛擬記憶體...