如何在实时Linux中实现进程间通讯?

4
有很多关于如何编写RT-Linux实时代码的例子,但是这个发行版已经被弃用了很多年。目前,针对vanilla内核的PREEMPT_RT补丁正在积极开发中,但官方Wiki上只有很少的代码示例。首先让我介绍一下我的问题。
我正在编写一个包含两个程序的项目:
1. 字节码虚拟机 - 它必须作为实时应用程序运行 - 它有64 KB的I/O内存和64 KB的字节码。 2. 客户端程序 - 它将读取和写入I/O内存,启动/暂停虚拟机,加载新程序,设置参数等。它不必是实时的。
如何在这些进程之间进行通信,以使进程(1)保持实时性并避免页面错误或其他可能干扰实时应用程序的行为?
方法1. 仅使用线程
有两个线程:
- 具有最高优先级的虚拟机线程 - 具有普通优先级的客户端线程,用于与用户和虚拟机通信
两个线程都可以通过名称访问所有全局变量。我可以在每个机器周期后创建附加缓冲区以进行传入/传出数据。但是,如果客户端线程导致应用程序崩溃,则机器线程也将终止。实现远程访问也更加困难。
方法2. 共享内存
在旧的FSMLabs中,建议在进程之间使用共享全局内存。现代PREEMPT_RT的Wiki页面建议使用mmap()进行进程数据共享,但在同一篇文章中,它因页面错误而不建议使用mmap()。
方法3. 命名管道
这是一种更灵活的进程间通信方式。然而,我对在Linux上编程还很陌生。我们想在机器和客户端之间共享内存,但它也应该提供一种加载新程序(文件路径或程序代码),停止/启动机器等的方法。旧的FSMLabs RT-Linux实现了自己的FIFO队列(命名管道)。现代PREEMPT_RT没有。使用命名管道会破坏实时行为吗?如何正确地执行?我应该使用O_NONBLOCK标志读取数据,还是创建另一个线程来读取/写入管道中的数据?
您知道其他可以在一个进程必须是实时的情况下进行进程间通信的方法吗?也许我只需要线程。但是,请考虑连接到虚拟机进程的更多客户端的场景。

你正在寻找“进程间通信”这个术语。 - hek2mgl
1个回答

1

对于在同一主机操作系统上执行的进程之间交换数据,您还可以使用UNIX域套接字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接