IO操作分两步:发起IO请求等待数据准备,实际IO操作(洗衣服,晾衣服)
同步需要主动读写数据,在读写数据的过程中还是会堵塞(好比晾衣服堵塞了你)
异步仅仅需要I/O操作完毕的通知。并不主动读写数据,由操作系统内核完毕数据的读写(机器人帮你晾衣服)
五种IO的模型:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO和异步IO
前四种都是同步IO,因为在内核数据copy到用户空间时都是阻塞的
权威:RFC标准或数据《UNIX Network Programming》中文《UNIX网络编程-卷-》第六章 推荐去看
1.阻塞IO
等待数据准备到数据数据 都是阻塞的 什么都干不了 干等着
2.非阻塞IO
取数据过程中 内核告诉你没准备好 过一会你又来看 内核告诉你还没准备 但这个过程你可以去干别的,但需要时不时去检查 当内核准备好数据拷贝后返回 但实际拷贝数据这个过程中也是阻塞的 所以是同步IO
3.IO多路复用
一个线程处理多个连接
线程会监听多个请求,会轮询,哪个好了就操作哪个,但在拷贝数据时也是阻塞的 属于同步IO
比上面好的优点是:特别多线程可以处理更多连接
I/O多路复用是阻塞在select,epoll这样的系统调用,没有阻塞在真正的I/O系统调用如recvfrom
进程受阻于select,等待可能多个套接口中的任一个变为可读
IO多路复用使用两个系统调用(select和recvfrom)
blocking IO只调用了一个系统调用(recvfrom)
select/epoll 核心是可以同时处理多个connection,而不是更快,所以连接数不高的话,性能不一定比多线程+阻塞IO好
多路复用模型中,每一个socket,设置为non-blocking,
阻塞是被select这
4.信号驱动IO
很少很少用到!
5.异步I/O(POSIX的aio_系列函数)
Future-Listener机制
你是一个进程或线程 由其它模块帮你去完成 你不能卡住
好比你是个大哥,你有点事告诉小弟去办 这个期间你去忙别的 小弟完成后告诉你完成了
1.进程调用 直接返回 主进程去干其它事情
2.内核主动去复制到用户空间 指定信号
总结
1.IO操作分为两步 第一步发起IO请求,等待数据准备 这里是阻塞IO和非阻塞IO的区别
第二步实际的IO操作,将数据从内核拷贝到进程中,这里是同步IO和异步IO的区别
2.前四种IO模型都是同步IO,区别在于第一阶段,而他们的第二阶段都是相同的,数据从内核copy到应用缓冲区期间都是阻塞的,进程阻塞于recvfrom调用或者select()函数,相反,异步I/O模型在这两个阶段都要处理
3.阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞知道完成那么就是传统的阻塞IO,如果不阻塞。那么就是非阻塞IO
4.同步IO和异步IO的区别在于第二步是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、多路复用IO、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你完成IO操作再将结果返回给你,那么就是异步IO
重点
几个核心点:
阻塞非阻塞说的是线程的状态(重要)
同步和异步说的是消息的通知机制(重要)
同步需要主动读写数据,异步是不需要主动读写数据
同步IO和异步IO是针对用户应用程序和内核的交互