zoukankan      html  css  js  c++  java
  • 网络编程----堵塞、非堵塞和同步、异步IO

    我是学渣。但我想进步。

    本文是面试我的牛人问我的。你知道什么是堵塞、非堵塞和同步、异步IO么?自觉得是分布式系统程序猿的我居然不知道。学习吧。


    首先介绍堵塞IO和非堵塞IO:

    堵塞IO:是指说程序等待socket文件的事件的时候。是处于堵塞状态的(这之中的过程是,线程进入suspend状态,被增加事件等待队列,退出CPU,将数据写回内存,简而言之就是linux内的schedule过程。)如图所看到的:、


    举个样例,这就像是:你去饭店点一份午餐打包带走。从你去開始饭店就開始准备饭菜,你就在那里等着。直等到菜品齐全拿着回家吃。

    这之中菜不做完,你就不会走。也不会干其它事情,就是堵塞在饭店等待事件。


    非堵塞IO:

    通过名称能够知道。这时与堵塞IO全然对立的方式,就是在等待IO事件的时候,仅仅是查询当前IO请求是否就绪,假设就绪则開始工作处理数据。假设没有就绪,则直接返回没有就绪。



    举个样例:你去饭店买菜,告诉饭店你要的菜品后。饭店须要一段时间才干准备好你须要的饭菜。这时你还想去取钱,那你就先去取钱,然后过一会再来问菜做好没。假设做好了,那就拿菜走人,假设没做好。那就再去干点其他的事情,过一会再来问。这就是非堵塞的等待事件的发生。

    你不会在饭店那里一直等待,仅仅会一次一次的去询问能否够拿菜了。


    总结堵塞和非堵塞IO。它们之间的主要维度是堵塞还是不堵塞在当前的事件上面。堵塞就是在事件没有准备好的情况下。主动的schedule,让出自己的CPU时间,直到符合条件的事件出现(或者超时)。

    非堵塞则是不会schedule,不会让出自己的CPU时间,直接返回成功或者没成功,由程序自由选择接下来的时间做什么,循环下次继续检查事件的就绪情况。


    以下来介绍同步IO和异步IO。


    同步IO:

    同步IO是指在数据准备好以后,用户线程须要对数据进行自己的操作以达到效果,也就是同步IO是仅仅接收数据事件到来的通知。至于数据须要怎样处理。则须要另行商量。

    举样例:你去餐厅买饭。餐厅会通过某种方式告知你,菜品准备好了。你就会到餐厅去取菜。这就是同步IO。


    异步IO:

    异步IO的意思是说,在事件的等待过程中。事件准备好了也不会告诉你,而是通过你们之前约定的数据处理方法进行处理。

    在处理结束后再告知你完毕了。



    举样例来说就是:你给饭店下单。然后告诉饭店说做好了就给我送到家里(你的地址)。

    这样你就能够继续在家里玩游戏,看电视了。等菜品送到了,自然会通知你送到了。


    由此可见。同步IO和异步IO的主要关注维度是数据准备好后的流程。同步IO是准备好了通知你,你再处理。

    异步IO是事件准备好了不通知你。用之前定下的规则处理成功后再告诉你。


    好好学习,天天向上。凡是。

    。。凡是。。。。


  • 相关阅读:
    C++ 抽象类二(抽象类的基本语法)
    C++ 抽象类一(多继承与赋值兼容性原则)
    C++ 类的多态五(多态的语法本质分析)
    C++ 类的多态四(虚析构函数的重要性)
    C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)
    MEF等Ioc框架引起内存泄露-PartCreationPolicy
    MEF部件的生命周期(PartCreationPolicy)
    wpf prism IRegionManager 和IRegionViewRegistry
    silverlight开发实例(Prism+MVVM+RIA)(二)--创建shell及用户登录
    Prism框架 如何在主程序中合理的弹出子窗体
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7090565.html
Copyright © 2011-2022 走看看