高级IO--五种IO基本模型
A>阻塞IO
a>阻塞IO:在内核将数据准备好之前,系统调用会一直等待,所有的套接字,默认是阻塞的方式.
b>阻塞Io模型.
B>非阻塞IO
a>非阻塞IO:在内核将数据准备好之前,系统仍然然会返回,返回的是EWOULDBLOCK错误码.(非阻塞IO往往需要程序员循环的方式读取文件描述符,也就是轮询.这个对cpu来说,一般只有特定的场景下才会使用)
b>非阻塞Io模型.
C>信号驱动IO
a>信号驱动IO:在内核将数据准备好时,使用SIGIO信号通知应用程序进行IO操作.(首先我们允许套接字接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据)
b>信号驱动Io模型.
c>信号驱动Io缺陷.
当信号来临时,必须先去处理信号捕捉函数,其余的所有线程必须挂起等待.
D>IO多路转接
a>IO多路转接:IO多路转接能够同时等待多个文件描述符的就绪状态.(I/O复用模型会用到select或者poll函数或者epoll,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的是,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。)
b>Io多路转接模型.
E>异步IO
a>异步IO:由内核在数据拷贝完成时,通知应用程序(通知后,可以立即处理,也可以不立即处理,立即处理时,其他线程也可以正常运行.)----(而信号驱动是告诉应用程序何时可以开始拷贝数据.)
b>异步Io模型.
任何IO过程中,都包含两个步骤,第一个是等待,第二个是拷贝,而且在实际的应用场景中,等待消耗的时间往往都大于拷贝的时间,让IO更高效,最核心的办法是,让等待的时间尽量减少.
在这里,我们来区分几个重要概念:
同步通信 VS 异步通信:
a> 同步通信:在发出一个调用时,在没有得到结果之前,该调用一直不返回,但是如果一旦返回了,就得到了该返回值了.换句话说,也就是由调用者主动等待这个结果.
b>异步通信:在发出一个调用时,这个调用就直接放回了,所以没有立即返回结果.换句话说,当一个异步过程调用发出后调用者不会立即返回结果,而是在调用发出之后,被调用者通过状态,通知调用者,或通过回调函数来处理这个调用.
同步 VS 互斥:
a> 同步:进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。
比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。而当进程A产生信息放入缓冲区时,进程B才会被唤醒.
b> 异步:当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。
比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行.
阻塞 VS 非阻塞:
a> 阻塞:阻塞调用是指调用者结果返回之前,当前线程会被挂起,调用线程只有得到结果之后才会返回.
b>非阻塞:不能立刻得到结果之前,该调用不会阻塞当前线程.