IO操作包括了等待和拷贝,实际中等待所消耗的时间往往大于拷贝的时间,因此,为了让IO操作高效,核心的方法就是缩短等待时间。
在低阶IO中,用户通过输入的内容读取到某个变量中,将变量的值打印到屏幕当中,简单的说就是C库维护缓冲区进行的IO操作。
高阶IO,通常应用于网络socket编程,对UDP、TCP、所维护的发送缓冲区进行IO操作,并且高阶IO分为同步IO和异步IO,同步IO又分为阻塞IO,非阻塞IO,信号驱动IO,多路转接IO。
应用进程调用recvform函数之后,进程进入阻塞,recvfrom通过系统调用进入内核,等待数据的准备,当数据准备好之后,从内核拷贝一份数据到用户空间,然后成功返回。
应用进程调用recvfrom函数进入内核,发现进程所需数据没有准备好,便返回EWOULDBLOCK,进程会重复调用recvfrom,直到内核将所需数据准备好,将数据从内核拷贝到用户空间,并成功返回,一般要重复调用recvfrom,所以可搭配循环使用。
应用程序建立一个SIGIO信号处理程序,然后进程继续往下执行,建立的SIGIO信号处理程序会系统调用一个sigaction给内核,然后直接返回,然后内核当中就开始准备数据,当数据准备好之后,会给信号处理程序发送一个SIGIO信号,当信号处理程序收到SIGIO信号后,应用进程会调用recvfrom给内核,应用程序在收到成功指示之前会阻塞,内核收到后开始拷贝数据,拷贝完成,返回成功指示
在流程上和阻塞IO类似,但是本质上最核心的地方就是可以一次性等待多个文件描述符的就绪状态
当内核将数据拷贝好之后,通知应用进程进行相关的IO操作,需要注意的是,他和信号驱动IO很像,但是信号驱动IO是内核将数据准备好才通知,而异步IO是内核将数据拷贝好之后才通知
注:为了性能和效率的优先,C++默认使用的是异步IO的方式