外贸建站建在哪里湖北建设网官方网站
2026/3/17 9:43:10 网站建设 项目流程
外贸建站建在哪里,湖北建设网官方网站,有的网站域名解析错误,旅游网站的导航栏目设计一.什么是I/O多路复用核心思想#xff1a;通过一个线程同时管理多个 Socket#xff08;文件描述符#xff09;#xff0c;在一个线程内同时检测 多个连接的状态#xff08;如是否可读/可写#xff09;#xff0c;从而实现高效的并发处理。在 Linux 中#xff0c;常见的…一.什么是I/O多路复用核心思想通过一个线程同时管理多个 Socket文件描述符在一个线程内同时检测 多个连接的状态如是否可读/可写从而实现高效的并发处理。在 Linux中常见的 I/O 多路复用技术包括select、poll和epoll。二.为什么要使用I/O多路复用1.最基础的TCP Socket编程使用的是阻塞I/O模型:每次进行I/O操作如读 写数据调用的线程会被阻塞直到操作完成为止。在这种模型下一个线程 只能处理一个客户端的请求也就是“一对一通信”。如果需要同时处理多个客户 \端连接就必须为每个连接创建一个独立的线程或进程。当客户端数量很少时 这种方式是可行的。但如果有成千上万个客户端如 C10K问题1万个并发客 户端连接线程/进程的调度和资源占用如内存会成为瓶颈。2.在传统的多线程/多进程模型中每个客户端连接对应一个独立的线程或进程。 当有数据读写时线程阻塞在对应的 Socket上直到数据准备好。当客户端数 量很少时这种方式是可行的但如果有成千上万个客户端如 C10K问题1 万个并发客户端连接线程/进程上下文切换开销会很大且每个线程/进程都有一定的内存开销如栈内存、线程控制块等此时内存和调度开销的将变得不可接受。三.select和poll的工作原理1.select 实现多路复用的方式是将已连接的Socket文件描述符都放到一个文件描述 符集合然后调用select函数将文件描述符集合拷贝到内核里让内核遍历整个文件描述 符集合检测每个Socket的状态如果某些Socket有事件如数据到达或可写内核会设置对应的状态。接着内核将检测结果整个 Socket集合拷贝回用户态用户程序需要再次遍历整个集合找到可读或可写的 Socket对其处理。缺点需要进行2次「遍历」文件描述符集合一次是在内核态里一个次是在用户态里 而且还会发生2次「拷贝」文件描述符集合先从用户空间传入内核空间由内核修改后再传出到用户空间中。2.select和poll的区别:select使用固定长度的BitsMap表示文件描述符集合而且所支持的文件描述符的个数是有限制的poll使用动态数组以链表形式来组织突破了select 的文件描述符个数限制当然还会受到系统文件描述符限制。 但是 poll和select并没有太大的本质区别都是使用「线性结构」存储进程关注的Socket集合因此都需要遍历文件描述符集合来找到可读或可写的Socket时间复杂度为O(n)而且也需要在用户态与内核态之间拷贝文件描述符集合这种方式随着并发数上来性能的损耗会呈指数级增长。3.epoll的工作原理epoll的改进1. 高效的红黑树管理 epoll 在内核中使用红黑树存储待监控的Socket集合。 优势 插入、删除、修改 Socket的时间复杂度为O(log n)。 相比于 select/poll每次都拷贝整个Socket集合 epoll 只需在第一次时添加到红黑树即可无需重复拷贝红黑树会一直维护这些描述符直到显式地移除它们。2. 事件驱动机制epoll 使用事件驱动机制即内核会监听事件的发生链表记录就绪事件 内核会将发生事件的 Socket如有数据到达或可写的Socket通过回调函数加入到一个就绪链表中。应用程序只需要处理这个链表中的 Socket无需遍历整个集合。epoll支持两种事件触发模式水平触发默认模式和select/poll一样。当被监控的Socket上有可读事件发生时内核会一直通知应用程序直到数据被read函数完全读取。边缘触发当被监控的Socket描述符上有可读事件发生时内核只会通知应用程序一 次需要应用程序收到通知后尽可能一次读取完所有数据以免错失读写机会。所以程序会循环从socket中读写数据那么如果文件描述符是阻塞的没有数据可读写时进程会阻塞在读写函数那里程序就没办法继续往下执。所以边缘触发模式一般和非阻塞I/O搭配使用。一般来说边缘触发的效率比水平触发的效率要高因为边缘触发可以减少系统调用次数。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询