一文带你深入了解Linux五种I/O模型和I/O多路复用
一文带你深入了解Linux五种I/O模型和I/O多路复用文章目录一文带你深入了解Linux五种I/O模型和I/O多路复用一、几种典型 I/O 模型1. 阻塞 I/O2. 非阻塞 I/O3. 信号驱动 I/O4. I/O 多路复用高级 I/O5. 异步 I/OAIO二、阻塞与非阻塞 vs 同步与异步三、I/O 多路转接模型1. select2. poll3. epoll惊群问题四、常见面试题总结1. 阻塞与非阻塞的区别2. 同步与异步的区别3. select、poll、epoll 的区别4. epoll 的 LT 和 ET 区别5. 什么是惊群问题如何解决6. 什么时候用 select/poll/epoll总结这个思维导图主要涵盖了Linux 五种 I/O 模型和I/O 多路复用select/poll/epoll的核心知识点。我将按照你的结构分模块详细解答并总结常见的面试题。一、几种典型 I/O 模型1. 阻塞 I/O定义进程发起 I/O 系统调用后内核等待数据准备完成进程被挂起阻塞直到数据从内核复制到用户空间调用才返回。特点调用是否立即返回否。功能是否由自己完成是同步。例子read()、write()默认行为。2. 非阻塞 I/O定义进程发起 I/O 调用后如果内核数据未准备好立即返回一个错误码如EWOULDBLOCK进程可以继续轮询检查。特点调用是否立即返回是。功能是否由自己完成是同步。需要循环调用浪费 CPU。3. 信号驱动 I/O定义进程发起调用后立即返回当数据准备好时内核发送SIGIO信号通知进程进程再通过 recvfrom 等调用读取数据。特点调用是否立即返回是。功能是否由自己完成否异步通知但读取仍需自己完成严格说是“异步通知型同步 I/O”。适用于 UDPTCP 较复杂。4. I/O 多路复用高级 I/O定义通过 select/poll/epoll 监控多个文件描述符当某个描述符就绪时通知进程进行 I/O 操作。特点阻塞在 select 上而非单个 I/O。可以同时监控多个 fd。5. 异步 I/OAIO定义进程发起 aio_read 等调用后立即返回内核完成数据准备并复制到用户空间后通过信号或回调通知进程。特点调用是否立即返回是。功能是否由自己完成否内核完成全部操作。真正的异步 I/O。二、阻塞与非阻塞 vs 同步与异步维度阻塞与非阻塞同步与异步关注点调用是否立即返回I/O 操作由谁完成组合阻塞 I/O、非阻塞 I/O同步 I/O、异步 I/O阻塞 I/O调用不返回直到数据就绪。非阻塞 I/O调用立即返回数据未就绪则返回错误。同步 I/O进程自己负责将数据从内核复制到用户空间。异步 I/O内核负责全部完成后通知进程。三、I/O 多路转接模型1. select实现流程调用 select传入 fd_set 集合。内核遍历所有 fd检查状态。有 fd 就绪或超时返回。用户遍历 fd_set 找到就绪 fd。优点跨平台支持好。缺点fd 数量受限FD_SETSIZE通常 1024。每次调用都要将 fd_set 从用户态拷贝到内核态。返回后需要遍历所有 fd 才能知道哪些就绪。2. poll实现流程调用 poll传入 pollfd 数组。内核遍历 pollfd检查事件。有 fd 就绪或超时返回。用户遍历 pollfd 检查 revents。优点无最大 fd 数限制基于链表。传入传出分离events 和 revents。缺点仍然需要遍历所有 fd。大量 fd 时性能线性下降。3. epoll实现流程epoll_create创建 epoll 对象。epoll_ctl注册要监控的 fd。epoll_wait等待事件发生。返回就绪事件列表。触发方式水平触发LT只要 fd 可读/写每次 epoll_wait 都会返回。边缘触发ET仅在状态变化时通知一次需要非阻塞 fd 循环读写。优点仅返回就绪 fd无需遍历。使用红黑树管理 fd增删改查高效。支持边缘触发提高效率。缺点仅 Linux 支持。边缘触发编程复杂。惊群问题定义多个进程/线程同时 epoll_wait 同一个 fd当事件发生时所有进程都被唤醒但只有一个能处理造成资源浪费。解决Linux 内核 4.5 解决了 epoll 惊群EPOLLEXCLUSIVE。也可用 SO_REUSEPORT 或自己实现负载均衡。四、常见面试题总结1. 阻塞与非阻塞的区别阻塞调用不返回直到完成。非阻塞调用立即返回未完成则返回错误。2. 同步与异步的区别同步进程自己完成 I/O包括等待和复制。异步内核完成 I/O完成后通知进程。3. select、poll、epoll 的区别selectfd 有限、每次全量拷贝、返回后需遍历。poll无上限、仍遍历、传入传出分离。epoll事件驱动、只返回就绪 fd、高效、支持 ET。4. epoll 的 LT 和 ET 区别LT安全、简单但可能重复通知。ET高效、需配合非阻塞 I/O 循环读写。5. 什么是惊群问题如何解决多个进程等待同一事件事件触发时全部唤醒。使用EPOLLEXCLUSIVE或 SO_REUSEPORT。6. 什么时候用 select/poll/epollselect简单、跨平台、少量 fd。pollfd 数量较多但变化不大。epoll高性能服务器、大量并发连接。如果你需要我画一个流程图或对比表格或者整理成 PDF 笔记也可以告诉我。总结这篇文章是作者搜集大量面经和资料这里出来的。感谢你的支持作者wkm是一名中国矿业大学(北京) 大一的新生希望得到你的关注如果可以的话记得一键三联
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416669.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!