• 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模型)

    参考

  • 相关阅读:
    设计模式之里氏替换原则
    设计模式之依赖倒转原则
    设计模式之接口分离原则
    spring 集成 kafka producer(KafkaTemplate)
    jmeter 分布式
    ant+Jenkins+jmeter
    pycharm+git+github项目上传
    Python_pip下载不下来源解决方案
    linux_python3环境搭建
    Jenkins+Git+Github+Python自动化化接口项目例子
  • 原文地址:https://www.cnblogs.com/kirito-c/p/10306234.html
Copyright © 2020-2023  润新知