深入理解 Resource Manager 接口设计
- 组织结构
自顶向下,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层的函数或您自己的函数。
可以独立于资源管理器使用此层,作为通用动态线程池实现。

参考