zoukankan      html  css  js  c++  java
  • IO模型介绍 以及同步异步阻塞非阻塞的区别

     

    阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成
    非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成

    同步:用户进程发起IO(就绪判断)后,轮询内核状态
    异步:用户进程发起IO后,可以做其他事情,等待内核通知

    介绍一下IO模型

     

    网络IO模型和文件IO模型是一样的,上图是IO的5种模型,包括阻塞IO、非阻塞IO、多路复用IO、信号驱动的IO、异步IO。

    一次IO包括两个过程,内核数据准备 、把数据从内核空间copy到用户空间。

    1、阻塞IO(recvfrom系统调用)是在两个过程应用都处于阻塞状态。

    2、非阻塞IO(recvfrom系统调用)是应用发出IO操作后可以立刻返回,通过轮询盘判断数据是否准备好,在copy数据阶段阻塞应用。

    3、多路复用IO(select 、recvfrom系统调用)是阻塞调用select,查找可用的套接字,如果有套接字可用,那么就阻塞调用(recvfrom)完成数据的copy过程。Linux select就是这种模型,缺点是一次select会扫描所有的socket。

    4、信号驱动的IO(SIGIO、recvfrom)是应用发出SIG IO后立刻返回,内核中数据准备好后,通知应用,由应用进行阻塞recvfrom调用从内核copy数据。linux epoll就是基于事件的就绪通知方式,省去了所有socket的扫描开销。

          epoll,kqueue比select高级,select是在内核里做轮询操作, epoll是使用回调机制, 消耗的资源更少. 套接字比较多的时候,每次select()都要通过遍历Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。epoll给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询。

    5、异步IO(aio-read)是应用发出aio-read后马上返回,数据准备好后,由操作系统把数据copy到应用,并通知应用数据copy完成。

         当然除了以上的IO模式,还有直接IO(应用绕过内核直接访问磁盘文件),内存映射MMap(建立内存和文件的映射关系),这两种模式在linux 2.6上本质上没有差异。

    直接IO在数据库引擎中用的比较多,数据库的buffer绕过文件系统cache,直接访问硬盘。MongoDB中就是用到mmap,无需调用read、write系统调用。

    同步、异步、阻塞、非阻塞一般有这么几种组合:

    同步非阻塞,典型代表是Java NIO

    异步阻塞,典型代表是select,epoll

    异步非阻塞,典型代表是aio

    并发设计中的模式,有以下两种:

    Reactor(NIO)和Preactor(AIO),都是处理派发/分离操作IO事件的。
    派发/分离事件就是将单独的IO事件通知到上层模块。不同之处是,Preactor用于异步,Reactor用于同步。
    可以看出,两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)。
    在结构上,两者也有相同点:dispatch负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler。
    不同点在于,异步情况下(Preactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示
    IO设备可以进行某个操作(can read or can write),handler这个时候开始提交操作。

    Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备。

  • 相关阅读:
    connect oralce
    monolog php
    js继承
    前后端交互-一些关于接口设计的思考
    zoom:1;
    H5的新特性及部分API详解
    软文参考
    seo细节
    seo每天要做的事情
    seo(每天要干的哪些事)
  • 原文地址:https://www.cnblogs.com/zedosu/p/6711371.html
Copyright © 2011-2022 走看看