Upgrade to Pro — share decks privately, control downloads, hide ads and more …

sync.Mutexの仕組みを理解する

 sync.Mutexの仕組みを理解する

Yoshiki Fujikane

June 02, 2023
Tweet

More Decks by Yoshiki Fujikane

Other Decks in Programming

Transcript

  1. 自己紹介 Name • Yoshiki Fujikane (ふじを) Company • CyberAgent, Inc.

    22新卒入社 • ABEMA バックエンドエンジニア @ffjlabo @ffjlabo
  2. • バイナリセマフォ ◦ sema == 0 => リソースが占有された状態 ◦ sema

    == 1 => リソースが解放された状態 sema runtimeレベルのロック状況を管理するために利用される(詳細は後ほど) src/sync/mutex.go
  3. 📝 Compare And Swap • Mutexをアクセス制御する リソースにつき1つ作成 • それを複数のgoroutineが 参照する

    resource G Mutex ✅ ❌ ❌ G G 変数の値の更新が競合しないようにatomicな操作で更新 https://pkg.go.dev/sync/atomic#pkg-overview
  4. semacquire1(): harder case • waiter countをインクリメント • cansemacquireを複数回実行 • waiterとしてenqueue???

    • sleep??? runtimeレベルでgoroutineがどのように動作するか着目する必要あり src/runtime/sema.go
  5. goroutine実行過程の概要 X := 3 pow(x) P G G M G

    G (goroutine): goroutine本体 P (Prosessor): 論理プロセッサ M (Machine): OSスレッド Inspired by https://speakerdeck.com/sakiengineer/sukeziyurakaraxue-bugorantaimu-code-reading-of-runtime-pkg
  6. goroutine実行過程の概要 X := 3 pow(x) P G G M G

    実行待ちのgoroutineを貯めるqueue 実行中のgoroutine
  7. semtable Mutex Mutex G G G G G 各Mutexをロックしようと待機している goroutineの待ち行列

    「各Mutexのsemaをロック状態に更新しようと待機する goroutineの待ち行列」の集合 G Mutex Mutex G G G sematable (semaRootの配列) src/runtime/sema.go
  8. semacquire1(): harder case P G G M G G Mutex

    Mutex G G G Mutexのsemaをロック状態に更新しよ うと待機するgoroutineの待ち行列の先 頭ノードを取得!! G src/runtime/sema.go
  9. semacquire1(): goroutineの一時停止 P G G M G G G G

    Mutex 現在実行中のgoroutineを待ち行列に追加 src/runtime/sema.go
  10. Semaphores in Plan 9 • • u: ユーザ空間上のセマフォ • k:

    カーネル空間上のセマフォ 効率を高めるために、競合がない場合は完全にユーザー空間で実行でき、競合を処理するためにカー ネルにのみフォールバックするセマフォ実装があると便利です