Articles of 内存映射文件

为什么C中的全局数组(初始化)不能完全算作PSS

envirenment:gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1〜14.04)3.16.0-30-generic#40〜14.04.1-Ubuntu SMP Thu Jan 15 17:45:15 UTC 2015 i686 i686 i686 GNU C代码a2.c:有一个40MB的全局数组,每个项目都被分配。 int b[10000000];//40M global array void main() { int i = 0; for(i = 0; i<10000000; i++) {b[i]=i;} while(1); } 我build立像gcc -o a2 a2.c 当我运行这个代码,看到smap文件cat /proc/25739/smaps ,内容如下 08048000-08049000 r-xp 00000000 08:11 46930087 /home/jzd/test/a2 Size: 4 kB Rss: 4 kB Pss: 4 kB […]

msync()写入文件只改变了页面或整个caching的缓冲区?

我在Linux中使用POSIX函数mmap() 。 但是,当我做msync() ,然后写caching的缓冲区到一个文件完全,或者某种程度上它被指出哪些页面已经改变,哪些没有,写入文件只改变 – 即msync()写入文件只改变页面或caching的缓冲区? 假设我们使用mmap()来处理1GB的文件,那么将其全部读取,即通过在整个文件的内存中引发大量的页面错误。 然后我们只改变了一个字节,并调用了msync() ,那么它将开始将整个1GBlogging到一个文件中,或者以某种方式确定您想要更改的页面,并且只保留它,以及如何定义 – 它是如何实现的? ?

使用boost :: iostreams :: mapped_file

我很新的内存映射,并试图理解内存映射文件,以在我的项目(基于Linux)使用它们。 我的要求是写,然后从内存映射文件读取。 我写了一个示例程序,只写和它工作正常,但我有一些非常基本的怀疑,因为我不明白这个内存映射的基础正确。 #include <unordered_map> #include <boost/iostreams/device/mapped_file.hpp> using namespace boost::interprocess; using namespace std; typedef unordered_map<int, string> work; int main() { boost::iostreams::mapped_file_params params; params.path = "map.dat"; params.new_file_size = 100; params.mode = (std::ios_base::out | std::ios_base::in); boost::iostreams::mapped_file mf; mf.open(params); work w1; w1[0] = "abcd"; w1[1] = "bcde"; w1[2] = "cdef"; work* w = static_cast<work*>((void*)mf.data()); *w = w1; mf.close(); […]

处理离开ProcessMapFile可用于进程B.

被谷歌search,但无法find答案。 之前没有使用过MemoryMappedFile 。 刚刚阅读了他们,以实现基本的IPC。 在我投入时间原型之前,谁能告诉我下面的逻辑是否可行? 我想要使​​用一个非持久化的内存映射文件,以便在使用后自动清理。 进程A打开MemoryMappedFile并写入它。 进程A启动进程B 过程A退出 进程B在进程A创build的MemoryMappedFile上执行OpenExisting 进程B从MemoryMappedFile读取数据并进行处理… 进程A和B都将知道文件的名称。 进程A创build的文件是否会保留,直到进程B处理完毕? 什么是机制,应该处理A不Dispose文件,并让stream程B这样做? 如果这个逻辑不起作用,那么我正在考虑进程A等待进程B完成,但这并不理想。 感谢任何的光芒;)

复制保存在内存映射文件中的数组的一部分

我有一个存储在内存映射文件中的双精度数组,我想读取数组的最后3个条目(或一些任意的条目)。 可以将存储在MMF中的整个数组复制到辅助数组中: void ReadDataArrayToMMF(double* dataArray, int arrayLength, LPCTSTR* pBufPTR) { CopyMemory(dataArray, (PVOID)*pBufPTR, sizeof(double)*arrayLength); } 并使用所需的条目,但这意味着将整个数组复制为实际需要的几个值。 我可以缩小arrayLength到一些数字n为了得到前n条目,但我有问题,复制一部分不是从第一个条目开始的数组。 我试着玩pBufPTR指针,但只能得到运行时错误。 任何想法如何从数组中间访问/复制内存,而不需要复制整个数组?

跨进程内存障碍

