本文只是概括思路,具体概念具体底层机制还请看其他文章。
以餐厅点餐为例子。服务员是本例子的主角。
- 客人:IO请求
- 服务员:线程
- 炒菜时:IO未就绪状态
- 炒好菜:IO就绪了
- 上菜:程序处理IO请求的数据
- 后厨:内核
- 客人菜单:IO请求的数据
同步阻塞
每来一位客人,派一个新服务员把客人菜单送到后厨,炒好菜之前服务员寸步不离。
此时的服务员进入阻塞状态让出时间片,相当于神游天地,需要重新进入就绪态才能被cpu调度
炒好菜后,服务员亲自上菜。
同步非阻塞
每来一位客人,派一个新服务员把客人菜单送到后厨,炒好菜之前服务员不断询问后厨菜是否炒好。
忙等状态,不主动放弃cpu执行权。期间服务员可以不断询问也可以抽空干点其他事,主要看代码逻辑
炒好菜后,服务员亲自上菜。
多路复用
每来一位客人,服务员会告诉后厨 “有人点了菜”,然后由同一个服务员不停地依次地询问后厨哪个客人菜单炒好了。
有人点了菜:相当于将IO操作注册到select中
炒好菜后,服务员亲自上菜。(此时若其他客人菜单也炒好了,也得等他把当前客人的菜上好)
Reactor模式
每来一位客人,服务员会告诉后厨 “有人点了菜”,然后由同一个服务员不停地依次地询问后厨哪个客人菜单炒好了。
此前服务员有两个职责,一个是等炒好菜,第二个是上菜。相当于既轮询也执行业务逻辑
而现在:服务员分成了等菜员和上菜员,等菜员只需少量或者一个人来轮询后厨是否炒好菜,若炒好菜,指派上菜员给他们上菜。上菜员越多上菜越及时。上菜员不上菜时可以干别的工作。
上菜员:用户线程
等菜员:轮询IO操作的handle_event事件循环
异步IO
每来一位客人,服务员会告诉后厨 “有人点了菜”,然后去做其他事情,后厨炒好了会通知他上菜。
参考文章
https://www.cnblogs.com/lovejune/p/12547470.html
https://blog.youkuaiyun.com/weixin_30535913/article/details/97485936