问题标签 [mmap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mmap - mmap() 内部结构
众所周知,mmap() 最重要的特性是文件映射在许多进程之间共享。但众所周知,每个进程都有自己的地址空间。
问题是内存映射文件(更具体地说,它的数据)真正保存在哪里,以及进程如何访问该内存?我的意思不是 *(pa+i) 和其他高级别的东西,而是指流程的内部。
solaris - mmap 会使用连续内存吗?(在太阳能系统上)
我使用 mmap(只是想了解 mmap 的工作原理)分配 96k 匿名内存,但看起来它将 96k 拆分为 64k 和 32k。但是当分配 960k 时,它只分配一个大小为 960k 的块。solaris 什么时候将 allocate mem 分成几部分?代码:
桁架:
地图:
java - FileChannel#map的内存使用情况
FileChannel#map
是立即分配结果所需的所有内存ByteBuffer
,还是仅在从缓冲区读取期间按需分配?
我刚刚尝试在一个简单的测试程序中映射所有 500+ MB 的文件,并查看了进程的内存使用情况。(Runtime#totalMemory
在 OS X 活动监视器中同时使用并在 groovysh 进程中观察它。)内存使用量从未超过 30-ish MB。
那么,Java 实现是否可以在本机调用中“隐藏”一些内存使用情况?如果是这样,有没有办法找出 OS X 上有多少?
solaris - mmap 会使用用户 cpu 而不是整个 sys cpu 吗?(太阳能)
在使用 mmap 分配一些匿名 mem 时,我们通常将起始地址设置为 0/null,因此 mmap 会自行计算起始地址。为了获得起始地址,它会在整个虚拟内存空间中找到一个可以分配内存卡盘的孔。我想这是作为用户 cpu 而不是 sys cpu 计算的。如果虚拟内存是碎片化的,那么找起始地址的时候会占用更多的用户cpu,我的理解是否正确
c++ - Shmem vs tmpfs vs mmap
有人知道以下三个在速度方面的比较:
共享内存
tmpfs (/dev/shm)
映射 (/dev/shm)
谢谢!
mmap - mmap 大端与小端
如果我用mmap
写uint32_t
's,我会遇到大端/小端约定的问题吗?特别是,如果我mmap
在大端机器上写入一些数据,当我尝试在小端机器上读取这些数据时会遇到问题吗?
linux - Linux/perl mmap 性能
我正在尝试使用 mmap 优化对大型数据集的处理。数据集在千兆字节范围内。这个想法是将整个文件映射到内存中,允许多个进程同时处理数据集(只读)。它没有按预期工作。
作为一个简单的测试,我只是简单地映射文件(使用 perl 的 Sys::Mmap 模块,使用我认为直接映射到底层 C 函数的“mmap”子)并让进程休眠。执行此操作时,代码在从 mmap 调用返回之前会花费超过一分钟,尽管此测试没有执行任何操作 - 甚至没有读取 mmap 文件。
猜猜,我虽然也许 linux 需要在第一次映射时读取整个文件,所以在文件在第一个进程中映射后(当它处于睡眠状态时),我在另一个进程中调用了一个简单的测试来尝试读取文件的前几兆字节。
令人惊讶的是,似乎第二个过程在从 mmap 调用返回之前也花费了很多时间,与第一次对文件进行 mmap 处理的时间大致相同。
我确保正在使用 MAP_SHARED 并且第一次映射文件的进程仍然处于活动状态(它没有终止,并且 mmap 没有被取消映射)。
我希望一个 mmaped 文件允许我让多个工作进程有效地随机访问大文件,但如果每个 mmap 调用都需要先读取整个文件,那就有点困难了。我没有测试过使用长时间运行的进程来查看第一次延迟后访问是否很快,但我希望使用 MAP_SHARED 并且另一个单独的进程就足够了。
我的理论是 mmap 或多或少会立即返回,并且 linux 会或多或少按需加载块,但我看到的行为是相反的,表明它需要在每次调用 mmap 时读取整个文件。
知道我做错了什么,或者我完全误解了 mmap 应该如何工作?
linux - 如何在 Linux 上为 clone() 系统调用映射堆栈?
Linux 上的 clone() 系统调用采用指向堆栈的参数,以供新创建的线程使用。这样做的明显方法是简单地 malloc 一些空间并传递它,但是您必须确保您已经 malloc 了与该线程将使用的一样多的堆栈空间(难以预测)。
我记得在使用 pthreads 时我不必这样做,所以我很好奇它做了什么。我遇到了这个站点,它解释说:“Linux pthreads 实现使用的最佳解决方案是使用 mmap 分配内存,并使用标志指定在使用时分配的内存区域。这样,内存分配给堆栈,如果系统无法分配额外的内存,则会发生分段冲突。”
我听说过使用 mmap 的唯一上下文是将文件映射到内存中,并且确实读取 mmap 手册页它需要一个文件描述符。这如何用于分配动态长度堆栈以提供给 clone()?那个网站疯了吗?;)
在任何一种情况下,内核是否都不需要知道如何为新堆栈找到一堆空闲的内存,因为这是用户启动新进程时它必须一直做的事情?如果内核已经可以解决这个问题,为什么还需要首先指定堆栈指针?
c - Linux mmap() 错误
我有一个内存映射文件,我希望从中解析缓冲区的内容。mmap() 返回成功,我可以使用 fprintf 成功将缓冲区内容打印到文件中。但是,当我尝试直接在程序中将缓冲区作为数组访问时,会出现分段错误。为什么会这样?这是代码:
c - 映射大文件(用于持久性大数组)
我正在通过 mmap 实现持久的大型常量数组。使用 mmap 时是否有任何提示和技巧或注意事项?