zoukankan      html  css  js  c++  java
  • IO模型

    I/O模型

    阻塞IO模型

    用户调用了recvfrom这个系统调用,线程在等待内核获取数据和拷贝数据的两个阶段,线程都是被阻塞的

    socket.accept 
    socekt.recv
    都会进入阻塞态
    

    如何让闲置的cpu运行起来

    1.在等待文件io的过程中,另外开起一个线程,让其他的连接不用排队,缺点是开启多线程是非常消耗系统资源的,线程的切换也是需要消耗时间的
    

    非阻塞IO模型

    应用程序以轮询的方式不断询问io的读取状态,用户调用recvfrom之后进程不会阻塞,会得到一个错误,当内核向用户内存拷贝数据时会进入阻塞状态,缺点是会大量的进行用户态到内核态的切换非常消耗时间

    socket.setblocking()#默认是True  
    socket.setblocking(False) #False的话就成非阻塞了
    

    IO多路复用模型

    select/epoll这个function不断轮询所有的socket,当数据准备好内核会通知select就会返回,用户在调用read操作将数据拷贝到用户内存中

    socket.setblocking(False)
    
    select.select(read_l,[],[])
    

    异步IO模型

    当用户读取数据时,回立刻进行返回,当数据拷贝到用户内存时,主动给用户进程发送一个signal信号

    模型比较

    1.阻塞与非阻塞,阻塞式IO模型会阻塞进程的执行知道操作完成,而非阻塞IO会立刻返回
    
    2.同步与异步,同步IO会将进程阻塞,当数据还没准备好,系统不对进程进行阻塞,当数据准备好后进程会进入阻塞一段时间,异步IO模型,整个过程都不会阻塞
    
    3.非阻塞与异步,非阻塞IO大部分时间不会被阻塞,但是需要进程主动检查数据的接收状态,一旦完成,需要手动调用recvfrom来将数据拷贝到用户内存,异步IO的方式操作系统完成接收到拷贝数据到内存的过程
    

    IO模型分类

    1.同步IO
      1.阻塞IO
      2.非阻塞IO
      3.IO多路复用
    2.异步IO
      1.异步IO
    
  • 相关阅读:
    python-MongoDB 非关系型数据库
    python-爬虫-Beautifulsoup模块
    python-flask-路由匹配源码分析
    python-flask-配置文件的源码分析
    python-爬虫-selenium模块
    python-flask-请求源码流程
    python-爬虫
    iOS开发——创建你自己的Framework
    手把手教你封装下载管理器
    AFNetwork 作用和用法详解
  • 原文地址:https://www.cnblogs.com/pluslius/p/11701431.html
Copyright © 2011-2022 走看看