● list 型の append() 等の結果、サイズが増減する処理を考える
コレクション型のサイズ変更等のイベント
75
x
y
z
-
-
-
-
-
-
[x, y, z] を表す
メモリー領域
別のところで
利用されている
メモリー領域
誰も使っていない
空間
w を追加したいのだが、
連続領域に
格納できない
Slide 76
Slide 76 text
● list 型の append 等のサイズが増減する処理を考える
コレクション型のサイズ変更等のイベント
76
x
y
z
-
-
[x, y, z] を表す
メモリー領域
x
y
z
w
別のところで
利用されている
メモリー領域 [x, y, z, w] を
連続メモリー領域を作成して
x, y, z はコピーされる
この領域を破棄したいのだが
別のスレッドが
このobjectを使っている
かもしれず、
安易に破棄できない
Lockの待機方法のイメージ
80
Object A Object B Object C
Thread X
Thread Y
Thread W
Thread Z
それぞれ Lock をとりたい 「Object」 という
「お店」の前に
「Thread」なる「人」が行列を
つくる方式ではなく
待機列
(人)
Object
(お店)
Slide 81
Slide 81 text
Lockの待機方法のイメージ
81
Object A Object B Object C
Thread X
Thread Y
Thread W
Thread Z
駐車場
Object
(お店)
駐車場に
待機あり
駐車場に
待機あり
駐車場に
待機なし
席が空いたら
駐車場に待っているスレッドに
呼び出しが行われるような
イメージ
Slide 82
Slide 82 text
Lockの待機方法のイメージ (Parking Lot)
82
Object A Object B Object C
Thread X
Thread Y
Thread W
Thread Z
駐車場
Object
(お店)
駐車場に
待機あり
駐車場に
待機あり
駐車場に
待機なし
待機列がないものについては
何回か (40回)、Lockをとるのを試みる。
Thread V
Slide 83
Slide 83 text
Lockの待機方法のイメージ (Parking Lot)
83
Object A Object B Object C
Thread X
Thread Y
Thread W
Thread Z
駐車場
Object
(お店)
駐車場に
待機あり
駐車場に
待機あり
駐車場に
待機あり
それでも取れなかったら
邪魔になるので駐車場にいく
Thread V
Slide 84
Slide 84 text
Parking Lot アルゴリズム
APIと名称は WebKit の WTF::ParkingLot (Web Template Framework)と Linux の
futex API に参考にされてつくられたもの
汎用Lockに比べて高速になっており、 Lockを表すサイズも小さい
84
Include/internal/pycore_parking_lot.h