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

在fork之前或之后对磁盘文件调用mmap()有什么区别?

在fork之前或之后对磁盘文件调用mmap()的区别如下:

在fork之前调用mmap():

  • 父进程和子进程共享同一个映射区域,即它们使用相同的虚拟内存地址来访问文件内容。
  • 父进程和子进程对映射区域的修改会相互影响,因为它们共享同一份物理内存。
  • 这种共享特性可以用于实现进程间通信(IPC),例如通过映射文件进行数据交换。

在fork之后调用mmap():

  • 父进程和子进程拥有各自独立的映射区域,它们使用不同的虚拟内存地址来访问文件内容。
  • 父进程和子进程对各自映射区域的修改不会相互影响,因为它们使用不同的物理内存。
  • 这种独立性可以用于实现父子进程之间的数据隔离,各自处理文件内容而不会相互干扰。

根据不同的使用场景和需求,选择合适的调用时机可以提供更好的灵活性和安全性。

腾讯云相关产品推荐:

  • 对于云计算领域,腾讯云提供了丰富的产品和服务,包括云服务器、云数据库、云存储、人工智能等。您可以根据具体需求选择适合的产品。
  • 云服务器(ECS):提供弹性计算能力,支持多种操作系统和应用场景。详情请参考:腾讯云云服务器
  • 云数据库(CDB):提供高可用、可扩展的数据库服务,支持多种数据库引擎。详情请参考:腾讯云云数据库
  • 云存储(COS):提供安全、可靠的对象存储服务,适用于存储和处理各类文件和多媒体资源。详情请参考:腾讯云云存储
  • 人工智能(AI):腾讯云提供了丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等。详情请参考:腾讯云人工智能

请注意,以上推荐的腾讯云产品仅供参考,具体选择应根据实际需求和情况进行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

笔记 Lab10: Mmap | 文件内存映射

Lab 10: mmap (hard) 实现 *nix 系统调用 mmap 的简单版:支持将文件映射到一片用户虚拟内存区域内,并且支持将对其的修改写回磁盘。...计算出来释放内存页的开始地址以及释放的个数后,调用自定义的 vmaunmap 方法(vm.c)物理内存页进行释放,并在需要的时候将数据写回磁盘。...调用 vmaunmap 释放内存页之后 v->offset、v->vastart 以及 v->sz 作相应的修改,并在所有页释放完毕之后,关闭对文件的引用,并完全释放该 vma。...让 allocproc 初始化进程的时候,将 vma 槽都清空 freeproc 释放进程时,调用 vmaunmap 将所有 vma 的内存都释放,并在需要的时候写回磁盘 fork 时,拷贝父进程的所有...映射的页并不在 [0, p->sz) 范围内,所以其页表项 fork 的时候并不会被拷贝。

1.5K20

linux系统调用函数 mmap--创建内存映射区(虚拟地址空间上)munmap--释放内存映射区

第四个参数 int flags 指示标志位参数, MAP_SHARED 数据会同步到磁盘、MAP_PRIVATE 数据不会同步到磁盘。 第五个参数是文件描述符fd,要映射的文件对应的文件描述符fd。...功能: 将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。 (1)使用普通文件提供的内存映射: 适用于任何进程之间。...此时,需要打开创建一个文件,然后再调用mmap() 典型调用代码如下: int fd = open(name, flag, mode); if(fd<0) ... void* ptr = mmap...由于父子进程特殊的亲缘关系,父进程中先调用mmap(),然后调用 fork()。...那么调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区 域进行通信了。注意,这里不是一般的继承关系。

