高级IO--五种IO基本模型    

A>阻塞IO

         a>阻塞IO:在内核将数据准备好之前,系统调用会一直等待,所有的套接字,默认是阻塞的方式.

         b>阻塞Io模型.

       高级IO--五种IO基本模型

    B>非阻塞IO

         a>非阻塞IO:在内核将数据准备好之前,系统仍然然会返回,返回的是EWOULDBLOCK错误码.(非阻塞IO往往需要程序员循环的方式读取文件描述符,也就是轮询.这个对cpu来说,一般只有特定的场景下才会使用)

         b>非阻塞Io模型.

高级IO--五种IO基本模型

    C>信号驱动IO

         a>信号驱动IO:在内核将数据准备好时,使用SIGIO信号通知应用程序进行IO操作.(首先我们允许套接字接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据)

         b>信号驱动Io模型.

高级IO--五种IO基本模型

      c>信号驱动Io缺陷.

          当信号来临时,必须先去处理信号捕捉函数,其余的所有线程必须挂起等待.

   D>IO多路转接

        a>IO多路转接:IO多路转接能够同时等待多个文件描述符的就绪状态.(I/O复用模型会用到select或者poll函数或者epoll,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的是,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。)

         b>Io多路转接模型.

         高级IO--五种IO基本模型

   E>异步IO

         a>异步IO:由内核在数据拷贝完成时,通知应用程序(通知后,可以立即处理,也可以不立即处理,立即处理时,其他线程也可以正常运行.)----(而信号驱动是告诉应用程序何时可以开始拷贝数据.)

         b>异步Io模型.

         高级IO--五种IO基本模型

任何IO过程中,都包含两个步骤,第一个是等待,第二个是拷贝,而且在实际的应用场景中,等待消耗的时间往往都大于拷贝的时间,让IO更高效,最核心的办法是,让等待的时间尽量减少.

在这里,我们来区分几个重要概念:

同步通信  VS   异步通信: 

    a> 同步通信:在发出一个调用时,在没有得到结果之前,该调用一直不返回,但是如果一旦返回了,就得到了该返回值了.换句话说,也就是由调用者主动等待这个结果.

    b>异步通信:在发出一个调用时,这个调用就直接放回了,所以没有立即返回结果.换句话说,当一个异步过程调用发出后调用者不会立即返回结果,而是在调用发出之后,被调用者通过状态,通知调用者,或通过回调函数来处理这个调用.

同步  VS   互斥:

    a> 同步:进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。

比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。而当进程A产生信息放入缓冲区时,进程B才会被唤醒.

高级IO--五种IO基本模型

  b> 异步:当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。

比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行.

高级IO--五种IO基本模型

阻塞  VS   非阻塞:

  a> 阻塞:阻塞调用是指调用者结果返回之前,当前线程会被挂起,调用线程只有得到结果之后才会返回.

  b>非阻塞:不能立刻得到结果之前,该调用不会阻塞当前线程.

相关文章: