windows
- 阻塞(blocking)模型
- 选择(select)模型
- WSAAsyncSelect模型
- WSAEventSelect 模型
函数:WSAEventSelect 、WSAWaitForMultipleEvents、WSAEnumNetworkEvents
- 重叠(overlapped)模型
overlapped I/O是Win32的一项技术
函数:WSAGetOverlappedResult
- 完成端口(completion port)模型
函数:CreateIoCompletionPort、GetQueuedCompletionStatus
内核对象
Windows提供了几种内核对象可以处于已通知状态和未通知状态:进程、线程、作业、文件、控制台输入/输出/错误流、事件、等待定时器、信号量、互斥对象。
函数:WaitForSingleObject与WaitForMultipleObjects
- 线程池 + 完成端口
函数:CreateThreadpoolIo,StartThreadpoolIo,CloseThreadpoolIo
Select(选择)
WSAAsyncSelect(异步选择)
WSAEventSelect(事件选择)
Overlapped(重叠IO)-事件通知
IOCP Completion port(完成端口)
《Windows核心编程系列》十谈谈同步设备IO与异步设备IO之异步IO
《Windows核心编程系列》九谈谈同步设备IO与异步设备IO之同步设备IO
IO多路复用
select、kqueue、poll/epoll、overlapped I/O等
再谈select, iocp, epoll,kqueue及各种I/O复用机制
那么,为什么epoll,kqueue比select高级?
答案是,他们无轮询。因为他们用callback取代了。想想看,当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。
库
ASIO:
“C++的I/O框架,逐渐成为Boost库的一部分。it’s like ACE updated for the STL era。”
支持select、epoll、IOCP等IO模型;
libevent:
由Niels Provos用C编写的一个轻量级的I/O框架。它支持kqueue和select、poll和epoll。
广为人知的有ACE,Libevent这些,他们都是跨平台的,而且他们自动选择最优的I/O复用机制,用户只需调用接口即可。说到这里又得说说2个设计模式,Reactor and Proactor。
Libevent是Reactor模型,ACE提供Proactor模型。实际都是对各种I/O复用机制的封装。
Reactor:
libevent/libev/libuv/ZeroMQ/Event Library in Redis
Proactor
IOCP/Boost.Asio
linux下还是Reactor把, 没有os支持, Proactor玩不转.
关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结
参考:
https://www.jianshu.com/p/5cf67fab6d61
https://blog.csdn.net/HQ354974212/article/details/76423050?locationNum=2&fps=1
https://blog.csdn.net/zj510/article/details/44652923