reactor 是一种管理网络 I/O 的模型,我们知道,内核对于网络 I/O 的管理方式是用的 select/poll epoll ,那么应用程序之间可能也需要一种管理 I/O 的方式,reactor 模型就此诞生。
客户端发送数据,内核接受数据返回给应用层,这就好比去会所都要有个老鸨接待,而应用程序也需要一个接待处,可以假想成在应用程序和内核之间加入了一层接待处。
reactor 模型,我们既然要管理 I/O ,那我们要怎么管理,如何管理。
首先我们需要确认的是,我们做的是应用层的网络 I/O 管理,除此之外,我们也无法改变内核如何管理 I/O ,因此我们做这个模型,需要借助内核 epoll 的管理方式。
而我们直到 epoll 会将 socket 的描述符加入红黑树 epfd
然后产生消息的事件会生成就绪队列,我们首先需要一个维护红黑树关系的数据结构,另外需要对每个 socket 描述符进行封装。
socket 描述符可以封装成一个事件,而红黑树负责管理事件。
而需要管理这些封装的事件就是反应堆模型。
首先就是对 ntyevent 结构体的操作,首先就是对事件类似增删查改的函数。
结构体肯定需要初始化,而我们把这个函数表示为设置。
这个函数类似很多初始化函数,当然他也承担一部分改的功能。
然后就是一个增一个删的函数,为什么没有查函数,因为只要声明了结构体指针然后直接引用函数内容即可。因此对于结构体来说增删是最需要的。
而删除函数为:
说完对与 ntyevent 结构体的管理,那么即使 reactor 结构体管理。
首先就是初始化结构体。
初始化好 reactor 结构体,我们然后要确认,在网络 I/O 过程中,我们期望这个结构体能干什么事情。
在一般的网络模型,服务端就是生成 socket, bind 端口,然后listen,有客户端连接需要 accept,同时接受数据,发送数据。listen 是一个状态需要管理,而 accept 表示未接收数据的一个状态,这个状态都是需要管理的,而且状态只会改变,比方说从 listen 变成 accept,因此 reactor 管理跟普通的管理不太一样
创建 socket ,bind 和 listen基本不存在双方交互的一个情况,而另外四个方式都涉及与客户端的交互。
,那么首先就是监听事件添加
然后即使监听事件的不同状态的转换
然后就是数据结构的销毁。
比较简单,就是关闭 epoll 的描述符,然后释放内存。
回调函数使用内核将事件复制到应用程序,我们需要处理的逻辑,就网络 I/O 来说,从服务器来说,我们从监听开始,因此第一个函数就是 accept 函数。
accept 之后就是 recv 函数,recv 的回调函数为
最后就是发送的回调函数。
上述就是利用 Linux 内核 epoll 对网络 I/O 进行管理的状态基本已经做完,而作为服务端,最开始就是要创建 socket 这些老套的东西。
最后就是一个总体函数使用,main 函数来了。
综上所述,其实不管是什么模型,其实就是定义数据结构后,首先对数据结构进行管理和业务逻辑,然后跟我们操作系统机制进行交互。当然对于 Java 这种封装比较完善的语言,可能就主要就是数据结构管理然后加上业务逻辑。和操作系统管理可能就是跟另一个数据结构进行交互了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。