当前位置: 首页 > 面试题库 >

使用非IO事件中断epoll_wait,无信号

呼延臻
2023-03-14
问题内容

当前方案是通过几个fds和可能的传入消息队列进行epoll_wait,我希望epoll_wait下面的循环在IO事件或新消息上执行。
我知道的方式:

  • 使用time毫秒超时,并在html" target="_blank">循环中首先检查队列
  • 当消息可用时,使用队列代码中的自动管道技巧
  • 用标准信号中断系统调用
  • 使用epoll_pwait并优化上一点

上面发布的所有要点都不足以让我满意,我想知道是否还有其他未找到的方法。
原因如下:

  • 信号是多线程代码上应避免的事情,并且不是很可靠
  • 超时一消除了epoll的部分好处,仅在发生事件时醒来
  • 目前,自管技巧似乎是最好的方法,但样板仍然太多

想法?


问题答案:

您可以使用eventfd,它实际上与self-
pipe技巧一样,只是文件描述符更少,样板更少(例如glibc具有便捷eventfd_read/write功能)。



 类似资料:
  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S

  • 函数原型 #include <sys/epoll.h> int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 参数 events 出参,记录准备好的fd。该参数为向量(数组),由调用方分配空间。 maxevents 最大监听fd。epoll_wait会检测从0

  • 事件 signals and slots 被其他人翻译成信号和槽机制,(⊙o⊙)…我这里还是不翻译好了。 所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,当然也有其他的事件产生方式,比如网络的连接,窗口管理器或者定时器等。调用应用的exec_()方法时,应用会进入主循环,主循环会监听和分发事件。 在事件模型中,有三个角色: 事件源 事件 事件目标 事件源就是发生了状态改变的对象。事件是

  • 事件 signals and slots 被其他人翻译成信号和槽机制,(⊙o⊙)… 我这里还是不翻译好了。 所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,当然也有其他的事件产生方式,比如网络的连接,窗口管理器或者定时器等。调用应用的 exec_() 方法时,应用会进入主循环,主循环会监听和分发事件。 在事件模型中,有三个角色: 事件源 事件 事件目标 事件源就是发生了状态改变的对象。

  • Go提供的网络接口,在用户层是阻塞的,这样最符合人们的编程习惯。在runtime层面,是用epoll/kqueue实现的非阻塞io,为性能提供了保障。 如何实现 底层非阻塞io是如何实现的呢?简单地说,所有文件描述符都被设置成非阻塞的,某个goroutine进行io操作,读或者写文件描述符,如果此刻io还没准备好,则这个goroutine会被放到系统的等待队列中,这个goroutine失去了运行权