前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Reactor 模型

Reactor 模型

原创
作者头像
ge3m0r
发布2024-05-20 22:47:36
970
发布2024-05-20 22:47:36

Reactor 模型

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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Reactor 模型
  • 代码实现
    • 数据结构定义
      • 对数据结构的操作
        • 回调函数
          • 从服务端最基础做起
          • 最后
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档