对于阻塞/非阻塞、同步和异步的理解

记录下最近对这几个概念的理解。
先有的事物,才有的对事物的描述,然后把这些通用的描述定义成概念。

阻塞和非阻塞

程序从main函数开始,然后进行不断的函数调用。
有的函数返回很快,有的函数返回很慢。很慢的原因一般是执行复杂的运算或者io操作耗时。

如果一个函数设计成立即返回,那么这次函数调用就是非阻塞的。
如果一个函数调用的时候,调用方线程阻塞。那么这次调用就是阻塞的。

函数内部阻塞与否,指的是函数内部执行线程是否阻塞。

一个函数内部是阻塞的,可以通过开线程等手段改成调用方非阻塞。
一个函数内部是非阻塞的,可以再封装一层,通过轮询等手段,有结果才返回。调用方阻塞

对于一些系统函数,select有个超时参数,当timeout不为0时,就是阻塞调用。

总结一些:
阻塞和非阻塞:函数设计成立即返回就是非阻塞的调用,等待结果的话就是阻塞的调用,至于内部是否阻塞,要具体分析。

同步和异步

当要执行一些操作并获取结果时。如果调用方可控的获取结果就是同步的。
类似与执行A->>B->>C 一步一步执行。
如果调用方不可控的获取结果,就是异步的
A->........
B->...

异步可以通过多线程实现,也可以通过事件循环机制实现。
js的定时器开启时,执行异步计时,然后把callback放到事件队列。然后轮询执行。

总结:同步和异步说的是整个过程。如果是调用方主动获取结果,就是同步的

5种网络IO模型

阻塞

阻塞等待socket就绪

非阻塞

非阻塞等待socket就绪,没有返回-1

io多路复用

调用方再timeout内阻塞

信号驱动io

调用线程socket函数注册信号处理函数,当socket就绪发送信号。

异步

被调用方开启新的线程执行,并执行回调函数

可以看到只有异步模型是异步的,其他四种都需要自己获取结果

posted @ 2023-03-17 11:05  xzsxzxs  阅读(22)  评论(0编辑  收藏  举报