社区
C++ 语言
帖子详情
内存映射文件与命名管道的速度谁快
vegascsu
2012-06-21 10:32:25
我有两个进程,需要进行进程间通信,采用请求/响应的机制。
由于请求/响应的次数,1秒内估计有1万次,现在用的是命名管道,发现速度不行。当然这个时间也跟另一个进程的数据处理时间有关。请问有没有更快的方式,比如内存映射文件是不是更快呢。
...全文
449
11
打赏
收藏
内存映射文件与命名管道的速度谁快
我有两个进程,需要进行进程间通信,采用请求/响应的机制。 由于请求/响应的次数,1秒内估计有1万次,现在用的是命名管道,发现速度不行。当然这个时间也跟另一个进程的数据处理时间有关。请问有没有更快的方式,比如内存映射文件是不是更快呢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pathuang68
2012-06-21
打赏
举报
回复
[Quote=引用 7 楼 的回复:]
响应方确实具有多个线程,估计最大时会有60个线程,我现在是直接用CreateThread来创建线程的。请问这种方法,是不是较慢。是不是你说的线程池会快一些呢。
另外消息队列你是指通信上用消息队列吗?
我试了一下,主要时间浪费在响应方的数据处理上,通信时间很少,数据处理上时间的增加,主要是加入了线程同步,我用的是临界区。不用线程同步,程序就会异常,请问有没有好的解决方案
引用 3 楼……
[/Quote]
1. 就用线程池吧。线程频繁的创建和销毁会需要很多时间,线程池可以避免这个消耗。
2. 你开了60个线程是否太多了?由于线程太多做造成线程同步的消耗也不容小视,还有你的机器上估计也没有60个CPU内核吧?这样密集的运算开再多的线程意义也不大,反而会降低处理速度。
赵4老师
2012-06-21
打赏
举报
回复
共享内存+锁
vegascsu
2012-06-21
打赏
举报
回复
响应方确实具有多个线程,估计最大时会有60个线程,我现在是直接用CreateThread来创建线程的。请问这种方法,是不是较慢。是不是你说的线程池会快一些呢。
另外消息队列你是指通信上用消息队列吗?
我试了一下,主要时间浪费在响应方的数据处理上,通信时间很少,数据处理上时间的增加,主要是加入了线程同步,我用的是临界区。不用线程同步,程序就会异常,请问有没有好的解决方案
[Quote=引用 3 楼 的回复:]
并发处理看行不行啊,
响应方用线程池来处理~~
看消息队列行不?
[/Quote]
vegascsu
2012-06-21
打赏
举报
回复
[Quote=引用 5 楼 的回复:]
那用共享内存吧, 申请个500M的, 里面建个环形队列, 做一个进程共享mutex+cond, 做lock+cond_wait+cond_brodcast支持多进程并发写多进程并发读,保证无死锁。
[/Quote]
我测了一下,好像确实不是通信的时间问题,主要是我内部数据处理的时间造成的。
由于内部数据处理所在的那个进程,有多个线程,我用的是临界区的线程同步方法,所以造成时间较慢。
你说的这种方法,有没有详细的介绍,或者推荐一下资料看看呀
qq120848369
2012-06-21
打赏
举报
回复
那用共享内存吧, 申请个500M的, 里面建个环形队列, 做一个进程共享mutex+cond, 做lock+cond_wait+cond_brodcast支持多进程并发写多进程并发读,保证无死锁。
pathuang68
2012-06-21
打赏
举报
回复
应该不会更快。内存映射文件通常的目的:用操作内存的方式,操作磁盘文件的,尤其是是针对文件比较大的时候。
直接用共享内存试试吧,如果还不行估计常规的办法就木有了。
jody_go
2012-06-21
打赏
举报
回复
并发处理看行不行啊,
响应方用线程池来处理~~
看消息队列行不?
luciferisnotsatan
2012-06-21
打赏
举报
回复
自己测一下不就清楚了
龙哥依旧
2012-06-21
打赏
举报
回复
just try it !
jackyjkchen
2012-06-21
打赏
举报
回复
命名管道走网络协议栈,速度应该慢些
内存映射擅长随机操作文件,能大大降低操作复杂度,顺序操作的话(不用seek跳来跳去),普通I/O也不麻烦,只是相当于多一层缓冲,效率略低
线程是太多了,尽量用线程池
qq120848369
2012-06-21
打赏
举报
回复
[Quote=引用 7 楼 的回复:]
响应方确实具有多个线程,估计最大时会有60个线程,我现在是直接用CreateThread来创建线程的。请问这种方法,是不是较慢。是不是你说的线程池会快一些呢。
另外消息队列你是指通信上用消息队列吗?
我试了一下,主要时间浪费在响应方的数据处理上,通信时间很少,数据处理上时间的增加,主要是加入了线程同步,我用的是临界区。不用线程同步,程序就会异常,请问有没有好的解决方案
引用 3 楼……
[/Quote]
响应速度慢造成的队列阻塞必须多线程/多进程并发, 没什么好考虑的.
如果你考虑内存已经承载不了那么大的排队阻塞了, 可以考虑使用开源消息队列, 保证不会因为内存耗尽崩掉, 并且可以持久化避免数据丢失.
Linux内核源代码情景分析 (上下册 高清非扫描 )
本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章
文件
系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与
文件
安全性 5.4
文件
系统的安装和拆卸 5.5
文件
的打开与关闭 5.6
文件
的写与读 5.7 其他
文件
操作 5.8 特殊
文件
系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2
管道
和系统调用pipe() 6.3
命名
管道
6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数sys—listen()——设定server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备
文件
系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构中的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构中的中断机制 9.5SMP结构中的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶段) 10.3系统初始化(第二阶段) 10.4系统初始化(第三阶段) 10.5系统的关闭和重引导
使用
内存映射
文件
在进程间共享数据
Windows提供了多种机制允许进程之间能够共享数据。比如,WM_COPYDATA消息,剪贴板,邮件槽(mailslot),
管道
(pipe),套接字(socket)等。在同一台机器上共享数据库最底层的机制就是
内存映射
文件
。 使用
内存映射
文件
的步骤如下: 1. 创建或打开一个
文件
内核对象,该对象标识了要用作
内存映射
文件
的那个磁盘
文件
(CreateFile) 2. 创建一
【linux开发】进程间通信
命名
管道
-共享内存-
内存映射
-消息队列-信号量
进程间通信
命名
管道
-共享内存-
内存映射
-消息队列-信号量 在Unix平台上,建立
命名
管道
是创建了一个fifo
文件
,和在shell下面用mkfifo命令的效果是一样的。看起来这个
管道
文件
就是一个普通的
文件
系统瓜挂载点,但是它只不过是作为一个名称存在,实际的内容是一块系统管理的共享内存。这个fifo
文件
读写端同时处于open状态,才能进行通信。否则,一端open的话,会处于阻塞状态。下面两个例子程
温故之.NET进程间通信——
内存映射
文件
上一篇技术文章中,我们讲解了进程间通信中的
管道
通信方式,这只是多种进程间通信方式中的一种,这篇文章我们回顾一下另一种进程间通信的方式——
内存映射
文件
。
管道
、
命名
管道
、信号、消息队列、共享内存、
内存映射
、信号量、套接字(Python)
(1)
管道
(Pipe):
管道
可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。 (2)
命名
管道
(named pipe):
命名
管道
克服了
管道
没有名字的限制,因此,除具有
管道
所具有的功能外,它还允许无亲缘关 系 进程间的通信。
命名
管道
在
文件
系统中有对应的
文件
名。
命名
管道
通过命令mkfifo或系统调用mkfifo来创建。 (3)信号(Signal):信号是比较...
C++ 语言
64,643
社区成员
250,474
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章