linux内存与虚拟内存

linux支持虚拟内存:
 内存:内存条
  物理内存     实际存在
 程序中的内存
  虚拟内存  os映射出来的
   直接映射
   文件映射
 提速:
  文件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

    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 <unistd.h>
       #include <sys/types.h>
       int  truncate(const   char   *path,
       off_t length);
       int    ftruncate(
       int    fd,  
       off_t length);
    3.打开文件
    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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值