淺析Java IO相關(guān)知識(shí)點(diǎn)
最近面試問的比較多的問題就是IO這一塊了,有些也答出來了,有些答的不好,最近這段時(shí)間開始深入了解一些這方面的東西,也想總結(jié)一下。
前置點(diǎn)
1,用戶空間系統(tǒng)空間
Linux系統(tǒng)會(huì)把一個(gè)進(jìn)程分為兩個(gè)空間,用戶空間和系統(tǒng)空間,比如我們正常的編碼,操作的都是用戶空間的,那如果我們需要調(diào)用系統(tǒng)功能,比如拷貝系統(tǒng)文件,這種就需要調(diào)用系統(tǒng)組件,獲取內(nèi)核服務(wù),完成操作
IO的兩個(gè)階段
IO的執(zhí)行過程中分為兩個(gè)階段,等待就緒,執(zhí)行拷貝
等待就緒:我們知道,我們執(zhí)行IO操作的時(shí)候,數(shù)據(jù)可能來自別的應(yīng)用程序或者網(wǎng)絡(luò),如果沒有數(shù)據(jù),操作系統(tǒng)是會(huì)一直等待的,此時(shí),應(yīng)用程序可能也會(huì)一直等待
執(zhí)行拷貝:將數(shù)據(jù)拷貝到應(yīng)用程序工作區(qū)
阻塞與非阻塞,同步與異步
先說同步與非同步,最簡(jiǎn)單就是看是否啟動(dòng)一個(gè)線程或者進(jìn)程來完成IO這件事情,同步IO的時(shí)候,系統(tǒng)會(huì)停下來等這個(gè)做完才能做別的事情,而異步IO就利用多線程的方式,啟動(dòng)一個(gè)新的線程去做這件事情,而自己就可以去干別的事情等待通知
再說阻塞與非阻塞吧,這兩個(gè)其實(shí)關(guān)注的是程序在等待調(diào)用結(jié)果的時(shí)候的狀態(tài),阻塞是指,你在獲取這個(gè)結(jié)果的時(shí)候,你會(huì)一直掛起,直到等到完整結(jié)果之后你才會(huì)繼續(xù)執(zhí)行,非阻塞是指,在該進(jìn)程不能獲取結(jié)果的時(shí)候,沒有阻塞線程,這個(gè)有點(diǎn)繞,有一個(gè)通俗的解釋,如果是阻塞的,我要獲取這個(gè)東西,獲取過程中,我就失去了CPU,等到結(jié)果之后我才會(huì)獲取CPU,但是如果我是非阻塞,我就繼續(xù)持有CPU,我還可以一直檢查
幾種IO模型
目前比較多的就是5種
阻塞IO
最傳統(tǒng)的一種IO,即讀寫會(huì)發(fā)生阻塞現(xiàn)象的
非阻塞IO
用戶發(fā)起read的時(shí)候,并不會(huì)失去CPU,會(huì)一直check,如果沒有成功,會(huì)返回一個(gè)error,如果收到成功信號(hào),就會(huì)發(fā)起read操作,獲取完整結(jié)果
多路復(fù)用IO
這個(gè)就是Java NIO的核心了,會(huì)有一個(gè)線程管理多個(gè)socket的狀態(tài),檢查是否有準(zhǔn)備好的,只有發(fā)現(xiàn)真正準(zhǔn)備好,才會(huì)調(diào)用cpu執(zhí)行IO操作,這塊是比較重要的
信號(hào)驅(qū)動(dòng)IO
用的少,忽略
異步IO
起一個(gè)線程去執(zhí)行吧
相關(guān)文章
Java?synchronized輕量級(jí)鎖實(shí)現(xiàn)過程淺析
這篇文章主要介紹了Java synchronized輕量級(jí)鎖實(shí)現(xiàn)過程,synchronized是Java里的一個(gè)關(guān)鍵字,起到的一個(gè)效果是"監(jiān)視器鎖",它的功能就是保證操作的原子性,同時(shí)禁止指令重排序和保證內(nèi)存的可見性2023-02-02
Java及Android中常用鏈?zhǔn)秸{(diào)用寫法簡(jiǎn)單示例
這篇文章主要介紹了Java及Android中常用鏈?zhǔn)秸{(diào)用寫法,結(jié)合實(shí)例形式分析了java編程中的鏈?zhǔn)秸{(diào)用概念、簡(jiǎn)單使用方法及相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
springboot如何通過注解實(shí)現(xiàn)多線程
在Spring Boot中實(shí)現(xiàn)異步方法時(shí),如果直接在調(diào)用類中使用`@Async`注解,可能會(huì)導(dǎo)致異步失敗,正確的做法是將實(shí)現(xiàn)異步的方法放在一個(gè)獨(dú)立的類中,并通過Spring生成的bean來調(diào)用這個(gè)方法,這樣可以成功實(shí)現(xiàn)異步2024-12-12
Netty中的DelimiterBasedFrameDecoder使用方法詳解
這篇文章主要介紹了Netty中的DelimiterBasedFrameDecoder使用方法詳解,DelimiterBasedFrameDecoder與LineBasedFrameDecoder類似,只不過更加通用,允許我們指定任意特殊字符作為分隔符,我們還可以同時(shí)指定多個(gè)分隔符,需要的朋友可以參考下2023-12-12
SpringBoot詳細(xì)講解多個(gè)配置文件的配置流程
SpringBoot項(xiàng)目是一個(gè)標(biāo)準(zhǔn)的Maven項(xiàng)目,它的配置文件需要放在src/main/resources/下,其文件名必須為application,其存在兩種文件形式,分別是properties和yaml(或者yml)文件2022-06-06
詳解Spring Cloud Gateway基于服務(wù)發(fā)現(xiàn)的默認(rèn)路由規(guī)則
這篇文章主要介紹了詳解Spring Cloud Gateway基于服務(wù)發(fā)現(xiàn)的默認(rèn)路由規(guī)則,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05

