看電影
終于周末了台汇,今天天氣真好呀,聽說《阿凡達》重新上映了篱瞎!我們趕緊去看吧苟呐!
當女朋友同意去看電影了,你穿好鞋收拾好了俐筋,女朋友突然說等等我收拾下牵素!一個漫長的等待將要開始了,洗澡澄者、補水笆呆、防曬...... 若干年后..... 。你啥也不敢粱挡,干巴巴的看著她一點點的化妝赠幕,當收拾好了打車到電影院天色已經(jīng)見晚!
女友要收拾打扮的時候询筏,你在旁邊啥也不干等待著她收拾榕堰,直到她收拾完一起出發(fā),這個過程就是同步嫌套。
幾周后.......
哎哎哎逆屡! 聽說《哥斯拉大戰(zhàn)金剛》上映啦圾旨! 同事說很好看哎,我們一起去看吧魏蔗!
當女朋友同意要去看的時候砍的,突然想起來上次看電影前漫長的等待,不僅陷入了長思......
不能在那干等拜褐巍挨约! 對頭! LOL 排位賽我怎么忘了呢产雹!這個時間我還能打幾百把游戲呢诫惭!
聰明的你在女朋友收拾的過程中不在死等啥也不干,而是去打游戲了蔓挖,當你女朋友收拾完后通知你出發(fā)夕土。這就是異步 。
通過上面的看電影不難看出瘟判,在第二次看電影前等女朋友收拾的過程中你在打游戲怨绣,打游戲和收拾兩件事在同時發(fā)生,不需要雙方互相等待拷获,這就是異步為什么比同步高效篮撑。
上述的同步和異步是線程間調(diào)用,是調(diào)用者和被調(diào)用者之間協(xié)同工作的方式匆瓜。
同步是調(diào)用方等待被調(diào)用方執(zhí)行完成后再執(zhí)行赢笨;
異步是兩方一起干,被調(diào)用者完成后通知調(diào)用者即可驮吱。
打電話
上次等女朋友看電影茧妒,她生氣我等她沒有耐心,這不打電話問問小松怎么哄女朋友左冬!
小松女朋友接的桐筏,小松好像在忙,我就等了一會拇砰, 直到他接到電話詢問他怎么辦梅忌!這種一直等待的方式屬于阻塞IO。
1除破、讓小松接電話: 調(diào)用 read() 函數(shù)讀取數(shù)據(jù)牧氮,沒有數(shù)據(jù)就一直等待,用戶線程進入阻塞狀態(tài)皂岔。
2蹋笼、老王展姐,剛才忙躁垛,找我什么事?: 數(shù)據(jù)就緒后剖毯,內(nèi)核將數(shù)據(jù)拷貝到用戶線程,用戶此時解除阻塞狀態(tài)教馆。
信號不好逊谋,電話突然中斷.......
再打過去他又不在,我沒有和上次一樣一直等待土铺,而是掛斷了去忙其他事情了胶滋,過了一會再打,又不在悲敷, 再打究恤,又不在...... 打了很多遍終于接通了,這種方式屬于非阻塞IO后德。
1部宿、讓小松接電話: 調(diào)用 read(設(shè)置為非阻塞)
, 無數(shù)據(jù),立即返回瓢湃;
2理张、讓小松接電話: 調(diào)用read(設(shè)置為非阻塞)
, 無數(shù)據(jù),立即返回绵患;
3雾叭、 .......
4、老王落蝙,剛才忙织狐,找我什么事?: 內(nèi)核數(shù)據(jù)就緒,內(nèi)核將數(shù)據(jù)拷貝到用戶線程筏勒。
可見赚瘦,這種非阻塞一般是在一個 while
循環(huán)中不斷調(diào)用 read
, 如果數(shù)據(jù)未就緒奏寨,用戶線程將處于忙輪詢起意,CPU
使用率會很高。
買禮物
詢問小松后病瞳,給女朋友準備了兩份小驚奇揽咕!
快遞遲遲不到,要不打電話問問快遞員套菜!
我打電話快遞員說還沒有到亲善,到了會通知我,我就接著干我的事情去了逗柴∮纪罚快遞小哥等待了一會后,快遞到達菜鳥驛站了,收到快遞小哥的電話后渣蜗,我馬不停蹄的去取快遞屠尊,最終快遞被我扛回了家。這就是所謂的同步IO耕拷。
reactor
模型:
1讼昆、打電話詢問快遞是否到了 :即調(diào)用 epoll/poll/select
函數(shù);
2骚烧、親浸赫,您的快遞到來,到菜鳥驛站提仍甙怼: 即 epoll
函數(shù)返回既峡,通知你某個 fd
上面有數(shù)據(jù)到來;
3碧查、麻溜的去取快遞:即調(diào)用 read 函數(shù)從內(nèi)核讀取數(shù)據(jù)涧狮,此時調(diào)用數(shù)據(jù)一定存在;
注意: 同步 IO 的特點是: 第三步時候主動調(diào)用 read
時候么夫,需要從內(nèi)核 copy
數(shù)據(jù)到用戶態(tài)者冤,這個過程用戶態(tài)是需要等待的,即 reactor
是屬于同步IO档痪。
還有一個禮物沒到呢涉枫! 打電話詢問快遞小哥,也沒有到腐螟,然后我就去洗衣服去了愿汰。過了一會快遞到達菜鳥驛站后快遞小哥直接將快遞搬到了我的家門口,然后通知我快遞到了乐纸。這就是異步IO衬廷。
proactor
模型:
1、打帶你詢問快遞是否到了: 調(diào)用 aio_read(buf)
汽绢, 并傳遞一個用戶讀取緩沖區(qū)吗跋,立即返回。
2宁昭、親跌宛,你的快遞已經(jīng)到了: signal/callback
的方式通知你,內(nèi)核已經(jīng)將數(shù)據(jù)從拷貝到了你傳遞進來的 buf
中了积仗。您可以直接使用了疆拘。不需要去等待。
總結(jié):
異步 IO 和同步 IO 的關(guān)鍵點在于: 用戶進程是否需要等待把數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間寂曹。和阻塞非阻塞沒關(guān)系哎迄。只要用戶進程等待數(shù)據(jù)拷貝就是同步回右。
阻塞和非阻塞關(guān)鍵點在于: 阻塞和非阻塞都有等待數(shù)據(jù)拷貝過程。不過非阻塞IO 不會再沒有數(shù)據(jù)時傻等漱挚。