【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!
博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!
吾等采石之人,应怀大教堂之心,愿大家奔赴在各自的热爱里…
一、I/O 阻塞、非阻塞
Java面试会常常问到什么是阻塞IO和非阻塞IO?
我们一般根据应用程序是否阻塞自身运行,把 I/O 分为阻塞 I/O 和非阻塞 I/O
我知道不容易理解 所以我们对着图来一起学习一下
举例:A找B获取一个数据,但是此时B未将此数据准备好,要等B将数据放入缓冲区后才能获取,此时A被迫等待,这就叫阻塞IO
阻塞IO解释: 在应用调用recvfrom读取数据时,其系统调用直到数据包到达且被复制到应用缓冲区中或者发送错误时才返回,在此期间一直会等待,进程从调用到返回这段时间内都是被阻塞的称为阻塞 I/O
举例:A找B获取一个数据,但是此时B未将此数据准备好,A不需要一直停留等待B,A可以做自己的事情,等到B将数据准备好后,在告诉A来取数据即可,这就是非阻塞 I/O
二、I/O 同步、异步
同步和异步是针对应用程序和内核的交互而言的。
同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪。
异步是指用户进程触发IO 操作以后便开始做自己的事情,而当IO 操作已经完成的时候会得到IO 完成的通知。
由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题
举个例子:比如把一定量的数据写入磁盘,CPU输出时间很快,可是磁盘要接收速度比较慢
同步IO:CPU等着,等着程序完全写入了磁盘,再执行后续步骤;这就是同步I/O
异步IO:CPU不等待,自己去做自己的事情,一段时间后,当IO返回结果时,再通知CPU进行处理
这里就好比人去早餐店买早点一样,如果要自己点餐排队,这个就是同步;如果点完餐,自己去做自己的事情,等到早餐好了,有人通知你去取这个就是异步
三、I/O 对比小结
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
同步、异步:针对客户端。
阻塞、非阻塞:针对服务器。
举例:
1、比如你要去买早点,点餐,排队,所有的事情都是亲力亲为,这就是同步
2、同样是买早点,你点完餐后,自己去坐着休息,等早餐好了自己再去取,这就是异步
同步和异步站在任务调度者的角度分析问题
3、比如你要去买早餐,你点了早餐,但是早餐没做好,你被迫排队等待,不能做其它的事情,这就是阻塞
4、同样是买早点,你点完餐,但是早餐没做好,你找了个人帮你看着,你去做自己的事情,比如刷抖音,看头条,等到早餐好了你再来取用,这就是非阻塞
阻塞与非阻塞是站在CPU角度来看的
小结:一直想写这篇文章,但是因为最近的工作和生活都比较匆忙,现在两个晚上终于整理完了,温故而知新,我也有了新的收获和理解,可能一开始对很多的概念很模糊,多看看图片会很容易理解,文章很多图片来源于网络,希望可以帮助大家加深记忆和理解。
非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!
愿你们奔赴在自己的热爱里!