同步IO
线程遇到IO请求,首先通过系统调用使得CPU进入内核态执行指令,系统内核通过调用驱动程序进行硬件IO处理。要么通过CPU将硬件缓冲区的IO数据拷贝到内核区域,要么通过DMA直接将硬件缓冲区的IO数据拷贝到内核区域。这两种方式的区别在于是否需要CPU介入这个拷贝过程。但是这两种方式都是同步IO,因为线程都必须等待数据从硬件缓冲区拷贝到内存区域,才能进行下一步操作。
在这种情况下进行高并发操作,必须依赖很多线程。而很多线程在等待内存中IO数据准备好的过程中,会因为中断导致CPU上下文切换而丢失CPU所有权,CPU转而执行其他就绪线程,上下文切换是比较消耗CPU资源的,在大多数X86或者X64架构的CPU中,线程上下文切换的时间间隔大约为15ms。
异步IO
在基于DMA的基础上,不需要CPU参与IO拷贝,那么就可以给CPU腾出空间执行其他逻辑。异步IO相比同步IO,工作线程可以执行其他请求,而不会阻塞等待IO请求执行完毕。可以极大提升系统性能,最大程度降低线程数量,减少线程上线文切换产生的性能损失。之所以能实现异步IO,在于当前线程向设备发出异步IO时候,请求被传给设备驱动程序,设备驱动程序处理IO请求时并不会等待IO请求完成,而是将IO请求加入到设备驱动程序的队列中,然后返回一个IO处理中的信号。应用程序不需要挂起等待IO请求的完成,从而可以继续执行其他任务。
总结
1、同步IO会阻塞线程,该模式下提高并发性能必须增加很多线程,但是很多线程会因为上下文切换而造成性能损失。
2、异步IO实现高性能IO有三点:减少IO上下文切换;异步非阻塞线程;避免内存复制。
3、开发高性能服务器框架的必备条件在于减少线程、避免内存复制、避免线程阻塞。