zoukankan      html  css  js  c++  java
  • I/O 模型

    2018-01-29

    一、基本概念:

    同步与异步

    区别:多个任务和事件发生时,一个事件的发生或执行是否会导致整个流程的暂时等待。

    阻塞与非阻塞:

    区别:当发出请求一个操作时,如果条件不满足,是会一直等待还是返回一个标志信息

    1. 阻塞IO:当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。

    2. 非阻塞IO: 当用户线程发起一个read操作后,它马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。

    所以在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。

    同步IO 与 异步IO

    区别:同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。

    1. 同步io:如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程。

    2. 异步io:IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。(这个阶段,用户线程可以干其他的事。)

    Note:注意同步IO和异步IO,与阻塞IO和非阻塞IO是不同的两组概念。

    二、五个io模型(from Unix网络编程)

    1. 阻塞io(前述)

    2. 非阻塞io(前述)

    3. 多路复用io(nio就是这种)

    4. 信号驱动io

    5. 异步io(最理想的io模型)

    参考

  • 相关阅读:
    将Microsoft SQL Server 2000数据库转换成MySQL数据库
    centos7 升级php版本
    Jquery Ajax方法传递json到action
    2015/12/7
    sql server 2008 评估期已过期
    C# 邮件发送注意事项
    ReSharper warning: Virtual member call in a constructor
    EF code first 生成edmx文件
    EF 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
    C# 发送邮件
  • 原文地址:https://www.cnblogs.com/kirito-c/p/10306234.html
Copyright © 2011-2022 走看看