主要看一下 Kqueue 的原理
翻译自 (Kqueue: A generic and scalable event notification facility) 这篇论文
概要
在 Unix 平台下,当 socket 或者其他的 descriptor 状态发生变化时,相关的应用应该收到通知。过去是通过系统调用 select() 和 poll() 来实现的。
但是,事实证明,在大量 descriptor 的情况下,这两种机制性能低下。
除了性能问题,这两种实现在功能上也不能满足需求。例如,不能处理以下事件:signals, file system changes, AIO completions.
于是,Kqueue 应运而生。它允许应用程序响应一系列不同的事件种类,并且更加高效。同时,可以做到在不修改应用程序接口的情况下,响应未来可能出现的新的事件种类。
1 介绍
应用程序通常是 event driven,也就是来一个事件,处理一个事件。所以,通常应用程序的性能取决于检测和响应这些事件的效率。
FreeBSD 提供了两个系统调用来监测 file descriptor 的动态,即 poll() and select()。但是,在大量 file descriptor 需要监控的情况下,这两个家伙都不够给力。有互联网服务端开发经验的兄弟都知道,服务器通常需要同时处理几千个请求,即监控几千个 descriptor。所以,这两个家伙便成了性能瓶颈。
应用程序需要监测的事件,并不局限于 activity on an open file descriptor. 应用程序同样需要能够监测到 when an asynchronous I/O (AIO) request completes, when a signal is delivered to the application, when a file in the filesystem changes in some fashion, or when a process exits. 而 poll() select() 无法监测这些事件,于是我们就需要大量的额外代码来处理这些问题,增加了代码的复杂度。
Kqueue 则允许应用程序 register its interest in a specific event, 并且稍候高效地收集 the notification of the event. 同时,除了上面列出的事件类型,还能够监控未来可能出现的新的事件类型(在不修改现有 API 的情况下)。
2 问题
poll() select() 的缺陷在于,对于每次调用,都需要传入完整的 descriptor 列表。这将迫使系统执行两次内存拷贝 across the uesr/kernel boundary, 占用大量内存。对于需要监控几千个 descriptor 的情况,实践证明,通常只有 a few hundred actually have any activity, 造成 95% 的拷贝操作都是不必要的。
监控的结果返回之后,应用程序需要遍历整个 descriptor 列表, 以寻找那些被 kernel 标记为 having activity 的。既然 kernel 已经知道 which descriptor were active,这就意味着做了重复的工作。更高效的方法是,kernel 只返回 a list of descriptor that it knows is active. 遍历列表的复杂度是 O(N), 当 N 变得非常大时,性能就会很差。
在 kernel 内部,情况也非常糟糕。kernel 必须分配空间来存放 descriptor 列表;对于较大的列表,往往是通过 malloc() 来实现,并且在返回结果之前,这部分空间必须释放掉。
// ===== 原文第二部分的余下论述,我实在不能理解,需要再查一下其他的资料 =====
分享到:
相关推荐
8. **源码调试技巧**:介绍如何阅读和理解Tornado源码,以及使用Python调试工具进行源码调试的方法。 总之,这篇文章对于想深入了解Tornado框架,特别是其HTTP服务器实现的开发者来说,是一份宝贵的资源。通过源码...
《深入剖析Tornado 1.2.0源码:揭示Web服务器的秘密》 Tornado,一个轻量级、高性能的Python Web服务器框架,以其异步非阻塞I/O模式著称,尤其适用于处理大量并发连接。本文将深入探讨Tornado 1.2.0版本的源码,...
tornado作为用户产品后台服务器核心框架 redis 保存session数据、短时间房源信息、地域信息等,保存页面缓存数据,提高服务器响应速度 采用前后端完全分离架构,采用ajax异步调用、json数据传输,使后端接口可以...
在"python+tornado开发的实例源码"中,我们可以学习到以下几个关键知识点: 1. **Python基础**:Python是一种高级编程语言,以其简洁明了的语法和丰富的标准库而闻名。在Tornado应用中,你需要了解Python的基本语法...
【Tornado 源代码详解】 ...同时,阅读源码也是学习 Python 异步编程和网络编程的宝贵资源。通过分析 Tornado 如何处理请求、管理事件循环、以及实现非阻塞 I/O,开发者可以提升自己在相关领域的技能。
【千锋教育 Tornado网课笔记】是一份深入学习Python Web开发框架Tornado的重要参考资料,由千锋教育提供。这份笔记结合了理论讲解与实践应用,旨在帮助学习者全面掌握Tornado框架的核心概念和实际应用技巧。Tornado...
tornado作为web框架和异步网络库,代码量过多,因此在分析tornado源码时,可以选择一些比较重要的模块来阅读,方式:current.py,gen.py,tcpserver.py,httpserver.py,ioloop .py,iostream.py,web.py等 ...
Tornado和VxWorks学习笔记, 包括Tornado和VxWorks的一些基础知识, 实际应用
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 ...
这个特定的源码是基于Python编程语言实现的,利用了Tornado框架,一个轻量级且高效的异步网络库。下面将详细介绍这个系统可能包含的关键知识点和相关技术。 首先,Python是当今最流行的编程语言之一,尤其在数据...
第二章前端基础 1、html&css;基础 2、html&css;提升 3、JavaScript基础 4、JavaScript提升 5、JavaScript进阶与轮播和飞机大战坦克 6、JQuery基础 7、JQuery提升 8、H5C3基础 第三章 Django 1、Django基本流程走通 ...
《Tornado 2.2.2内核源码解析》 Tornado 2.2.2是VxWorks操作系统的一个重要版本,对于嵌入式开发人员来说,深入理解其内核源码对于优化系统性能、解决运行时问题以及进行定制化开发具有极大的价值。本文将对Tornado...
3. **编译与链接**:使用Tornado内置的编译器进行源码编译,通过链接器生成可执行映像文件。 4. **目标板配置**:设置目标板连接参数,如串口波特率、IP地址等。 5. **下载与调试**:通过仿真器或实际硬件将映像文件...
手动安装可以通过下载tornado-x.x.tar.gz源码包,然后通过标准的Python源码包安装步骤来完成安装。 在Tornado的官方文档中,提供了一个简单的“Hello, World”示例程序,这个例子展示了如何使用Tornado创建一个基础...
基于tornado的BBS问答社区源码 计算机语言:python 授权模块: * 登陆 * 注册 * 注销 * 验证码 问题模块: * 问题列表 * 问题分页 * 问题创建 * 问题上传图片 * 问题删除 * 问题详情 * 问题搜索 * 问题过滤 [最新...
基于python的+tornado框架实现的一个项目管理系统源码.zip 基于python的+tornado框架实现的一个项目管理系统源码.zip 基于python的+tornado框架实现的一个项目管理系统源码.zip
### Tornado 4.0.1 Python Framework Guide #### 用户指南 **1.1 引言** Tornado 是一个开源的 Python Web 框架,它以非阻塞的方式处理大量的并发连接,使得服务器能够高效地处理每一个客户端请求。Tornado 4.0.1...
通过阅读和分析这些源码,你可以了解如何在实际项目中构建Web应用,包括路由设置、请求处理、模板渲染以及数据库操作等。Tornado的异步特性使得它在处理高并发请求时表现出色,源码分析将帮助你理解如何利用这个特性...
Tornado是一款高性能、异步网络库,最初由FriendFeed团队开发,后来被Facebook收购并开源。...对于希望深入了解Tornado的人来说,阅读官方文档和源码,参与社区讨论,以及实践开发项目都是极好的学习途径。