首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

需要使用mmap()重复读取寄存器。读取值不会更新。我需要重新映射吗?

mmap() 是一种在内存与文件之间建立映射关系的系统调用函数,用于实现文件的内存映射。

对于需要重复读取寄存器的情况,如果读取的值不会更新,重新映射是没有必要的。因为 mmap() 建立的映射关系会将文件的数据映射到内存中,并且通过读取内存来访问文件数据,而不是每次都需要通过文件系统读取文件。

当使用 mmap() 读取寄存器的值时,如果该值不会发生更新,那么可以直接从内存中读取,不需要重新映射。重新映射会导致额外的系统调用和内存操作,增加了开销和复杂性。

需要注意的是,如果需要读取的寄存器值会发生更新,那么在读取之前需要先重新映射,以保证读取到最新的值。这可以通过调用 munmap() 解除之前的映射,然后再次调用 mmap() 建立新的映射关系来实现。

总结:

  • 如果需要重复读取寄存器的值且该值不会更新,不需要重新映射。
  • 如果需要重复读取寄存器的值且该值会发生更新,需要重新映射。

参考腾讯云相关产品和介绍链接:

  • 腾讯云主机:https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储 COS:https://cloud.tencent.com/product/cos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PHP Opcache的工作原理

APCu:是APC的一个分支,共享内存,缓存用户数据,不能缓存opcode,可以配合Opcache 使用 eAccelerate:同样是不更新了,不推荐 xCache:不再推荐使用了 2....API: mmap映射的内存在不是持久化的,如果进程关闭,映射随即失效,除非事先已经映射到了一个文件上 内存映射机制mmap是POSIX标准的系统调用,有匿名映射和文件映射两种 mmap的一大优点是把文件映射到进程的地址空间...但是,像Zend Framework等框架中,会引用注释,所以,是否关闭注释的缓存,需要区别对待。 5. OPCache 更新策略 是缓存,都存在过期,以及更新策略等。...而OPCache的更新策略非常简单,到期数据置为Wasted,达到设定值,清空缓存,重建缓存。 这里需要注意:在高流量的场景下,重建缓存是一件非常耗费资源的事儿。...OPCache 在创建缓存时并不会阻止其他进程读取。 这会导致大量进程反复新建缓存。所以,不要设置OPCache过期时间 每次发布新代码时,都会出现反复新建缓存的情况。如何避免呢?

