- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个具有多个多线程进程的稍微复杂的软件。因为其中一个我需要实时功能(基本上是为了稳健性),所以我为 Xenomai 修补了我的目标内核,并使用 Xenomai 的 native 皮肤对其进行了编程。
现在我需要连接两个进程:一个运行实时任务,另一个运行简单的pthreads(后者编译时没有使用 Xenomai 的实时库/皮肤) .
我的问题是:我能以某种方式传达它们吗?例如,我是否可以创建一个共享内存对象 (shm_open
) 并共享互斥体,即使其中一个在 RT 环境中?
最佳答案
我建议你使用Xenomai原生API来创建命名管道,例如rt_pipe_create()
等。
您还可以使用一件事:消息队列。然而,我总是选择命名管道而不是消息队列。
共享内存和消息队列都可以用来在进程间交换信息。区别在于它们的使用方式。
共享内存正是您所想的那样:它是一个可以由多个进程读取和写入的存储区域。它不提供内在的同步;换句话说,由程序员来确保一个进程不会破坏另一个进程的数据。但它在吞吐量方面是高效的:读取和写入是相对较快的操作。
消息队列是一个单向管道:一个进程写入队列,另一个进程按写入顺序读取数据,直到出现数据结束条件。创建队列时,会设置消息大小(每条消息的字节数,通常相当小)和队列长度(待处理消息的最大数量)。访问比共享内存慢,因为每个读/写操作通常是一条消息。但是队列保证每个操作要么成功处理整个消息,要么在不改变队列的情况下失败。因此,写入者永远不会在仅写入部分消息后失败,而读取器要么检索到完整消息,要么什么也得不到。
本质上,管道——无论是命名的还是匿名的——都像消息传递一样使用。有人向收件人发送一条信息,收件人可以收到。共享内存更像是发布数据——有人将数据放在共享内存中,而读者(可能很多)必须使用同步,例如通过信号量了解有新数据的事实,并且必须知道如何读取内存区域以查找信息。
使用管道,同步很简单,并且内置于管道机制本身 - 当发生有趣的事情时,您的读取和写入将卡住和解冻应用程序。使用共享内存,可以更轻松地异步工作并偶尔检查一次新数据——但代价是代码要复杂得多。另外,您可以获得多对多的通信,但它又需要更多的工作。此外,由于上述原因,调试基于管道的通信比调试共享内存更容易。
一个小的区别是 fifos 在文件系统中是直接可见的,而共享内存区域需要特殊的工具,如 ipcs 来管理它们,以防你,例如,创建一个共享内存段,但您的应用程序死机并且不会自行清理(信号量和您可能需要与共享内存一起使用的许多其他同步机制也是如此)。
共享内存还可以让您更好地控制缓冲和资源使用 - 在操作系统允许的限制内,您可以决定分配多少内存以及如何使用它。使用管道,操作系统会自动控制一切,因此您再次失去了一些灵 active ,但减轻了很多工作。
最重要的几点总结:用于一对一通信的管道,更少的编码和让操作系统处理事情,多对多的共享内存,更多的手动控制,但代价是更多的工作和更努力调试
关于我可以从 Xenomai 实时任务访问非 RT 共享内存对象和互斥量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19842860/
是否可以编写一个控制台 EXE 应用程序,如“hello, world!”用于 Surface RT? 我以为编译ARM就可以了,但是好像没有这样的编译选项。 我安装了 Office 2013 RT
是否可以编写一个控制台 EXE 应用程序,如“hello, world!”用于 Surface RT? 我以为编译ARM就可以了,但是好像没有这样的编译选项。 我安装了 Office 2013 RT
我尝试在 Clojure 中尽可能快地进行复数数组的乘法运算。 选择的数据结构是两个元素的映射,:re 和 :im,每个元素都是原始 double 的 Java native 数组,用于低内存开销。
目录 1. Ubuntu Pro简介 2. Real-time Ubuntu 3. 订阅Ubuntu Pro 4.
我已经实现了流转换器。请注意,这只是一个练习(为了学习 Dart)。此转换器将整数转换为字符串。我给出下面的代码,你也可以在GitHub上找到它. // Conceptually, a transfo
我正在考虑在使用 RT-PREEMPT(使其实时)修补的 Linux 内核上将 ZeroMQ 设置为消息代理。 基本上我想发布/订阅使用谷歌 Protocol Buffer 序列化的短事件。 1. E
alt-rt.jar中的HashMap有什么区别和 rt.jar。我想我看到了相当大的加速在我的一个应用程序中,解释是什么? 最好的问候 P.S.: 我发现了两个不同的 *.jar在 JDK 1.6.
我知道Surface RT版本只能运行Windows Store应用程序。那么,我可以将自己的 Windows 应用商店应用部署到 Surface RT 并通过 Visual Studio 2012
在我将 Android Studio 更新到 3.0 并按照此 instruction 迁移了我的项目之后 我得到这样的错误: * What went wrong: Execution failed
当 jaxws-rt.jar 已经可用时,我不明白在 rt.jar 中使用 jax-ws 包的“内部”实现。为什么 Sun/Oracle 会做出这样的决定,将 jax-ws 集成到 jdk 中....
介绍 RT-Thread Studio是官方出品的一款专门针对RT-Thread嵌入式开发、部署、调试、测试的集成开发环境,它基于Eclipse开源项目开发,极大的提高了嵌入式开发者的开发效率,目前
在 .NET Web 应用程序的负载测试期间监视性能计数器时,一个名为“RT 检查时间百分比”的计数器不断超过默认临界阈值 10。 为什么花费大量时间进行运行时检查是不好的? 这对我们的应用程序有何影
我正在寻找支持 UML-RT 的建模工具,但我找不到。 我已经拥有 MS Visio (2010)、Power Designer (2008) 和 Rational Rose,但似乎它们都不包含 UM
rt linux 中的客户端和服务器通信。客户端发送数据,服务器接收数据。客户端和服务器之间使用UDP进行通信。当服务器(rt linux)从客户端接收到数据时,内核应该停止正在做的事情并开始执行新到
rt linux 中的客户端和服务器通信。客户端发送数据,服务器接收数据。客户端和服务器之间使用UDP进行通信。当服务器(rt linux)从客户端接收到数据时,内核应该停止正在做的事情并开始执行新到
我正在尝试在我的应用程序中对某些帧进行双重缓冲。但是,双缓冲要求我根据我试图保留额外数据 block 的区域更改 Texture2D 大小。 为双缓冲区的每个区域请求一个新的 CreateTextur
我正在学习如何使用 RT 计时器创建周期性事件。我尝试使用这个基于 timer_create 文档示例的示例。 预期的行为是每 5 秒产生一个周期性事件,同时主执行休眠 30 秒,但我得到以下行为。
一、基本信息 MCU:STM32F103ZET6 RT-Thread:5.0.2 LVGL:8.3.11 LCD:ST7735s 编译环境:RTThread studio
我向 rt 索引添加了新字段,如何重建它?如果我做截断 rtindex 新字段不添加。我是从desc rtindex看到的。我应该停止 sphinx 服务并取消链接所有索引文件然后重新索引吗? 最佳答
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我是一名优秀的程序员,十分优秀!