nodejs事件循环阶段之poll io

  • 2020 年 3 月 12 日
  • 筆記

poll io是nodejs非常重要的一个阶段,文件io、网络io、信号处理等都在这个阶段处理。这也是最复杂的一个阶段。处理逻辑在uv__io_poll这个函数。这个函数比较复杂,我们分开分析。 开始说poll io之前,先了解一下他相关的一些数据结构。 1 io观察者uv__io_t。这个结构体是poll io阶段核心结构体。他主要是保存了io相关的文件描述符、回调、感兴趣的事件等信息。 2 watcher_queue观察者队列。所有需要libuv处理的io观察者都挂载在这个队列里。libuv会逐个处理。 我们看如何初始化一个io观察者

// 初始化io观察者  void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd) {    // 初始化队列,回调,需要监听的fd    QUEUE_INIT(&w->pending_queue);    QUEUE_INIT(&w->watcher_queue);    w->cb = cb;    w->fd = fd;    // 上次加入epoll时感兴趣的事件,在执行完epoll操作函数后设置    w->events = 0;    // 当前感兴趣的事件,在再次执行epoll函数之前设置    w->pevents = 0;  }

我们再看一下如何注册一个io观察到libuv。