首页 > 编程知识 正文

内存映射和直接io区别,硬盘

时间:2023-05-03 08:54:59 阅读:22710 作者:4074

1 .没有虚拟内存的CPU几乎不能运行多任务操作系统,不能支持多进程。

2 .实现虚拟内存的技术主要有两种:段内存管理和页内存管理,目前页内存管理占主流。

3 .基于页面的内存管理通过将内存划分为大小相同的页面,并由多个页面组成每个进程地址空间,实现了进程空间的隔离。

4。 为什么使用内存映射:读写文件的传统方法要求每次调用open-read/write/lseek-close时进行系统调用,但效率不高,多个进程访问同一文件这是徒劳的。 如果使用mmap将文件作为内存(如数组)进行操作,则没有这种问题。

Linux内存映射: Linux内核将整个内存地址空间视为一系列不同的“文件”映射,但在此将其称为内核对象。 Linux将内核加载到内存的过程是内存映射的过程,加载可执行文件的过程也是内存映射。

5.32位地址虚拟内存: 32位虚拟内存地址最多可以管理4G的物理地址。 32位虚拟地址分为三个部分。 页面目录|页面表|页面内偏移(10|10|12 )。 页面目录可以管理1024个页面表,页面表可以管理1024个页面。 )每1024页分成一个页面表,页面表地址放在页面目录的数组中。 1024页的地址将被放置在页表数组中)

6 .从虚拟地址到物理地址的转换可以应用很多。 进程和进程之间的虚拟地址可以相同,物理地址也可以不同,从而实现空间上的真正隔离。 可以利用页面交换技术将文件映射到存储器,实现mmap这样的系统调用; 通过将相同的虚拟地址转换为相同的物理地址,可以共享线程等数据。 可以在虚拟存储器中反映硬件设备的控制存储区,并通过存储器直接控制设备.

7 .内存映射的缺点

内存映射可能会浪费存储物理空间。 每次不同或相同的进程对同一文件调用mmap时,内存映射技术总是将新页面偏移为0的页面分配给进程,并且多次调用mmap写入的数据不连续。 每次调用mmap时写入的数据占4096的空间越多,浪费的空间就越多。

8.mmap系统调用

void*mmap(void*addr,size_t len,int prot,int flag,int filedes,off_t off );

intmunmap(void*addr,size_t len ); //释放地图

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#define PAGE_SIZE 4096

(intmain(intargc,char *argv[] ) ) ) ) ) ) ) ) ) ) )

{

Int软盘;

int i;

未指定的char * p _ map;

//打开设备

FD=open(Liujin.txt )、O_RDWR );

是if(FD0 )

{

打印机(打开故障(n ) );

退出(1;

}

//内存映射

p _ map=(未指定的char * ) mmap(0,PAGE_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0 );

if(p_map==map_failed ) )。

{

打印机(mmap故障(n ) );

goto here;

}

snprintf (p _ map 5,10,' bye!' );

//打印映射后内存的前10字节内容

for(I=0; i10; I )

printf(%c(n ),p_map[i];

here:

munmap(p_map,PAGE_SIZE );

返回0;

}

显示文件中的数据: od -tx1 -tc liujin.txt

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。