zoukankan      html  css  js  c++  java
  • 简述IO

    首先, 操作系统分为用户态内核态。实际上我们在用户态,调用系统提供的内核态的程序
     
    同步(synchronized)、异步(asynchronized)IO的区别:
    • 同步:用户态的IO请求,要等待内核态的IO操作后,才能继续走下去;
    • 异步:用户态的IO请求,不需要等待内核态的IO操作,可以走下去。(内核态通知用户态线程或者调用回调事件)
     
    阻塞/非阻塞阻塞意思是IO要彻底完成非阻塞是说操作后立即返回状态码,不等IO完成
     
    同步/异步描述的是用户态内核态的流动情况阻塞/非阻塞内核响应用户态的流动方式

    一般来说,IO分为下面这几类:

    Blocking IO

    同步阻塞。
    可以理解为一个线程处理一个connection多线程下非常低效(大量的线程上下文切换)。比如说:一个线程处理一个socket。
    linux的select(), poll()就是进程级别的 同步阻塞。
     

    non-blocking IO

    同步非阻塞。与java的nio(new-io)是有区别的。java的nio简单来说就是实现了reactor模型+缓冲区。而这里的non-blocking-IO是说的一个socket未完成任务情况下立即响应一个状态码。客户端要轮询查询是否真正完成。几乎没有使用的。
     

    IO multiplexing

    异步阻塞。就是说的reactor模型。
    相当常用、常见的IO模型。 C的libevent,java的nio等都是基于这个模型实现的的。
    一个主线程处理事件队列,把事件分发给worker处理,worker来响应。
    缺点是“主线程处理事件队列”是一个相对阻塞的动作。
     
    题外话,reactor模型一般都是基于事件驱动的,而事件驱动就是观察者模式

    asynchronous IO

    异步非阻塞。

    也就是proactor模型。彻底的实现情况。

    对比起reactor接收事件,该处不阻塞了。并且响应的动作也由一个统一入口处理,也不阻塞。

    然而实现复杂,并且很多都要操作系统支持才能实现。

    好内容分享:

    http://www.cnblogs.com/fanzhidongyzby/p/4098546.html

     http://colobu.com/2014/11/13/java-aio-introduction/

  • 相关阅读:
    正则表达式语法介绍
    关系型数据库和非关系型数据库的简单对比
    lambda函数
    java基础系列--Exception异常处理
    springBoot基础系列--properties配置
    spring基础系列--JavaConfig配置
    java基础系列--Calendar类
    java基础系列--Date类
    一个特殊的List去重问题的解决方案
    Java学习笔记
  • 原文地址:https://www.cnblogs.com/ELMND/p/4779413.html
Copyright © 2011-2022 走看看