IO模型总结

什么是同步异步阻塞非阻塞

同步异步

同步和异步体现的是消息通知这个机制

同步:1 两个任务依次执行,前者的成功与否关系到后者,后者依赖于前者,要么同时成功要么同时失败,是一个可靠的任务序列
2 当一个同步调用发出后,调用者要一直等待返回消息(结果)通知后,才能进行后续的执

异步:1 不同任务的执行相互不产生依赖,任务被调用者调用后不会立马返回,在任务完成后会调用回调函数,通知给调用者,是一个不可靠的任务队列

举例

拿去银行排队办理业务来举例

同步:在人后面排队,只有前面人都办完了,到你了,你就办理
异步:给你一个叫号单,到你了之后会有人叫你,去办理

第一种:前者(排队等候)就是同步等待消息通知,也就是我要一直在等待银行办理业务情况;
第二种:后者(等待别人通知)就是异步等待消息通知。在异步消息处理中,等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。

阻塞非阻塞

阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。

还是拿银行的例子来举

阻塞 : 无论你叫号还是排队 ,你在轮到你办理服务之前啥也干不了,干等着,就是阻塞,对应了线程在等待调用之前挂起
非阻塞:无论你叫号还是排队,你在轮到你办理服务之前可以打游戏,聊天,干别的,对应了线程在等待调用之前还是活跃的

有了这四个东西,就有了同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

同步阻塞:线程在等待被调用时,消息通知是同步的,一直得等待当前执行的函数返回(前面的人都办理完了,轮到你了)效率最低
异步阻塞:线程不用等待当前函数返回(拿到小纸条,直接叫你去办业务),但是这段时间你是干不了别的,你被阻塞在等待消息这件事上,
同步非阻塞:线程在等待被调用时,还可以干别的事情,你去银行排队,边排队边打游戏,打一下抬一下头去看看前面到你了没,对应程序来说就是频繁的切换线程,在两个操作中反复横跳,这个其实效率是非常低的
异步非阻塞:线程不用等待当前函数的返回才会执行,,函数会马上返回不会被阻塞,当所关注的事件被触发时会调用之前注册的回调函数进行处理。你在等业务办理的时候,拿到了叫号牌(注册回调函数),这时候你想打局游戏,你就去打了,打的时候那边忙完了到你了,你得到通知去处理。这就是效率最高的方式

总结

同步和异步关注的是消息通知的机制,是立马通知还是注册回调函数通知,阻塞非阻塞关注的是等待消息通知时线程的状态是活跃还是挂起
举个例子:
小明 下载游戏,小明要做一些事情(玩别的游戏,吃饭,睡觉等等)但是他还得下游戏因为他下完了要玩,他依赖于这个前置的任务—下载游戏
同步阻塞:小明看着下载进度条啥也不干,就看着下完没,干等
同步非阻塞:小明先去玩别的游戏或者学习,但是得边玩(边学)边看这边下载完没,来回切换
异步阻塞:下载完会有通知的弹窗和提示音但是小明还是啥也不干等着被提示
异步非阻塞:下载完会有通知的弹窗和提示音,小明在被提示之前可以想干什么干什么,甚至睡一觉(效率最高)

你可能感兴趣的:(java,面试,epoll,java,c++)