服务器框架(C/S模型)

  • I/O处理单元

    • I/O模型

      • 阻塞I/O:阻塞的文件描述符称为阻塞I/O,针对阻塞I/O执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。针对非阻塞的I/O执行的系统调用总是立即返回,而不管事件是否已经发生。所以,只有在事件已经发生的情况下操作非阻塞I/O,才能提高程序的效率。程序阻塞于读写函数。
      • I/O复用:应用程序使用I/O复用函数向内核注册一组事件,内核通过I/O复用函数把其中就绪的事件通知给应用程序(select, poll, epoll)。对I/O本身的读写操作是阻塞的。
      • SIGIO信号:信号触发读写事件,用户程序执行读写操作。程序没有阻塞阶段。
      • 异步I/O:用户直接对I/O执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及I/O操作完成之后内核通知应用程序的方式。同步I/O模型要求用户代码自行执行I/O操作,而异步I/O机制则由内核来执行。也可以这样理解,同步I/O向应用程序通知的是I/O就绪事件,而异步I/O向应用程序通知的是I/O完成事件。
    • 事件处理模式

      IO事件、信号以及定时事件。同步IO用来实现Reactor,异步IO用来实现Proactor。

      • Reactor

        主线程(IO处理单元)只负责监听文件描述符上是否有事件发生,有的话立即将该事件通知工作线程(逻辑单元)。读写数据,接受新的连接,以及请求客户请求均在工作线程中完成。

        例:

        主线程往epoll内核事件表中注册socket上的读就绪事件;主线程调用epoll_wait等待socket上有数据可读;当socket上有数据可读时,epoll_wait通知主线程;主线程则将socket可读事件放入请求队列;睡眠在请求队列上的某个工作线程被唤醒,它从socket读取数据,并处理客户请求,然后往epoll内核事件表中注册socket上的写就绪事件;

        主线程调用epoll_wait等待socket可写;当socket可写时,epoll_wait通知主线程,主线程将socket可写事件放入请求队列;睡眠在请求队列上的某个工作线程被唤醒,它往socket上写入服务器处理客户请求的结果。

      • Proactor

        将所有的IO操作交给主线程和内核来处理,工作线程仅仅负责业务逻辑。

        例:

        主线程调用aio_read函数向内核注册socket上的读完成事件,并告诉内核用户读缓冲区的位置,以及读操作完成时如何通知应用程序;主线程继续处理其他逻辑;当socket上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据可用;

        应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求,工作线程处理完客户请求后,调用aio_write函数向内核注册socket上的写完成事件,并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序;主线程继续处理其他逻辑;当用户缓冲区的数据被写入socket之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕;应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭socket。

        主线程中的epoll_wait调用仅能检测监听socket上的连接请求事件,而不能用来检测连接socket上的读写事件。

      • 模拟Proactor

        主线程执行读写操作,读写完成后,主线程向工作线程通知这一完成事件,从工作线程角度来看,就直接获得了读写结果,接下来就只要进行逻辑处理。

  • 逻辑单元

    并发编程模式,适用于IO密集型程序

    • 半同步/半异步模式

      在IO模型中,同步异步区分的时内核向应用程序通知的是何种IO事件(是就绪事件还是完成事件),以及该由谁来完成IO读写(是应用程序还是内核)。在并发模式中,同步指的是程序完全按照代码序列的顺序执行;异步指的是程序的执行需要由系统事件来驱动。

      image-20210425213851634

      同步线程用来处理客户逻辑,异步线程用来处理IO事件。异步线程监听到客户请求后,就将其封装成请求对象并插入到请求队列中;请求队列将通知某个工作在同步模式的工作线程来读取并处理该请求对象,具体选择哪个工作线程,取决于请求队列的设计。

      例:半同步/半反应堆模式,高效半同步半异步模式。

      image-20210425213932835
    • 领导者/追随者模式

      多个工作线程轮流获得事件源集合,轮流监听、分发并处理事件的一种模式。在任意时间点,程序仅有一个领导者线程,它负责监听IO事件,而其他线程都是追随者,它们休眠在线程池中等待成为新的领导者,当前的领导者如果检测到IO事件,首先要从线程池中推选出新的领导者线程,然后处理IO事件。此时,新的领导者等待新的IO事件,而原来的领导者则处理IO事件,二者实现了并发。

      句柄集:IO资源,文件描述符

      线程集:所有工作线程的管理者,负责线程间同步、新领导者线程的推选。

      事件处理器:事务处理器被绑定在某个具体的句柄上。当句柄上有事件发生时,就执行事务处理器中的回调函数。

      具体的事件处理器

      优缺点:领导者自己监听并处理客户请求,不需要在线程之间传递数据。仅支持一个事件源集合,无法让一个工作线程管理多个客户连接。

    • 有限状态自动机

      高效的逻辑处理方式

posted @ 2021-04-25 22:08  等风的猫xx  阅读(223)  评论(0编辑  收藏  举报