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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

Avatar for Yoshiki Fujikane

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:

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