NIO面試題大全
創(chuàng)新互聯(lián)建站長(zhǎng)期為1000多家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為白沙黎族企業(yè)提供專(zhuān)業(yè)的成都網(wǎng)站制作、成都做網(wǎng)站,白沙黎族網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。目錄
文檔索引
面試題匯總
Q:什么是同步、異步、阻塞、非阻塞?
Q:操作系統(tǒng)有哪些IO模型?
Q:多路復(fù)用IO模型系統(tǒng)怎么實(shí)現(xiàn)?select、poll、epoll區(qū)別?
Q:NIO比BIO相比有什么優(yōu)勢(shì)?
Q:NIO有哪些組件?
Q:NIO存在哪些問(wèn)題?
Q:什么是零拷貝?
A: 一次IO的過(guò)程主要是:應(yīng)用向操作系統(tǒng)發(fā)起IO指令(read、write),操作系統(tǒng)內(nèi)核準(zhǔn)備數(shù)據(jù)(把IO外部設(shè)備的數(shù)據(jù),加載到內(nèi)核緩沖區(qū)),準(zhǔn)備完畢后將數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶(hù)空間。
內(nèi)核準(zhǔn)備數(shù)據(jù)過(guò)程中,用戶(hù)進(jìn)程是否被阻塞
阻塞:用戶(hù)進(jìn)程直到內(nèi)核數(shù)據(jù)準(zhǔn)備完成,才返回
非阻塞:用戶(hù)進(jìn)程不等待內(nèi)核數(shù)據(jù)準(zhǔn)備完成,立即返回
將數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶(hù)空間時(shí),用戶(hù)進(jìn)程是否被阻塞
同步:用戶(hù)進(jìn)程等待數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶(hù)空間
異步:用戶(hù)進(jìn)程不等待數(shù)據(jù)復(fù)制,內(nèi)核復(fù)制完成后,發(fā)送信號(hào)通知進(jìn)程
Q:操作系統(tǒng)有哪些IO模型?A: 有五種模型:阻塞IO、非阻塞IO、多路復(fù)用IO、信號(hào)渠道IO、異步IO
阻塞IO:阻塞等待數(shù)據(jù)準(zhǔn)備(阻塞),數(shù)據(jù)準(zhǔn)備好后,等待數(shù)據(jù)從內(nèi)核復(fù)制到用戶(hù)空間(同步)
非阻塞IO:不等待數(shù)據(jù)準(zhǔn)備(非阻塞),通過(guò)輪詢(xún)方式判斷數(shù)據(jù)準(zhǔn)備好后,等待數(shù)據(jù)從內(nèi)核復(fù)制到用戶(hù)空間(同步)
多路復(fù)用IO:發(fā)生請(qǐng)求后,將socket注冊(cè)到select,select輪詢(xún)檢查多個(gè)socket數(shù)據(jù)是否準(zhǔn)備好(非阻塞),數(shù)據(jù)準(zhǔn)備好后,等待數(shù)據(jù)從內(nèi)核復(fù)制到用戶(hù)空間(同步)
信號(hào)渠道IO:發(fā)生請(qǐng)求后,內(nèi)核通過(guò)信號(hào)量標(biāo)志數(shù)據(jù)是否準(zhǔn)備好(非阻塞),數(shù)據(jù)準(zhǔn)備好后,等待數(shù)據(jù)從內(nèi)核復(fù)制到用戶(hù)空間(同步)
異步IO:發(fā)生請(qǐng)求后,不等待數(shù)據(jù)準(zhǔn)備(非阻塞),數(shù)據(jù)準(zhǔn)備好后,內(nèi)核將數(shù)據(jù)復(fù)制到用戶(hù)空間,然后發(fā)送信號(hào)通知數(shù)據(jù)已經(jīng)復(fù)制完成(異步)
Q:多路復(fù)用IO模型系統(tǒng)怎么實(shí)現(xiàn)?select、poll、epoll區(qū)別?A:?多路復(fù)用IO模型目前操作系統(tǒng)有select、poll、epoll三種方式
select:select函數(shù)僅僅知道有幾個(gè)I/O事件發(fā)生了,但并不知道具體是哪幾個(gè)socket連接有I/O事件,還需要輪詢(xún)?nèi)ゲ檎?,時(shí)間復(fù)雜度為O(n),處理的請(qǐng)求數(shù)越多,所消耗的時(shí)間越長(zhǎng)。
poll:poll本質(zhì)上和select沒(méi)有區(qū)別,它將用戶(hù)傳入的數(shù)組拷貝到內(nèi)核空間,然后查詢(xún)每個(gè)fd對(duì)應(yīng)的設(shè)備狀態(tài),?但是它沒(méi)有大連接數(shù)的限制,原因是它是基于鏈表來(lái)存儲(chǔ)的
epoll:epoll可以理解為event pool,不同與select、poll的輪詢(xún)機(jī)制,epoll采用的是事件驅(qū)動(dòng)機(jī)制,每個(gè)fd上有注冊(cè)有回調(diào)函數(shù),當(dāng)網(wǎng)卡接收到數(shù)據(jù)時(shí)會(huì)回調(diào)該函數(shù),同時(shí)將該fd的引用放入rdlist就緒列表中。
當(dāng)調(diào)用epoll_wait檢查是否有事件發(fā)生時(shí),只需要檢查eventpoll對(duì)象中的rdlist雙鏈表中是否有epitem元素即可。如果rdlist不為空,則把發(fā)生的事件復(fù)制到用戶(hù)態(tài),同時(shí)將事件數(shù)量返回給用戶(hù)。
Q:NIO比BIO相比有什么優(yōu)勢(shì)?A:?
1、BIO是面向流的傳輸;NIO是面向塊傳輸,按塊處理數(shù)據(jù)要比按字節(jié)處理數(shù)據(jù)快得多
2、BIO是采用同步阻塞機(jī)制,一個(gè)線(xiàn)程資源只能處理一個(gè)鏈接;NIO是采用多路復(fù)用IO,可以處理多個(gè)鏈接
3、NIO使用了零拷貝,提高了傳輸性能
Q:NIO有哪些組件?A:?
1、Channel
Channel 是對(duì)數(shù)據(jù)的源頭和數(shù)據(jù)目標(biāo)點(diǎn)流經(jīng)途徑的抽象
ServerSocketChannel:用于監(jiān)聽(tīng)新的TCP連接的通道,負(fù)責(zé)讀取&相應(yīng),通常用于服務(wù)端的實(shí)現(xiàn)
SocketChannel:用于發(fā)起TCP連接,讀寫(xiě)網(wǎng)絡(luò)中的數(shù)據(jù),通常用于客戶(hù)端的實(shí)現(xiàn)
2、Selector
Selector是通道注冊(cè)器,多個(gè)Channel均可以注冊(cè)到Selector,Selector負(fù)責(zé)監(jiān)聽(tīng)每個(gè)Channel的幾個(gè)事件:鏈接就緒、寫(xiě)就緒、讀就緒,當(dāng)某個(gè)Channel注冊(cè)就緒的事件發(fā)生,則Selector不再阻塞,返回事件集合,然后按事件不同分發(fā)處理
3、Buffer
Buffer就是一個(gè)內(nèi)存塊,底層是一個(gè)數(shù)組。Buffer提供了一組方法輕松使用內(nèi)存塊,Channel讀取或?qū)懭霐?shù)據(jù)都必須經(jīng)過(guò)Buffer
Q:NIO存在哪些問(wèn)題?A:?
1、半包讀寫(xiě)
TCP是面向連接的傳輸協(xié)議,TCP傳輸?shù)臄?shù)據(jù)是以流的形式,而數(shù)據(jù)流是沒(méi)有明確的開(kāi)始結(jié)尾邊界,所以TCP也沒(méi)辦法判斷哪一段流屬于哪一個(gè)消息,故存在粘包和半包問(wèn)題
2、斷連重連
服務(wù)端出現(xiàn)異常時(shí),客戶(hù)端可能存在連接斷開(kāi)需重新連接的情況
Q:什么是零拷貝?A: 一次IO讀寫(xiě)(如從硬盤(pán)發(fā)送網(wǎng)卡)的過(guò)程:應(yīng)用發(fā)出read指令,CPU進(jìn)行上下文切換,由用戶(hù)態(tài)轉(zhuǎn)為內(nèi)核態(tài),CPU通知DMA開(kāi)始讀取數(shù)據(jù),DMA從磁盤(pán)讀取數(shù)據(jù)到內(nèi)核緩沖,DMA完成后,向CPU發(fā)出中斷,CPU從內(nèi)核緩沖復(fù)制到用戶(hù)緩沖,復(fù)制完成后,read指令返回,CPU由內(nèi)核態(tài)轉(zhuǎn)為用戶(hù)態(tài)。
應(yīng)用發(fā)出write指令,CPU進(jìn)行上下文切換,由用戶(hù)態(tài)轉(zhuǎn)為內(nèi)核態(tài),CPU從用戶(hù)緩沖復(fù)制到socket緩沖,DMA將socket緩沖寫(xiě)入到網(wǎng)卡,寫(xiě)入完成后,write指令返回,CPU由內(nèi)核態(tài)轉(zhuǎn)為用戶(hù)態(tài)。
故整個(gè)IO讀寫(xiě)過(guò)程涉及兩次系統(tǒng)調(diào)用,四次上下文切換
通過(guò)上面的過(guò)程,我們可以看出同樣的數(shù)據(jù),從內(nèi)核緩存復(fù)制到用戶(hù)緩沖,再?gòu)?fù)制到內(nèi)核緩沖
操作系統(tǒng)提供了mmap,使得應(yīng)用和操作系統(tǒng)可共享內(nèi)核緩沖,此時(shí)就無(wú)需再將數(shù)據(jù)從內(nèi)核緩沖復(fù)制到用戶(hù)緩沖,發(fā)起write指令后,CPU直接從內(nèi)核緩沖復(fù)制到socket緩沖
但mmap只是減少了一次CPU復(fù)制事件,操作系統(tǒng)提供sendfile函數(shù)可以減少一次系統(tǒng)調(diào)用,發(fā)起sendfile后,上下文切換到內(nèi)核空間,DMA將數(shù)據(jù)復(fù)制到內(nèi)核緩沖區(qū),CPU將數(shù)據(jù)從內(nèi)核緩沖復(fù)制到socket緩沖,再經(jīng)由DMA從socket緩沖復(fù)制到網(wǎng)卡,sendfile指令返回,上下文切換到用戶(hù)空間。
可以發(fā)現(xiàn)本次sendfile僅僅發(fā)生了2次上下文切換以及3次拷貝(2次DMA拷貝+1次CPU拷貝)
linux2.4版本后,對(duì)sendfile做了優(yōu)化升級(jí),引入SG-DMA技術(shù),它可以直接從內(nèi)核空間緩沖區(qū)中將數(shù)據(jù)讀取到網(wǎng)卡,這樣的話(huà)還可以省去CPU拷貝
CPU把內(nèi)核緩沖區(qū)中的文件描述符信息(包括內(nèi)核緩沖區(qū)的內(nèi)存地址和偏移量)直接發(fā)送到socket緩沖區(qū),DMA控制器根據(jù)文件描述符信息直接把數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到網(wǎng)卡
可以看到sendfile + DMA發(fā)生了2次上下文切換以及2次數(shù)據(jù)拷貝,全程沒(méi)有通過(guò)CPU來(lái)搬運(yùn)數(shù)據(jù),所有的數(shù)據(jù)都是通過(guò)DMA進(jìn)行傳輸?shù)?,?shí)現(xiàn)了零拷貝
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