面試官:BIO、NIO、AIO是什麼,他們有什麼區別?

哈嘍!大家好,我是小奇,一位熱愛分享的程式設計師
小奇打算以輕鬆幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧
文章持續更新

一、前言

書接上回,感覺上次的公司氛圍不太好(其實就是女的少),還是不去了,等有了大公司要我我就再去。

今天下起了大雨,農村的空氣格外的清新,呼吸起來讓我非常的放鬆,悠然自得呀。這麼好的天氣不去買點熟食再買上瓶牛欄山在家喝一頓就可惜了,說干就干,披上雨披去鎮上買二兩牛肉。

走到了村口看到了鄰居家的大美和小美,不知道她倆去哪裡吃飯了,吃了一身巧克力。

我:「你倆這是去哪裡吃飯了?吃的這一身巧克力。」

大美:「吃啥飯呀,廠子里下了班就回來了,回家做飯吃。」

我:「沒吃飯這一身巧克力咋來的。」

小美:「剛才拐彎太猛甩出去了。」

在这里插入图片描述

我:「你倆也是人才。。。路這麼不好走我也不去鎮上買熟食了,還是回家吧,免得熟食吃不成再吃一身巧克力。」

在这里插入图片描述

回到家裡躺沙發上打開電視,這下雨天看看電視也挺美滋滋呀。突然電話響了。

我:「喂您好」。

對面:「您好,請問是小奇嗎」。

我:「是我,你是?」。

對面:「我是XXX公司的,我看到hr推給我你的簡歷,我感覺還不錯,你什麼時候方便來現場面試一下」。

我:「現在不方便現場面試了」。

對面:「好吧,那你現在方便嗎?我們現在線上面試一下吧」。

我:「好的」。

二、面試

面試官:「你能說一下網路IO模型嗎?」

我:「網路IO模型有BIO、NIO、AIO 」。

面試官:「他們分別代表什麼,有什麼區別嗎?」

BIO:同步阻塞IO。
NIO:同步非阻塞IO。
AIO:非同步非阻塞IO。

面試官:「BIO為什麼是同步阻塞IO,他阻塞的是誰跟誰之間的關聯?」。

首先在網路編程中,客戶端給服務端發送消息大約分為兩個個步驟。
1、發起連接。
2、發送數據。

在BIO中每一個連接都需要分配一個執行緒來執行,假如A客戶端連接了伺服器,但是還沒有發送消息,這個時候B客戶端向伺服器發送連接請求,這個時候伺服器是沒有辦法處理B客戶端的連接請求的。

在这里插入图片描述

因為一個執行緒處理了一個客戶端的連接後就阻塞住,並等待處理該客戶端發送過來的數據。處理完該客戶端的數據後才能處理其他客戶端的連接請求。

在这里插入图片描述

面試官:「那你這個是只有一個執行緒的時候,那我弄多個執行緒不就好了,來一個請求連接我弄一個執行緒」。

我:「那假如有一萬個連接請求同時過來,那你開啟一萬個執行緒服務端不就崩了嘛。」

面試官:「那我弄一個執行緒池呢,我最大執行緒數最多弄500呢?」。

我:「那假如有500執行緒只請求連接,並不發送數據呢,那你這個執行緒池不也一樣廢了嗎。這500個請求連接上了還沒有發送數據,那麼執行緒池的500個執行緒就沒辦法去處理別的請求,這樣照樣廢廢了。」

面試官:「那咋辦呢?」。

我:「別慌,哥有辦法,可以使用NIO同步非阻塞,這樣就不需要很多執行緒,一個執行緒也能處理很多的請求連接和請求數據。」

面試官:「NIO他是怎麼實現一個執行緒處理多個連接請求和多個請求數據的呢?」。

我:「NIO會將獲取的請求連接放入到一個數組中,然後再遍歷這個數據查看這些連接有沒有數據發送過來。」

在这里插入图片描述

面試官:「這招高啊」。

我:「那必須滴。」

面試官:「但是有個問題啊,如果B和C只連接了,但是一直沒有發送數據,那每次還循環判斷他倆有沒有發送數據的請求是不是有點多餘了,能不能在我知道B和C肯定發送了數據的情況下再去遍歷他呢?」。

我:「那你讓客戶B和客戶C發送數據的時候給你打一個電話不就行了,然後你就只遍歷他倆。」

面試官:「他們也不能夠給我打呀,你再想一個別的辦法」。

我:「可以引入Epoll,在JDK1.5開始引入了epoll通過事件響應來優化NIO,原理是客戶端的每一次連接和每一次發送數據都看作是一個事件,每次發生事件會註冊到服務端的一個集合中去,然後客戶端只需要遍歷這個集合就可以了。」

面試官:「那AIO有什麼特點呢?」

我:「AIO是非同步非阻塞,他對於客戶端的連接請求和發送數據請求是用不同的執行緒來處理的,他是通過回調來通知服務端程式去啟動執行緒處理,適用於長連接的場景。」

面試官:「小夥子不錯呀,什麼時候能回北京入職呢」

我:「額。。。等等吧,現在家裡雨太大了,容易弄一身巧克力。」

面試官:「行,那你來了北京一定來我們公司上班啊」

我:「額。。。這個跟你承諾不了,萬一還有別的好公司給我打電話呢」。

面試官:「來吧,條件好商量」

我:「我考慮考慮吧」。

三、總結

這裡關於網路編程模型還沒有整理完畢,文章後面持續更新,建議收藏。

文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。

如果覺得我的文章還不錯的話就點個贊吧

Tags: