目前对于IO的常见处理模式主要有四种:
阻塞IO非阻塞IO多路复用IO异步IO下面就用客服接电话的场景来对IO操作进行解释。客服的主要事情有:接打电话(读写请求)、转接技术员(IO数据处理)、喝茶。
阻塞IO:就是一个客服只有一部无铃声但有屏幕的固定电话,客服一直坐着看着屏幕等电话来,只有接完一个电话再转接技术员、喝茶、看报。
非阻塞IO:客服只有一个无铃声有屏幕的固定电话,但这个客服不会死盯着屏幕,他在看到屏幕没有来电时,转头去喝茶,喝完茶再来看下屏幕。
多路复用IO:客服有多个无铃声有屏幕的固定电话,客服坐在那死等,哪个先来接哪个。
异步IO:客服给了业务员一个手机,并把手机号记录在了固定电话上(注册监听事件),让固定电话来电时能通知至业务员手机上,客服自己可以出去喝茶、看报。
io过程:从内核态到应用态需要经过:数据准备、内存拷贝。
阻塞与非阻塞是对应关系,区别就在于是否等待上述过程完成。而多路复用关注的是在单线程里处理多个通道。而异步IO的特点就是用户线程与IO操作之间无阻塞。
各模型特点:
阻塞IO:节省cpu时间,对于多通道不友好(一般用多线程来处理多通道,开销大)
非阻塞:浪费cpu(一般都会反复去尝试接收数据),适合在IO不是很频繁、时效性不高的场景使用,简单来讲就是有空的时候去处理下IO,其他时间都去干别的事。对于多通道的支持也不友好(循环,浪费时间)
IO多路复用:单线程支持多通道,节省资源(线程资源),缺点是:同步处理,在高负载的情况下,单线程存在处理瓶颈,需要用多线程来处理数据,保证时效性。
异步IO:主线程不受IO操作影响。缺点在异步模式下,如果需要保证事务、时序,编程模型就会比较复杂,容易出错。