當前位置: 華文問答 > 數碼

出於什麽樣的原因,誕生了「協程」這一概念?

2016-08-30數碼

其實從處理器的角度看協程更符合直覺,一個處理器核心本來就沒法同時處理兩件事情,要同時進行多件事情本來就需要正在執行的讓出處理器,然後才能去處理另一件事情。只不過這個讓出的過程是執行緒排程器主動搶占的。

所以執行緒排程器是假定不同的執行緒是毫無關系的,所以它平均的分配時間片讓處理器雨露均沾。

但是很快人們發現這不是事情的全部,很多時候兩個執行緒不是完全獨立的,他們會操作同一個資源。這個時候人們又發明了同步鎖,使得一段時間內只有一個執行緒可以操作這個資源,其他執行緒只能等待。

然後我們很快發現,這特麽不是脫了褲子放屁麽?處理器本來同一時間就只能有一個執行緒在執行。是執行緒排程器搶截劃分時間片給其他執行緒跑,現在其他執行緒又說特麽我要等前面那個執行緒用完了這個資源才能執行。

你特麽早說啊,我搶什麽搶?既然你們排他性的爭搶同一個資源,你們一個個的跑不就好了,我就給你們排個隊就完了。

也就是說, 在所有執行緒相互獨立且不會阻塞的模式下,搶截式的執行緒排程器是不錯的選擇 。因為它可以保證所有的執行緒都可以被分到時間片不被程式設計師的垃圾程式碼所累。這對於某些事情來說是至關重要的,例如計時器、回呼、IO觸發器(譬如說處理請求)什麽的。

但是線上程不是相互獨立,經常因為爭搶而阻塞的情況下,搶截式的執行緒排程器就顯得脫了褲子放屁了, 既然你們只能一個個的跑,那搶截還有什麽意義? 讓你們自己去讓出時間片就好了。

再往後, 大家發現經常有阻塞的情況下 ,主動讓出時間片的協程模式比搶占式分配的效率要好,也簡單得多。

但是執行緒並不是一無是處, 搶截式執行緒排程器事實上提供了準即時的體驗 。例如Timer,雖然不能確保在時間到達的時候一定能夠分到時間片執行,但不會像協程一樣萬一沒有人讓出時間片就永遠得不到執行……

比如說像JS這種語言,你要開啟控制台敲個while(true);回車……