Coroutine學習

背景
搶佔式多任務調度html

如今的操做系統都是支持多任務的,多任務可經過多進程或多線程的方式去實現,進程和線程的對比就不在這裏說了,在多任務的調度上操做系統採起搶佔式和協做式兩種方式,搶佔式是指操做系統給每一個任務必定的執行時間片,在到達這個時間片後如任務仍然未釋放對CPU的佔用,那麼操做系統將強制釋放,這是目前多數操做系統採起的方式;協做式是指操做系統按照任務的順序來分配CPU,每一個任務執行過程當中除非其主動釋放,不然將一直佔據CPU,這種方式很是值得注意的是一旦有任務佔據CPU不放,會致使其餘任務」餓死」的現象,所以操做系統確實不太適合採用這種方式。java

多線程支持高併發方式多線程

說完操做系統多任務的調度方式後,來看看一般程序是如何實現支持高併發的,併發

一個任務佔據一個進程/線程
一種就是典型的基於操做系統提供的多進程或多線程機制,每一個任務佔據一個進程或一個線程,當任務中有IO等待等動做時,則將進程或線程放入待調度隊列中,這種方式是目前大多數程序採起的方式,這種方式的壞處在於如想支持高的併發量,就不得不建立不少的進程或線程,而進程和線程都是要消耗很多系統資源的,另一方面,進程或線程建立太多後,操做系統須要花費不少的時間在進程或線程的切換上,切換動做須要作狀態保持和恢復,這也會消耗掉不少的系統資源;
一個任務不徹底佔據一個進程/線程
另一種方式則是每一個任務不徹底佔據一個進程或線程,當任務執行過程當中須要進行IO等待等動做時,任務則將其所佔據的進程或線程釋放,以便其餘任務使用這個進程或線程,這種方式的好處在於能夠減小所須要的原生的進程或線程數,而且因爲操做系統不須要作進程或線程的切換,而是自行來實現任務的切換,其成本會較操做系統切換低,這種方式也就是本文的重點,Coroutine方式,又稱協程方式,這種方式在目前的大多數語言中都有支持。
Actor模型
各類語言在實現Coroutine方式的支持時,多數都採用了Actor Model來實現,Actor Model簡單來講就是每一個任務就是一個Actor,Actor之間經過消息傳遞的方式來進行交互,而不採用共享的方式,Actor能夠看作是一個輕量級的進程或線程,一般在一臺4G內存的機器上,建立幾十萬個Actor是毫無問題的。
對於Java應用而言,傳統方式下爲了支持高併發,因爲一個線程只能用於處理一個請求,即便是線程中其實有不少IO中斷、鎖等待也一樣如此,所以一般的作法是經過啓動不少的線程來支撐高併發,但當線程過多時,就形成了CPU須要消耗很多的時間在線程的切換上,從而出現瓶頸,按照上面對Coroutine的描述,Coroutine的方式理論上而言可以大幅度的提高Java應用所能支撐的併發量。高併發

參考操作系統

相關文章
相關標籤/搜索