摘要:接下來(lái)我們就來(lái)探討下異步同步與阻塞非阻塞它們其中的區(qū)別。阻塞非阻塞是針對(duì)的第一階段的描述。
一: 引言Author: bugall
Wechat: bugallF
Email: 769088641@qq.com
Github: https://github.com/bugall
在面試中我們會(huì)碰到這種場(chǎng)景:
面試官:能解釋下什么是同步,異步么?
程序員:假如我們執(zhí)行A,B兩個(gè)IO操作的時(shí)候,如果必須等待A完成后才能執(zhí)行B那么這個(gè)就是
同步的,如果A,B可以同時(shí)執(zhí)行那么就是異步的。
面試官:那能解釋下什么是阻塞什么是非阻塞么?
程序員:如果必須等待A完成后才能執(zhí)行B那么這個(gè)就是阻塞的,如果A,B可以同時(shí)執(zhí)行那么就 是非阻塞的
面試官:那你的意思異步/同步的概念與阻塞非阻塞一樣了?
程序員:嗄。。??梢赃@么說(shuō)吧。我覺(jué)得可以并發(fā)執(zhí)行的就是異步非阻塞的。one by one執(zhí)行 的就是同步阻塞的
二:區(qū)分每個(gè)人看去看同一個(gè)問(wèn)題都會(huì)有不同的理解,原因就是因?yàn)槊總€(gè)人的看待問(wèn)題的深度不一樣,就像上面的對(duì)白,程
序員的理解只是停留在應(yīng)用層面,代碼里有多個(gè)IO操作,每個(gè)IO操作都可以不用互相等待的“同時(shí)”執(zhí)行。
接下來(lái)我們就來(lái)探討下異步/同步與阻塞/非阻塞它們其中的區(qū)別。
阻塞 / 非阻塞描述的是函數(shù), 指訪問(wèn)某個(gè)函數(shù)時(shí)是否會(huì)阻塞線程(block),導(dǎo)致線程進(jìn)入阻塞狀態(tài)。
同步 / 異步描述的是執(zhí)行IO操作的主體是誰(shuí),同步是由用戶態(tài)的進(jìn)程自己去執(zhí)行IO操作,異步是用戶態(tài)進(jìn)程不關(guān)心IO細(xì)節(jié),由內(nèi)核態(tài)進(jìn)程去完成IO操作然后通知用戶態(tài)進(jìn)程。
好的,現(xiàn)在定義已經(jīng)描述完了。現(xiàn)在可以區(qū)分它們之間的區(qū)別了么?(吃瓜群眾:這TM的寫的是什么?) ,別急,我們下面舉栗說(shuō)明,包教包會(huì)。
三:舉栗一般來(lái)說(shuō)IO分為兩個(gè)階段,第一階段是等待數(shù)據(jù)階段,第二階段是內(nèi)核空間的數(shù)據(jù)拷貝到用戶空間,假設(shè)一個(gè)線程(或是進(jìn)程)P準(zhǔn)備執(zhí)行一個(gè)IO操作的話它會(huì)經(jīng)歷以下過(guò)程:
第一階段:
P發(fā)出一個(gè)IO請(qǐng)求,這時(shí)候會(huì)有兩種情況: 1:立刻返回: 非阻塞 2:一直等待,P調(diào)用sleep/wait休眠或是掛起,讓出CPU給別的線程/進(jìn)程 阻塞
第二階段:
這時(shí)內(nèi)核的數(shù)據(jù)終于準(zhǔn)備好了, 那么現(xiàn)在用戶進(jìn)程想要讀取內(nèi)核空間的數(shù)據(jù)有兩種方式: 1: P自己把數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間 同步 2:P創(chuàng)建一個(gè)線程做數(shù)據(jù)copy的工作 異步
現(xiàn)在應(yīng)該明白了吧。阻塞/非阻塞是針對(duì)IO的第一階段的描述。異步/同步是針對(duì)IO的第二階段的描述也就是IO的主體。
這里主要比較難理解的就是同步/異步。首先P在發(fā)起IO的請(qǐng)求的時(shí)候如果P本身還要負(fù)責(zé)IO請(qǐng)求后的數(shù)據(jù)copy(內(nèi)核空間到用戶空間)工作。那么我們就可以說(shuō)是同步的。
如果P在發(fā)起IO操作后數(shù)據(jù)copy的工作由內(nèi)核線程/進(jìn)程或是P自己再創(chuàng)建一個(gè)線程/進(jìn)程去完成,那么我們就可以稱之為異步
四:排列組合同步阻塞IO:
同一個(gè)線程在操作IO時(shí)一直阻塞,直到讀取數(shù)據(jù)成功,然后線程本身負(fù)責(zé)把數(shù)據(jù)從核心空間拷貝到用戶空間
同步非阻塞:
同一個(gè)線程發(fā)起IO后,立即獲得返回,后面定期輪詢數(shù)據(jù)讀取情況,發(fā)現(xiàn)數(shù)據(jù)讀取成功,線程本身負(fù)責(zé)把數(shù)據(jù)從核心空間拷貝到用戶空間
異步非阻塞:
一個(gè)線程發(fā)起IO后,立即返回,由另外的線程發(fā)現(xiàn)數(shù)據(jù)讀取成功,把數(shù)據(jù)從核心空間拷貝到用戶空間。
非阻塞同步IO由于讀寫方法非阻塞,并且需要用戶自己來(lái)進(jìn)行讀寫,所以每次調(diào)用讀寫方法實(shí)際讀寫的字節(jié)數(shù)是不確定的,所以需要一個(gè)Buffer來(lái)保存每次讀寫的字節(jié)狀態(tài)。更重要的是用戶不知道什么時(shí)候完成了讀寫,一般需要用
while循環(huán)判斷Buffer的狀態(tài)來(lái)跟蹤讀寫。非阻塞異步IO由于是內(nèi)核線程進(jìn)行讀寫,并且在IO完成后會(huì)回調(diào)用戶提供的callback,編程模型就比較簡(jiǎn)單,用戶只需要調(diào)用讀寫,提供回調(diào)就可以了,比如 read(filename, callback)select / poll / epoll 從本質(zhì)上說(shuō)都是非阻塞同步IO,select會(huì)收到IO就緒的狀態(tài),然后通知用戶去處理
IO,實(shí)際的IO操作還需要用戶等待內(nèi)核復(fù)制操作。
要理解IO就緒和完成的區(qū)別。就緒指的是還需要用戶自己去處理,完成指的是內(nèi)核幫助完成了,用戶不用關(guān)心IO過(guò)
程,只需要提供回調(diào)函數(shù)。
五:并行/并發(fā)與異步 并行對(duì)多處理器而言--多個(gè)程序在同一時(shí)刻發(fā)生,具有并發(fā)的含義,但并發(fā)不一定并行,也亦是說(shuō)并發(fā)事件之間不一定要同一時(shí)刻發(fā)生。
并行:在單處理器中多道程序設(shè)計(jì)系統(tǒng)中,進(jìn)程被交替執(zhí)行,表現(xiàn)出一種并發(fā)的外部特種;在多處理器系統(tǒng)中,進(jìn)
程不僅可以交替執(zhí)行,而且可以重疊執(zhí)行。在多處理器上的程序才可實(shí)現(xiàn)并行處理。計(jì)算機(jī)操作系統(tǒng)中把并行性和并發(fā)性明顯區(qū)分開(kāi),主要是從微觀的角度來(lái)說(shuō)的,具體是指進(jìn)程的并行性(多處理機(jī)的情況下,多個(gè)進(jìn)程同時(shí)運(yùn)行)和并發(fā)性(單處理機(jī)的情況下,多個(gè)進(jìn)程在同一時(shí)間間隔運(yùn)行的)
對(duì)單處理器而言--多個(gè)程序在同一時(shí)間段發(fā)生;
并發(fā)中又有:互斥和同步:
互斥:進(jìn)程間相互排斥使用臨界資源;比如寫操作; 同步:不是排斥關(guān)系而是依賴關(guān)系,前一個(gè)進(jìn)程的輸出是后一個(gè)進(jìn)程的輸入 當(dāng)?shù)谝粋€(gè)進(jìn)程沒(méi)有結(jié)束時(shí)第二個(gè)進(jìn)程必須等待,相互協(xié)同完成一些事情; 具有同步關(guān)系的一組進(jìn)程并發(fā)時(shí)發(fā)送的消息稱為消息或者事件;
同步和異步:
異步:就是線程B在等待A的結(jié)果的時(shí)候還可以繼續(xù)干自己的事兒, 之間通過(guò)消息和事件來(lái)通知對(duì)方,提高了程序運(yùn)行的效率。 簡(jiǎn)而言之,就是不是站在那兒傻傻死等;異步和多線程并不是一回事, 異步是最終目的,多線程只是實(shí)現(xiàn)的一種方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/83101.html
摘要:一閱前熱身為了更加形象的說(shuō)明同步異步阻塞非阻塞,我們以小明去買奶茶為例。等奶茶做好了,店員喊一聲小明,奶茶好了,然后小明去取奶茶。將響應(yīng)結(jié)果發(fā)給相應(yīng)的連接請(qǐng)求處理完成因?yàn)榛冢悦總€(gè)可以處理無(wú)數(shù)個(gè)連接請(qǐng)求。如此,就輕松的處理了高并發(fā)。 一、閱前熱身 為了更加形象的說(shuō)明同步異步、阻塞非阻塞,我們以小明去買奶茶為例。 1、同步與異步 ①同步與異步的理解 同步與異步的重點(diǎn)在消息通知的方式上...
摘要:一閱前熱身為了更加形象的說(shuō)明同步異步阻塞非阻塞,我們以小明去買奶茶為例。等奶茶做好了,店員喊一聲小明,奶茶好了,然后小明去取奶茶。將響應(yīng)結(jié)果發(fā)給相應(yīng)的連接請(qǐng)求處理完成因?yàn)榛冢悦總€(gè)可以處理無(wú)數(shù)個(gè)連接請(qǐng)求。如此,就輕松的處理了高并發(fā)。 一、閱前熱身 為了更加形象的說(shuō)明同步異步、阻塞非阻塞,我們以小明去買奶茶為例。 1、同步與異步 ①同步與異步的理解 同步與異步的重點(diǎn)在消息通知的方式上...
摘要:而是在調(diào)用發(fā)出后,被調(diào)用者通過(guò)狀態(tài)通知來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用。請(qǐng)求程序發(fā)出請(qǐng)求,從服務(wù)器端獲取數(shù)據(jù),并設(shè)置了回調(diào)函數(shù)。然后,瀏覽器會(huì)設(shè)置偵聽(tīng)來(lái)自網(wǎng)絡(luò)的響應(yīng),拿到數(shù)據(jù)后,將該回調(diào)函數(shù)插入到事件循環(huán)。 并發(fā)與并行 并發(fā)是指兩個(gè)或多個(gè)事件鏈隨時(shí)間發(fā)展交替執(zhí)行,以至于從更高的層次來(lái)看,就像是同時(shí)運(yùn)行(但在任意時(shí)刻只處理一個(gè)事件) 并發(fā)的關(guān)鍵是你有處理多個(gè)任務(wù)的能力,不一定同...
摘要:原文地址要想更好了解編程,有一個(gè)不可繞過(guò)的環(huán)節(jié)就是在中,一切皆文件實(shí)際上要文件干啥不就是讀寫么所以,這句話本質(zhì)就是才是王道用的打開(kāi)文件關(guān)閉文件讀讀寫寫,這叫本地文件在編程中,本質(zhì)就是網(wǎng)絡(luò)所以,在開(kāi)始進(jìn)一步的編程前,我們必須先從概念上認(rèn)識(shí)好 [原文地址:https://blog.ti-node.com/blog...] 要想更好了解socket編程,有一個(gè)不可繞過(guò)的環(huán)節(jié)就是IO.在Lin...
摘要:異步本質(zhì)上應(yīng)該就是多線程語(yǔ)言的產(chǎn)物。如果是多線程的異步,假死的應(yīng)該是運(yùn)行方法的線程,而方法仍然會(huì)按預(yù)期打印出。當(dāng)然了,按我個(gè)人的理解,應(yīng)該說(shuō)是是的回調(diào)函數(shù)。 引子 每個(gè)故事都有由來(lái)。前兩天在看 gulp 的時(shí)候,看到了它有個(gè) promise 的玩意兒,然后的然后,這兩天就掉進(jìn)了 javascript 的異步和回調(diào)的坑里面去了。 其間搜索了 javascript promise,看到了...
閱讀 2954·2023-04-25 19:20
閱讀 817·2021-11-24 09:38
閱讀 2072·2021-09-26 09:55
閱讀 2444·2021-09-02 15:11
閱讀 2082·2019-08-30 15:55
閱讀 3623·2019-08-30 15:54
閱讀 3162·2019-08-30 14:03
閱讀 2973·2019-08-29 17:11