Day06(下) Liunx高级系统设计7-磁盘映射与共享内存

本文介绍了内存映射技术mmap,对比了其与常规文件操作的区别,指出mmap通过一次数据拷贝即可完成I/O操作,提高了效率。同时,详细讲解了共享内存的原理、功能和使用方法,包括shmget、shmat等函数的用法和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

磁盘映射MMAP

概述

存储映射 I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相
映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存
入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用 read write 函数
的情况下,使用地址(指针)完成 I/O 操作。 使用存储映射这种方法,首先应通知内
核,将一个指定文件映射到存储区域中。这个映射工作可以通过 mmap 函数来实现。

与文件读取的区别(了解)

首先简单的回顾一下常规文件系统操作(调用 read/fread 等类函数)中,函数的调用
过程:
1 、进程发起读文件请求。
2 、内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此
文件的 inode( 存储文件元信息的区域 , 中文名索引节点 )
3 inode address_space( 地址空间 ) 上查找要请求的文件页是否已经缓存在页缓存
中。如果存在,则直接返回这片文件页的内容。
4 、如果不存在,则通过 inode 定位到文件磁盘地址,将数据从磁盘复制到页缓存。之后
再次发起读页面过程,进而将页缓存中的数据发给用户进程。
总结来说,常规文件操作为了提高读写效率和保护磁盘,使用了页缓存机制。这样造成
读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用
户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。这
样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。写操作也是一
样,待写入的 buffer 在内核空间不能直接访问,必须要先拷贝至内核空间对应的主存,
再写回磁盘中(延迟写回),也是需要两次数据拷贝。
而使用 mmap 操作文件中,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映
射这两步,没有任何文件拷贝操作。而之后访问数据时发现内存中并无数据而发起的缺
页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数
据传入内存的用户空间中,供进程使用。
总而言之,常规文件操作需要从磁盘到页缓存再到用户主存的两次数据拷贝。而 mmap
控文件,只需要从磁盘到用户主存的一次数据拷贝过程。
mmap 效率更高

相关函数

mmap 函数
作用:
建立映射区
语法
所需头文件
#include <sys/mman.h>
函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHANGα

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值