Tag: mmap

共享内存或mmap – Linux C / C ++ IPC

上下文是进程间通信,其中一个进程(“服务器”)必须将固定大小的结构发送到在同一台机器上运行的许多侦听进程(“客户端”)。 在Socket Programming中我很自在。 为了更快地在服务器和客户端之间进行通信并减少副本数量,我想尝试使用共享内存(shm)或mmaps。 操作系统是RHEL 64位。 由于我是新手,请建议我应该使用哪个。 如果有人能指点我一本书或在线资源来学习同样的东西,我会很感激。 谢谢你的回答。 我想补充一点,服务器(市场数据服务器)通常会接收多播数据,这将导致它每秒向“客户端”“发送”大约200,000个结构,其中每个结构大约为100字节。 shm_open / mmap的实现是否仅对大型数据块或大量小型结构的性能优于套接字?

mmap()vs read()

我正在用C编写批量ID3标签编辑器.ID3标签通常位于mp3编码文件的开头,尽管旧的(版本1)标签在最后。 该应用程序旨在接受命令行中的目录和帧ID列表,然后递归目录结构,更新它找到的所有ID3标记。 用户可另外选择删除所有旧(版本1)标签。 另一种选择是简单地显示当前标签,而不执行更新。 该目录可能包含2个文件或200万个文件。 如果用户意味着更新文件,我打算将整个文件加载到内存中,执行更新,然后保存(文件也可以重命名)。 但是,如果用户仅表示打印当前的ID3标签,则加载整个文件似乎过多。 毕竟文件可能是200mb。 我已经阅读了这个线程,这是有见地的 – mmap()与阅读块 所以我的问题是,最有效的方法是什么 – read(),mmap()或某种组合? 欢迎设计理念。 TIA, 安德鲁 编辑:我的理解是mmap基本上委托将文件加载到内存中,并加载到虚拟内存子系统。 在我看来,VMM将在大多数系统上进行高度优化,因为它对系统性能至关重要。

使用mmap将文件读取到字符串

我正在尝试使用mmap将文件读取到字符串。 我跟随这个例子: http : //www.lemoda.net/c/mmap-example/index.html 我的代码看起来像这样 unsigned char *f; int size; int main(int argc, char const *argv[]) { struct stat s; const char * file_name = argv[1]; int fd = open (argv[1], O_RDONLY); /* Get the size of the file. */ int status = fstat (fd, & s); size = s.st_size; f = (char *) […]

mmap vs sbrk,性能比较

这些电话中的哪一个平均更快? 我听说mmap对于较小的分配来说速度更快,但我还没有听到过比较。 任何有关这些表现的信息都会很好。

mmap问题,分配大量内存

我得到了一些我需要解析的大文件,人们一直在推荐mmap,因为这样可以避免必须在整个内存中分配整个文件。 但是看看’top’看起来我确实打开整个文件进入内存,所以我觉得我一定做错了。 ‘顶级秀> 2.1演出’ 这是一个代码片段,显示了我正在做的事情。 谢谢 #include #include #include #include #include #include #include #include #include #include int main (int argc, char *argv[] ) { struct stat sb; char *p,*q; //open filedescriptor int fd = open (argv[1], O_RDONLY); //initialize a stat for getting the filesize if (fstat (fd, &sb) == -1) { perror (“fstat”); return 1; […]

如何使用仅手动同步到磁盘的mmap来获取检查点文件

我需要以最快的方式定期将文件与内存同步。 我想我想要的是有一个mmap’d文件,它只能手动同步到磁盘。 我不确定如何防止任何自动同步发生。 除非我手动指定,否则无法修改该文件。 关键是要有一个检查点文件,它将状态的快照保存在内存中。 我想尽可能避免复制,因为这需要相当频繁地调用,速度很重要。

为什么对mmap的内存进行未对齐访问有时会在AMD64上出现段错误?

我有这段代码在AMD64兼容CPU上运行Ubuntu 14.04时会出现段错误: #include #include #include int main() { uint32_t sum = 0; uint8_t *buffer = mmap(NULL, 1<<18, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); uint16_t *p = (buffer + 1); int i; for (i=0;i<14;++i) { //printf("%d\n", i); sum += p[i]; } return sum; } 如果使用mmap分配内存,则仅此段错误。 如果我使用malloc ,堆栈上的缓冲区或全局变量,它不会发生段错误。 如果我将循环的迭代次数减少到少于14的次数,则不再是段错误。 如果我从循环内打印数组索引,它也不再是段错误。 为什么未对齐的内存访问能够访问未对齐地址的CPU上的段错误,为什么只有在这种特定情况下呢?