[Day 15] epoll

前言

在系列文的第二篇我就提到过, 一个非同步运行框架, 应该要含有两种架构, 一个是能够 multi-thread 操作资料的介面, 一个是能够进行 thread schedule 的 scheduler。

其中, 以 .Net 为例, 整个 Task 以及 Threadpool , 就是一个是能够 multi-thread 操作资料的介面, scheduler 的部分则是外包给了外部档案完成, 我们没读到。也因此, 我们回避掉了不少困难的部分, 但在读 node 的过程, 这两个都是不可回避的, 难度也因此相应提高, 所以我会在开始读之前把在读的过程中可能遇到的概念聊一下。

以下都是聊聊他们在 linux 中的样子, node 会以他们为基础, 去实践自己的框架。

epoll

https://zh.wikipedia.org/wiki/Epoll

简单来说,

epoll 是一种非同步监听 IO 的方法, 其介面延续了 unix 核心 everything is a file 的精神, 利用对文件的读写来操作, 底层实践则是透过给注册的事件追加 callback function , 该 callback function 的功能是把发生的事件放入一个虚拟文件, 而 epoll 的等待是去读该虚拟文件, 读到事件就得知该事件发生。

以下简述流程 :

  1. 建立空白虚拟文件, user space 可以直接读取
  2. 利用 epoll 提供的注册方法给被注册的事件追加 callback function
  3. 事件发生, 触发回调函数
  4. threads 利用 epoll 提供的等待方法, 等到事件发生, 将第 3 步的事件加入虚拟文件
  5. threads 读取虚拟文件, 且处理该事件。

比较

若是拿出我在第二天写的 httpServer 所使用的非同步方法, 可以发现高下立判, 如果使用这种演算法只要用以下方法设计, 效能远超我在第二天撰写的版本

  1. 给每次连线建立的 socket 注册 epoll
  2. 所以每次 socket 传输的资料都直接写入虚拟文件
  3. 接着 thread 只要去读虚拟文件即可

如此一来我不需要建立那麽多 thread 在那边空等, 只要利用一条 epoll 的 thread 就可以快速的处理所有连线并且资料都会自动的写入虚拟文件。接着就是无脑的处理虚拟文件即可。

明天进度

因为 epoll 版 httpServer 很多人写了, 就跳过不实作了, 改成用 windows 的 IOCP 撰写 httpServer, 感觉会比较有趣。

所以明天来聊一下 IOCP 这个非同步监听 IO 的方法吧

明天见 !


<<:  Day1_前言

>>:  Day 1:开始前的准备

Media queries

为什麽需要 Media Queries Media queries 可以让我们依据不同装置的特性来调...

[Day_4]Python 字串(1)

字串 在Python里扮演很重要的角色, 使用**单引号「'」与双引号「"」**所包含的文...

Day 16 - 研习计画起源与菜鸟业师面试学生篇

渐渐的掌握专案开发的技术以及与厂商洽谈的诀窍後,接着迎接了一个新的挑战是先前没有遇过的,那就是协助单...

零信任的特徵

零信任 零信任是一种用於访问控制的网络安全范例,具有以数据为中心,细粒度,动态且具有可见性的特徵。 ...

Angular 深入浅出三十天:表单与测试 Day17 - E2E 自动化测试工具简介

在这个各种前端框架、开发工具层出不穷、百花齐放、百鸟齐鸣的美好时代, E2E 自动化测试工具的选择...