kernel/user 地址 space 之间的共享无锁队列
shared lock-free queue between kernel/user address space
我正在尝试在用户和内核之间构建两个共享队列(一个命令队列和一个回复队列)space。这样内核就可以向用户space发送消息,用户space可以在完成处理后向内核发送回复。
我所做的是使用分配内核内存页面(用于队列)和 mmap 给用户 space,现在用户和内核端都可以访问这些页面(这里我的意思是写在内核中的内容space 可以在用户 space 中正确读取,反之亦然)。
问题是我不知道如何同步内核和用户之间的访问space。假设我要为多生产者 1 消费者方案构建一个环形缓冲区,如何使这些环形缓冲区访问不被同时写入破坏?
我这周做了一些研究,这里有一些可能的方法,但我在内核模块开发方面还很陌生,不确定它是否有效。在深入研究的过程中,如果能得到任何意见或建议,我将非常高兴:
在 user/kernel space 之间使用共享信号量:Shared semaphore between user and kernel spaces
但是会用到很多像sem_timedwait()这样的系统调用,我很担心效率如何。
我真正喜欢的是无锁方案,如https://lwn.net/Articles/400702/中所述。内核树中的相关文件是:
- kernel/trace/ring_buffer_benchmark.c
- kernel/trace/ring_buffer.c
- Documentation/trace/ring-buffer-design.txt
这里记录了如何实现无锁:https://lwn.net/Articles/340400/
不过,我假设这些是内核实现,不能直接在用户space中使用(如ring_buffer_benchmark.c中的示例)。有什么办法可以在用户 space 中重用这些方案吗?也希望能找到更多的例子。
在那篇文章 (lwn 40072) 中,还提到了一种使用 perf 工具的替代方法,这似乎与我正在尝试做的类似。如果 2 不起作用,我会尝试这种方法。
The user-space perf tool therefore interacts with the
kernel through reads and writes in a shared memory region without using system
calls.
抱歉英语语法...希望它有意义。
要在内核和用户之间同步 space,您可以使用 curcular 缓冲区 机制(文档位于 Documentation/circular-buffers.txt)。
这种缓冲区的关键因素是两个指针(头和尾),它们可以分别更新,非常适合分离的用户和内核代码。另外,循环缓冲区的实现非常简单,所以在用户space.
中实现起来并不难
请注意,对于内核中的多个生产者,您需要使用自旋锁或类似方法来同步它们。
我正在尝试在用户和内核之间构建两个共享队列(一个命令队列和一个回复队列)space。这样内核就可以向用户space发送消息,用户space可以在完成处理后向内核发送回复。
我所做的是使用分配内核内存页面(用于队列)和 mmap 给用户 space,现在用户和内核端都可以访问这些页面(这里我的意思是写在内核中的内容space 可以在用户 space 中正确读取,反之亦然)。
问题是我不知道如何同步内核和用户之间的访问space。假设我要为多生产者 1 消费者方案构建一个环形缓冲区,如何使这些环形缓冲区访问不被同时写入破坏?
我这周做了一些研究,这里有一些可能的方法,但我在内核模块开发方面还很陌生,不确定它是否有效。在深入研究的过程中,如果能得到任何意见或建议,我将非常高兴:
在 user/kernel space 之间使用共享信号量:Shared semaphore between user and kernel spaces
但是会用到很多像sem_timedwait()这样的系统调用,我很担心效率如何。
我真正喜欢的是无锁方案,如https://lwn.net/Articles/400702/中所述。内核树中的相关文件是:
- kernel/trace/ring_buffer_benchmark.c
- kernel/trace/ring_buffer.c
- Documentation/trace/ring-buffer-design.txt
这里记录了如何实现无锁:https://lwn.net/Articles/340400/
不过,我假设这些是内核实现,不能直接在用户space中使用(如ring_buffer_benchmark.c中的示例)。有什么办法可以在用户 space 中重用这些方案吗?也希望能找到更多的例子。
在那篇文章 (lwn 40072) 中,还提到了一种使用 perf 工具的替代方法,这似乎与我正在尝试做的类似。如果 2 不起作用,我会尝试这种方法。
The user-space perf tool therefore interacts with the kernel through reads and writes in a shared memory region without using system calls.
抱歉英语语法...希望它有意义。
要在内核和用户之间同步 space,您可以使用 curcular 缓冲区 机制(文档位于 Documentation/circular-buffers.txt)。
这种缓冲区的关键因素是两个指针(头和尾),它们可以分别更新,非常适合分离的用户和内核代码。另外,循环缓冲区的实现非常简单,所以在用户space.
中实现起来并不难请注意,对于内核中的多个生产者,您需要使用自旋锁或类似方法来同步它们。