热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QNX驱动开发—进程调度和进程通信

锋影e-mail:174176320qq.comQNX进程间调度和进程通信切换任务一、进程调度方法1.FIFO:先进先出队列法。一个最高优先级的线程可以


锋影

e-mail:174176320@qq.com




QNX进程间调度和进程通信切换任务

一、进程调度方法

1.FIFO:先进先出队列法。一个最高优先级的线程可以一直执行到结束或是主动放弃CPU。高优先级的线程可以随时中断低优先级的线程,获得CPU的使用权限,与之相同优先级的CPU也只能等待其交出CPU的使用权限后才能按排队的顺序先后执行。

2.Round Robin:循环法。除了对于最高的相同优先级的使用时间片轮转的方法外,其他特点与FIFO法相同。注意此处的时间片轮转与windows的不一样,是随时可以被高优先级任务抢占的。

二、进程间通信

      QNX所有功能实现都是靠消息传递的机制实现的,并可以轻松实现网络通信。其中POSIX函数与底层的通信就是靠消息实现的。

      通信的过程分为三个步骤:client向server发送消息;server向client接受消息;server处理并将结果返回给client。

      A useful minimal set of functions is ChannelCreate(),ConnectAttach(),MsgReply(),MsgSend(), andMsgReceive().

对于client想要与server通信要通过ConnectAttach 与server建立连接,使用MsgSend向server发送一个消息。

对于server:

       首先要通过ChannelCreate创建一个通道,然后有“receive”和“reply”两个阶段来处理消息。

chid = ChannelCreate (0);或者(Name_attach_t *attach = name_attach(NULL,(char *)”myserver”,0);)

rcvid = MsgReceive (chid, message, sizeof (message),NULL);

MsgReply (rcvid, EOK, message, sizeof (message));

    对于client:

    需要做两件事情,一是要通过ConnetAttach与server的channel建立连接,二是要通过MsgSend向server发送消息。

     1)与server建立连接

int ConnectAttach (int nd,

pid_t pid,

int chid,

unsigned index,

int flags);

例如coid = ConnectAttach (0, 77, 1, 0, 0);是连接了自己节点(0)的,进程号为77的一个进程的1号channel。可是如何获得server的ND/PID/CHID这几参数呢?

QNX提供了几种方法:

1.server向一个文件中写入自己的ND/PID/CHID参数,client发送消息时打开文件,读出字符串。(文件过多)

2.使用全局变量来存储这几个参数。(非常有局限性,如果有共享内存,无法使用网络连接到!)

3.使用命名功能来把client注册一个名字。

4.把server升级为一个resource manger,这样就可以打开/dev/**来建立通信消息。(一般不这样做)。

        在通常情况下,命名功能name_attach() and name_open()来完成比较方便。

比如:server_coid = name_open((char *)”myserver” ,0);来打开server创建的/dev/name/local/myserver,与server创建的channel建立连接。

在server端可以使用name_attach()在命名空间创建一个name,如

Name_attach_t *attach = name_attach(NULL,(char *)”myserver”,0);当server的线程结束时,此命名也自动地跟着删除掉。这就很好的解决了建立通道的问题。

        2)向server发送消息

       这里可以分为几种情况,需要回复数据、回复成功或失败但是不回复数据。于是我们可以使用一下函数完成功能。

int MsgSend (int coid, const void *smsg, int sbytes, void *rmsg, int rbytes);

MsgReply (rcvid, EOK, NULL, 0); //successful

MsgError (rcvid, EROFS); //failed

       Client和Server各参数之间的关系如下图所示:

        我做了一个这样的实验,在工程中建立一个名为server的工程和一个名为client的工程,两个进程之间完全时陌生的,通过name_attach和name_open的方式建立通道,这样就不需要获得ND/PID/CHID这几个参数了。在实验的过程中发现使用消息进行通信时非常方便的,但是最好自己定义一个命令消息格式,滤除掉不是原client发来的消息(系统还会对server发送消息进行控制),这样就不会出现误触发。

建立一个结构体

Struct _io_message{

Int nbyte;

Int type;

Char msg[1024];

};

        就可以很方便的判断传入消息的大小、消息类型以及消息的多少了,如果server的接收buffer太小,使得接收的数据丢失,可以通过判断实际传过来的nbyte和定义buffer的大小来判断这一情况,使用MsgRead()和MsgWrite()再把实际大小的数据读回来。



推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
炎木柏玮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有