說起IO,牽涉到同步计雌,異步,阻塞玫霎,非阻塞4個方面! IO有內(nèi)存IO凿滤、網(wǎng)絡(luò)IO和磁盤IO三種,通常我們說的IO指的是后兩者庶近。IO指的就是讀入/寫出數(shù)據(jù)的過程翁脆,和等待讀入/寫出數(shù)據(jù)的過程。
網(wǎng)絡(luò)IO來說鼻种,等待的過程就是數(shù)據(jù)從網(wǎng)絡(luò)到網(wǎng)卡再到內(nèi)核空間反番。讀寫的過程就是內(nèi)核空間和用戶空間的相互拷貝。IO包括兩個過程叉钥,一個是等待數(shù)據(jù)的過程罢缸,一個是讀寫(拷貝)數(shù)據(jù)的過程。不能包括操作數(shù)據(jù)的過程投队。
同步 (同步和異步關(guān)注的是消息通信機(jī)制 )
- 整個處理過程順序執(zhí)行枫疆,當(dāng)各個過程執(zhí)行完畢并且返回結(jié)果,是一種線性的執(zhí)行方式敷鸦,執(zhí)行的流程只能按順序來不能跨越息楔。比如用戶登錄,需要對用戶驗(yàn)證完成后才能登錄系統(tǒng)扒披。 (需要等待)
異步
- 只發(fā)送調(diào)用的指令值依,調(diào)用者不需要等待被調(diào)用的方法本身執(zhí)行完畢,而是繼續(xù)執(zhí)行下面的流程,是一個并行處理方式碟案≡赶眨可以多條指令同時執(zhí)行不需要等待別的程序執(zhí)行完。比如頁面數(shù)據(jù)加載過程蟆淀,不需要等所有數(shù)據(jù)獲取后再顯示頁面拯啦。 (不需要等待)
阻塞 (阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果)
- 指調(diào)用結(jié)果返回之前澡匪,當(dāng)前線程會被掛起。調(diào)用線程只有在得到結(jié)果之后才會返回褒链。
非阻塞
- 不能得到結(jié)果之前唁情,不會阻塞當(dāng)前線程
同步才有阻塞和非阻塞之分
- 同步阻塞:獲取結(jié)果之前一直等著,網(wǎng)絡(luò)編程中甫匹,讀取客戶端的數(shù)據(jù)需要調(diào)用recvfrom甸鸟,默認(rèn)情況下,調(diào)用會一直阻塞直到數(shù)據(jù)接收完畢兵迅。這是一個最簡單的同步阻塞IO模型抢韭。阻塞期間線程將無法執(zhí)行任何運(yùn)算或響應(yīng)任何的網(wǎng)絡(luò)請求。這時候只能在服務(wù)端使用多線程(多進(jìn)程)來讓每個連接都有獨(dú)立的線程(或進(jìn)程)處理任務(wù)恍箭。阻塞就不會影響其他的連接刻恭。 用進(jìn)程還是線程看具體執(zhí)行任務(wù),進(jìn)程開銷大于線程扯夭,進(jìn)程比線程更安全鳍贾!
- 同步非阻塞:得到結(jié)果之前,一直等待交洗。只不過期間你會一直循環(huán)去詢問骑科,直到得到想要的結(jié)果。中間多了一個反復(fù)詢問的過程.
異步 (阻塞/非阻塞)
- 異步阻塞是可以同時出發(fā)构拳,但是不能行動咆爽,也就是很多條道路,都可以選擇出發(fā)置森,但是都堵上了斗埂。相當(dāng)于多個線程都在等待
- 異步非阻塞,是可以同時出發(fā)也可以動暇藏。有多條馬路可以出發(fā)蜜笤,幸運(yùn)的是每條路都能順利通行!相當(dāng)于多個線程都在正常運(yùn)行盐碱。
并行
- 并行是相對多核來說的把兔,當(dāng)系統(tǒng)有一個以上CPU時,當(dāng)一個CPU執(zhí)行一個進(jìn)程瓮顽,另一個CPU可以執(zhí)行另一個進(jìn)程县好,兩個進(jìn)程互不搶占CPU資源,可以同時進(jìn)行
并發(fā)
- 并發(fā)是在一個時間片中暖混,有多個程序運(yùn)行缕贡,看起來像是同時運(yùn)行,實(shí)際上是串行執(zhí)行的,在一個CPU上晾咪。