1.1K21
  • 关键字volatile正确理解和使用

    当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。...用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份 volatile char a; a=0; while(!...多任务环境下各任务间共享的标志应该加volatile(这个在Linux应用编程里面会使用到) 存储器映射的硬件寄存器通常也要加voliate,因为每次对它的读写都可能有不同意义。...volatile的本质: 编译器的优化:在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器取值;当变量值在本线程里改变时...当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。

    61830

    PHP Opcache的工作原理

    APCu:是APC的一个分支,共享内存,缓存用户数据,不能缓存opcode,可以配合Opcache 使用 eAccelerate:同样是不更新了,不推荐 xCache:不再推荐使用了...API: mmap映射的内存在不是持久化的,如果进程关闭,映射随即失效,除非事先已经映射到了一个文件上 内存映射机制mmap是POSIX标准的系统调用,有匿名映射和文件映射两种 mmap...但是,像Zend Framework等框架中,会引用注释,所以,是否关闭注释的缓存,需要区别对待。 5. OPCache 更新策略 是缓存,都存在过期,以及更新策略等。...而OPCache的更新策略非常简单,到期数据置为Wasted,达到设定值,清空缓存,重建缓存。 这里需要注意:在高流量的场景下,重建缓存是一件非常耗费资源的事儿。...OPCache 在创建缓存时并不会阻止其他进程读取。 这会导致大量进程反复新建缓存。所以,不要设置OPCache过期时间 每次发布新代码时,都会出现反复新建缓存的情况。如何避免呢?

    91520

    聊聊Linux IO

    坊间传闻,mmap(2)的方式文件比传统的方式要快,因为少一次拷贝。真是这样?为什么少一次拷贝? 如果你觉得这些问题都很简单,都能很明确的回答上来。...文件的内容需要映射到实际的物理磁盘,这种映射关系由文件系统来完成;Buffer Cache用于缓存存储设备块(比如磁盘扇区)的数据,而不关心是否有文件系统的存在(文件系统的元数据缓存在Buffer Cache...上面的图有点复杂,画一幅简图,把这些机制所在的位置添加进去: ? 这下一目了然了吧?传统的 Buffered IO 使用read(2)读取文件的过程什么样的?...而mmap(2)做了什么?mmap(2)直接把Page Cache映射到了用户态的地址空间里了,所以mmap(2)的方式文件是没有第二次拷贝过程的。那Direct IO做了什么?...这里给篇参考文章[5],不再赘述(更好的选择是去TLPI相关章节)。 文件读写遭遇断电时,数据还安全?相信你有自己的答案了。使用O_SYNC或者fsync(2)刷新文件就能保证安全

    3.2K21

    轻松突破文件IO瓶颈:内存映射mmap技术

    真正的文件读取是当进程发起或写操作时。 进程的或写操作访问虚拟地址空间这一段映射地址,通过查询页表,发现这一段地址并不在物理页面上。...注:修改过的脏页面并不会立即更新回文件中,而是有一段时间的延迟,可以调用msync()来强制同步, 这样所写的内容就能立即保存到文件里了。...这样一来,应用程序自然不需要使用文件系统的 write(写入)、read(读取)、fsync(同步)等系统调用,因为现在只要面向内存的虚拟空间进行开发。...4. mmap 不是银弹 mmap 不是银弹,这意味着 mmap 也有其缺陷,在相关场景下的性能存在缺陷: 由于 MMAP 使用时必须实现指定好内存映射的大小,因此 mmap 并不适合变长文件; 如果更新文件的操作很多...效率差; 6.mmap使用细节 使用mmap需要注意的一个关键点是,mmap映射区域大小必须是物理页大小(page_size)的整倍数(32位系统中通常是4k字节)。

    4K20

    面试PHP主管岗位的时候,问我PHP的opcache是用来干嘛的?

    APCu:是APC的一个分支,共享内存,缓存用户数据,不能缓存opcode,可以配合Opcache 使用eAccelerate:同样是不更新了,不推荐xCache:不再推荐使用了 2....API:mmap映射的内存在不是持久化的,如果进程关闭,映射随即失效,除非事先已经映射到了一个文件上内存映射机制mmap是POSIX标准的系统调用,有匿名映射和文件映射两种mmap的一大优点是把文件映射到进程的地址空间避免了数据从用户缓冲区到内核...但是,像Zend Framework等框架中,会引用注释,所以,是否关闭注释的缓存,需要区别对待。 5. OPCache 更新策略是缓存,都存在过期,以及更新策略等。...而OPCache的更新策略非常简单,到期数据置为Wasted,达到设定值,清空缓存,重建缓存。 这里需要注意:在高流量的场景下,重建缓存是一件非常耗费资源的事儿。...OPCache 在创建缓存时并不会阻止其他进程读取。这会导致大量进程反复新建缓存。所以,不要设置OPCache过期时间 每次发布新代码时,都会出现反复新建缓存的情况。如何避免呢?

    97620

    文件IO操作的最佳实践

    02 /知识点梳理/ 本文主要关注的 Java 相关的文件操作,理解它们需要一些前置条件,比如 PageCache,Mmap(内存映射),DirectByteBuffer(堆外缓存),顺序读写,随机读写...,文件中的位置在虚拟内存中有了对应的地址,可以像操作内存一样操作这个文件,相当于已经把整个文件放入内存,但在真正使用到这些数据前却不会消耗物理内存,也不会有读写磁盘的操作,只有真正使用这些数据时,也就是图像准备渲染在屏幕上时...紧接着还要告诉你一些令你沮丧的事,至少在 JAVA 中使用 MappedByteBuffer 是一件非常麻烦并且痛苦的事,主要表现为三点: MMAP 使用时必须实现指定好内存映射的大小,并且一次 map...的大小限制在 1.5G 左右,重复 map 又会带来虚拟内存的回收、重新分配的问题,对于文件不确定大小的情形实在是太不友好了。...深度思考:当内存吃紧时,PageCache 的分配会受影响?PageCache 的大小如何确定,是固定的 16kb 可以监控 PageCache 的命中情况

    83430

    文件IO操作的最佳实践

    02 /知识点梳理/ 本文主要关注的 Java 相关的文件操作,理解它们需要一些前置条件,比如 PageCache,Mmap(内存映射),DirectByteBuffer(堆外缓存),顺序读写,随机读写...,文件中的位置在虚拟内存中有了对应的地址,可以像操作内存一样操作这个文件,相当于已经把整个文件放入内存,但在真正使用到这些数据前却不会消耗物理内存,也不会有读写磁盘的操作,只有真正使用这些数据时,也就是图像准备渲染在屏幕上时...紧接着还要告诉你一些令你沮丧的事,至少在 JAVA 中使用 MappedByteBuffer 是一件非常麻烦并且痛苦的事,主要表现为三点: MMAP 使用时必须实现指定好内存映射的大小,并且一次 map...的大小限制在 1.5G 左右,重复 map 又会带来虚拟内存的回收、重新分配的问题,对于文件不确定大小的情形实在是太不友好了。...深度思考:当内存吃紧时,PageCache 的分配会受影响?PageCache 的大小如何确定,是固定的 16kb 可以监控 PageCache 的命中情况

    1.5K71

    从Linux零拷贝深入了解Linux-IO

    使用了「预功能」。...比如,假设 read 方法每次只会 32 KB 的字节,虽然 read 刚开始只会 0 ~ 32 KB 的字节,但内核会把其后面的 32 ~ 64 KB 也读取到 PageCache,这样后面读取...此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。...前面提到过的虚拟内存机制和mmap等都表明,通过在不同的虚拟地址上重新映射页面可以实现在用户进程和内核之间虚拟复制和共享内存;因此如果要在实现在用户进程内处理数据(这种场景比直接转发数据更加常见)之后再发送出去的话...此外,在实际应用的过程中,为了避免频繁的内存映射,可以重复使用同一段内存缓冲区,因此,你不需要在只用过一次共享缓冲区之后就解除掉内存页的映射关系,而是重复循环使用,从而提升性能。

    1.7K32

    Linux内核IO技术栈详解

    此时设备断电会有影响?会丢失数据? write调用是原子的?多线程写文件是否要对文件加锁?有没有例外,比如append方式? 坊间传闻,mmap的方式文件比传统的方式要快,因为少一次拷贝。...文件的内容需要映射到实际的物理磁盘,这种映射关系由文件系统来完成;Buffer Cache用于缓存存储设备块(比如磁盘扇区)的数据,而不关心是否有文件系统的存在(文件系统的元数据缓存在Buffer Cache...上面的图有点复杂,画一幅简图,把这些机制所在的位置添加进去: 这下一目了然了吧?传统的Buffered IO使用read读取文件的过程什么样的?...而mmap做了什么?mmap直接把Page Cache映射到了用户态的地址空间里了,所以mmap的方式文件是没有第二次拷贝过程的。那Direct IO做了什么?...这里给篇参考文章[5],不再赘述(更好的选择是去TLPI相关章节)。 文件读写遭遇断电时,数据还安全?相信你有自己的答案了。使用O_SYNC或者fsync刷新文件就能保证安全

    2.6K10

    一文读懂 Linux mmap 内存映射

    真正的文件读取是当进程发起或写操作时。 进程的或写操作访问虚拟地址空间这一段映射地址,通过查询页表,发现这一段地址对应的物理内存页面上没有数据。...注:修改过的脏页并不会立即更新回文件中,而是有一段时间的延迟,可以调用msync(2)来强制同步,这样所写的内容就能立即保存到文件里了。...之后再次发起页请求,进而将页缓存中的数据发给用户进程。 总的来说,常规文件操作为了提高读写效率和保护磁盘,使用了页缓存机制。这样造成文件时需要先将文件页从磁盘拷贝到页缓存。...MAP_SHARED 与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或munmap()被调用,文件实际上不会更新。...的匿名映射,除了可用于父子进程间通信,还可用于申请大块内存,并在运行时动态扩缩映射区域大小,而不需要重新创建映射

    4.2K01

    C语言中volatile关键字的作用

    当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。...2>用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。 例如: volatile char a; a=0; while(!...5.volatile的本质: 1> 编译器的优化 在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器取值;当变量值在本线程里改变时...当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。...当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

    1.1K30

    2.并发编程~先导篇(下)

    /tree/master/python/5.concurrent/Linux/进程通信/5.mmap 好处:内存操作,比IO快 缺点:和文件一样不会像管道一样阻塞(的可能不全,需要自己考虑读写效率)...PS:内存映射一个文件并不会导致整个文件被读取到内存中: 文件并没有被复制到内存缓存中,操作系统仅仅为文件内容保留了一段虚拟内存。...当你访问文件的不同区域时,这些区域的内容才根据需要读取映射到内存区域中。...) ACCESSCOPY:写时复制内存(影响内存,但不会更新基础文件) ACCESSDEFAULT:延迟到prot(3.7才添加) offset,偏移量,默认是0(和文件一致) # 这个够明了了,\0转换成二进制就是...是否关闭 if __name__ == '__main__': main() 输出:(测试了一下,切片操作【、写】不会影响postion) 4096 1024 b'' 1024 0 b'\

    1.4K40

    从Linux零拷贝深入了解Linux IO

    但是对于机械磁盘来说,就是通过磁头旋转到数据所在的扇区,再开始「顺序」读取数据,但是旋转磁头这个物理动作是非常耗时的,为了降低它的影响,PageCache 使用了「预功能」比如,假设 read 方法每次只会...fork和O_DIRECT I/O如果O_DIRECT I/O中使用到的内存buffer是一段私有的映射(虚拟内存),如任何使用上文中提到过的mmap并以MAP_PRIVATE flag 声明的虚拟内存...,比如静态文件服务器或者是直接转发数据的代理服务器前面提到过的虚拟内存机制和mmap等都表明,通过在不同的虚拟地址上重新映射页面可以实现在用户进程和内核之间虚拟复制和共享内存;因此如果要在实现在用户进程内处理数据...,而在其它场景下反而可能造成负优化,因为 COW事件所带来的系统开销要远远高于一次 CPU 拷贝所产生的此外,在实际应用的过程中,为了避免频繁的内存映射,可以重复使用同一段内存缓冲区,因此,你不需要在只用过一次共享缓冲区之后就解除掉内存页的映射关系...,而是重复循环使用,从而提升性能但这种内存页映射的持久化并不会减少由于页表往返移动/换页和 TLB flush所带来的系统开销,因为每次接收到 COW 事件之后对内存页而进行加锁或者解锁的时候,内存页的只读标志

    2.4K194

    C语言丨深入理解volatile关键字

    如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。...2)中断服务程序中修改的供其它程序检测的变量,需要加volatile; 当变量在触发某中断程序中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到某寄存器操作,而后每次只会从该寄存器读取变量副本...3)多任务环境下各任务间共享的标志,应该加volatile; 在本次线程内, 当读取一个变量时,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器取值;当内存变量或寄存器变量在因别的线程等而改变了值...,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致 。...如 果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

    90760

    从Linux零拷贝深入了解Linux-IO

    比如,假设read方法每次只会32KB的字节,虽然read刚开始只会0~32KB的字节,但内核会把其后面的32~64KB也读取到PageCache,这样后面读取32~64KB的成本就很低,如果在32...如果O_DIRECT I/O中使用到的内存buffer是一段私有的映射(虚拟内存),如任何使用上文中提到过的mmap并以MAP_PRIVATE flag 声明的虚拟内存,那么相关的O_DIRECT I/...前面提到过的虚拟内存机制和mmap等都表明,通过在不同的虚拟地址上重新映射页面可以实现在用户进程和内核之间虚拟复制和共享内存;因此如果要在实现在用户进程内处理数据(这种场景比直接转发数据更加常见)之后再发送出去的话...1)写时拷贝 (Copy-on-Write) 前面提到过过利用内存映射(mmap)来减少数据在用户空间和内核空间之间的复制,通常用户进程是对共享的缓冲区进行同步阻塞读写的,这样不会有线程安全问题,但是很明显这种模式下效率并不高...此外,在实际应用的过程中,为了避免频繁的内存映射,可以重复使用同一段内存缓冲区,因此,你不需要在只用过一次共享缓冲区之后就解除掉内存页的映射关系,而是重复循环使用,从而提升性能。

    1.4K30

    MONGODB 的存储引擎更快,更高,更强的秘诀 --译

    预分配文件空间 内存和文件的映射允许我们大大的减少固定大小文件的在操作系统和文件系统之间的交互,但如果文件是增长的,我们需要引入文件系统,文件系统将更新文件的metadata,并且确保这些更新如果在系统崩溃时仍然不会丢失...重新设置映射文件区域 摆在这里有一个有难度的问题,同步。我们可以想象一下,引入两个线程,一个读取文件,另一个要截断文件。...mmap_use_count: 一个操作在使用映射缓冲区之前应该将这个计数器加1,在使用映射缓冲区之后在将其减1。这个计数器告诉我们是否有人正在使用缓冲区。写入器等待直到计数器变为0才能继续。...于此有稍许不同的是对于500m-btree-50r50u和update-btree, mmap的一些操作(例如更新或插入)要慢一些,但其他操作(通常是读取)要快得多,这里我们会持续的研究这些没有获得“好处...当然统计数据并不能完整的解释所有的结果:因为在使用mmap时候,工作负载的吞吐量比使用系统调用时高63%。

    46310

    PHP Opcache工作原理

    APCu:是APC的一个分支,共享内存,缓存用户数据,不能缓存opcode,可以配合Opcache 使用 eAccelerate:同样是不更新了,不推荐 xCache:不再推荐使用了 2....API: mmap映射的内存在不是持久化的,如果进程关闭,映射随即失效,除非事先已经映射到了一个文件上 内存映射机制mmap是POSIX标准的系统调用,有匿名映射和文件映射两种 mmap的一大优点是把文件映射到进程的地址空间...共享内存:一个单位时间内,只允许一个进程执行写操作,允许多个进程执行操作; 写操作同时,不阻止操作,以至于很少有锁死的情况。...但是,像Zend Framework等框架中,会引用注释,所以,是否关闭注释的缓存,需要区别对待。 5. OPCache 更新策略 是缓存,都存在过期,以及更新策略等。...OPCache 在创建缓存时并不会阻止其他进程读取。 这会导致大量进程反复新建缓存。所以,不要设置OPCache过期时间 每次发布新代码时,都会出现反复新建缓存的情况。如何避免呢?

    1.5K21

    零拷贝详解_深拷贝和浅拷贝如何实现

    因为用户空间没有权限操作磁盘或网卡,内核的权限最高,这些操作设备的过程都需要交由操作系统内核来完成,所以一般要通过内核去完成某些任务的时候,就需要使用操作系统提供的系统调用函数。...DMA,然后让 CPU 执行其他任务; 3)DMA 进一步将 I/O 请求发送给磁盘; 4)磁盘收到 DMA 的 I/O 请求,把数据从磁盘读取到磁盘控制器的缓冲区中,当磁盘控制器的缓冲区被满后...fr=aladdin 二、优化发展史 可参考:《原来 8 张图,就可以搞懂「零拷贝」了》 三、如何实现零拷贝 1、mmap   mmap 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据...RocketMQ 中就是使用mmap 来提升磁盘文件的读写性能 2、sendfile   还能继续优化?...2、mmap   mmap 将磁盘文件映射到内存,支持和写,对内存的操作会反映在磁盘文件上,适合小数据量读写,需要 4 次上下文切换(用户态 -> 内核态 -> 用户态 -> 内核态 -> 用户态)

    1.2K20
    领券