解析 mmap 系统调用的所有的标志位
当调用 mmap 系统调用时,可以提供一组标志,来控制内存映射行为。以下是相关标志位的解析:
MAP_SHARED:将内存映射设置为共享。这意味着对映射区域的修改会影响到所有共享这个映射区域的进程。这个标志在多进程间通过内存共享进行通信时非常有用。
MAP_PRIVATE:将内存映射设置为私有。这意味着对映射区域的修改只会影响到当前进程的私有映射。在多个进程之间不会共享这些修改。这可以用于将一个文件映射到多个进程的地址空间中,但每个进程都可以独立地修改它们自己的版本。
MAP_ANONYMOUS:创建一个匿名映射。在这种情况下,内存中的数据不与文件系统中的文件相关联,而是由内核分配和管理,且该数据从未写入过磁盘。这种映射通常用于分配一些共享内存。
MAP_FIXED:允许映射文件或内存区域的指定地址处。如果在指定的地址范围内已经有映射,则 mmap 调用将失败。使用这个标志允许程序在一个固定的位置分配内存。
MAP_GROWSDOWN:允许堆栈向下扩展。这个标志通常在写入内核栈时使用。
MAP_LOCKED:将映射区域置于内存中。这能够将内存页锁定在 RAM 中,以避免将其交换出去。这个标志要求进程有足够的特权以便实现该行为。
MAP_NONBLOCK:如果没有足够的空闲内存页以满足映射请求,这个标志将导致 mmap 调用失败而不是等待直到内存页变得可用。
MAP_NORESERVE:仅仅是通知内核预留内存空间,而不是分配实际的物理内存。在 Linux 系统中,这种情况可能导致由于内存锁定的内存不够,而导致系统崩溃的风险比较大。
MAP_POPULATE:预读映射的页面,这样在之后读取这个区域的时候可以高效得多。在整个映射区域内进行读取操作会导致进程暂停,但这个标志能够防止暂停。
以上是 mmap 系统调用的不同标志的作用和解释。
相关技术视频教程:https://ke.qq.com/course/417774?flowToken=1013300
c/c++后端技术交流群:812855908
评论