哈嘍!大家好,我是小奇,一位熱愛分享的程式設計師
小奇打算以輕鬆幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧
文章持續更新
一、前言
書接上回,感覺上次的公司氛圍不太好(其實就是女的少),還是不去了,等有了大公司要我我就再去。
今天下起了大雨,農村的空氣格外的清新,呼吸起來讓我非常的放鬆,悠然自得呀。這麼好的天氣不去買點熟食再買上瓶牛欄山在家喝一頓就可惜了,說幹就幹,披上雨披去鎮上買二兩牛肉。
走到了村口看到了鄰居家的大美和小美,不知道她倆去哪裡吃飯了,吃了一身巧克力。
我:“你倆這是去哪裡吃飯了?吃的這一身巧克力。”
大美:“吃啥飯呀,廠子裡下了班就回來了,回家做飯吃。”
我:“沒吃飯這一身巧克力咋來的。”
小美:“剛才拐彎太猛甩出去了。”
我:“你倆也是人才。。。路這麼不好走我也不去鎮上買熟食了,還是回家吧,免得熟食吃不成再吃一身巧克力。”
回到家裡躺沙發上開啟電視,這下雨天看看電視也挺美滋滋呀。突然電話響了。
我:“喂您好”。
對面:“您好,請問是小奇嗎”。
我:“是我,你是?”。
對面:“我是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是非同步非阻塞,他對於客戶端的連線請求和傳送資料請求是用不同的執行緒來處理的,他是通過回撥來通知服務端程式去啟動執行緒處理,適用於長連線的場景。”
面試官:“小夥子不錯呀,什麼時候能回北京入職呢”
我:“額。。。等等吧,現在家裡雨太大了,容易弄一身巧克力。”
面試官:“行,那你來了北京一定來我們公司上班啊”
我:“額。。。這個跟你承諾不了,萬一還有別的好公司給我打電話呢”。
面試官:“來吧,條件好商量”
我:“我考慮考慮吧”。
三、總結
這裡關於網路程式設計模型還沒有整理完畢,文章後面持續更新,建議收藏。
文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。
如果覺得我的文章還不錯的話就點個贊吧