对于阻塞/非阻塞、同步和异步的理解
记录下最近对这几个概念的理解。
先有的事物,才有的对事物的描述,然后把这些通用的描述定义成概念。
阻塞和非阻塞
程序从main函数开始,然后进行不断的函数调用。
有的函数返回很快,有的函数返回很慢。很慢的原因一般是执行复杂的运算或者io操作耗时。
如果一个函数设计成立即返回,那么这次函数调用就是非阻塞的。
如果一个函数调用的时候,调用方线程阻塞。那么这次调用就是阻塞的。
函数内部阻塞与否,指的是函数内部执行线程是否阻塞。
一个函数内部是阻塞的,可以通过开线程等手段改成调用方非阻塞。
一个函数内部是非阻塞的,可以再封装一层,通过轮询等手段,有结果才返回。调用方阻塞
对于一些系统函数,select有个超时参数,当timeout不为0时,就是阻塞调用。
总结一些:
阻塞和非阻塞:函数设计成立即返回就是非阻塞的调用,等待结果的话就是阻塞的调用,至于内部是否阻塞,要具体分析。
同步和异步
当要执行一些操作并获取结果时。如果调用方可控的获取结果就是同步的。
类似与执行A->>B->>C 一步一步执行。
如果调用方不可控的获取结果,就是异步的
A->........
B->...
异步可以通过多线程实现,也可以通过事件循环机制实现。
js的定时器开启时,执行异步计时,然后把callback放到事件队列。然后轮询执行。
总结:同步和异步说的是整个过程。如果是调用方主动获取结果,就是同步的
5种网络IO模型
阻塞
阻塞等待socket就绪
非阻塞
非阻塞等待socket就绪,没有返回-1
io多路复用
调用方再timeout内阻塞
信号驱动io
调用线程socket函数注册信号处理函数,当socket就绪发送信号。
异步
被调用方开启新的线程执行,并执行回调函数
可以看到只有异步模型是异步的,其他四种都需要自己获取结果