在QNX Neutrino中消息传递(Message passing)是IPC的主要形式,其他的姓氏也是基于消息传递实现的。QNX中提供的IPC形式如何下图所示:
一、Synchronous message passing 同步消息传递
如果一个线程执行了MegSend()方法向另一个线程(可以是不同的进程)发送消息,它会被阻塞,知道目标线程执行了MsgReceive(),并处理消息,然后执行MsgReply()。如果一个线程在其他线程执行了MsgReceive(),它会被阻塞到另一个线程执行MsgSend()。消息查undishi通过直接你存copy来实现的。如果需要大的消息传递时建议通过共享内存或其他方式实现。
1、消息传递中的状态迁移
客户程序的状态迁移
SEND blocked:调用MsgSend()后,服务程序没有调用MsgReceive()的状态。
REPLY blocked:调用MsgSend()后,并且服务程序调用了MsgRecive(),但是没有调用MsgReply()/MsgError()的状态。当服务程序已经调用了MsgReceive(),客户程序一旦调用MsgSend()就直接迁移到此状态。
READY:调用MsgSend()后,并且服务程序地调用了MsgReceive()和MsgReply()的状态。
服务器状态迁移:
RECEIVE blocked:调用MsgRecevie()后,客户程序没有调用MsgSend()时的状态
READY:消息处理时的状态。MsgReply()调用后不会阻塞。当服务器MsgSend()会返回一个错误,不会被阻塞。
2、Channels and connections 通道与连接
在QNX Neutrino 中消息传递时通过Channels和Connections的,而不是直接在线程之间传递。一个要接受消息的线程必须先生成一个通道,而一个要发送消息的线程必须依附通道生成一个连接。一个进程中的多个客户线程可以同时依附一个通道上,这时所有连接实际都会映射到同内核对象。
客户连接直接映射到文件描述符。这样客户线程不需要了解什么地方发送消息,而仅仅需要考虑向文件描述符中发送消息。
一个Channel中包含以下三种列表:
Receive:一个用来保存等待罅隙的线程的后进先出队列(LIFO)
Send:一个用来保存发送但是未被接受的优先级先进先出队列
Reply:一个用来保存已被接受但是还没有返回的不排序列表
所有这些队列中等待的线程都是被阻塞的线程,多个服务线程和多个客户线程可以等待在一个Channel上。
3、Pulses 脉冲
QNX Neutrino同样提供了一个被称为Pulses的非同步的消息机制。Pulses通常用于中断线程的通知机制,或者通过服务线程来唤醒客户而不被阻塞。
Pulses包是相当于最小负载单位,有8 bits的代码和32 bits的数据。
4、Priority inheritance and messages
当服务线程接受消息时会将服务线程的优先级调整为发送者线程中的最高优先级。如果有一下三个线程,服务线程的优先级为22,客户线程1的优先级为13,客户线程2的优先级为10。客户线程2发送一条消息的话,服务线程在接受时会将自身的优先级调整为10。如果此时客户线程1也发送了一条消息的话,服务线程的优先级就会调整为13。
这种优先级继承机制的目的是为了防止一下两种优先级逆转:
当服务线程的优先级较高时,不会因为低优先级的客户线程的消息而抢占比起高优先级线程
当服务线程的优先级较低时,一个较高优先级的线程的消息不会被一个较低优先级线程锁抢占
当然也可以关闭优先级继承功能,在ChannelCreate()是关闭此标志: _NTO_CHF_FIXED_PRIORITY
5、Robust implementations with Send/Receive/Reply
通过Send/Receive/Reply实现的程序能够通过一下两点避免死锁
永远不要有两个线程相互发送消息
将线程组织为等级结构,并且只向上发送消息
二、其他IPC机制
1、Events 事件
QNX Neutrino提供的一种非同步事件发送机制。一下三种情况会发送Events
MsgDeliverEvent()被调用
中断处理
计时器到期
2、I/O notification
最有代表性的就是select()函数,主要当下面条件成立时发送此事件:
3、Signals 信号
信号处理类似于硬件中断,他会使一个进程从当前的执行控制流程跳出,以实现特定的行为,待特定处理完成后,再恢复到中断点继续执行。QNX Neutrino 中的信号时通过Events机制实现的,应该注意,虽然QNX遵循POSIX,但是使用信号的函数有点细微的变化;QNX Neutrino系统中提供了如下64个Signals:
当一个服务线程希望通知一个客户线程一些信息时,可以使用两种手段:
Pulses:客户线程需要生产一个Channel,并调用MsgReceive()
Signals:只需要调用sigwaitinfo(),而不需要生产Channel。
4、POSIX message queues
POSIX通过message queues定义一组非阻塞的消息传递机制。QNX Neutrino的系统核心不支持Message queues,如果想使用它就必须启动对应的服务。QNX Neutrino提供了两种Message queues的实现:
・mqueue:一个传统的使用mqueue资源管理的实现
・mq:一个使用mq服务和非同步消息的替代实现
QNX的Message机制与POSIX的Message queues有一个根本性的区别,QNX的消息机制通过内存拷贝来实现消息的传递,而POSIX的消息队列通过将消息队列的存取来实现消息的传递,POSIX可以维护多了消息队列。QNX的消息机制比POSIX的消息队列更有效率,但是有时为了POSIX的灵活性,这点性能消耗也是值得的。
消息队列的功能有:
5、Shared memory 共享内存
由于Share memory 不支持同步处理,所以通常和Semaphores或Mutexes一起使用。一般来说信号量用于进程同步,而互斥量用于线程同步。QNX 的互斥量也支持进程的同步,相对而言互斥效率更高一些。
使用Share memory时,要创建一个Share memory对象,在使用内存共享时要用到的函数有:
QNX中的消息传递时通过消息的直接拷贝来完成的,当消息较大时可以通过内存共享来提升消息,发送消息时,不是发送整个消息,而是将消息保存于Share memory中,并将地址发送过去,而接受消息时通过Share memory的地址来读取消息。
The mmap() function is defined as follows:
void * mmap( void *where_i_want_it,
size_t length,
int memory_protections,
int mapping_flags,
int fd,
off_t offset_within_shared_memory );
6、Typed memory 类型化内存
POSIX也已经定义,主要是针对实行性的,在这里用到了池(pool)的概念,想使用此功能要包含的头文件是 <sys/mman.h>
Typed memory 增加的功能在 C库里:
posix_typed_mem_open():打开一个Typed memory对象,返回的是文件描述符,可通过mmap()来创建此对象
posix_typed_mem_get_info():得到该对象的信息
实际例子:
int fd = posix_typed_mem_open( "/memory/ram/sysram", O_RDWR,
POSIX_TYPED_MEM_ALLOCATE_CONTIG);
unsigned vaddr = mmap( NULL, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE, fd, 0);
7、Pipes and FIFOs
Pipes
Pipes是两个活着多个协作进程间未命名的IO通道。Pipes通常用于两个平行进程间的单向通信,如果想双向就应该使用消息。
FIFOs
FIFOs是文件系统中一个已经命名的永久文件,实现功能与管道出不多
相关推荐
本文将深入探讨在QNX环境中如何进行串口通信,以及它与Linux串口通信的差异。 串口通信是计算机硬件之间交换数据的一种常见方式,尤其在嵌入式设备和微控制器中,它扮演着重要角色。在QNX操作系统中,串口通信通常...
在QNX操作系统上获取进程内存信息是系统管理和性能优化的重要环节。QNX是一个实时操作系统,广泛应用于嵌入式系统和工业设备中。了解一个进程的内存使用情况有助于开发者诊断内存泄漏、优化资源分配以及确保系统的...
QNX是一款微内核设计的操作系统,其核心仅包含最基本的进程管理、内存管理和设备驱动等服务,其余服务则作为独立的进程运行,这种设计提供了高度的稳定性和可扩展性。QNX RTOS支持多任务并行处理,且具备硬实时特性...
QNX下的串口通信,在实际的机器上测试了一下,发现可以连续的发送数据。
The QNX Neutrino Persistent Publish/Subscribe (PPS) service is a small, extensible publish and subscribe service that offers persistence across reboots. It's designed to provide a simple and easy-to-...
第3章介绍了进程间通信(IPC),这是QNX Neutrino中的关键特性。通过高效、安全的IPC,不同进程可以有效地共享数据和资源,实现协同工作。QNX Neutrino的IPC机制包括消息队列、信号量、共享内存等,提供了丰富的通信...
在QNX操作系统中,进程间通信是非常重要的一部分,包括任务创建、任务管理、进程间通信等方面的知识。开发人员可以使用这些技术来实现进程间通信和数据交换。 QNX操作系统的应用前景非常广阔,包括实时控制、通信、...
1. 微内核(Microkernel):这是QNX的核心,负责调度任务、管理内存和提供基本的进程间通信(IPC)。 2. 进程管理(Process Management):QNX支持多任务并行执行,其进程管理机制确保了高效的任务切换和资源分配。 ...
通过分析低版本的QNX源码,我们可以学习到操作系统设计的基本原则,理解其调度策略、内存管理、进程通信等核心机制。这不仅有助于提升编程技能,还对理解其他操作系统的工作原理大有裨益。同时,由于QNX的广泛应用,...
QNX的核心设计理念是微内核架构,这意味着它的核心只包含最基本的服务,如进程调度、进程间通信(IPC)、底层网络通信和中断处理。这样的设计使得核心非常小巧,QNX4.x的内核大小仅为12Kb,同时运行效率极高。由于...
### 基于QNX与Windows运行的PC机之间的网络进程通信 #### 摘要与研究背景 本文探讨了一种实现运行QNX操作系统的PC机与运行Windows操作系统的PC机之间基于TCP/IP协议的网络进程通信的方法。该研究背景源于在某型...
此外,QNX的进程间通信(IPC)机制是其微内核架构的重要组成部分,提供了多种通信方式,如消息队列、信号量、共享内存等,使得不同进程间的协作变得高效且可靠。 文件系统在QNX Neutrino中扮演着重要角色。系统支持...
同时,QNX内建的Interprocess Communication (IPC)机制允许进程间高效通信,如消息队列、信号量和共享内存。 6. **开发环境** 使用QNX Momentics IDE,开发者可以创建、编辑、编译和调试C/C++代码。IDE集成了GCC...
QNX Neutrino 实时操作系统是QNX Software Systems Limited开发的一种嵌入式实时操作系统(RTOS)。QNX Neutrino RTOS被广泛应用于各种嵌入式系统中,如汽车信息娱乐系统、工业控制系统、网络设备、医疗设备等,它以...
进程间通信机制(IPC) 消息传递是QNX4的主要进程间通信机制。例如,当一个用户进程想要打开某个文件时,这个系统调用会被转换成一条消息,然后发送给负责文件管理的服务器进程。服务器进程接收到消息后执行相应的...
基础的命令如`ls`、`cd`、`mkdir`、`rm`和`cp`等与Linux类似,但也有独特的命令,例如`msgsend`和`msgrecv`用于进程间通信。理解如何使用`ps`查看进程状态,以及`netstat`来检查网络连接,对于日常系统管理和调试至...
三、进程间通信(IPC) QNX6.5的进程间通信机制是其核心竞争力之一。它提供了消息队列、共享内存、信号量等多种通信方式,确保了进程间的高效协作和数据同步。 四、虚拟内存管理 QNX6.5采用先进的虚拟内存系统,...
选择QNX Neutrino的原因在于其微内核结构,这使得操作系统的核心功能最小化,只包含最基本的内存管理和进程间通信(IPC),其余服务则由用户态进程提供,提高了系统的稳定性和效率。 微内核架构将操作系统视为一组...
QNX Neutrino作为一个基于消息传递的操作系统,利用进程间通信(IPC)机制进行进程间的数据交换和协调。它支持灵活的网络分布模型,允许内核在单计算机模式以及分布式网络中的灵活部署。 QNX Neutrino的微内核实现...
该文档描述了QNX系统特性,进程间通信机制,系统常用命令,QNX应用程序开发等。