linux記憶體與虛擬記憶體

2021-07-29 08:18:23 字數 2763 閱讀 7057

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的話,作業系統根本處理不過來 問題 虛擬記憶體...