我今天在考慮這么一個問題,CPU這個東西在某個時間只能運行一個指令箱蟆,假設(shè)當前CPU是單核的,并只有100個進程刮便,每個進程有5個指令空猜,5個指令中有一個是IO指令,每個進程執(zhí)行自己的任務(wù)诺核,如果采用阻塞式抄肖,第一個進程在執(zhí)行IO指令的時候阻塞,但是會讓出CPU讓第二個進程去處理窖杀,同樣如果第二個進程也在IO阻塞漓摩,會讓給其他空閑進程處理,這樣的情況會導致CPU一直處于處理指令的狀況入客,也就是說CPU一直不會發(fā)生空閑狀態(tài)管毙,除非100個進程都在IO。
同樣的桌硫,考慮非阻塞式夭咬,一個進程在IO的時候,不會阻塞铆隘,而是去運行其他任務(wù)卓舵,所以CPU也不會閑下來,依然是執(zhí)行某個命令膀钠,這么考慮的話掏湾,他和上面所述的阻塞執(zhí)行有啥區(qū)別呢,總的來看CPU在任何時刻都在執(zhí)行指令肿嘲,總的指令個數(shù)都是100*5融击,那么總的時間大致來說基本上都是一樣的,那為什么阻塞式就不能高并發(fā)雳窟,非阻塞的就能高并發(fā)呢尊浪?
后來查閱資料,只要涉及到阻塞和非阻塞的區(qū)別,就沒有一個人提起線程或者進程的切換上拇涤。不拿進程舉例了捣作,拿線程舉例,對于阻塞而言工育,如果線程的數(shù)量不多的情況虾宇,其實是和非阻塞沒啥異樣的,因為任何時刻CPU都在運行如绸,發(fā)生阻塞的時候只是切換線程嘱朽。我們都知道進程的切換需要消耗大量資源(切換上下文PCB,),但是線程切換同樣消耗資源怔接,雖然消耗的資源不多搪泳。那么如果是在高并發(fā)的情況下,采用阻塞的方式扼脐,就需要創(chuàng)建成千上萬個線程岸军,一個線程過來了發(fā)生阻塞踱蠢,就要切換給其他線程來執(zhí)行楔敌,而采用阻塞的方式浴鸿,他只有一個線程幸冻,采用輪詢的方式一直對某個請求進行處理,完全不需要對線程進行切換蟹倾,那么從微觀角度來講广凸,如果是1w個請求拌屏,非阻塞對于阻塞而言罚攀,大大減少了很多次的線程切換的開銷党觅,所以阻塞在這種情況會更消耗資源,而非阻塞就更加占有優(yōu)勢斋泄。
不知道我這種理解是不是對的杯瞻,但是我想不出其他情況來否認自己的觀點了,如果朋友你看到了炫掐,有更好的觀點魁莉,請一定要告訴,我迷茫這個問題已經(jīng)很久了D嘉浮沛厨!