我正在使用内存映射文件进行跨进程数据共享。 我有两个进程,一个写入数据块和一个或多个读取这些块的其他进程。 为了让读者知道一个块是否准备好了,我正在写两个“标签”值,一个在开始,一个在每个块的末尾,表示已经准备就绪。 它看起来像这样: 注:在这个例子中,我不包括读者进程可以寻求到前面的块的事实。 static const int32_t START_TAG = 0xFAFAFAFA; static const int32_t END_TAG = 0x06060606; void writer_process(int32_t* memory_mapped_file_ptr) { auto ptr = memory_mapped_file_ptr; while (true) { std::vector<int32_t> chunk = generate_chunk(); std::copy(ptr + 2, chunk.begin(), chunk.end()); // We are done writing. Write the tags. *ptr = START_TAG; ptr += 1; *ptr = chunk.size(); ptr […]

只写存储器映射在升压?

为什么不提升进程间支持只写内存映射? 也许我错过了一些东西,但是不要写只写映射比读/写映射快得多,因为操作系统不必从磁盘读取页面,只是将页面从内存中清除到磁盘? 此外,它将有完全非阻塞的好处(除了冲洗和破坏)。 从升压切换到本地操作系统内存映射,我会受益吗?

如何使用Linux hugetlbfs共享文件的内存映射?

我有一个程序使用mmap和共享内存来有效地访问大型数据库文件。 我想用大页面来试验,看看它是否能够加快速度。 我认为一个简单快捷的方法是将数据库文件复制到Linux的hugetlbfs目录中,并在旧位置创build一个符号链接。 但是,这不起作用,因为cp命令不能写入文件。 我怀疑只能通过调用ftrunc和mmap来写入文件才能创build文件。 我可能会尝试写一个这样做的复制工具,除非我得到一个描述现有工具的答案。 我正在寻找任何其他好的方法来在Linux中使用大页面来共享内存映射。

将DMA缓冲区写入内存映射文件

我需要在embedded式Linux(2.6.37)中尽可能快地将input的DMA缓冲区作为原始设备/ dev / sda1写入HD分区。 缓冲区按需要alignment,长度相等,为512KB。 这个过程可能会持续很长一段时间,比如256GB的数据。 我需要使用内存映射文件技术(O_DIRECT不适用),但不能理解如何做到这一点的确切方式。 所以,在伪代码“正常”写作: fd=open(/dev/sda1",O_WRONLY); while(1) { p = GetVirtualPointerToNewBuffer(); if (InputStopped()) break; write(fd, p, BLOCK512KB); } 现在,我将非常感谢如何利用内存映射技术来编写这个类似的伪/实际代码示例。 UPDATE2:感谢kestasx最新的工作testing代码如下所示: #define TSIZE (64*KB) void* TBuf; int main(int argc, char **argv) { int fdi=open("input.dat", O_RDONLY); //int fdo=open("/dev/sdb2", O_RDWR); int fdo=open("output.dat", O_RDWR); int i, offs=0; void* addr; i = posix_memalign(&TBuf, TSIZE, TSIZE); if ((fdo […]

在Linux上升压内存映射文件归零

我正在重新学习C ++,我需要使用内存映射文件。 我决定使用提升(因为它似乎是坚实的图书馆)。 我创build了一个内存映射文件映射到一个双精度数组,并写在这个数组中的第一个double。 在磁盘上的文件包含前四个字节的一些数据,其余的这个被清零,这对我来说是好奇的,一般来说,如果我得到一个C ++的指针到内存位置,在大多数情况下,我必须假设它包含垃圾。 我有保证新创build的内存映射文件将被清零(至less在Linux上)? 我没有find任何参考。 BOOST_AUTO_TEST_CASE(OpenMMapFile){ boost::iostreams::mapped_file file; boost::iostreams::mapped_file_params params; params.path = "/tmp/mmaptest-1"; params.mode = std::ios::in | std::ios::out; params.new_file_size = 10*sizeof(double); file.open(params); double* data = static_cast<double*>((void*)file.data()); data[0] = 12; file.close(); } 这里是文件内容: cat /tmp/mmaptest-1 | base64 AAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA = 编辑 正如@Zan指出的— boost实际上使用ftruncate来调整mmaped文件的大小,所以保证调零(至less在Linux上)。