服务器程序框架

C/S模型

  1. 服务器启动后,创建一个监听 socket,调用 bind 函数将其绑定到特定端口,调用 listen 函数等待客户连接。
  2. 服务器稳定运行后,客户端可以调用 connect 函数向其发起连接。由于客户连接请求是随机到达的异步事件,服务器使用某种 I/O 模型(select、poll、epoll)监听这一事件。
  3. 当监听到连接请求后,调用 accept 函数接受它,并分配一个逻辑单元(新创建的子进程、子线程)为新的连接服务。逻辑单元读取客户请求,处理该请求,然后将处理结果返回给客户端。
  4. 客户端接收到结果后,可继续向服务器发送请求,也可以主动关闭连接。若客户端主动关闭连接,则服务器执行被动关闭连接。至此,通信结束;
  5. 服务器在处理一个客户请求时还会监听其他客户请求;

select系统调用

服务器编程框架

在这里插入图片描述

  • I/O处理单元
    服务器管理客户连接的模块
    工作:等待并接受客户连接,就收客户数据,将服务器响应数据返回给客户端
  • 逻辑单元
    通常是一个进程或线程
    工作:分析并处理客户数据,然后将数据传递给 I/O 处理单元或直接发送给客户端;
  • 网络存储单元
    可以使数据库、缓存和文件
  • 请求队列
    是各单元之间的通信方式的抽象,通常被实现为池的一部分

I/O模型

  • 阻塞I/O
    执行的系统调用可能因为无法立即完成操作而被操作系统挂起,直到等待的事件发生为止;
  • 非阻塞I/O
    执行的系统调用总是立即返回,而不管事件是否已经发生。若未立即发生,返回 -1,和出错的情况一样,必须根据 errno 来区分
    对 accept、send、recv 而言,事件未发生时 errno 通常被设置为 EAGAIN(再来一次)或者 EWOULDBLOCK(期望阻塞);对 connect 而言 ,errno 被设置为 EINPROGRESS(在处理中)
  • I/O 复用
    (select、poll、epoll)最常用的 I/O 通知机制,应用程序通过 I/O 复用函数向内核注册一组事件,内核通过 I/O 复用函数把其中就绪的事件通知给应用程序。
    I/O复用函数本身是阻塞的,提高程序效率的原因在于同时监听多个 I/O 事件的能力

以上三种都是同步 I/O 模型,因为 I/O 的读写操作,都是在 I/O 事件发生之后,由应用程序来完成的

  • 异步 I /O
    用户可直接对 I/O 执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及 I/O 操作完成后内核通知应用程序的方式,异步 I/O 的读写操作总是立即返回,而不论 I/O 是否是阻塞的,因为真正的读写操作已经由内核接管

  • 区别
    同步I/O 模型要求用户代码自行执行 I/O 操作(将数据从内核缓冲区读入用户缓冲区,或从用户缓冲区写入内核缓冲区);向应用程序通知的时 I/O 就绪事件
    异步 I/O 由内核来执行 I/O 操作(数据在内核缓冲区和用户缓冲区之间的移动是由内核在“后台”完成);向应用程序通知的是 I/O 完成事件

I/O 模型 读写操作与阻塞阶段
阻塞I/O 程序阻塞于读写函数
I/O复用 程序阻塞于I/O复用系统调用,但可同时监听多个I/O事件。对I/O本身的读写操作是非阻塞的
异步I/O 内核执行读写操作并触发读写完成事件。程序没有阻塞阶段

Reactor模式

主线程(I/O处理单元 只负责监听文件描述符上是否有事件发生,有的话立即将该事件通知工作线程(逻辑单元)。除此之外,主线程不做其他实质性的工作。读写数据、接受新的连接、处理客户请求均在工作线程中完成。

  • 使用同步I/O(epoll_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 通知主线程,将可写事件放入请求队列
  7. 睡眠在请求队列上的某个工作线程被唤醒,往 socket 上写入服务器处理客户请求的结果

在这里插入图片描述

  • 工作线程从请求队列中取出事件后,将根据事件的类型来决定如何处理它;

猜你喜欢

转载自blog.csdn.net/weixin_39554266/article/details/83030999