老霸王游戏机🎮3.0完工,欢迎参观http://gameguy.iotshare.org

MENU

【一起来写http服务器】造一个简单的事件框架轮子

2022 年 06 月 18 日 • 网络编程

在造事件框架这个轮子之前,我们先谈谈为什么需要事件框架,以及现有流行的事件框架这么多,为什么要自己再造一个轮子呢。

1.为什么需要事件框架

在程序执行中,往往按照CPU、I/O的使用情况分为两大类,一类是CPU密集型,另外一类是I/O密集型

  • CPU密集型
    即程序中多以单纯的CPU计算为主,比如做数据计算、编解码的程序就属于CPU密集型程序;
  • I/O密集型
    I/O密集型的程序与外部的I/O交互较多,常见的如服务器软件,通过接收用户的请求来触发程序进行少量的计算,再将计算结果返回给用户。

我们要做的HTTP服务器程序就属于后者。

I/O密集型程序有个显著的特征就是程序的大部分时间都是在等待,反映到进程/线程视角,就是这个线程一直在阻塞,而阻塞是导致CPU利用率低的主要元凶。

等待用户的请求、等待时间到来这些等待其实都是在等一个事件,如果可以在这些事件到来时主动及时地告知给我们,那我们我们就可以在A事件没来的时候去处理已经到来的B事件,因为相对于等待所消耗的时间,事件处理所需要的时间往往是微不足道的。程序在同一时间内所处理的事件个数上去了,请求的吞吐量自然也就跟着上去了。

所以,针对I/O密集型、数据处理少的程序,我们往往需要一个事件框架来提升并行处理事件的能力。

2.为什么要造事件框架的轮子

现有的比较流行的事件框架有libevent,可以满足基本的socket、定时器等事件的接管与通知。但是如果自己动手去造一个事件框架,可以更加深刻地理解这个编程模型的实用和优点,写代码时会更加关注所调用的接口是否会引起阻塞,以及阻塞所带来的负面影响。

3. 事件框架的目标

所写出的事件框架应达到如下目标:

  • 可接管socket、文件的可读可写事件;
  • 可接管定时器事件;

4. 事件框架的基本组成

为了达成上述事件框架的目标,可使用epoll和文件描述符来作为事件框架的基座。其中为了让定时器事件也可以被epoll所纳管,这里使用的定时器采用timefd。即这个简单的事件框架整体结构如下:

5.代码实现

按照上述的目标,已实现基本fd的事件监听和定时器,章节如下:

最后编辑于: 2023 年 06 月 22 日