【发布时间】:2017-06-20 18:14:59
【问题描述】:
我正在尝试在用户和内核空间之间构建两个共享队列(一个命令队列和一个回复队列)。这样内核可以向用户空间发送消息,用户空间可以在内核完成处理后向内核发送回复。
我所做的是使用分配内核内存页面(用于队列)和 mmap 到用户空间,现在用户和内核端都可以访问这些页面(这里我的意思是可以正确读取内核空间中写入的内容用户空间,反之亦然)。
问题是我不知道如何同步内核和用户空间之间的访问。假设我要为多生产者 1 消费者方案构建一个环形缓冲区,如何让这些环形缓冲区访问不会被同时写入破坏?
这周我做了一些研究,这里有一些可能的方法,但我在内核模块开发方面还很陌生,不确定它是否有效。在挖掘它们的同时,如果我能得到任何 cmet 或建议,我会很高兴:
-
在用户/内核空间之间使用共享信号量: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
- 文档/trace/ring-buffer-design.txt
这里记录了如何实现无锁:https://lwn.net/Articles/340400/
但是,我假设这些是内核实现,不能直接在用户空间中使用(如 ring_buffer_benchmark.c 中的示例)。有什么办法可以在用户空间中重用这些方案?也希望我能找到更多的例子。
-
同样在那篇文章(lwn 40072)中,提到了一种使用 perf 工具的替代方法,这似乎与我正在尝试做的类似。如果 2 不起作用,我会尝试这种方法。
因此,用户空间性能工具与 内核通过在共享内存区域中读写而不使用系统 来电。
对不起英语语法...希望它有意义。
【问题讨论】:
标签: linux-kernel locking mmap producer-consumer critical-section