网络:同步、异步、阻塞、非阻塞

Reading time ~1 minute

好吧,这几个概念相信大家都很迷糊,反正我是一只很迷糊。。。 有空的可以看看这个知乎问题:怎样理解阻塞非阻塞与同步异步的区别?

同步与异步:

  • 同步:
    所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

  • 异步:
    异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 同步和异步关注的是消息通信机制。同步是调用者主动等待调用的结果。异步则是调用者调用后,被调用者主动通知调用者结果。

同步异步更多表示一种协作方式。 同步IO中,对同一个描述符的操作必须是有序的。甲发送一次请求,乙接收了请求并返回结果,然后甲才可以进行下一次请求。 异步IO中,异步IO可以允许多方同时对同一个描述符发送IO请求,或者一次发多个请求,当然有机制保证如何区分这些请求。甲方有请求就发送,乙方也全都接受,乙方有了结果就返回,有时候可能更甲收到的结果顺序与请求的顺序并不同。

引用一个例子: 你打电话给书店要找一本书。如果是同步,老板会让你等着,然后去找书,过段时间找到了(或者没找到),再拿起电话告诉你结果。而异步的话,老板会说”知道了,等我找找,到时候给你电话“,然后就把你电话挂了。过了一会,老板又给你打过来电话,告诉你结果。

阻塞与非阻塞:

首先要明确一个很重要的地方,在处理IO(不管是Soket还是文件之类的)的时候,阻塞和非阻塞都是同步IO。

  • 阻塞:
    阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。 要注意,不要把阻塞调用和同步调用等同起来,实际上它们是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。Socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

  • 非阻塞:
    非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。只是应用在请求的读取和发送。阻塞其实就是等待,发出通知,等待结果完成。非阻塞属于发出通知,立即返回结果,没有等待过程。

还是上面例子: 你打电话问书店老板有没有一本书。如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

Scriptable Objects 及 游戏架构

Scriptable Objects 相关介绍,及基于其的游戏架构技术 Continue reading

AssetBundle 最佳实践

Published on January 29, 2019

AssetBundle 基础总结

Published on January 27, 2019