首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

linux新的API signalfd、timerfd、eventfd使用说明

c=article&a=read&id=46555 注意很多当前(2013/8/6)线上运营的Linux内核可能不支持!...三种新的fd加入linux内核的的版本: signalfd:2.6.22 timerfd:2.6.25 eventfd:2.6.22 三种fd的意义: signalfd...eventfd:实现了线程之间事件通知的方式,eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中...it_interval; /* Interval for periodic timer */ struct timespec it_value; /* Initial expiration */ }; eventfd...涉及API: #include int eventfd(unsigned int initval, int flags); 创建一个eventfd,这是一个计数器相关的fd,计数器不为零是有可读事件发生

1.7K30

关于eventfd,epoll,线程间通信小记

先介绍eventfd 1 #include 2 int eventfd(unsigned int initval, int flags); 使用这个函数来创建一个事件对象,...linux线程间通信为了提高效率,大多使用异步通信,采用事件监听和回调函数的方式来实现高效的任务处理方式(虽然会将逻辑变得复杂)。...linux内核会为这个事件对象维护一个64位的计数器(uint64_t).并在初始化时用传进去的initval来初始化这个计数器,然后返回一个文件描述符来代表这个事件对象。...线程B:对eventfd进行Epoll监听,回调函数的功能是对eventfd的计数器读数据出来并将结果进行分发。 用例1:外部单个客户端每隔1秒向线程A发送一个请求。...用例1结果:线程A正确处理请求,并将结果写入eventfd中,线程B及时从eventfd中读取出请求处理结果,并正确分发给其他线程。 用例2:外部单个客户端连续向线程A发送多个请求。

2.1K70

从内核看eventfd的实现(基于5.9.9)

前言:eventfd是一种进程/线程通信的机制,他类似信号,不过eventfd只是一种通知机制,无法承载数据(eventfd承载的数据是8个字节),他的好处是简单并且只消耗一个fd。...1 创建eventfd SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags){ return do_eventfd(count,...flags);} SYSCALL_DEFINE1(eventfd, unsigned int, count){ return do_eventfd(count, 0);} 内核支持两个版本的eventfd...(ctx); return fd;} do_eventfd主要是创建了一个eventfd_ctx结构体并初始化。...后记:我们看到eventfd的实现相对是比较简单的,多个进程/线程通过fd指向同一个file,然后file关联一个eventfd_ctx。多个进程/线程通过这个共同的eventfd_ctx实现通信。

68650

聊聊BIO,NIO和AIO (2)

Linux下实际使用比较多的是Linux AIO。 Linux AIO Linux中的另外一套AIO接口被称为Linux AIO,是Linux在内核实现的一套AIO接口。这套是"真・AIO"。...Linux提供了eventfd解决这个问题。 使用eventfd协调epoll和Linux AIO 如果在Linux下编写一个高性能文件服务器,就需要同时用到epoll和Linux AIO。...eventfd能协调epoll和Linux AIO是因为: epoll支持监听eventfd,并且 Linux AIO中被提交的events如果完成,就会触发eventfd,于是监听该eventfd的epoll...就能察觉到 这样对于同时使用eventfdLinux AIO的程序就可以把阻塞点统一到epoll_wait上。...这时需要借助eventfd。POSIX AIO并不支持eventfd,所以虽然有这么套接口,但是一般没机会用。 Linux AIO只支持Direct IO,所以无法利用Page Cache。

1.3K20

聊聊BIO,NIO和AIO (2)磁盘IO磁盘IO的优化AIO反思AIO

Linux下实际使用比较多的是Linux AIO。 Linux AIO Linux中的另外一套AIO接口被称为Linux AIO,是Linux在内核实现的一套AIO接口。这套是"真・AIO"。...Linux提供了eventfd解决这个问题。 使用eventfd协调epoll和Linux AIO 如果在Linux下编写一个高性能文件服务器,就需要同时用到epoll和Linux AIO。...eventfd能协调epoll和Linux AIO是因为: epoll支持监听eventfd,并且 Linux AIO中被提交的events如果完成,就会触发eventfd,于是监听该eventfd的epoll...就能察觉到 这样对于同时使用eventfdLinux AIO的程序就可以把阻塞点统一到epoll_wait上。...这时需要借助eventfd。POSIX AIO并不支持eventfd,所以虽然有这么套接口,但是一般没机会用。 Linux AIO只支持Direct IO,所以无法利用Page Cache。

