继续学习并翻译 (Kqueue: A generic and scalable event notification facility) 这篇论文
接着上篇 Tornado 源码阅读笔记(二) ,把原论文第2章余下的部分翻译完。
参考了 《socket 的几种工作模式》 一文中的流程图之后,我对 select() poll() 的工作模式有了清晰的认识。(一图胜千言,这话没错。)系统内核在复制了需要监控的 descriptor 列表之后,先遍历该列表,监测是否有 pending activity on the descriptor. 此次遍历之后,如果一个 active descriptor 都没有,内核将更新 descriptor's selinfo entry(用于唤醒内核监测 descriptor 列表的进程). 之后,该监控进程调用 tsleep()。当有 active descriptor 出现时,监控进程将被唤醒。醒了就得干活啊,于是,再遍历 descriptor 列表一遍,查找当前处于 active 状态的 descriptors。
在 poll or select actually sleep 的情况下,这个过程需要遍历 descriptor 列表 3 次:
第一次,内核,遍历列表以查找 pending events 并记录 select 信息;
第二次,内核,遍历列表以查找哪个 descriptor 的 activity 唤醒了检测进程;
第三次,user space,遍历列表以查找哪些 descriptor 被内核标记为 active 状态。
可见,poll() select() 低效的根源在于:
1。内核不能记录每个 application 所关注的 descriptor 列表,只能靠调用时,通过参数传入。如果内核能记录这些信息,再次调用时,就不需要传递 descriptor 列表了。
2。内核每次都返回完整的 descriptor 列表。如果只返回 actived descriptors,岂不是更好。
3. 设计目标
设计目标1:在处理几千个 descriptors 时,高效、可扩展;
设计目标2:make the system flexible(不解)。
基于 UNIX 的系统缺乏健壮的 event notification 处理机制。poll() select() 接口局限于 socket 和 pipe 这两种 descriptor,以致我们无法等待其他类型的 events,例如文件的创建和删除。若要监测其他类型的 events,只能使用其他接口 (必须使用 siginfo 和 family 来获取 notification of signal events, 调用 aiowait 来判断 if an AIO call has completed)。
设计目标3:保持接口简单,易于理解,并且便于将基于 poll() select() 的应用使用新 API 改写。
增加接口的返回信息。例如,对于 readable sockets,我们有时同样想知道 how many bytes are actually pending in the socket buffer in order to avoid multiple read() calls.
level-triggered.
4. Kqueue API
int kqueue(void)
int kevent(int kq,
const struct kevent *changelist, int nchanges,
struct kevent *eventlist, int nevents,
const struct timespec *timeout)
struct kevent {
uintpt_t ident; // identifier for event
short filter; // filter for event
u_short flags; // action flags for kq
u_int fflags; // filter flag value
intptr_t data; // filter data value
void *udata; // opaque identifier
}
EV SET(&kev, ident, filter, flags, fflags, data, udata)
kqueue API 引入了两个新的系统接口,如上所示。kqueue 接口创建一个新的 kqueue,它是一个 notification channel, 或者 queue。应用程序可以在其上 register 关注的 events,同时用来接收来自 kernel 的 events。kqueue() 的返回值可以作为一个普通的 descriptor 来处理,可以被传入 poll(), select(), 甚至 registered in another kqueue.
kevent 接口被应用程序用来 register 新的 events with the kqueue, 并接收任何 pending events。
分享到:
相关推荐
Tornado-Hail-gh-pages-源码.rar
资源分类:Python库 所属语言:Python 资源全名:tornado_widgets-0.0.31-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:tornado-redis-session-0.1.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python库。 资源全名:tornado_sqlalchemy-0.1.1-py3-none-any.whl
tornado-6.1-cp38-cp38-win32
资源来自pypi官网。 资源全名:tornado_sqlalchemy-0.2.0-py3-none-any.whl
首先,"tornado-4.5.2-cp36-cp36m-win_amd64"这个标题暗示了我们正在处理的是Tornado的4.5.2版本,它是为Python 3.6编译的,并且适用于64位Windows操作系统(AMD64架构)。这表明该框架已经过精心优化,能够充分利用...
标题中的"tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl"是一个针对Python 3.6版本的Tornado 6.1的预编译 wheel 包,适用于多平台(manylinux1)的64位x86系统。这个whl文件是一个可直接安装的二进制格式,使得用户...
资源分类:Python库 所属语言:Python 资源全名:tornado_rest_easy-0.1-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
tornado-6.0.3-cp38-cp38-win_amd64.whl官网下载很慢,把自己下载的一些上传给大家下载,速度更快。
该开源项目是一款基于Tornado和QTornado(本人独立开发的Tornado衍生版本)构建的通知器框架源码,包含254个文件,涵盖117个JavaScript文件、70个LESS样式文件、16个CSS文件、10个JPG图片文件、10个HTML文件、5个...
Tornado 是一个高性能的Python Web服务器和异步网络库,特别适合处理大量的并发连接,如Websocket和长轮询。Tornado 使用非阻塞I/O模型,使其在高并发场景下表现出色。在本项目中,Tornado 作为后端服务器,负责处理...
tornado-6.1-cp36-cp36m-win32
tornado-6.1-cp310-cp310-win_amd64
tornado-6.0.4-cp39-cp39-win_amd64
tornado-6.1-cp38-cp38-win_amd64