Unix/Linux 上的五种 IO
模型
1 阻塞 blocking
2 非阻塞 non-blocking
1 | int opt = 1; |
3 IO 复用(IO multiplexing)
在 IO
复用模型中,使用 select
、poll
或 epoll
等系统调用,可以同时监视多个文件描述符,当其中一个或多个文件描述符准备好时,通知应用程序进行处理。这种模型常用于处理高并发连接。
4 信号驱动(signal-driven)
在信号驱动 IO
模型中,应用程序为文件描述符设置信号驱动模式,当数据准备好时,内核会向应用程序发送信号,通知其进行数据处理。应用程序不需要频繁轮询。
设置信号驱动模式:
1 | fcntl(sockfd, F_SETFL, O_ASYNC); |
内核在第一个阶段是异步,在第二个阶段是同步;与非阻塞 IO
的区别在于它提供了消息通知机制,不需要用户进程不断的轮询检查,减少了系统 API 的调用次数,提高了效率。
5 异步(asynchronous)
在异步 IO
模型中,应用程序发起 IO
请求后立即返回,内核会在数据准备好并完成读写操作后,通过回调函数或信号通知应用程序。应用程序可以在等待 IO 完成的同时执行其他任务。
定义异步 IO 控制块:
1 | struct aiocb { |
-------------本文结束感谢您的阅读-------------
本文作者:
Corner
本文链接: http://corner430.github.io/2024/07/21/Unix-Linux-%E4%B8%8A%E7%9A%84%E4%BA%94%E7%A7%8D-IO-%E6%A8%A1%E5%9E%8B/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: http://corner430.github.io/2024/07/21/Unix-Linux-%E4%B8%8A%E7%9A%84%E4%BA%94%E7%A7%8D-IO-%E6%A8%A1%E5%9E%8B/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