3.9K90

网络编程小结

IO复用里,最简单的应该就是select了吧,select是同步IO复用机制 这个操作在Windows下和Linux下都支持。使用上基本一样,但是还是有一点点小区别。...再接下来就是epoll和kqueue了,这两个也都是同步IO复用,但是他们是基于事件的,Linux里有epoll,FreeBSD里有kqueue 他们都是向系统注册关系的事件,然后系统在事件发生是返回...并且其内部的数据是mmap进内核态的,就少了一次拷贝 epoll和kqueue主要部分是一样的,性能相差也不大 使用epoll的时候,还可以一起使用一个linux内核里比较新的东西,eventfd。...并且read时如果eventfd里的计数为0,操作就会阻塞。在释放的时候,一个eventfd的所有句柄都被释放时,资源才会被销毁。类似引用计数,比较Nice。...详见 http://man7.org/linux/man-pages/man2/eventfd.2.html 用epoll+eventfd来实现Boost.Asio的全异步IO,轻松+愉快啊。

1.3K10

(一)主线程与工作线程的分工

我们采取如下方法来解决该问题,以linux为例,不管epoll_fd上有没有文件描述符fd,我们都给它绑定一个默认的fd,这个fd被称为唤醒fd。...这个唤醒fd,在linux平台上可以通过以下几种方法实现: 1. 管道pipe,创建一个管道,将管道绑定到epoll_fd上。需要时,向管道一端写入一个字节,工作线程立即被唤醒。...2. linux 2.6新增的eventfd: int eventfd(unsigned int initval, int flags); 步骤也是一样,将生成的eventfd绑定到epoll_fd上...需要时,向这个eventfd上写入一个字节,工作线程立即被唤醒。 3. 第三种方法最方便。...即linux特有的socketpair,socketpair是一对相互连接的socket,相当于服务器端和客户端的两个端点,每一端都可以读写数据。

1.9K90

Linux 原生异步 IO 原理与使用(Native AIO)

Linux 原生 AIO 原理 Linux Native AIO 是 Linux 支持的原生 AIO,为什么要加原生这个词呢?...因为Linux存在很多第三方的异步 IO 库,如 libeio 和 glibc AIO。所以为了加以区别,Linux 的内核提供的异步 IO 就称为原生异步 IO。...本文主要介绍 Linux 原生 AIO 的原理和使用,所以不会对其他第三方的异步 IO 库进行分析,下面我们先来介绍 Linux 原生 AIO 的原理。 如 图2 所示: ?...在上面的例子中,我们获取异步 IO 操作的结果是在一个无限循环中进行的,其实 Linux 还支持一种基于 eventfd 事件通知的机制,可以通过 eventfd 和 epoll 结合来实现事件驱动的方式来获取异步...总结 本文主要介绍了 Linux 原生 AIO 的原理和使用,Linux 原生 AIO 的使用比较简单,但其内部实现比较复杂,在下篇文章中将会介绍 Linux 原生 AIO 的实现。

3.2K10

Looper的wake机制升级

前言 我做了两期有关Looper的视频,目前来看播放量还不错,有兴趣的可以去B站观看,视频中我提到Looper采用pipe机制wake,纠正一下自己的错误,新版本的Looper已经采用eventfd代替...(0, EFD_NONBLOCK);//用eventfd初始化mWakeEventFd AutoMutex _l(mLock); rebuildEpollLocked(); } void...eventfd代替pipe 3.1 fd减少一个 每个进程fd是有上限的,一般是1024个,超出了就是OOM pipe产生2个fd eventfd只会产生1个fd 3.2 轻量化 虽然wake的时候都是往...fd写入一个字符或者数字,但是内核中pipe和eventfd对write的系统调用的实现可不同,可以观看我的视频,了解详情。...王小二图解Android【005】一切皆文件 pipe需要维护一个内存缓冲区,一般是4096B eventfd只需要维护一个无符号的64位整形计数器 counte 四、总结 很明显eventfd用更少的代价达到了相同的目的

1.2K20
领券