Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >连续调用mmap,有缓存吗?

连续调用mmap,有缓存吗?
EN

Stack Overflow用户
提问于 2013-12-09 08:32:56
回答 2查看 410关注 0票数 3

我在向量中读到:

代码语言:javascript
运行
AI代码解释
复制
int readBytes(string filename, vector<uint32_t> &v)
{
    // fstat file, get filesize, etc.

    uint32_t *filebuf = (uint32_t*)mmap(0,filesize,PROT_READ,
                                        MAP_FILE|MAP_PRIVATE,
                                        fhand,0);
    v = std::vector<uint32_t>(filebuf,filebuf+numrecords);
    munmap(filebuf, filesize);
}

在main()中,我有两个连续调用(纯粹作为一个测试):

代码语言:javascript
运行
AI代码解释
复制
vector<uint32_t> v(10000);    
readBytes(filename, v);
readBytes(filename, v);
// ...

第二个电话几乎总是给出一个更快的时钟时间:

代码语言:javascript
运行
AI代码解释
复制
Profile time [1st call]: 0.000214141 sec
Profile time [2nd call]: 0.000094109 sec

查看系统调用表明内存块是不同的:

代码语言:javascript
运行
AI代码解释
复制
mmap(NULL, 40000, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe843ac8000
mmap(NULL, 40000, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7fe843ac7000

为什么第二个电话打得更快?巧合?什么,如果有的话,是缓存的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-09 08:41:30

假设你在谈论什么*NIX-ish,可能有一个页面缓存,它的工作就是缓存这类数据以获得这种加速。除非在调用之间有其他东西将这些页面从缓存中删除,否则它们仍然存在。

因此,第一个呼叫可能必须:

  1. 分配页
  2. 将这些页面映射到进程地址空间中。
  3. 将这些页面中的数据复制到向量中(可能会导致磁盘上的数据出错)

第二个调用可能会找到缓存中的页面,并且只需要:

  1. 将这些页面映射到进程地址空间中。
  2. 将数据从这些页面复制到向量中(这次它们是预错误的,所以这是一个简单的内存操作)

实际上,我跳过了一个步骤:您的注释中的open/fstat步骤可能也是通过inode缓存加速的。

票数 4
EN

Stack Overflow用户

发布于 2013-12-09 08:36:37

记住,您的程序会看到虚拟内存。有一个映射表(“页面表”),它将程序看到的虚拟地址映射到实际的物理内存中。操作系统将确保两个mmap()调用map程序看到的两个不同的虚拟地址到相同的物理内存中。因此,数据只需从磁盘加载一次。

更多的死亡:

  • 第一个mmap():OS只记录映射
  • 当您实际尝试读取数据时,会发生“页面错误”,因为数据不在内存中。操作系统捕捉到这一点,将数据从磁盘读取到其磁盘缓存,并更新页表,以便您的程序可以直接从该磁盘缓存读取数据,然后自动恢复您的程序。
  • 首先,munmap():OS禁用映射,并更新页面表,这样就不能再读取文件了。请注意,该文件仍在操作系统的磁盘缓存中。
  • 第二个mmap():OS只记录映射
  • 当您实际尝试读取数据时,会发生“页面错误”,因为数据没有映射。操作系统捕捉到这一点,注意到数据已经在其磁盘缓存中,并更新页表,以便您的程序可以直接从该磁盘缓存中读取,然后它将自动恢复您的程序。
  • 第二个munmap():OS禁用映射,并更新页面表,这样就不能再读取文件了。请注意,该文件仍在操作系统的磁盘缓存中。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20475666

复制
相关文章
Android全面的屏幕适配方案解析(四)__今日头条适配方案
之前三篇把屏幕适配概念梳理了还讲解了列举的其中四种适配方案,还没有看过的童鞋可以先参考这三篇: Android全面的屏幕适配方案解析(一)__屏幕适配概念梳理 Android全面的屏幕适配方案解析(二)__宽高限定符屏幕适配 Android全面的屏幕适配方案解析(三)__sw限定符适配方案 Android全面的屏幕适配方案解析(四)__今日头条适配方案
SoullessCoder
2022/03/23
1.6K0
Android全面的屏幕适配方案解析(四)__今日头条适配方案
Android获取屏幕分辨率及DisplayMetrics简介[通俗易懂]
Android 可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题。
全栈程序员站长
2022/07/20
4.2K0
Android获取屏幕分辨率及DisplayMetrics简介[通俗易懂]
Android智能平板应用,界面适配的另一种轻量级方法
各种设备种类和尺寸那么多,基于一种原型设计好的界面,换到另一种设备上去若不适配全乱套了。好在还是有很多方案的,这减少了不少的开发工作量。最流行的就是头条的方案了,使用也超级简单。然而,如果不想引入,还可以简单的一个工具类实现,原理类似于头条的方案。
杨永贞
2022/04/13
8810
Android智能平板应用,界面适配的另一种轻量级方法
浅扒Android动态设置字体大小
Android开发中,TextView类的控件应该说是很常用了。一般来说我们是通过android:textSize="20sp" 来设置字体大小,但是很多时候也需要动态设置字体大小,调用也很简单:
JarvanMo
2018/09/06
3.5K0
038android初级篇之android UI中的单位
density值表示每英寸有多少个显示点 而分辨率表示设备长和宽上的像素的个数。
上善若水.夏
2018/09/28
4310
Android UI 开发里的尺寸单位理解
在学习 Android UI 开发的初期,经常被一些常用概念如 dp、sp 和它们与 px 的换算等虐,要避免被虐,最好的方法当然是知其所以然,再见到它们就胸中有料心不慌了。
零式的天空
2022/03/28
4150
Android UI 开发里的尺寸单位理解
在学习 Android UI 开发的初期,经常被一些常用概念如 dp、sp 和它们与 px 的换算等虐,要避免被虐,最好的方法当然是知其所以然,再见到它们就胸中有料心不慌了。
mzlogin
2020/04/16
1.3K0
Android UI 开发里的尺寸单位理解
Android屏幕适配框架(一)
核心思路:利用ui设计稿的尺寸和手机自身尺寸得出缩放比,再将控件宽高处理后设置到控件上。性能方面会多渲染一次控件 ui设计稿高和宽这边假设是1920*1080,具体根据实际设计稿来设置 //ui图上的宽高 private static final int BASE_WIDTH = 1080; private static final int BASE_HEIGHT = 1920; // ui给的图不包含状态栏,后面要减去状态栏的高度 定义一些变量 //设备的真实宽高 private static int d
aruba
2020/07/03
8320
Android图片处理--缩放
把ImageView或者PhotoView的对象名直接添加到display中就OK 了。
cMusketeer
2018/06/17
2.8K0
Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配
https://github.com/JessYanCoding/AndroidAutoSize
全栈程序员站长
2022/09/05
1.6K0
Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配
Android的分辨率
这些术语都是指屏幕的分辨率。 VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素; HVGA:Half-size VGA;即:VGA的一半,分辨率为480×320; QVGA:Quarter VGA;即:VGA的四分之一,分辨率为320×240; WVGA:Wide Video Graphics Array;即:扩大的VGA,分辨率为800×480像素;
forrestlin
2022/04/02
1.2K0
Android绘图机制与处理技巧-更新中
Android手机屏幕,不管是分辨率还是大小,五花八门。。。要想在不同的屏幕上保持绘图的准确性,需要对屏幕有充分的认识.
小小工匠
2021/08/16
7150
如何让一套代码完美适配各种屏幕?
区别于iOS,android设备有不同的分辨率大小以及不同厂商的系统,目前市场的分辨率可以看下相关统计。
CRMEB商城源码
2022/07/19
1.2K0
android缩放动画中心缩放_安卓动画缩放调到多少比较好
备注:由于我的图片是导出视频再用PS转换成的gif,故效率上有所损失,实际动画效果和速度比图片的快。
全栈程序员站长
2022/11/04
2.4K0
android缩放动画中心缩放_安卓动画缩放调到多少比较好
Android TabLayout修改选中字体大小
style的方式只能改整体的大小,修改选中字体大小就需要用到CustomView了
yechaoa
2022/06/10
2.2K0
Android TabLayout修改选中字体大小
Android 设置字体大小不跟随系统
最近发现如果将手机系统的字体设置为大字体,应用中的字体将跟随系统变大,而布局大部分我们根据设计出图写死了大小,这就会导致文字显示不全。 究其原因到底是因为什么呢? Google了一下,发现原来我们为字体设置的大小为SP,而SP,不仅根据像素进行改变,还会根据系统设置的大小而改变,所以如果我们布局写死的地方,可以将字体的大小也设置位dp。 但是估计等我们发现这个问题的时候,我们的应用可能已经完成或者已经进行了一大部分了,那么怎么解决这个问题呢? 看大家的编码习惯了,如果你的应用进行了抽取,所有的Activity,都继承抽取出来的BaseActivity的话那么添加如下代码,即可解决上述问题。
longzeqiu
2019/08/14
5.7K0
WebStorm如何设置字体大小
由于最近要练习一些js代码,特地装了WebStorm,但是发现字体太小,因此将已知的两种方法整理出来。
全栈程序员站长
2022/07/01
5.2K0
WebStorm如何设置字体大小
点击加载更多

相似问题

matplotlib字体与LaTeX字体不匹配

11

text.usetex为'true‘的轴字体不使用设置字体

21

使用'text.usetex‘= true时,pdf中嵌入的字体错误

12

使用LaTeX的Matplotlib字体通用字体

14

将"matplotlib.rcParams['text.usetex'] = True“设置为在标签中使用LaTeX和使用德语区域设置使用逗号时出现问题

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档