高级IO
在应用层进行高效地IO;
一、五种IO模型
1.1前置知识
read和write接口当没有数据或者缓冲区满了的时候就会进行阻塞式地等待,即操作系统并不一定来数据就对数据进行处理,最终是否处理由操作系统本身决定;
IO = 等待 + 拷贝;所以进行拷贝前就要判断条件是否成立,然后决定是否进行拷贝,这个条件又叫做读写事件;等待读事件就绪意味着接收缓冲区当中有数据了,可以进行读,等待写事件就绪就意味着发送缓冲区中有空间了,可以进行写操作了;
高效地IO意味着可以在较短的时间内拷贝更多的数据;换句话说就是,让IO过程中的等待部分占比减少,拷贝部分增加;多线程并发访问就是使等待的时间减少了;
总结:进行高效地IO就是使等待的时间进行减少;
1.2IO模型
钓鱼就是等待的时间多,真正钓鱼的时间少;
1.阻塞式IO,阻塞等待子进程;
2.非阻塞式IO,非阻塞轮询等待子进程;
3.信号驱动式IO;
4.多路复用,多路转接IO,多线程并发访问,使得等待时间重叠,提高了命中概率;
5.异步IO,用户发起请求,操作系统分配一个缓冲区和通知方式,进行提供数据,判断数据是否就绪并通知;
以上前4种IO都是同步IO;
阻塞IO和非阻塞IO等待和拷贝是一样的,只不过阻塞是无其他行为等待,而非阻塞是执行其他任务变相地等待,时间都是等价;
同步IO和异步IO,区别就是有没有直接参与IO,异步IO不参与IO只是发起请求;
异步IO本质上还是使用的一个执行流,提高不了效率并且代码容易造成逻辑混乱,所以使用了协程技术解决此问题;实际上最高效的IO方式是多路复用方式;