linux支持虚拟内存:
内存:内存条
物理内存 实际存在
程序中的内存
虚拟内存 os映射出来的
直接映射
文件映射
内存:内存条
物理内存 实际存在
程序中的内存
虚拟内存 os映射出来的
直接映射
文件映射
提速:
文件io操作 耗时长
内存操作 耗时短
文件io操作 耗时长
内存操作 耗时短
mmap函数可以把文件映射成虚拟内存,像操作内存一样去操作文件。
mmap函数可以直接映射一块虚拟内存。
#include <sys/mman.h>
void *mmap(//
void *start, //映射出来的虚拟内存的首地址,设置为NULL表示由内核来设置,建议设置为NULL
size_t length, //映射出来的虚拟内存的字节数
int prot, //
int flags, //映射内存的访问方式
int fd, //文件描述符
off_t offset); //偏移量设置 0
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
字节
页:4K 4096byte
虚拟映射内存以页为单位映射。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
编程:
1.创建文件 open
2.修改文件大小 ftruncate
#include <unistd.h>
#include <sys/types.h>
1.创建文件 open
2.修改文件大小 ftruncate
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path,
off_t length);
int ftruncate(
int fd,
off_t length);
off_t length);
int ftruncate(
int fd,
off_t length);
3.打开文件
4.把文件映射成虚拟内存
5.使用虚拟内存
6.释放虚拟内存
7.关闭文件
4.把文件映射成虚拟内存
5.使用虚拟内存
6.释放虚拟内存
7.关闭文件
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
把文件映射成虚拟内存
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
struct student{
char name[20];
int age;
char sex;
double score;
};
int main(){
int fd;
struct student stu = {0};
fd = open("student.dat",O_RDONLY);
/*
read(fd,&stu,sizeof(stu));
printf("%s,%d,%c,%g\n",stu.name,stu.age,stu.sex,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->sex,p->score);
return 0;
}
创建新文件映射成虚拟内存
#include <stdio.h>
#include <fcntl.h>//open
#include <stdlib.h>//%m exit
#include <string.h>//strlen strcpy
#include <sys/mman.h>//mmap
struct student{
char name[20];
int age;
char sex;
double score;
};
int main(){
struct student stu = {"测试",18,'f',95.9};
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->sex = stu.sex;
p->score = stu.score;
//6释放内存
munmap(p,sizeof(stu));
//7关闭文件
close(fd);
return 0;
}