首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏程序那些事

    高级IO模型之kqueue和epoll

    kqueue kqueue和epoll一样,都是用来替换select和poll的。 不同的是kqueue被用在FreeBSD,NetBSD, OpenBSD, DragonFly BSD, 和 macOS中。 kqueue 不仅能够处理文件描述符事件,还可以用于各种其他通知,例如文件修改监视、信号、异步 I/O 事件 (AIO)、子进程状态更改监视和支持纳秒级分辨率的计时器,此外kqueue提供了一种方式除了内核提供的事件之外 kqueue提供了两个API,第一个是构建kqueue: int kqueue(void); 第二个是创建kevent: int kevent(int kq, const struct kevent * 和kqueue的优势 epoll和kqueue之所以比select和poll更加高级, 是因为他们充分利用操作系统底层的功能,对于操作系统来说,数据什么时候ready是肯定知道的,通过向操作系统注册对应的事件

    86120编辑于 2022-03-21
  • 来自专栏用户9199536的专栏

    System|多路复用IO|Kqueue事件通知

    Kqueue和其他的多路复用IO的核心是,单消费者同时监听不同种类的生产者,从而提供高性能的单线程IO,减少调度开销。而Kqueue通过在内核态维持状态提供了更高的性能。 因此Kqueue的机制就在于内核中维持一个队列储存状态。 如果事件触发则激活,通过knote找到其所属的kqueue,并且将knote加入kqueue的active链末尾。 Miscellaneous Notes 1.论文的版本fork的时候不复制kqueue的df除非vfork。如果复制的话需要在fork时进行整个kqueue复制或者标记为COW。 总结 精妙之处在于kqueue维持在内核中,因此socket如果满了可以直接将knote加入进程kqueue的活跃链,而不需要等到下次syscall的时候再检查。

    84430发布于 2021-11-22
  • 来自专栏F-Stack的专栏

    F-Stack之kqueue封装为epoll介绍

    F-Stack中使用的FreeBSD协议栈的高性能异步事件通知的API是kqueue,而Linux系统上则是我们熟悉的epoll,大量的Linux网络server都是基于epoll事件通知机制,为降低已有服务器接入 F-Stack的修改难度,F-Stack协议栈实现了把kqueue封装为epoll接口,提供的API如下: int ff_epoll_create(int size):创建epoll fd,底层实际调用 FreeBSD协议栈的kern_kqueue()接口 int ff_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event):epoll evlist, M_DEVBUF); return ret; } ff_epoll_wait()的核心就是struct kevent结构和struct epoll_event的转换,把kqueue

    2.3K110发布于 2018-01-31
  • 来自专栏F-Stack的专栏

    F-Stack 之 kqueue 封装为 epoll 介绍

    F-Stack中使用的FreeBSD协议栈的高性能异步事件通知的API是kqueue,而Linux系统上则是我们熟悉的epoll,大量的Linux网络server都是基于epoll事件通知机制,为降低已有服务器接入 F-Stack的修改难度,F-Stack协议栈实现了把kqueue封装为epoll接口,提供的API如下:: int ff_epoll_create(int size): 创建epoll fd,底层实际调用 freebsd协议栈的kern_kqueue()接口 int ff_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event): epoll free(evlist, M_DEVBUF); return ret; } ff_epoll_wait()的核心就是struct kevent结构和struct epoll_event的转换,把kqueue

    3.9K10发布于 2017-06-12
  • 来自专栏我是攻城师

    各种IO复用模式之select,poll,epoll,kqueue,iocp分析

    下面我们来看下select,poll,epoll,kqueue,iocp分别属于那种模型: select,poll属于第三种IO复用模型,iocp属于第5种异步io模型,那么epoll和kqueue呢? 那么epoll,kqueue为什么比select和poll高级呢? epoll和kqueue是更先进的IO复用模型,其也没有最大连接数的限制(1G内存,可以打开约10万左右的连接),并且仅仅使用一个文件描述符,就可以管理多个文件描述符,并且将用户关系的文件描述符的事件存放到内核的一个事件表中 模型,目前很少有支持asynchronous I/O的系统,即使windows上的iocp非常出色,但由于其系统本身的局限性和微软的之前的闭源策略,导致主流市场大部分用的还是unix系统,与mac系统的kqueue 和linux系统的epoll相比,iocp做到了真正的纯异步io的概念,即在io操作的第二阶段也不阻塞应用程序,但性能好坏,其实取决于copy数据的大小,如果数据包本来就很小,其实这种优化无足轻重,而kqueue

    8.6K11发布于 2018-12-17
  • 来自专栏Rust语言学习交流

    【Rust日报】 2020-1-16 用 Rust 来诠释 Epoll, Kqueue 和 IOCP

    用 Rust 来诠释 Epoll, Kqueue 和 IOCP 这其实是一本书,旨在说明 Epoll,Kqueue 和 IOCP 的工作原理,我们可以将其用于高效率、高性能的 I/O。 其中一些实现将会使用 rust,原文地址:https://cfsamsonbooks.gitbook.io/epoll-kqueue-iocp-explained/ 扩展阅读:Green Threads Explained in 200 Lines of Rust reddit 上参与讨论:https://www.reddit.com/r/rust/comments/ephm4t/epoll_kqueue_and_iocp_explained_with_rust

    1.2K10发布于 2020-02-20
  • 来自专栏吊打面试官

    腾讯1面:epoll不支持文件IO,kqueue为什么支持

    腾讯面试:epoll不支持文件IO,kqueue为什么支持一、背景面试官:提问谈谈你对kqueue理解?小义:这个范围太广了,如何缩小回答范围呢? 相比之下,FreeBSD 及其衍生系统中的 kqueue 机制不仅支持网络 I/O,还支持对本地文件的监控。 所以kqueue可以支持磁盘io。它相当于托管了整个磁盘IO操作,做到让磁盘io看上去是“非阻塞”的。 https://people.freebsd.org/~jlemon/papers/kqueue.pdf文档: kqueue, kevent -- kernelevent notification mechanismEVFILT_AIO​​ ​​将 AIO 操作的生命周期注入 kqueue 事件流​​,通过三个核心步骤完成:​​注册绑定​​:将 aiocb 地址作为事件标识关联到 kqueue。 ​​

    22800编辑于 2025-07-25
  • 来自专栏四楼没电梯

    IO 多路复用:`select`、`poll`、`epoll` 和 `kqueue` 的区别与示例

    在 UNIX/Linux 和 BSD 系统中,select、poll、epoll、kqueue 都是实现 I/O 多路复用的系统调用。它们各有特点,适合不同的应用场景。 4. kqueue 概述 kqueue 是 BSD 系统(包括 macOS)中的高效 I/O 事件通知机制。与 epoll 类似,kqueue 使用事件通知的机制来避免每次遍历整个文件描述符集合。 stdlib.h> #include <sys/event.h> #include <sys/time.h> #include <unistd.h> int main() { int kq = kqueue (); struct kevent change, event; int ret; if (kq == -1) { perror("kqueue"); 总结 特性 select poll epoll kqueue 支持的平台 Unix/Linux/BSD Unix/Linux/BSD Linux BSD/macOS 文件描述符限制 有限制(1024)

    75510编辑于 2024-10-12
  • 来自专栏吊打面试官

    腾讯一面:epoll不支持文件IO,kqueue怎么做到的!

    https://people.freebsd.org/~jlemon/papers/kqueue.pdf 文档: kqueue, kevent -- kernel event notification kqueue.pdf 第6章节描述 EVFILT_AIO 的实现本质是 将 AIO 操作的生命周期注入 kqueue 事件流,通过三个核心步骤完成: 注册绑定:将 aiocb 地址作为事件标识关联到 kqueue Kqueue 会将活跃列表中的 knote 信息(以 kevent 结构的形式)拷贝回用户空间。 Kqueue 机制本身是在内核态实现的,不在用户态实现。 *s\n", bytes_read, (int)bytes_read, ctx->buffer); } int main() { int kq = kqueue(); // 创建 kqueue 这种模型符合Linux“机制与策略分离”的设计原则——内核提供基础能力,具体操作由用户态控制 完成通知(kqueue模型) kqueue支持完成通知:内核直接执行I/O操作(如磁盘数据读入内存),完成后通过事件

    47710编辑于 2025-08-15
  • 来自专栏小工匠聊架构

    Netty - 五种 IO 多路复用机制 select、poll、epoll、kqueue、iocp(windows) 对比

    Pre 高性能网络编程 - select、 poll 、epoll 、libevent select、poll、epoll、kqueue、iocp(windows) 这里我将对比一下常见的多路复用技术: select、poll、epoll、kqueue 和 IOCP(Windows)。 kqueue: 优点: 适用于 BSD 系统(如 macOS、FreeBSD 等),效率较高。 支持水平触发和边缘触发两种模式。 提供了更好的扩展性和性能。 综上所述,select 和 poll 在大规模连接场景下性能较差,而 epoll 和 kqueue 则具有更好的性能和扩展性,其中 epoll 更适用于 Linux 平台,而 kqueue 则适用于 BSD

    1K00编辑于 2024-05-26
  • 来自专栏OpenLinyou

    OpenSocket是Linux和安卓用epoll、Win32用IOCP、iOS和Mac用kqueue的高性能网络库

    Linux和安卓用epoll,Win32用IOCP,iOS和Mac用kqueue,其他系统使用select。结合OpenThread使用,可以轻轻构建在任意平台(包括移动平台)构建高性能并发服务器。

    1.7K00编辑于 2023-03-09
  • 来自专栏程序那些事

    netty系列之:kequeue传输协议详解

    ,通过简单的替换和添加对应的依赖包,我们可以轻松的将普通的NIO netty服务替换成为native的Kqueue服务。 另外在使用KQueueEventLoopGroup之前我们还需要确保Kqueue在系统中是可用的,这个判断是通过调用KQueue.ensureAvailability();来实现的。 ,则说明kqueue在native方法中存在,我们可以继续使用了。 和KQueueEventLoopGroup一样,KQueueEventLoop也需要判断当前的系统环境是否支持kqueue: static { KQueue.ensureAvailability BUSY_WAIT是一个非阻塞的IO PULL,kqueue并不支持,所以会fallback到SELECT。

    61710编辑于 2022-07-04
  • 来自专栏二进制文集

    Redis 源码简洁剖析 08 - epoll

    include "ae_evport.c" #else #ifdef HAVE_EPOLL #include "ae_epoll.c" #else #ifdef HAVE_KQUEUE #include "ae_kqueue.c" #else #include "ae_select.c" #endif #endif #endif 从代码中可看到,有 epoll 就会使用 epoll(Linux);没有的话则会使用 kqueue(MacOS)或 select(Windows)。 源码分析 由于我的开发环境是 Mac,所以分析 ae_kqueue.c 文件。在 Linux 系统下可以分析 ae_epoll.c 文件。 kqueue 的详细介绍:Kernel Queues and Events。

    61320编辑于 2022-03-24
  • 来自专栏程序那些事

    深入探讨I/O模型:Java中的阻塞和非阻塞和其他高级IO应用

    epoll,kqueue和pollepoll, kqueue, 和 poll 是用于事件驱动编程的系统调用,通常用于处理 I/O 多路复用(I/O multiplexing)的任务。 在大多数情况下,epoll 和 kqueue 也是更高性能的替代方案,特别适用于大规模并发的应用。为什么epoll,kqueue比select高级? epoll 和 kqueue 比 select 高级的原因在于它们在处理高并发I/O时具有更好的性能和扩展性。 epoll 和 kqueue 的事件通知机制减少了不必要的系统调用,从而提高了性能。 这使得 epoll 和 kqueue 更灵活,适用于更多的应用场景。

    50120编辑于 2023-10-20
  • 来自专栏方亮

    libev源码解析——I/O模型

    kqueue模型。对应的文件是ev_kqueue.c。 iocp模型。即IO完成端口模型(I/O Completion Port)。         这些模型并不是我们这个系列介绍的重点。 backend && (flags & EVBACKEND_PORT )) backend = port_init (EV_A_ flags); #endif #if EV_USE_KQUEUE backend && (flags & EVBACKEND_KQUEUE)) backend = kqueue_init (EV_A_ flags); #endif #if EV_USE_EPOLL #endif #if EV_USE_PORT if (backend == EVBACKEND_PORT ) port_destroy (EV_A); #endif #if EV_USE_KQUEUE if (backend == EVBACKEND_KQUEUE) kqueue_destroy (EV_A); #endif #if EV_USE_EPOLL if (backend == EVBACKEND_EPOLL

    1.4K10发布于 2019-01-16
  • 来自专栏用户9199536的专栏

    System|网络|packet的一生

    tcp_v4_rcv执行包头检查,tcp_v4_lookup查询对应的socket和connection,如果正常,tcp_prequeue将skb放进socket接收队列 socket随即唤醒所在的进程 Kqueue 因为epoll没有论文,就说说kqueue是怎么做的吧,kqueue会根据socket绑定的knote链表(每个监听的kqueue都可能创建一个knote),将knote通过反向指针获得kqueue, 将knote加入kqueue的就绪队列末尾。 如果此时恰好有进程正在监听的话,将会唤醒进程,kqueue会被扫描,并从就绪队列处获得所有的event,从而了解已经就绪的所有socket。

    32420发布于 2021-11-22
  • 来自专栏原创分享

    nginx0.1.0之event模块初始化源码分析(2)

    ngx_epoll_conf_t)), NGX_CONF_ERROR); epcf->events = NGX_CONF_UNSET; return epcf; } kqueue static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle) { ngx_kqueue_conf_t *kcf; ngx_test_null (kcf, ngx_palloc(cycle->pool, sizeof(ngx_kqueue_conf_t)), NGX_CONF_ERROR); kcf

    52440发布于 2019-03-06
  • 来自专栏程序那些事

    深入探讨I/O模型:Java中的阻塞和非阻塞和其他高级IO应用

    epoll,kqueue和poll epoll, kqueue, 和 poll 是用于事件驱动编程的系统调用,通常用于处理 I/O 多路复用(I/O multiplexing)的任务。 在大多数情况下,epoll 和 kqueue 也是更高性能的替代方案,特别适用于大规模并发的应用。 为什么epoll,kqueue比select高级? epoll 和 kqueue 使用基于事件的机制,不会受到文件描述符数量的限制,因此适用于高并发场景。 epoll 和 kqueue 的事件通知机制减少了不必要的系统调用,从而提高了性能。 这使得 epoll 和 kqueue 更灵活,适用于更多的应用场景。

    47430编辑于 2023-10-25
  • 来自专栏Java项目实战

    分布式服务基础知识(二)

    在Linux系统中,有多种事件驱动机制可供选择,其中epoll和kqueue是比较常用的两种。下面分别介绍一下如何使用epoll或kqueue来监视Redis的文件描述符。 2.kqueue机制kqueue是Linux内核提供的一种高效的I/O多路复用机制,可以同时监视多个文件描述符的变化。与epoll相比,kqueue具有更好的兼容性和更低的延迟。 具体步骤如下:(1)创建kqueue对象:使用kqueue_create函数创建一个kqueue对象,指定要监视的文件描述符范围。 (2)注册文件描述符:使用kqueue_ctl函数将需要监视的文件描述符添加到kqueue对象中。(3)处理事件:当文件描述符发生变化时,会触发kqueue_wait函数等待事件的发生。 使用epoll或kqueue等事件驱动机制来监视Redis的文件描述符可以提高系统的性能和可靠性。需要注意的是,在使用这些机制时,需要根据具体的应用场景和系统配置进行调整和优化。

    33020编辑于 2023-04-28
  • 来自专栏Java项目实战

    分布式服务基础知识

    在Linux系统中,有多种事件驱动机制可供选择,其中epoll和kqueue是比较常用的两种。下面分别介绍一下如何使用epoll或kqueue来监视Redis的文件描述符。 2.kqueue机制kqueue是Linux内核提供的一种高效的I/O多路复用机制,可以同时监视多个文件描述符的变化。与epoll相比,kqueue具有更好的兼容性和更低的延迟。 具体步骤如下:(1)创建kqueue对象:使用kqueue_create函数创建一个kqueue对象,指定要监视的文件描述符范围。 (2)注册文件描述符:使用kqueue_ctl函数将需要监视的文件描述符添加到kqueue对象中。(3)处理事件:当文件描述符发生变化时,会触发kqueue_wait函数等待事件的发生。 使用epoll或kqueue等事件驱动机制来监视Redis的文件描述符可以提高系统的性能和可靠性。需要注意的是,在使用这些机制时,需要根据具体的应用场景和系统配置进行调整和优化。

    26200编辑于 2023-07-23
领券