网络编程----阻塞、非阻塞和同步、异步IO

来源:互联网 发布:微淘与淘宝达人 编辑:程序博客网 时间:2024/06/06 15:40

我是学渣,但我想进步。

本文是面试我的牛人问我的,你知道什么是阻塞、非阻塞和同步、异步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是事件准备好了不通知你,用之前定下的规则处理成功后再告诉你。


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


0 0
原创粉丝点击