1.5K20
  • Nginx一点事儿(一)

    如果缓冲区大小比请求大小小一些,则将数据存入磁盘文件上,因此将涉及IO操作。...共享内存 linux中为了实现进程间通信方式,一般通过mmap或者shmget系统调用在内存中创建一块连续的线性地址空间,使用munmap或者shmdt系统调用可以释放这块内存。...nginx是多进程的,一些全局变量,nginx希望所有进程都可以共享这些变量,共享变量实现有几种方案: 1. mmap匿名映射 2. 尝试将mmap映射到/dev/zero上 3....如果不支持原子操作,使用文件锁实现多进程环境下加锁 从性能考虑,优先使用mmap匿名映射。 nginx如何使用共享内存? 默认情况下,通过fork派生的子进程并不与其父进程共享内存区。...解决方法就是mmap的flags参数,master进程调用fork之前制定flags为MAP_SHARED来调用mmap,POSIX保证父进程中的内存映射关系时存留到子进程中,父进程共享内存的所有修改都可以子进程中看到

    71020

    Linux系统面试题

    磁盘地址表中有 13 个块号,文件将以块号磁盘地址表中出现的顺序依次读取相应的块。...5. malloc、vmalloc 和 kmalloc 什么区别?malloc 用户空间下的内存管理接口,保证的是虚拟地址空间上的连续。stack 和 heap 中间。...小于128M的通过brk申请,大于的通过 mmap 申请。vmalloc 用于申请大块内存,虚拟地址连续,物理地址不一定连续,不能直接用于DMA,进程地址空间专门的一块。...进程对内存区域的分配最终都会归结到do_mmap()函数上来(brk调用被单独以系统调用实现,不用do_mmap()), 内核使用do_mmap()函数创建一个新的线性地址区间。...可执行文件,普通文件,目录文件,链接文件,设备文件,管道文件14. 创建进程的系统调用哪些?clone, fork, vfork15. 调用 schedule() 进行进程切换的方式几种?

    1.7K44

    一文读懂 Linux mmap 内存映射

    文件映射到内存为例,实现这样的映射后,进程虚拟地址空间中一段内存地址将与文件磁盘地址一一应,进程就可以采用指针的方式读写这段内存,系统会自动回写脏页到对应的磁盘文件。...注:修改过的脏页并不会立即更新回文件中,而是一段时间的延迟,可以调用msync(2)来强制同步,这样所写的内容就能立即保存到文件里了。...共享区的写入,相当于输出到文件。直到msync()munmap()被调用文件实际上不会被更新。 MAP_PRIVATE 建立一个写时拷贝的私有映射。内存区域的写入不会影响到原文件。...父进程中先调用 mmap(),然后调用 fork()。那么调用 fork() 之后,子进程继承父进程匿名映射的地址区域,同样也继承 mmap() 返回的地址。...对于相同的文件对象,多个进程可以通过 mmap 将其映射到各自的地址空间中。这种映射的地址并不一定相同,因为每个进程自己独立的虚拟地址空间。

    3.9K01

    手拿放大镜深究文件IO

    执行之前,内核缓冲区中可能有大量的“脏页”,因此sync可能需要一段时间才能执行完,一般不建议使用,只有需要重启linux操作系统时,重启之前才应该执行sync函数。...了解了linux文件写流程之后,相信对于这两个工程实践中参数的取值会有更深刻的理解。 2.6. 用户缓冲I/O 上一小节介绍了访问文件最基本的方式:系统调用。...当fork子进程时,子进程保存指向父进程相同资源的指针,每当进程修改资源时,就会复制该资源,并把副本提供给该进程,复制过程其他进程是“透明”的。 2.7.3....select调用之前,需要保存所有监听的文件其进行遍历,并依次判断是否在想监听的文件集合中(主要原因是fd_set不支持遍历);而poll使用了pollfd数组,poll返回直接其进行遍历即可,...I/O多路复用总结 不同于磁盘文件,网络文件上的数据并不总是”就绪“的,如果此时其读取,可能发生阻塞,由此也产生了阻塞I/O与非阻塞I/O,本文的重点落在I/O上,select、poll、epoll

    84930

    kafka零拷贝原理_通俗易解中的解是什么意思

    下面我就画图讲解零拷贝,如果帮助请点个赞支持。 传统IO kafka的数据是要落入磁盘的,那么必然牵扯到磁盘的IO,传统磁盘IO又叫缓存IO,效率是很低的,那么为什么效率低呢?...传统的文件读写或者网络传输,通常需要将数据从内核态转换为用户态。应用程序读取用户态内存数据,写入文件 / Socket之前,需要从用户态转换为内核态之后才可以写入文件或者网卡当中。...我们可以称之为read/write模式,此模式的步骤为: 首先,调用read时,磁盘文件拷贝到了内核态; 之后,CPU控制将内核态数据copy到用户态下; 调用write时,先将用户态下的内容copy到内核态下的...Kafka只是把文件存放到磁盘之后通过网络发出去,中间并不需要修改什么数据,那read和write的两次CPU copy的操作完全是多余的。...sendfile Linux2.1内核开始引入了sendfile函数,用于将文件通过socket传送。开始时跟mmap什么区别,但是Linux2.4做出了重大优化,将零拷贝推到顶峰。

    46430

    零拷贝技术原理以及实现

    cpu运算,并且结果保存在进程内存中 if (pcntl_fork()) {//pcntl_fork调用 内核 fork函数,由用户态转内核态,复制一个新的进程     echo "hello world.../test.txt");//fpm中执行 它的流程为: 1:从硬盘中读取数据到内核态缓冲区,第一次复制拷贝 2:内核态复制数据到用户态,第二次拷贝 3:用户态获取数据之后,echo 发送数据,复制数据到内核态...操作系统会根据读取的文件,预存储到内核态内存中,因为硬盘效率非常慢,所以当多次相同文件读取请求时,可以将文件数据从内核态缓存中直接复制到用户态内存中,节省文件操作 零拷贝技术就是避免cpu将数据从一块存储位置拷贝到另一块位置...,file_length);     return 0; } 它的流程为: 1:首先将磁盘文件数据读取  file_length 大小(注意,mmap这边大小应该为内核空间数据页大小的倍数,例如4k*2...sendfile.h> ssize_t senfile(int out_fd,int in_fd,off_t* offset,size_t count); 使用 sendfile函数流程为: 1:首先读取磁盘文件

    66220

    基础总结 (操作系统篇)

    僵尸进程:一般工作中叫Z进程,即一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用waitwaitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,称之为僵尸进程,如何处理...loadAverage是CPU负载的评估,其值越高,说明其任务队列越长,处于等待执行的任务越多。即一段时间内共有多少任务使用等待使用CPU。...<=128KB调用brk,其他调用mmap。brk将数据段(.data)最高地址指针_edata往高地址推、mmap文件映射区找一块空闲的虚拟内存。...mmap磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射。(但它也可以用于进程间的通信) 3、shm而言,shm每个进程最终会映射到同一块物理内存。...4、另外mmap一个好处是当机器重启,因为mmap文件保存在磁盘上,这个文件还保存了操作系统同步的映像,所以mmap不会丢失,但是shmget就会丢失。

    40130

    Linux内核编程--内存映射和共享内存

    一,内存映射 对于磁盘文件和进程: 将一个文件其它对象映射到进程地址空间,实现文件磁盘的存储地址和进程地址空间中一段虚拟地址的映射关系。...进程可以直接操作磁盘文件,用内存读写代替 I/O读写 应用场景: 1.进程间通信 使用内存映射实现进程间通信的两个场景: 场景1.亲缘关系的进程间通信(父子进程) step1: 父进程创建内存映射区...step2: 父进程利用fork()创建子进程 step3: 子进程继承了父进程的内存映射区后,父子进程通过内存映射区进行通信 场景2.没有亲缘关系的进程间通信 step1: 准备一个非空的磁盘文件...对于Client-Server架构,如果服务器进程和客户端进程共享同一块存储区,服务器进程正在将数据写入共享存储区时,写入操作完成之前,客户端进程不应去取出这些数据。...length) 处理mmap的时候,普通文件共享内存区对象的大小都可以通过调用ftruncate修改。

    6.1K10

    Linux内存管理之mmap详解

    用PROT_WRITE 和 MAP_SHARED标志建立起来的文件映射,其st_ctime 和 st_mtime在对映射区写入之后,但在msync()通过MS_SYNC 和 MS_ASYNC两个标志调用之前会被更新...系统调用msync() #include int msync ( void * addr , size_t len, int flags) 一般说来,进程映射空间的共享内容的改变并不直接写回到磁盘文件中...:适用于具有亲缘关系的进程之间;由于父子进程特殊的亲缘关系,父进程中先调用mmap(),然后调用fork()。...那么调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区域进行通信了。注意,这里不是一般的继承关系。...如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新. (5) 所有进程映射同一个共享内存区域时,情况都一样,在建立线性地址与物理地址之间的映射之后

    4.5K90

    Linux内存管理之mmap详解

    用PROT_WRITE 和 MAP_SHARED标志建立起来的文件映射,其st_ctime 和 st_mtime在对映射区写入之后,但在msync()通过MS_SYNC 和 MS_ASYNC两个标志调用之前会被更新...系统调用msync() #include int msync ( void * addr , size_t len, int flags) 一般说来,进程映射空间的共享内容的改变并不直接写回到磁盘文件中...(2)使用特殊文件提供匿名内存映射:适用于具有亲缘关系的进程之间;由于父子进程特殊的亲缘关系,父进程中先调用mmap(),然后调用fork()。...那么调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区域进行通信了。注意,这里不是一般的继承关系。...如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新. (5) 所有进程映射同一个共享内存区域时,情况都一样,在建立线性地址与物理地址之间的映射之后

    2.6K40

    Linux内存映射——mmap

    当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接该段内存写时不会写入超过当前文件大小的内容....用PROT_WRITE 和 MAP_SHARED标志建立起来的文件映射,其st_ctime 和 st_mtime在对映射区写入之后,但在msync()通过MS_SYNC 和 MS_ASYNC两个标志调用之前会被更新...4.msync系统调用 #include int msync ( void * addr , size_t len, int flags) 一般说来,进程映射空间的共享内容的改变并不直接写回到磁盘文件中...(2)使用特殊文件提供匿名内存映射:适用于具有亲缘关系的进程之间;由于父子进程特殊的亲缘关系,父进程中先调用mmap(),然后调用fork()。...那么调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区域进行通信了。注意,这里不是一般的继承关系。

    5.7K10

    Linux fork那些隐藏的开销

    fork是懒惰导致trick 你看,fork没有一个参数,你没法创建一个新进程之前去设置这个新进程的任何参数,比如优先级等,因为fork调用前,什么都没有,连个新进程创建的计划都没有,然而一旦fork...fork写时复制带来的普通内存开销 父进程fork之后,子进程调用exec之前,如果父进程写了页面,那么将会发生写时复制,这种写时复制大多是 不必要的!...父进程中创建大量的常驻内存的页面,fork之后子进程exec之前,父进程写这些页面,将会造成这些页面被复制,这是一种明显的不必要的开销。...之后,exec之前的内存用量!...这个CLONEVM创建的子进程和CLONETHREAD创建的线程什么区别呢?这里不想赘述POSIX线程的定义,只提几点: CLONE_THREAD创建的线程exec时会释放调用进程的地址空间。

    4.9K50

    Kafka和RocketMQ底层存储之那些你不知道的事

    我们都知道 RocketMQ 和 Kafka 消息都是存在磁盘中的,那为什么消息存磁盘读写还可以这么快?有没有做了什么优化?都是存磁盘它们两者的实现之间什么区别么?各自有什么优缺点?...首先了解一下页缓存,页缓存是操作系统用来作为磁盘的一种缓存,减少磁盘的I/O操作。 写入磁盘的时候其实是写入页缓存中,使得磁盘的写入变成对内存的写入。...并且也不必再通过调用readwrite方法对文件进行读写,可以通过映射地址加偏移量的方式直接操作。 sendfile-零拷贝 既然消息是存在磁盘中的,那消费者来拉消息的时候就得从磁盘拿。...可以看到数据其实是冗余的,那我们来看看mmap之后的发送文件流程是怎样的。 可以看到上下文切换的次数没有变化,但是数据少拷贝一份,这和我们上文提到的mmap能达到的效果是一样的。...因为就一个系统调用就满足了发送的需求,相比 read + write 或者 mmap + write 上下文切换肯定是少了的,但是好像数据还是冗余啊。

    70141

    POSIX文件操作(二)

    基础知识 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一映关系。...实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。...具体它与一般I/O操作什么区别,可以参考: 从内核文件系统看文件读写过程 认真分析mmap:是什么 为什么 怎么用 使用范例 #include #include <stdio.h...mmap映射内存 buf[0]='6'; //解除内存映射(解除之前文件已被修改,但系统并不保证已修改同步完成,可以自行加死循环验证) if(munmap(buf,statbuf.st_size...所以随机写很多的情况下,mmap方式效率上不一定会比带缓冲区的一般写快. ---- 以上就是关于mmap的基本使用和一些基础知识,如有问题,欢迎指正。

    1.7K50

    Linux系统编程-进程间通信(mmap内存映射)

    内存映射mmap函数介绍 mmap函数可以将磁盘上的文件映射到内存空间中,返回映射的首地址。..., int flags,int fd, off_t offset); 函数功能: 用来将某个文件内容映射到内存中,该内存区域的存取即是直接文件内容的读写。...此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。 MAP_DENYWRITE 只允许对映射区域的写入操作,而不能对fd指向的文件进行读写,文件直接写入的操作将会被拒绝。...调用mmap()时必须要指定MAP_SHARED MAP_PRIVATE。 (5) 第五个参数fd为open()返回的文件描述词,代表欲映射到内存的文件。...案例代码: mmap用法示例(2) 下面代码的功能: 程序运行时,从命令行传入一个存在的文件路径进去,再调用open打开文件,再通过mmap映射文件地址,得到地址之后文件拷贝一串字符串数据进去。

    1.5K31

    MIT 6.S081 Lab Ten -- mmap

    MIT 6.S081课程前置基础参考: 基于RISC-V搭建操作系统系列 ---- mmap(hard) map和munmap系统调用允许UNIX程序其地址空间进行详细控制。...munmap调用可能只覆盖mmap区域的一部分,但您可以认为它取消映射的位置要么区域起始位置,要么区域结束位置,要么就是整个区域(但不会在区域中间“打洞”)。...也就是说,mmap不应该分配物理内存读取文件。相反,usertrap中(由usertrap调用)的页面错误处理代码中执行此操作,就像在lazy page allocation实验中一样。...---- 代码解析 本实验是实现一个内存映射文件的功能,将文件映射到内存中,从而在与文件交互时减少磁盘操作。 (1)....回忆lazy实验中,如果惰性分配的页面调用了uvmunmap,或者子进程fork调用uvmcopy复制了父进程惰性分配的页面都会导致panic,因此需要修改uvmunmap和uvmcopy检查PTE_V

    27630

    从内核世界透视 mmap 内存映射的本质(原理篇)

    笔者之前的文章《一步一图带你深入理解 Linux 虚拟内存管理》 中曾为大家详细介绍过进程虚拟内存空间的布局,进程虚拟内存空间的布局中,一段叫做文件映射与匿名映射区的虚拟内存区域,当我们在用户态应用程序中调用...下面这幅是多进程通过 mmap 共享文件映射之后的内核数据结构关系图: image.png 同私有文件映射方式一样,当多个进程调用 mmap 磁盘上的同一个文件进行共享文件映射的时候,内核中的处理都是一样的...子进程就不一样了,父进程调用mmap 之后,父进程的虚拟内存空间中已经了一段虚拟映射区 VMA 并关联到匿名文件了。...如果我们使用 mmap 系统调用的时候设置了 MAP_POPULATE ,内核分配完虚拟内存之后,就会马上分配物理内存,并在进程页表中建立起虚拟内存与物理内存的映射关系,这样进程调用 mmap 之后就可以直接访问这段映射的虚拟内存地址了...所以我们使用 mmap 系统调用 hugetlbfs 下的文件进行大页映射之前,首先需要做的事情就是系统中挂载 hugetlbfs 文件系统到指定的路径下。

    4.4K67

    RocketMQ为什么这么快?我从源码中扒出了10大原因!

    接下来,我将从以下10个方面来探讨一下RocketMQ这么快的背后原因 如果你RocketMQ还不了解,可以从公众号后台菜单栏中查看我之前写的关于RocketMQ的几篇文章 如果你RocketMQ源码也感兴趣...RocketMQ为了保证磁盘文件的高性能读写,使用到了一个叫零拷贝的技术 1、传统IO读写方式 说零拷贝之前,先说一下传统的IO读写方式。...实现零拷贝的以下两种方式: mmap() sendfile() mmap() mmap(memory map)是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一映关系...,就是通过mmap技术来实现高效的文件读写 RocketMQ中使用mmap代码 虽然前面一直说mmap不涉及CPU拷贝,但在某些特定场景下,尤其是写操作特定的系统优化策略下,还是可能涉及CPU拷贝。...sendfile()将一个文件内容传输到另一个文件中或者是网络中 sendfile()整个过程中是无法对文件内容进行修改的,如果想修改之后再传输,可以通过mmap来修改内容之后再传输 上面出现的API

    38410
    领券