松本行弘: 編程語言的設計與實現 - 2-2 筆記
上回介紹內存共享和 mutex lock 的機制, 但這消耗的系統資源較高
在這本書介紹了 1973年時 Carl Hewitt 所提出的 Actor 無鎖模型
Actor 模型可以傳遞異步消息 (async), 訊息發送的動作中不必等待處理的結果.
而是可以另外分開處理發送和接收訊息. 這也是為何會叫做 mailbox,
就像郵差寄信, 你不用一直站在門口親手接郵差寄來的信, 而是郵差把信放在郵箱,
有空時再去郵箱拿信即可.
底下這篇值得一看:
https://cloud.tencent.com/developer/news/698662
有做過 RTOS 的大概對 mailbox 和 message queue 並不陌生.
雖然每個 RTOS 的 mailbox 細節實作定義稍有不同,
但或許可以想成
mailbox = queue + semaphore
最近看 數位貨幣 挖礦程式, 有段也與這類似.
tq_push() / tq_pop()
https://github.com/pooler/cpuminer/blob/master/util.c
用到 pthread_cond_signal() / pthread_cond_wait(), mutex 和 list queue
這和原本 Actor 模型只用 semaphore + list queue 的差別,
之後或許還可以繼續深入研究一下
https://stackoverflow.com/questions/70773/pthread-cond-wait-versus-semaphore
目前工作所寫的 wifi driver 中的 command dispatcher 也是用這 actor 模型 - gitub
semaphore + cmd list queue
actor 模型的缺點, 如前面網頁 link, 也就是當 mailbox 滿了或中間有訊息要拋棄 abort,
該如何處理, 這邊又回到 event driven programming 的大課題, wifi driver 也有同樣狀況,
這些訊息處理是要只用一個 thread 來做減少延遲, 還是多個 thread 來處理?
多個 thread 時, 是否又會出現需要 lock 保護的老課題...
這些將來有機會繼續詳述探討...
留言
張貼留言