摘要:同步信號(hào)驅(qū)動(dòng)在快遞柜上寫(xiě)上自己的手機(jī)號(hào)回調(diào)函數(shù),當(dāng)快遞送過(guò)來(lái)的時(shí)候直接給我打電話(huà)執(zhí)行回調(diào)函數(shù),然后我去取快遞。
IO模型
對(duì)于IO,我們經(jīng)常可以聽(tīng)到諸如同步阻塞IO,同步非阻塞IO,異步IO等等,那么什么是異步/同步,什么是阻塞/非阻塞?首先一次IO在UNIX系統(tǒng)中分為兩個(gè)步驟
1.發(fā)起IO請(qǐng)求:用戶(hù)線(xiàn)程向操作系統(tǒng)內(nèi)核發(fā)起IO請(qǐng)求
2.執(zhí)行IO操作:當(dāng)內(nèi)核準(zhǔn)備好數(shù)據(jù)可以提交給發(fā)起IO請(qǐng)求的線(xiàn)程
阻塞/非阻塞的區(qū)別:發(fā)起IO請(qǐng)求之后會(huì)一直等待直到獲取數(shù)據(jù)則是阻塞,否則是非阻塞
同步/異步的區(qū)別:獲取到的數(shù)據(jù)是自己主動(dòng)拿到的則是同步,是被動(dòng)拿到的則是異步
下面我用取快遞這個(gè)例子來(lái)介紹一下UNIX的五種IO模型
眾所周知吸管喝飲料分為兩個(gè)步驟:1.打開(kāi)快遞柜(發(fā)起IO請(qǐng)求),2.取走快遞(執(zhí)行IO操作)
同步&阻塞IO打開(kāi)快遞柜(發(fā)起IO請(qǐng)求),如果快遞柜里沒(méi)有東西(內(nèi)核沒(méi)有準(zhǔn)備好數(shù)據(jù)),則一直等在快遞柜旁等快遞來(lái)(阻塞直到內(nèi)核準(zhǔn)備好數(shù)據(jù)),快遞柜有了快遞則取走(用戶(hù)線(xiàn)程讀取內(nèi)核中的數(shù)據(jù))。
整個(gè)流程除了拿快遞,等快遞不能做其他事
同步&非阻塞IO打開(kāi)快遞柜(發(fā)起IO請(qǐng)求),如果快遞柜里沒(méi)有東西(內(nèi)核沒(méi)有準(zhǔn)備好數(shù)據(jù)),則馬上做其他事情每隔一段時(shí)間就去快遞柜里打開(kāi)看看是否有快遞(輪詢(xún)內(nèi)核是否準(zhǔn)備好數(shù)據(jù)),快遞柜有了快遞則取走(用戶(hù)線(xiàn)程讀取內(nèi)核中的數(shù)據(jù))。
盡管這個(gè)模型相對(duì)同步阻塞IO效率有一定提升,但是大量的無(wú)用輪詢(xún)?cè)斐闪薈PU的空轉(zhuǎn),很少使用這種IO模型
同步&多路復(fù)用IO需要同時(shí)取N個(gè)快遞,派一個(gè)人幫你監(jiān)視快遞柜,告訴他你想要哪個(gè)快遞比如告訴他我要天貓的快遞,然后這個(gè)監(jiān)視者一直站在快遞柜旁邊等待天貓快遞到來(lái)并簽收,我們只需要向這個(gè)監(jiān)視者拿快遞就行了。
這個(gè)模型中,監(jiān)視者就是我們Java NIO中的Selector,一個(gè)線(xiàn)程阻塞同時(shí)監(jiān)管多個(gè)線(xiàn)程連接狀態(tài),返回給調(diào)用者連接狀態(tài)滿(mǎn)足所注冊(cè)的狀態(tài)條件連接線(xiàn)程。
同步&信號(hào)驅(qū)動(dòng)IO在快遞柜上寫(xiě)上自己的手機(jī)號(hào)(回調(diào)函數(shù)),當(dāng)快遞送過(guò)來(lái)的時(shí)候直接給我打電話(huà)(執(zhí)行回調(diào)函數(shù)),然后我去取快遞。
異步IO假設(shè)收快遞的是一個(gè)國(guó)王,只需要叫一聲 我想要收到我的快遞,剩下的都不用國(guó)王自己操心了,會(huì)派人去快遞柜門(mén)口等快遞,然后會(huì)有人幫忙把快遞送到手上(用戶(hù)線(xiàn)程)
思考其實(shí)同步異步/阻塞非阻塞并非只是在計(jì)算機(jī)的世界里有,在互聯(lián)網(wǎng)時(shí)代,大部分的場(chǎng)景都在經(jīng)歷IO模型之間的轉(zhuǎn)變
網(wǎng)購(gòu)/外賣(mài):就是一種異步IO,商品(數(shù)據(jù))從賣(mài)家/餐廳(內(nèi)核態(tài))被送貨員送到家(線(xiàn)程態(tài)),傳統(tǒng)的從家里到餐廳然后吃飯,吃了回家,就是一種典型的同步阻塞IO。
滴滴打車(chē):是一種信號(hào)驅(qū)動(dòng)IO,在滴滴上下單過(guò)后就只需等待滴滴軟件提示(回調(diào)函數(shù))已經(jīng)分配好司機(jī)并且正在來(lái)接你。傳統(tǒng)的方式則是自己要在路口等出租車(chē)/公交車(chē),同步阻塞IO。
微信/短信:非阻塞同步IO,要通知其他人直接把信息發(fā)出去就不用管了,一段時(shí)間去看看對(duì)方是否有回復(fù)(輪詢(xún))。而傳統(tǒng)的打電話(huà)則要確保對(duì)方接聽(tīng)并將信息告知對(duì)方,同步阻塞IO。
種植業(yè):多路復(fù)用IO,比如farmer每天去看果園哪些蘋(píng)果紅了(滿(mǎn)足注冊(cè)的條件)就將紅蘋(píng)果收下來(lái)。如果種植業(yè)機(jī)械化程度夠高,則可以變成異步IO的模式,種植,澆水,收割全部由機(jī)器完成。
等等
社會(huì)上所有能夠提升效率的場(chǎng)景,基本可以用IO模型去進(jìn)行思考,演進(jìn)過(guò)程也大致是從同步—》異步,阻塞—》非阻塞
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/76829.html
摘要:作為開(kāi)發(fā)中應(yīng)用最廣泛的開(kāi)源腳本語(yǔ)言,憑借庫(kù)類(lèi)豐富,使用簡(jiǎn)單,安全等特點(diǎn),成為和等互聯(lián)網(wǎng)巨頭和全球超過(guò)網(wǎng)站的主要開(kāi)發(fā)語(yǔ)言,然而性能問(wèn)題是一直以來(lái)飽受詬病的,來(lái)自開(kāi)發(fā)組的高馳濤同學(xué)將為我們帶來(lái)他對(duì)性能優(yōu)化方面的思考和建議。 PHP作為Web開(kāi)發(fā)中應(yīng)用最廣泛的開(kāi)源腳本語(yǔ)言,憑借庫(kù)類(lèi)豐富,使用簡(jiǎn)單,安全等特點(diǎn),成為Facebook和BAT等互聯(lián)網(wǎng)巨頭和全球超過(guò)70%網(wǎng)站的主要開(kāi)發(fā)語(yǔ)言,然而性能...
摘要:宋體是一款自主研發(fā)的分布式文件存儲(chǔ)產(chǎn)品,此前已推出容量型版本。宋體性能的提升不僅僅是因?yàn)榇鎯?chǔ)介質(zhì)的升級(jí),更有架構(gòu)層面的改進(jìn),本文將從協(xié)議索引存儲(chǔ)設(shè)計(jì)等幾方面來(lái)詳細(xì)介紹性能型升級(jí)改造的技術(shù)細(xì)節(jié)。UFS (UCloud File System) 是一款 UCloud 自主研發(fā)的分布式文件存儲(chǔ)產(chǎn)品,此前已推出容量型 UFS 版本。UFS 以其彈性在線(xiàn)擴(kuò)容、穩(wěn)定可靠的特點(diǎn),為眾多公有云、物理云、托管...
摘要:進(jìn)程和線(xiàn)程究竟是什么東西傳統(tǒng)網(wǎng)絡(luò)服務(wù)模型是如何工作的協(xié)程和線(xiàn)程的關(guān)系和區(qū)別有哪些過(guò)程在什么時(shí)間發(fā)生在剛剛結(jié)束的上海站,來(lái)自七牛云存儲(chǔ)的高級(jí)工程師許智翔帶來(lái)了關(guān)于的分享中的進(jìn)程線(xiàn)程協(xié)程同步異步回調(diào)。使用紅黑樹(shù)管理就緒隊(duì)列。 進(jìn)程和線(xiàn)程究竟是什么東西?傳統(tǒng)網(wǎng)絡(luò)服務(wù)模型是如何工作的?協(xié)程和線(xiàn)程的關(guān)系和區(qū)別有哪些?IO過(guò)程在什么時(shí)間發(fā)生? 在剛剛結(jié)束的 PyCon2014 上海站,來(lái)自七牛云...
閱讀 1180·2021-11-24 09:39
閱讀 2688·2021-09-28 09:35
閱讀 1081·2019-08-30 15:55
閱讀 1371·2019-08-30 15:44
閱讀 885·2019-08-29 17:00
閱讀 1982·2019-08-29 12:19
閱讀 3319·2019-08-28 18:28
閱讀 697·2019-08-28 18:10