说你是分裂单片Windows程序成可重用的组件,其可以互相使用某种形式的沟通进程间通信 (IPC),并且,无论是什么原因,你可以选择匿名管道(例如,启动多个进程-ES和在命令提示)|连接Console.Out到Console.In下一处理的,或只使用“”。
一个多布斯博士的文章用一个例子命名管道 :
什么是性能损失相比,在同一台机器内的其他IPC方法呢? 而这将是在进程数或数据量扩大传输时碰到的第一个问题吗?
例如,如果不是管我们正在使用的文件,我们会打锁定问题和磁盘速度。
请注意,不必连载传输的数据结构已经存在的开销,这是我的效率损失基线。
PS。 在管道的兴趣是因为它们很容易在每个过程中(到Console.ReadLine,Console.WriteLine)来实现,它很容易编写MSMQ和异步HTTP接口给他们,并为Unix的爱和命令行。
您可以使用CreatePipe双向匿名管道()Win32 API调用,所以管道输入/输出是不是唯一的方式。 您只需获得一个新的文件句柄,你可以给其他进程。
匿名管道是基于共享存储器,但不支持异步操作(通过ReadFileEx,ReadFileWrite)。 性能问题(缺点)因此是1)同步操作,2)存储复印,3)间同步。 一般地,“原始”共享存储器(存储器映射的文件,而无需实际的背衬文件)和命名管道会更快,而插座和窗口消息会比较慢(低于匿名管道)。
你不能使用匿名管道I / O完成端口(IOCP),而不是你要“人头”的管道,产生额外的上下文切换。 除了序列数据,序列化的数据必须在内存中复制的,因为你不能直接写入共享内存。 一个过程还必须等待另一个,这意味着其他方法具有以信号的进程间同步原语。 性能严重依赖于(读/写的比率调用达发送的数据)的消息的大小,因为对于每个读/写的过程中必须做出上下文切换和可能的自旋/睡眠。
除了“原始”共享存储器中的所有方法都需要存储器复制和某种进程间信令(同步),所以匿名管的主要缺点是同步操作。 发送大量邮件时,当CPU花费大部分时间做的上下文切换的你会碰到天花板。
性能方面,命名管道是更好,因为你可以使用异步通知IOCP工作线程(S)处理,甚至可以用一个呼叫收到多封邮件,从而降低了API的开销。 如果让自己的组件,从给定的名字来管额外的麻烦是非常值得的麻烦(你可以通过网络连接连)。 后来的Windows版本执行特殊路由本地插槽,也都支持IOCP。
最快的方法是直接使用共享内存,但随后你将不得不照顾间同步你自己的。 这有可能自己实现无锁管,但如果你没有不断地传输数据,您仍然可以使用同步原语来通知/唤醒听的过程中了。
另请注意,使用的文件并不意味着你会被磁盘速度的限制,因为你可以使用内存映射文件,甚至与普通文件,缓存管理器处理的读/写。 其他方法(RPC,剪贴板等)都是基于这些“标准”的方法,这意味着他们将只需添加协议的一些额外的层是为了更容易/更有帮助,或者更适合一些编程环境(但不是要快)。
文章来源: What are the main disadvantages of Windows pipes for inter-process communication?