IO和NIO

2018-05-03 22:18 更新

1.什么是阻塞和非阻塞?什么是同步和異步?

阻塞和非阻塞:

從線程的角度考慮 ,線程掛起 不在搶奪CPU 則稱為線程被阻塞 同步和異步:

任務(wù)的執(zhí)行需要相互等待、相互協(xié)調(diào)為同步;各執(zhí)行各的,不管其他人,是異步。

2.解釋一下什么是NIO?

是jdk1.4出現(xiàn)同步非阻塞式IO,它可以實(shí)現(xiàn)面向通道操作緩沖區(qū),雙向的傳遞數(shù)據(jù),它適合在高并發(fā)的情況下使用,可以實(shí)現(xiàn)少量的線程為多個(gè)客戶端服務(wù)。

3.NIO和IO有什么區(qū)別?

1) BIO: 面向流,操作字節(jié)字符,具有方向性,同步阻塞式IO 比喻:水管 InputStream OutputStream Reader Writer

         

2)NIO: 面向通道,操作緩沖區(qū),可以雙向傳輸數(shù)據(jù),同步非阻塞式IO 比喻:地下通道 Channel Buffer Selector

4.NIO的常用API?

要實(shí)現(xiàn)NIO,主要就是操作它的三個(gè)API;

1)Channel 通道 可以實(shí)現(xiàn)雙向傳輸數(shù)據(jù)

既能讀,又能寫(xiě),在使用的時(shí)候需要調(diào)用方法將其設(shè)置為false,即非阻塞模式;它有很多的實(shí)現(xiàn)類:

2)Buffer 緩沖區(qū)

在內(nèi)存中開(kāi)辟一段連續(xù)的空間,用于存儲(chǔ)臨時(shí)的數(shù)據(jù)。

常用的ByteBuffer,和CharBuffer,還有其它的用于不同的數(shù)據(jù)類型

所有的buffer都是抽象類,無(wú)法被直接實(shí)例化;

緩沖區(qū)的數(shù)據(jù)存放在內(nèi)存中,能提高讀寫(xiě)效率;

緩沖區(qū)有指針記錄,能改變讀寫(xiě)數(shù)據(jù)的起始點(diǎn),處理靈活;

Buffer有幾個(gè)基本的屬性:capacity、Position、Limit、Mark

  • Int Capacity()容量,緩沖區(qū)支持的最大容量
  • Int Position()記錄指針,緩沖區(qū)讀寫(xiě)數(shù)據(jù)的起始點(diǎn)。開(kāi)始為0,最大為limit
  • Int Limit()界限,讀寫(xiě)數(shù)據(jù)的終止點(diǎn)
  • Mark標(biāo)記,在0-positon,設(shè)置該值

緩沖區(qū)常用的方法:清除/反轉(zhuǎn)/環(huán)繞/存放/取/存

  • Clear()清空緩沖區(qū),僅僅是移動(dòng)position和limit,在往里寫(xiě)會(huì)覆蓋原有的數(shù)據(jù)
  • flip()實(shí)現(xiàn)反轉(zhuǎn)緩沖區(qū),確定緩存區(qū)的數(shù)據(jù)的起點(diǎn)和終止點(diǎn)
  • Rewind() 重繞緩沖區(qū),就是重新讀一遍
  • hasRemaining()判斷positon和limit之間是否有元素
  • Mark() 標(biāo)記一個(gè)mark,隨時(shí)可以回到這個(gè)標(biāo)記
  • Wrap()創(chuàng)建緩沖區(qū)
  • Get()和put()獲取元素和存放元素

3)Selector 選擇器

多個(gè)客戶端在Selector中注冊(cè)自己,多個(gè)通道注冊(cè)到Selector中,通過(guò)選擇操作選出就緒的鍵,通道線程來(lái)實(shí)現(xiàn)少量線程的為多個(gè)客戶端服務(wù)

用到的一些方法:

  • register()方法;將通道注冊(cè)到選擇器中,
  • Selector.open();獲取選擇器
  • int select();選擇器進(jìn)行選擇操作
  • Set<SelectionKey> selectedKeys();獲取已經(jīng)就緒的鍵

5.什么是網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)恼嘲鼏?wèn)題?

數(shù)據(jù)包之間發(fā)生的粘連問(wèn)題,網(wǎng)絡(luò)分為7層,每層負(fù)責(zé)每層的任務(wù), TCP不理解應(yīng)用層傳輸過(guò)來(lái)的數(shù)據(jù)

由于TCP傳輸是一種可靠的連續(xù)的數(shù)據(jù)傳輸,如果兩次傳輸?shù)臄?shù)據(jù)時(shí)間間隔比較短,數(shù)據(jù)的接收方可能很難判斷出兩次數(shù)據(jù)的邊界在哪里,感覺(jué)就好像兩個(gè)數(shù)據(jù)黏著在了一次,無(wú)法區(qū)分。

粘包問(wèn)題常用的解決辦法:
1)每次傳輸固定大小的數(shù)據(jù),存在資源浪費(fèi),缺乏靈活性
2)約定分隔符,如果符號(hào)相同,轉(zhuǎn)義一下,需要解析,不是很好
3)使用協(xié)議,雙方約定好
使用公開(kāi)協(xié)議,或者私有的協(xié)議
在傳輸?shù)倪^(guò)程中,先傳遞長(zhǎng)度信息,在根據(jù)長(zhǎng)度信息獲取數(shù)據(jù)

6.IO圖1

7.IO圖2

推薦一篇好文章https://www.cnblogs.com/xiaoxi/p/6576588.html

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)