什么是理想&内核和用户空间之间通信的最快方式?

时间:2009-06-02 22:36:05

标签: linux linux-kernel

我知道通过内核和用户空间程序之间的以下接口可以实现信息交换

  • 系统调用

  • 读写控制

  • / proc& / SYS

  • 网络链路

我想找出

  • 如果我错过了其他任何界面?

  • 其中哪一种是交换大量数据的最快方式? (如果有任何文件/邮件/解释支持我可以参考的这种说法)

  • 哪一个推荐方式进行通信? (我认为它的netlink,但仍然希望听到意见)

6 个答案:

答案 0 :(得分:7)

交换大量数据的最快方法是内存映射。可以在设备文件上使用mmap调用,然后相应的内核驱动程序可以决定将内核内存映射到用户地址空间。一个很好的例子是Video For Linux驱动程序,我想帧缓冲驱动程序的工作方式相同。有关V4L2驱动程序如何工作的详细说明,您有:

你无法击败大量数据的内存映射,因为没有涉及操作的memcopy,物理底层内存在内核和用户空间之间有效共享。当然,就像在所有共享内存机制中一样,您必须提供一些同步,以便内核和用户空间不会认为它们同时具有所有权。

答案 1 :(得分:6)

内核和使用空间之间的共享内存是可行的。

http://kerneltrap.org/node/14326

有关说明/示例。

你也可以使用非常快的命名管道

这一切真的取决于您共享的数据,是否同时访问以及数据结构如何。对简单数据进行调用可能就足够了。

Linux kernel /proc FIFO/pipe

也可以提供帮助

祝你好运

答案 2 :(得分:5)

你也可以考虑接力(以前称为relayfs):

“基本上,relayfs只是一堆per-cpu内核缓冲区,可以从内核代码中有效地写入。这些缓冲区表示为可以mmap的文件,并直接从用户空间读取。目的是setup是提供最简单的机制,允许在内核中记录大量数据并“转发”到用户空间。“

http://relayfs.sourceforge.net/

答案 3 :(得分:2)

显然你可以使用copy_from_user等共享内存,你可以轻松设置一个字符设备驱动程序,基本上所有你要做的就是创建一个file_operation结构,但这是迄今为止最快的方法。 我没有基准,但现代系统上的系统调用应该是最快的。我的理由是它最优化的是什么。它曾经是来自用户 - >内核必须创建一个中断,然后进入中断表(一个数组),然后找到中断处理(0x80),然后进入内核模式。这真的很慢,然后是.sysenter指令,它基本上使这个过程非常快。没有详细说明,.sysenter立即读取注册表CS:EIP并且变化非常快。 相反,共享存储器需要写入和读取存储器,这比从寄存器读取要贵得多。

答案 4 :(得分:1)

这是所有可能接口的可能编译,尽管在某些方面它们彼此重叠(例如,套接字和系统调用都有效地使用系统调用):

Procfs
Sysfs
Configfs
Debugfs
Sysctl
devfs (eg, Character Devices) 
TCP/UDP Sockets
Netlink Sockets 
Ioctl
Kernel System Calls
Signals
Mmap

答案 5 :(得分:1)

对于共享内存,我发现即使使用NUMA,在两个不同内核上运行的两个线程也要通过共享内存进行通信,仍然需要从L3缓存中进行写/读,如果幸运的话(在一个插槽中) 大约比syscall慢2倍,如果(不在一个套接字上),则慢5倍 比syscall慢,我认为syscall的硬件机制有所帮助。