同步IO与异步IO的区别
- 同步就是在一个功能调用时,可以阻塞也可以非阻塞等待,等待事件返回后进行事件的读写处理
- 异步就是用户调用发出后,系统立刻返回,实际处理这个事件读写(内核空间和用户空间交互)的函数由操作系统内核完成。在完成后,通过状态、通知和回调来通知用户。因此需要操作系统支持windows(IOCP)/linux(AIO)
信号驱动IO与异步IO的区别
-
信号驱动IO:通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里面调用recv)。但是本质也是同步IO
-
异步IO,会由 内核执行读写,并复制到指定的用户空间
阻塞IO
非阻塞IO
IO多路复用
- 本质也是同步IO。并且会阻塞于select/epoll,这2个系统调用都可以在内核准备好数据(网络数据到达内核)时告知用户进程,这个时候再调用recv一定是有数据的,不会阻塞在读写上。因此也能成为同步非阻塞IO
几大IO的区别
Reactor和Proactor
-
Reactor:非阻塞同步网络模型,可以理解为:来了事件我通知你,你来处理
-
Proactor:异步网络模型,可以理解为:来了事件我来处理,处理完了我通知你。
IO过程中的拷贝
- 读写的4次拷贝
- mmap减少一次拷贝
- sendfile系统调用:直接再内核空间内复制数据,减少一次mmap
- DMA辅助的sendfile,省去了kerner 缓存到socket缓存的复制
- 更新
参考链接:
https://www.cnblogs.com/felixzh/p/10345929.html
https://blog.youkuaiyun.com/bandaoyu/article/details/90694602
https://www.cnblogs.com/wxxjianchi/p/13581356.html