非同步模型筆記
Concurrency: 兩件以上的事情,同時被一個處理單位處理,以分時的方式。
ex: 處理A事情處理到一半,把 call stack 丟出去,載入 B stack 到暫存器中,以分時的方式處理。
Parallelism: 多個事件,被多個處理單位同時處理。
這兩種程式在開發的時候都非常困難,因為有 shared memory 的問題!
Shares memory 會造成
1. Race condition
2. Dead lock
解決方式
1. functional programing - 每件事都是 immutable
2. Actor model - 把 mutable 的狀態封裝在物件內,只透過非同步的通訊方式交換訊息
Actor
1. 輕量化的物件,有自己內部可改變的 state,別人不可改,也不共享
2. 跑在自己的執行緒上面
3. 沒有 shared memory state
4. 別的 actor 來的訊息,會按照順序存在 mailbox 中,依序處理
5. 只能透過訊息改變其他 actor
6. 程式變得更可擴展,因為更輕量且每個 call stack 都很小
CSP Model
Actor vs CSP
相同:
1. 不同的執行單元是透過傳 message 的方式溝通
2. 他們自己內部都有 private state,所以不需要 lock
3. 他們不是用共享記憶體的方式通訊,而是通訊來達到共享記憶體
不同:
1. CSP 不關注 Process 本身,所以 CPS 的 processes are anonymous,然而每個 Actor 都會有自己的身份
2. Actor 都是用非同步的方式傳送訊息,但是 CSP 則是同步,也就是 CSP 會 blocking
Asynchronous model
callbacks:
當相依的事件做完之後,會呼叫下一件要做的事情
會有 callback hell 的問題
promise => async/await:
promise 底層其實也是透過 callback, 只是將 callback 封裝在內部,
搭配內部 state (fulfilled, pending, reject) 的管理,將 callback hell 的問題解決。
更詳細的解說請參考: https://zhuanlan.zhihu.com/p/58428287
async await 跟 generator 的概念幾乎一樣,詳細請看
https://zhuanlan.zhihu.com/p/115112361
Coroutine:
User-space light weight thread created within one process
Coroutine之間是 cooperative scheduling => non-preemptive
簡單來說,Coroutine 是將非同步的寫法變成類似同步的寫法,
底層來說 Coroutine 並不是讓效能變好的關鍵
IO模型中的 Reactor model 才是,藉由 io multiplexing 來達成。
io multiplexing 是指
實現一個 thread 可以監聽多個 file descriptor
一但某個 file descriptor 已經就緒了
就會通知對應的應用程式去進行處理
如果都沒有 file descriptor 就緒
就把 cpu 的控制權交出去
以Linux的環境上,Reactor 會用到 epoll 來提升效能
(補充)
進行 CPU scheduling 的可能時機有下列四種:
1. 當一個 process 的狀態由 running 轉為 waiting 時
2. 當一個 process 的狀態由 running 轉為 ready 時 e.g. time sharing 因為 timeout 回到 ready
3. 當一個 process 的狀態由 waiting 轉為 ready 時
4. 當一個 process 的狀態由 running 轉為 terminate 時
Non-preemptive 不可搶奪型,又稱 cooperative scheduling 合作式排程
一個 Process 除非自行放棄 CPU 的使用權,否則其他 Processes 不能奪取其 CPU 使用權
- process 等待 I/O, semaphore wait
- process terminates
Non-preemptive scheduling 只可能發生在上面的 1. 4. 兩個時機點
Preemptive 可搶奪型
不論正在執行的 process 是否可繼續執行,必要時 CPU 使用權可能被搶奪
Preemptive scheduling 在上述的四個時間點皆會發生
適用於 real-time system, time sharing system
context switch 次數較多,overhead 較大
Ref: https://www.kshuang.xyz/doku.php/operating_system:course_concept:cpu_scheduling
Ref: https://blog.techbridge.cc/2019/06/21/actor-model-in-web/
Ref: IO多路覆用
Ref: IO模型-Reactor model
留言
張貼留言