首页 > 系统相关 >【Linux】【网络】Reactor模式

【Linux】【网络】Reactor模式

时间:2025-02-17 13:54:31浏览次数:9  
标签:socket 主线 网络 线程 事件 Linux event Reactor

【Linux】【网络】Reactor模式

1. Reactor 模式:

Reactor 模式是一种事件驱动的设计模式,同步I/O通常用于设置Reactor 模式主线程(I/0处理单元,下同)只负责监听文件描述上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元,下同)。除此之外,主线程不做任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。
在这里插入图片描述
使用同步 I/O模型(以cpoll wait 为例)实现的 Reactor 模式的工作流程是:
1)主线程往
epoll内核事件表
中注册socket 上的读就绪事件。(主线程循环等待监听连接套接字上的事件)
2)主线程调用epoll_wait 等待socket 上有数据可读。
3)当socket上有数据可读时,epoll_wait() 通知主线程。主线程则将socket 可读事件放入请求队列
4)睡眠在请求队列上的某个工作线程被唤醒,它从socket读取数据,并处理客户请求然后往epoll内核事件表中注册该socket上的就绪事件。
5)主线程调用epoll_wait() 等待 socket 可写。
6)当socket 可写时,epoll_wait()通知主线程。主线程将socket可写事件放入请求队列
7)睡眠在请求队列上的某个工作线程被唤醒,它往socket上写入服务器处理客户请求的结果。

工作流程:
  1. 主线程(Reactor)负责监听和接收事件

    • Reactor 线程等待 I/O 事件的发生(例如 socket 上的可读或可写事件),并通过事件循环处理。
    • 它使用 I/O 多路复用机制(如 epollselect)来监听多个事件源(例如多个 socket)。
  2. 注册事件

    • 主线程将事件(例如可读、可写、连接请求等)注册到 I/O 多路复用器(如 epollselect)。
    • 当事件发生时,I/O 多路复用器会通知 Reactor 线程。
  3. 事件分发

    • Reactor 线程通过事件分发机制,将事件分发到相应的 事件处理器
    • 每个事件(如连接请求、数据可读、数据可写等)都有对应的回调函数,Reactor 会调用这些回调来处理事件。
  4. 事件处理

    • 回调函数通常由工作线程或主线程执行,处理 I/O 操作(例如读数据、写数据、关闭连接等)。
示例:

Reactor 模式通常通过主线程驱动的事件循环来实现,在 libevent 中可以通过 event_base 来实现这个事件循环。

#include <event2/event.h>
#include <stdio.h>

void on_event(evutil_socket_t fd, short what, void *arg) {
    printf("Event triggered on fd %d\n", fd);
    // 可以在此执行具体的 I/O 操作,如读取数据、写数据等
}

int main() {
    struct event_base *base = event_base_new();
    struct event *ev;
    evutil_socket_t fd = 0; // 标准输入文件描述符
    ev = event_new(base, fd, EV_READ | EV_PERSIST, on_event, NULL);
    event_add(ev, NULL);  // 将事件加入事件循环

    event_base_dispatch(base);  // 启动事件循环,等待事件发生并处理

    event_free(ev);
    event_base_free(base);
    return 0;
}

PS:

  • Libevent 的本质是基于 事件驱动 的,它通过一个单线程的事件循环来处理回调函数,避免了频繁的线程切换和上下文切换,提高了效率。回调函数是在主线程的栈区执行的,这样可以避免创建额外线程的开销。但是某个回调函数阻塞可能会导致程序阻塞。
  • 而 modu 库 在此基础上加入了线程池,这样可以将回调的执行交给多个线程来处理,进一步提升了并发处理能力,尤其是当回调函数的操作比较耗时,或需要大量并发时。线程池的引入能够更好地分摊负载,并且避免了主线程被阻塞的风险。

把libevent实现写完会写一下modu库

标签:socket,主线,网络,线程,事件,Linux,event,Reactor
From: https://blog.csdn.net/m0_64014551/article/details/145680096

相关文章