linux内核mmap映射区域

用户使用malloc申请大于128KB内存内存分配器通过mmap系统调用linux进程虚拟空间直接映射一片内存用户使用使用mmap映射内存区域比较神秘我们运行一个程序需要磁盘执行文件加载内存文件加载内存两种常用操作方法一种通过常规文件I/O操作read/write系统调用接口一种使用mmap系统调用文件映射进程虚拟空间然后直接这片映射区域读写即可

文件I/O操作使用文件API函数(open, read, write, close)文件进行打开读写操作文件存储磁盘我们通过指定文件打开一个文件得到一个文件描述符通过文件描述符可以找到文件索引节点inode根据inode就可以找到文件磁盘存储位置然后我们可以直接调用read write 函数磁盘指定位置读写数据文件读写流程如图5-34左侧所示

buf

用户空间

内核空间

read/write

磁盘

buf

write/read

内核中缓冲区

fsync

磁盘

磁盘属于机械设备程序每次读写磁盘都要经过转动磁盘磁头定位操作读写速度较慢为了提高读写效率减少IO次数保护磁盘linux内核基于程序局部原理提供了一种磁盘缓冲机制如图5-34所示内存物理为单位缓存磁盘普通文件设备文件应用程序磁盘文件缓存数据存在数据存在直接读取复制用户空间不存在先将磁盘数据读取缓存然后缓存复制数据用户空间buf应用程序数据磁盘文件用户空间buf数据写入page cache, page cache缓存数据达到设定阈值或者刷新时间超时linux内核这些数据磁盘

不同进程可能读写多个文件不同文件可能都要缓存page cache物理如图5-35所示linux内核通过一个叫做radix tree 结构管理这些缓存对象一个物理可以文件缓存也可以交换缓存甚至普通内存文件缓存为例通过一个叫作address_space 结构体磁盘文件内存产生关联我们通过文件可以找到文件对应inodeinode->imapping 成员指向address_space对象物理page->mapping 指向缓存owneraddress_space这样文件名对应物理缓存产生了关联

文件名

inode->address_space

磁盘 页缓存

radix tree

物理页 物理页 物理页 物理页 物理页 物理页

当我们读写指定磁盘文件通过文件描述符可以找到文件address space, 通过进去文件位置偏移参数就可以缓存查找对应物理页查找读取物理数据用户空间没有查找linux 内核新建一个物理页添加到缓存磁盘读取数据物理页最后物理数据复制用户空间

buf1 buf2

fwrite fread

IO缓冲

fflush->read/write 用户空间/内核空间

缓存

fsync 硬件

磁盘

linux内核缓存机制一定程度提高了磁盘读写数据但是程序通过read/write频繁系统调用还是带来一定性能开销系统调用不停切换CPU操作系统工作模式数据也在用户空间内核空间之间不停复制为了减少系统调用次数尝到了缓存甜头glibc决定进一步优化如图5-36所示用户空间开辟一个IO缓冲区并将系统调用read write 进一步封装fread/ fwrite 函数

用户空间C标准库每个打开文件分配一个IO缓冲一个文件描述符fdIO缓冲区信息文件描述符fd一起封装FILE结构体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值