erlang メールボックスの使用方法に関する情報はたくさんありますが、erlang が VM 内部で同時にメールボックスに実際にアクセスする方法を説明している論文や文書を見つけることはめったにありません。
私の理解では、Erlang VM はメッセージの整合性を確保するためにロックまたは CAS アクションを実行する必要があります。erlang のカーテンの背後にある洗練された方法はありますか?
erlang メールボックスの使用方法に関する情報はたくさんありますが、erlang が VM 内部で同時にメールボックスに実際にアクセスする方法を説明している論文や文書を見つけることはめったにありません。
私の理解では、Erlang VM はメッセージの整合性を確保するためにロックまたは CAS アクションを実行する必要があります。erlang のカーテンの背後にある洗練された方法はありますか?
メールボックスとは、メッセージが挿入されるプロセス メールボックスのことだと思います。楽しい質問!
ここでは、Erlang プロセス メッセージ キューのロック特性についていくつかの会話があります。
ただの好奇心: 現在、メッセージの送信にはある種のロックがあります。ロックフリーのリンクリストを実装しようとした人はいますか: http://www.amd64.org/fileadmin/user_upload/pub/epham08-asf-eval.pdf
または、間違った場所を見ているだけで、erts_smp_proc_lock は既にこのようなものを使用していますか?
メッセージキューにはすでにこれがあります。メッセージボックスを所有するプロセスには、彼がロックオンしている「内箱」と、すべての送信者が争う「外箱」があります。そのため、多くのプロセスがそのプロセスに送信する場合、ロック競合は「外側のボックス」のキューの末尾にあります。ただし、メールボックスの所有者は関係ありません。
BEAM プロセスの実装を読むとわかりやすいかもしれません。
簡単な答え: はい、ロックはメッセージ キューで行われますが、スケジューラ スレッド間の競合を減らすために複雑で最適化されています。
プロセス構造を処理するいくつかのロックがあります。メッセージの送信に関して最も重要なのは、MSGQ ロックと MAIN ロックです。MAIN ロックは、操作中に構造体のフィールドをロックするロックです。フィールドの 1 つは発信キューです。MSGQ ロックは、着信メッセージのリンク リストをカバーします。
したがって、メッセージを送信するには、受信者の MSGQ ロックを取得し、キュー (MAIN によって保護されている) から他のプロセスの着信メッセージのキューにメッセージをコピーする必要があります。
この送信操作がいかに非同期であるかに注意してください。プロセスは互いにブロックしません! (ほとんどの時間;)