通俗理解同步IO\异步IO
生活随笔
收集整理的這篇文章主要介紹了
通俗理解同步IO\异步IO
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
概念
同步IO
- 在一個線程中,CPU執(zhí)行代碼的速度極快,然而,一旦遇到IO操作,如讀寫文件、發(fā)送網(wǎng)絡(luò)數(shù)據(jù)時,就需要等待IO操作完成,才能繼續(xù)進行下一步操作。這種情況稱為同步IO。
- 在IO操作的過程中,當前線程被掛起,而其他需要CPU執(zhí)行的代碼就無法被當前線程執(zhí)行了。
多線程多進程的解決思路
- 因為一個IO操作就阻塞了當前線程,導(dǎo)致其他代碼無法執(zhí)行,所以我們必須使用多線程或者多進程來并發(fā)執(zhí)行代碼,為多個用戶服務(wù)。每個用戶都會分配一個線程,如果遇到IO導(dǎo)致線程被掛起,其他用戶的線程不受影響。
- 多線程和多進程的模型雖然解決了并發(fā)問題,但是系統(tǒng)不能無上限地增加線程。由于系統(tǒng)切換線程的開銷也很大,所以,一旦線程數(shù)量過多,CPU的時間就花在線程切換上了,真正運行代碼的時間就少了,結(jié)果導(dǎo)致性能嚴重下降。
其他解決方案異步IO
- 多線程和多進程只是解決這一問題的一種方法。
- 另一種解決IO問題的方法是異步IO。當代碼需要執(zhí)行一個耗時的IO操作時,它只發(fā)出IO指令,并不等待IO結(jié)果,然后就去執(zhí)行其他代碼了。一段時間后,當IO返回結(jié)果時,再通知CPU進行處理。
- 異步IO模型需要一個消息循環(huán),在消息循環(huán)中,主線程不斷地重復(fù)“讀取消息-處理消息”這一過程
消息模型是如何解決同步IO必須等待IO操作這一問題的呢?
- 當遇到IO操作時,代碼只負責發(fā)出IO請求,不等待IO結(jié)果,然后直接結(jié)束本輪消息處理,進入下一輪消息處理過程。當IO操作完成后,將收到一條“IO完成”的消息,處理該消息時就可以直接獲取IO操作結(jié)果。
- 在“發(fā)出IO請求”到收到“IO完成”的這段時間里,同步IO模型下,主線程只能掛起,但異步IO模型下,主線程并沒有休息,而是在消息循環(huán)中繼續(xù)處理其他消息。這樣,在異步IO模型下,一個線程就可以同時處理多個IO請求,并且沒有切換線程的操作。對于大多數(shù)IO密集型的應(yīng)用程序,使用異步IO將大大提升系統(tǒng)的多任務(wù)處理能力。
一個通俗易懂的例子
老張愛喝茶
- 1 老張把水壺放到火上,立等水開。(同步阻塞)
- 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)
- 3 老張把響水壺放到火上,立等水開。(異步阻塞) (水開之后,能大聲發(fā)出嘀~~~~的噪音。),這樣沒有意義
- 4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)
所謂同步異步,只是對于水壺而言。 普通水壺,同步;響水壺,異步。 雖然都能干活,但響水壺可以在自己完工之后,提示老張水開了。這是普通水壺所不能及的。 同步只能讓調(diào)用者去輪詢自己(情況2中),造成老張效率的低下。
所謂阻塞非阻塞,僅僅對于老張而言。 立等的老張,阻塞;看電視的老張,非阻塞。 情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對于立等的老張沒有太大的意義。所以一般異步是配合非阻塞使用的,這樣才能發(fā)揮異步的效用。
傳送門
總結(jié)
以上是生活随笔為你收集整理的通俗理解同步IO\异步IO的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab中数据变为nan,字符转化为
- 下一篇: 收集sqlite常见问题