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)少量的線程為多個客戶端服務(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,主要就是操作它的三個API;

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

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

2)Buffer 緩沖區(qū)

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

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

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

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

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

Buffer有幾個基本的屬性:capacity、Position、Limit、Mark

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

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

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

3)Selector 選擇器

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

用到的一些方法:

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

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

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

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

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

6.IO圖1

7.IO圖2

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號