2018-08-06-Python全栈开发day35-事件、IO、select-part3-IO模型

1.IO模型

  io的概念:

  1.1为什么会发生io

    当进行读写操作时,比如读写操作,首先系统需要进行数据的准备(将数据拷贝到内核态),然后将准备好的数据放入进程中进行使用,在此过程中就发生了阻塞

  io模型分为四种

  • 同步Io
  • 异步io
  • 阻塞io
  • 非阻塞io

2.阻塞IO

  

  阻塞是用户态内存和内核态内存进行交互的过程。

  对于阻塞IO,当用户态内存想收消息recvfrom时,会给内核态内存发一个系统调用,此时内核态内存开始准备数据,在准备数据的过程中,整个进程是属于IO状态也就是阻塞状态的,当内核态内存准备好数据之后,还需要将内核态的内存拷贝到用户态内存,因为用户态内存不能直接调用内核态内存,此时也需要时间,当数据拷贝完成之后,告诉系统整个过程ok

  这样就是阻塞io,在整个过程中都是出于阻塞状态,进程利用率低。

3.非阻塞IO

  

和阻塞io相比,非阻塞io在进行系统调用的时候,不是等到内核态数据准备好了之后告诉我才去拷贝数据,而是过一段时间调用一次,看能否拷贝到,如果没有就去做别的事情,

  优点:可以优先的提高进程利用效率

  缺点:一直进行系统调用,进程消耗高,不能及时响应用户的请求

4.多路复用io

  

 

  流程:和阻塞io相似,但是对于多路复用,可以同时监视多个socket对象,一旦某个socket对象的数据准备好,就告诉进程可以从内核态拷贝数据,相当于完成了多用户

5.异步IO

 

  异步:在系统发起调用之后,进程不理会内核态而去做其他事情,当内核数据准备完成,并且拷贝到用户态之后,发通知给进程,此时进程才开始回来继续完成,在整个过程中没有阻塞。

 

posted @ 2018-08-06 22:54  brownbearye  阅读(129)  评论(0)    收藏  举报