网站首页 > 文章精选 正文
相对cpu与内存,磁盘是慢速设备,大量文件操作会有性能问题。
传统文件IO机制
假如没有mmap技术,使用最传统和基本的普通文件进行IO操作会产生数据多次拷贝问题。
1.先从磁盘上把数据读取到内核IO缓冲区里面,
2.然后再从内核IO缓冲区中读取到用户进程私有空间,
3.最后进程才能拿到这个数据。
如上图显示,可以明显的看出数据被拷贝了两次,这样肯定对磁盘读性能是有影响的。同样的如果想给磁盘中写内容,也是得先从用户进程的私有空间把数据拷贝到内核IO缓冲区,然后从内核IO缓冲区再拷贝到磁盘文件。
内存映射机制
虽然基于磁盘的顺序写可以极大提高 IO 的写效率,但是基于文件的存储采用多拷贝方式。在性能提升上会很有限。
对于大量读写文件场景下,引入了内存映射机制。即将磁盘文件映射到内存中,以操作内存的方式操作磁盘,性能提升了一个级别。
内存映射: 按需把磁盘文件的数据读取到内存里面,把 物理磁盘上的一些地址和用户进程私有空间的一些虚拟内存地址进行了一个映射。这个映射的过程在JDK下面的NIO包里MapperByteBuffer的map函数,底层就是基于mmap技术实现的。
这个mmap技术在地址映射的过程中对文件的大小是有限制的,在1.5G~2G之间。在 JAVA 中可通过 FileChannel 的 map 方法创建内存映射文件。
注意:
1.进程异常退出,存储在页缓存中的数据并不会丢失,操作系统会定时将页缓存中的数据持久化到磁盘,做到数据安全可靠。不过如果是机器断电等异常情况,存储在页缓存中的数据就有可能丢失。
2.按需读取文件内存到页缓存,并非所有文件数据都加载到内存。
如下是一种内存映射文件(应用于重试队列),包含文件头和文件数据。
分文件头的原因是可以快速的检索数据占用情况。文件头放入mmap。
文件头是目录:有状态、数据地址。状态分:空、占用、处理中、处理完成
文件数据是数据:有长度,数据。
读写指针只能自增长,可以加读写锁控制访问。
猜你喜欢
- 2025-03-14 C语言中内存四区的详解(c语言内存分为几个区)
- 2025-03-14 别等涨价再后悔 大内存这样玩(大内存有什么用)
- 2025-03-14 Linux运维获取内存、cpu、磁盘IO信息
- 2025-03-14 用自己电脑做云存储空间,用自己电脑做云存储的数据备份方法
- 2025-03-14 Win10下C盘爆满,只剩500MB!我一怒之下最终清理出70G空间!
- 2025-03-14 傻傻分不清?内存条和固态硬盘区别来了
- 2025-03-14 微信占几十G Mac空间?可以这样一键导出旧聊天文件
- 2025-03-14 深圳尚学堂:关于java内存管理的基础知识
- 2025-03-14 计算机原理:内存和硬盘的关系你真的知道吗?
- 2025-03-14 在windows中,5招教你释放硬盘空间,让系统和重装一样干净
- 05-05MyBatis的三种分页方式,你学废了吗?
- 05-05如何写一个简单的分页(最简单的分页)
- 05-05详解如何使用Spring Data JPA进行数据的分页与排序
- 05-05手速太快引发分页翻车?前端竞态陷阱揭秘
- 05-05前端分页机制的具体实现(分页前端需要做什么)
- 05-05一个后勾腿动作,有效疏通血管,改善下肢发麻,促进全身燃脂
- 05-05大型调相机起动及并网研究(什么是调相机,与发电机区别)
- 05-05你们都是托:动态对比度其实是骗你的
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)