java異步結果不阻塞,同步、異步、阻塞、非阻塞IO

 2023-11-22 阅读 20 评论 0

摘要:????? 在網上看到一篇對這四個概念比較清晰的分析的文章:http://blog.csdn.net/historyasamirror/article/details/5778378。結合自己一直在學習Java NIO方面的知識,對著四個概念做一些總結。 ? java異步結果不阻塞,????? 數據在操作系統中的簡單流動過程ÿ

????? 在網上看到一篇對這四個概念比較清晰的分析的文章:http://blog.csdn.net/historyasamirror/article/details/5778378。結合自己一直在學習Java NIO方面的知識,對著四個概念做一些總結。

?

java異步結果不阻塞,????? 數據在操作系統中的簡單流動過程:

????? 首先進程地址空間分為用戶空間和內核空間。用戶空間調用IO方法,如read(),它會陷入內核空間,有內核負責將數據從磁盤或者其它IO設備上讀入內核,再由內核將數據拷貝到用戶空間。

?

同步和異步的針對什么來說的。????? 應用程序所在的用戶進程(或線程)是否被阻塞,這是區分同步和異步的關鍵。所以,阻塞IO、非阻塞IO和多路復用IO都屬于同步IO。

????? 下面一一進行說明:

????? 阻塞IO:應用程序在用戶空間調用read(),一直等到內核準備好數據(此過程有內核線程完成,所以經過了上下文切換),將數據拷貝到用戶空間的緩沖區中。這個時候用戶線程是阻塞掛起的,它不會消耗CUP,但是它阻塞了改用戶線程改read()操作之后的所有動作。

同步與阻塞。????? 非阻塞IO:應用程序調用read(),read通過系統調用后直接返回,根據返回結果判斷是否需要繼續調用read(),這其實就是一個不斷輪詢(輪詢內核數據是否已經準備好)的過程。直到read()返回一個滿意的結果。在這個返回滿意結果的這一次調用過程中,數據從內核空間拷貝到用戶空間的緩沖區,這個過程是阻塞的。

????? 多路復用IO:通常使用selector監視多個網絡端口,本身select是阻塞的,阻塞用戶進行直到內核檢查到有網絡端口已經準備好,然后對每一個準備好的端口進行IO操作,這個IO操作過程也是阻塞的。

?

同步和異步的理解。????? 異步IO:應用程序IO操作直接返回,內核獲取數據后,將數據從內核空間拷貝到用戶空間,然后通知應用程序。應用程序收到信號后處理相關數據,處理方式可以采用回調方法的辦法。

轉載于:https://www.cnblogs.com/lanhzbupt/p/3580495.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/185176.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息