[QNX] 深入理解 Resource Manager 接口设计

深入理解 Resource Manager 接口设计

  1. 组织结构

自顶向下,Resource Manager 由以下四个层组成:

线程池层(thread pool layer)

调度层(dispatch layer)

资源管理层(resmgr layer)

IO函数层(iofunc layer)

1.1 iofunc layer

这一层由一组函数组成,它们负责处理大部分 POSIX 文件系统细节 --- 它们提供了 POSIX 个性。如果正在编写设备资源管理器,则需要使用此层,这样您就不必太担心 POSIX 文件系统所涉及的细节。

此层由默认处理程序组成,如果你不提供处理程序,资源管理器库将使用这些默认处理程序。例如,如果不提供io_open处理程序, 则会调用 iofunc_open_default() 。

iofunc 层还包含默认处理程序调用的辅助函数。如果您用自己的处理程序覆盖默认处理程序,您仍然可以调用这些辅助函数。例如,如果您提供自己的io_read 处理程序,则应在其开始时调用 iofunc_read_verify() 以确保客户端有权访问资源。

此层的函数和结构的名称形式为 iofunc_* ,头文件为<sys/iofunc.h>

1.2 resmgr layer

此层管理大部分资源管理器库细节:

检查传入的消息

调用适当的处理程序来处理消息

此层的函数和结构的名称形式为 resmgr_*,头文件为<sys/resmgr.h>

1.3 dispatch layer

这一层充当许多不同类型事物的单一阻塞点(试想一下dispatch_block函数)。使用这一层可以处理:

IO 消息

**select:**TCP/IP的进程通常会调用 poll()(以前是select(),资源管理器框架中的支持就是以此命名的,但实际上它是建立在ionotify()之上的),以在等待数据包到达时阻塞,或者等待写入更多数据的空间。使用调度层,注册了一个被调用的处理程序函数。这方面的函数是select_*()函数

Pulses:与其他层一样,您注册一个处理函数,当特定脉冲到达时调用该处理函数。这方面的函数是pulse_*()函数。

Other messages:可以为调度层提供你组成的消息类型范围和处理程序。因此,如果消息到达并且消息的前几个字节包含给定范围内的类型,则调度层调用您的处理程序。这方面的函数是message_*()函数

根据消息类型或脉冲代码,搜索使用 message_attach() 或 pulse_attach() 附加的匹配函数。如果找到匹配项,则调用附加的函数。

如果消息类型在资源管理器 (I/O 消息) 处理的范围内,并且使用 resmgr_attach() 附加了路径名,则会调用资源管理器子系统并处理资源管理器消息。

如果收到脉冲,如果它是资源管理器处理的代码之一(UNBLOCK 和 DISCONNECT 脉冲),则可能会将其分派到资源管理器子系统。如果您调用 select_attach() 并且脉冲与其使用的脉冲匹配,则将调用 select 子系统并分派该事件。

如果收到一条消息并且没有找到与该消息类型匹配的处理程序,但是已注册了默认处理程序,则调用默认处理程序。

如果收到了消息类型不匹配的消息,并且没有注册默认处理程序,则调用 MsgError ( ENOSYS ) 来解除对发送方的错误阻止

1.4 thread pool layer

这一层允许拥有单线程或多线程资源管理器。这意味着一个线程可以处理write(),而另一个线程处理read()。

您提供阻塞函数供线程使用,以及在阻塞函数返回时调用的处理函数。大多数情况下,为其提供调度层的函数。但是,您也可以为其提供resmgr层的函数或您自己的函数。

可以独立于资源管理器使用此层,作为通用动态线程池实现。

参考

https://www.qnx.com/developers/docs/8.0/com.qnx.doc.neutrino.resmgr/topic/skeleton_RESMGR_layers.html

相关推荐
AlfredZhao1 小时前
别再 rm 日志了:Linux 下安全清空日志文件的正确姿势
linux
Shadow(⊙o⊙)1 小时前
MySQL C/C++链接MySQL使用
数据库·sql·mysql
星恒随风1 小时前
Linux开发工具详解(二):Git版本控制、GitHub协作与GDB调试实战
linux·笔记·git·学习·github
2401_868534781 小时前
简要说明PON下行和上传数据方式
运维·服务器·网络
Mortalbreeze1 小时前
MySQL 基础篇(五):数据操作基础 —— CRUD
linux·服务器·数据库·mysql
Shadow(⊙o⊙)1 小时前
mysql为创建普通用户并创建库赋权
数据库·sql·mysql
Studying 开龙wu1 小时前
CVAT 导出崩溃排查实录:一个空壳轨迹引发的连锁反应
数据库·sqlite
ai小陈9 小时前
GPU服务器租用存储验收:检查点写入与磁盘吞吐实战
运维·服务器·人工智能·ai·ssh·gpu算力
PaperData9 小时前
1985-2025年全国区县专利申请与授权面板数据
数据库