select poll epoll

2023-12-28 21:10:40

select poll epoll 是啥

select、poll和epoll是Linux系统中用于实现I/O多路复用(I/O Multiplexing)的系统调用机制。这些机制允许一个进程或线程同时监控多个文件描述符(通常是网络套接字),并能够知道哪些描述符已经准备好进行读写操作,而无需为每个描述符都进行阻塞的系统调用。

select
select是最早的I/O多路复用机制之一。它允许程序监视一组文件描述符,并在其中任何一个描述符变得可读或可写时返回。使用select时,需要将待监视的文件描述符集合、读事件集合、写事件集合和超时时间作为参数传入。

poll
poll与select类似,也是用来监视多个文件描述符的就绪状态。与select不同的是,poll使用结构体pollfd来存储待监视的文件描述符和相应的事件,这使得poll可以处理比select更多的文件描述符,而且poll没有最大文件描述符数量的限制。

epoll
epoll是Linux内核提供的一种更高效、更灵活的I/O多路复用机制。与select和poll相比,epoll有以下主要优势:

  • 通过epoll_create系统调用创建一个epoll实例后,可以使用epoll_ctl添加或删除待监视的文件描述符,而不需要每次调用时都传递整个文件描述符集合。
  • epoll采用事件驱动的方式,只有当文件描述符状态发生变化时才会通知应用程序,避免了无谓的轮询。
  • epoll支持水平触发(Level Triggered,LT)和边沿触发(Edge Triggered,ET)两种模式。LT模式下,只要文件描述符处于就绪状态,每次epoll_wait都会返回该事件;而在ET模式下,只有当文件描述符状态从非就绪变为就绪时,才会返回一次事件。

总的来说,epoll在处理大量并发连接和高负载场景下表现更优,而select和poll在简单应用或者对可移植性要求较高的情况下可能是更好的选择。不过,现代Linux系统通常推荐使用epoll作为首选的I/O多路复用技术。

优缺点

javascript:void(0) 是一个在 HTML 中常用于 href 属性的 JavaScript 表达式。当用户点击这样的链接时,它不会导致页面跳转,而是执行一个空的 JavaScript 函数。

具体来说:

  • javascript: 是一个伪协议,表示接下来的内容应该被解析为 JavaScript 代码。
  • void(0) 是一个 JavaScript 表达式,其中 void 是一个操作符,它接受一个表达式作为参数并返回 undefined。在这里,传入的是 0,所以 void(0) 的结果就是 undefined

使用 javascript:void(0) 的主要目的是阻止链接的默认行为(即页面跳转),同时保留链接的样式和点击交互。通常,这会与事件处理函数(如 onclick)一起使用,以便在点击链接时执行特定的 JavaScript 代码,而不是导航到新的 URL。

简而言之,javascript:void(0) 可以理解为创建了一个不会导致页面跳转的“假链接”,它的作用是在保持链接外观的同时提供一种执行 JavaScript 代码的方式。

netty当中如何处理select poll epoll

在Netty中,处理select、poll和epoll的选择和使用是自动进行的,Netty框架会根据运行的操作系统和环境选择最合适的I/O多路复用技术。

具体来说,Netty通过以下方式来处理select、poll和epoll:

  1. 基于操作系统的选择
    Netty在启动时会检测运行的操作系统。对于Linux系统,它会默认使用epoll;对于其他支持的Unix-like系统,可能会使用kqueue(在BSDs和Mac OS X上)或poll。

  2. 事件循环(EventLoop)
    Netty的核心是其事件循环模型。每个连接或通道都与一个事件循环关联,该事件循环负责监视该连接的读写事件。事件循环内部使用的就是操作系统提供的I/O多路复用机制,如epoll、kqueue或poll。

  3. Selector实现
    Netty提供了io.netty.channel.nio.NioEventLoop类,它是事件循环的具体实现。在这个类中,Netty使用了java.nio.channels.Selector API,这是Java标准库提供的非阻塞I/O API的一部分。在Linux系统上,当使用NIO时,JDK内部会自动使用epoll作为底层的I/O多路复用机制。

  4. Native transport
    对于更高级的性能优化,Netty还提供了原生(native)传输,通过io.netty.channel.epoll.EpollEventLoop类直接使用Linux的epoll系统调用。这种方式可以进一步提高性能,特别是对于高并发和大规模连接的场景。

在编写Netty应用程序时,通常不需要直接处理select、poll或epoll。你只需要关注如何设置和处理ChannelHandler、编码器和解码器等组件。Netty框架会自动处理底层的I/O多路复用和网络通信细节。如果你想对I/O多路复用有更细粒度的控制,可以深入研究Netty的事件循环和Selector实现。但通常情况下,使用Netty的标准API和配置就已经足够满足大多数应用的需求。

文章来源:https://blog.csdn.net/m0_37607945/article/details/135270234
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。