标签: kqueue

select,epoll,kqueue和evport之间的根本区别是什么?

我最近在读Redis.Redis实现了一个基于I/O多路复用的简单事件驱动库.Redis表示会选择系统支持的最佳多路复用,并提供以下代码:

/* Include the best multiplexing layer supported by this system.
 * The following should be ordered by performances, descending. */
#ifdef HAVE_EVPORT
#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
Run Code Online (Sandbox Code Playgroud)

我想知道他们是否有基本的性能差异?如果是这样,为什么?

最好的祝福

unix epoll kqueue multiplexing redis

4
推荐指数
1
解决办法
1628
查看次数

如何在cocoa中获取文件夹更改通知(文件夹观察者)

我是Cocoa Application开发的新手.我希望在修改给定目录下的任何文件时(文件夹观察者)通知我的应用程序.修改意味着删除,添加,文件内容被更改.我尝试使用FSEvents也使用NSWorkspace的通知中心或委托消息,如在UKKQueue中http://www.zathras.de/angelweb/sourcecode.htm#UKKQueue.我的应用程序在目录下的任何文件被修改时收到通知.但问题是它没有给出修改后的特定文件的名称或路径.它给出了目录的路径,但没有给出特定文件的路径.

不知道如何在特定文件中查看文件夹进行修改?

cocoa filesystemwatcher fsevents kqueue

3
推荐指数
2
解决办法
4760
查看次数

是否可以使用 select() 轮询 kqueue 的文件描述符?

当你创建一个 kqueue 时,kqueue()你会得到一个文件描述符。但看来这个文件描述符不能用 进行有意义的轮询select()。我知道轮询/读取 a 的标准kqueue()方法是 withkevent(...)但我正在尝试与一些使用select().

这里的目标是能够触发可以通过select基于此的轮询机制检测到的“用户事件”(即使该事件最终需要kevent()稍后使用“消耗”)。EVFILT_USER这看起来像是天生要做的事情,但快速实验表明select(),当在 kqueue 中添加(并触发)事件时,不会将 kqueue 的 fd 报告为已准备好读取,它只是超时(或阻塞)永远)。(但是等效的kevent()调用确实看到/返回该事件。)

难道我做错了什么?或者是不可能用 轮询 kqueue 的 fd select()

macos select freebsd kqueue

3
推荐指数
1
解决办法
992
查看次数

使用select,epoll或kqueue提供大文件

Nginx使用epoll或其他多路复用技术(select)来处理多个客户端,即不像apache那样为每个请求生成一个新线程.

我尝试使用select在我自己的测试程序中复制相同的内容.我可以通过创建一个非阻塞套接字并使用select来决定服务哪个客户端来接受来自多个客户端的连接.我的程序只是将它们的数据回显给它们.它适用于小数据传输(每个客户端一些字节)

当我需要通过连接发送大文件到客户端时,会出现问题.由于我只有一个线程为所有客户端服务,直到我读完文件并将其写入套接字时,我无法恢复为其他客户端服务.

是否有针对此问题的已知解决方案,或者最好是为每个此类请求创建一个线程?

select epoll nginx kqueue

2
推荐指数
1
解决办法
7409
查看次数

对EVFILT_USER使用kqueue

我很难理解如何将kqueue用于用户空间事件。
我寻找2个用例。
用例1:手动重置事件
用例2:自动重置事件

我想我了解如何使用kqueue()和kevent(),但是我不清楚传递给kevent()的事件如何查找相关操作:
让有一个名为“ event”的结构kevent变量。
让我们假设,我们没有问题找到一个新的事件ID,该事件ID与该kqueue实例的其他事件ID不冲突,名为“ eventId”。

  1. 创建用户事件:EV_SET(&event,eventId,EVFILT_USER,EV_ADD,NOTE_FFNOP,0,NULL)
  2. 销毁用户事件:EV_SET(&event,eventId,EVFILT_USER,EV_DESTROY,NOTE_FFNOP,0,NULL)
  3. 设置用户事件:EV_SET(&event,eventId,EVFILT_USER,?????,NOTE_FFNOP,0,NULL)
  4. 重置用户事件:EV_SET(&event,eventId,EVFILT_USER,?? EV_CLEAR ???,NOTE_FFNOP,0,NULL)
  5. 脉冲用户事件:EV_SET(&event,eventId,EVFILT_USER,0,NOTE_TRIGGER,0,NULL)
  6. 在等待循环中,我认为片段会出现:if(event.filter == EVFILT_USER && event.ident == eventId){//这是我的事件!做点什么!}

看到了吗?在上面的EV_SET()调用中查看我需要帮助的地方。
对于用例1(手动重置事件),与用例2(自动重置事件)相比,操作(1)创建看上去可能有所不同。
操作(3)和(4)我完全处于黑暗中。这些可能需要EV_ENABLE / EV_DISABLE吗?EV_CLEAR安装在哪里?
到目前为止,我认为除了“调度”之外,我不需要执行任何操作(6)。我非常肯定,操作(5)可以像我上面给出的那样工作。

我现在花了一天的时间来尝试查找说明如何完成工作的文档或样本。我在苹果代码库中找到了一个kqueue测试程序,但我对此表示怀疑。同样,它在测试中仅发送1个事件,并且该事件终止接收线程的循环。因此,这无助于我了解2个用例的详细信息。

我打算现在在x86机器上的FreeBsd 9.1下使用它。

freebsd kqueue

2
推荐指数
1
解决办法
2296
查看次数

NIO 选择器默认使用事件通知吗?

我发现这篇文章说 OpenJDK 在 Linux 上使用 epoll,但是有人知道 Selector 实现是否使用 kqueue、dev/poll 等而不是传统的轮询(如果可用)?

java events nio kqueue

1
推荐指数
1
解决办法
867
查看次数

修改文件内的目录时kqueue不会触发

我使用kquque来监控桌面:

  • flags - EV_ADD | EV_CLEAR
  • fflags - NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE
  • filter - EVFILT_VNODE

但是,当我.js使用sublime2软件在桌面上编辑文件时,它不会触发通知:(

请指教

这是我的js-ctypes代码:

var rez_fd = ostypes.API('kqueue')();
console.info('rez_fd:', rez_fd.toString(), uneval(rez_fd));
if (ctypes.errno != 0) {
    throw new Error('Failed rez_fd, errno: ' + ctypes.errno);
}

this.kq = rez_fd;
this.path = OS.Constants.Path.desktopDir;

// Open a file descriptor for the file/directory that you want to monitor.
var event_fd = ostypes.API('open')(this.path, OS.Constants.libc.O_EVTONLY);
console.info('event_fd:', event_fd.toString(), uneval(event_fd));
if (ctypes.errno != …
Run Code Online (Sandbox Code Playgroud)

c macos bsd kqueue

0
推荐指数
1
解决办法
750
查看次数

标签 统计

kqueue ×7

epoll ×2

freebsd ×2

macos ×2

select ×2

bsd ×1

c ×1

cocoa ×1

events ×1

filesystemwatcher ×1

fsevents ×1

java ×1

multiplexing ×1

nginx ×1

nio ×1

redis ×1

unix ×1