Types for Safe Locking
(ESOP ’99)
Cormac Flanagan
and
Martίn Abadi
SRC, Compaq
Presenter: Shin SAITO [shin]
Abstract
並列プログラミングの問題の一つ、
「共有データへのアクセス競合
(Race condition)」
を回避するための型システムの提案
Second-order や
デッドロック回避のための型システム
などへの拡張
Pitfalls in Parallel Programming
並列プログラミングの落とし穴:
– 競合 (race condition)
– デッドロック (deadlock)
Race Condition
競合 (race condition) とは
– 複数のスレッドがデータ構造を同期を取らずに
操作している状態
非決定性や誤った結果をもたらす
タイミングに依存 → 追跡が困難
解決策
– ロックの導入: ロックを獲得してからデータを操作
Race Condition
競合 (race condition) とは
– 複数のスレッドがデータ構造を同期を取らずに
操作している状態
非決定性や誤った結果をもたらす
タイミングに依存 → 追跡が困難
解決策
– ロックの導入: ロックを獲得してからデータを操作
データにアクセス
thread
lock をとる
A
Race Condition
競合 (race condition) とは
– 複数のスレッドがデータ構造を同期を取らずに
操作している状態
非決定性や誤った結果をもたらす
タイミングに依存 → 追跡が困難
解決策
– ロックの導入
→ デッドロックの可能性
Deadlock
デッドロック (deadlock) とは
– 互いに (他のスレッドが獲得している) ロックを
獲得しようとして停止している状態
thread1
A
thread2
B
Deadlock
デッドロックの解決策
– ロックに半順序を導入
– 複数のロックは小さい方から獲得
thread1
A
lockA < lockB
thread2
B
Static Analysis of
Programming Discipline
以上のような「解決策のルール」
– 守られていることをチェックするのは容易でない
– 1ヶ所でも違反 → タイミングに依存するエラー
型システムを用いて静的にチェック
Outline
Target language
Race-free property
Extensions
Future work
Target Language (1/2)
並列、手続き型言語
– スレッド生成
– ロックの生成/獲得/解放
– 参照セルの割当て、参照
Target Language (2/2)
言語仕様
– 共有されるデータ: 参照セルで表す
– 参照セルにロックを付加
– 規約:ロックを獲得してデータにアクセスする
守られていることを型システムで保証する
制限
– ロック獲得の構造は入れ子
ロック獲得 → 文実行 → ロック解放
– ロック変数のスコープ
Syntax
e Exp ::=
—V
(値)
unit
x
px:t.e
(C言語の void)
(変数)
(関数定義)
Syntax
e Exp ::=
—V
p
(::= unit | x | x:t.e )
(値)
Syntax
e Exp ::=
–V
(値)
p
(::= unit | x | x:t.e )
–ee
(関数適用)
– refm e | !e | e := e
(参照セルの割り当て/参照外し/代入)
– fork e
(スレッド生成)
– new-lock x:m in e
(ロック変数の生成)
– sync e e
(同期=ロックの獲得)
e; e | let x=e in e
(逐次実行/let 文)
“new-lock” statement
new-lock
x:m in e
– 新しいロック変数 x と
“singleton lock type” m を宣言
– x, m は e の中で有効
(制約: x を返すことはできない)
拡張可能 (existential type)
“sync” Statement
(一般には) sync l e
– ロック変数 l に関して同期をとる
– e を評価 (実行)
– l を解放
Reference Cell
refm e
– e への参照セルを生成
– m はセルを protect するロック変数の型
– セルの型は Refm t (ただし e:t とする)
!e
– e は参照セルを表す式
– (e: Refm t とするとき) スレッドは型 m に対応する
ロックの獲得が必要
Function Definition
p
x:s.e
– 引数を x (型 s) とする関数の定義
ロック変数は引数にできない
→ 拡張可能 (polymorphism)
– p: permission (lock type の 集合)
関数本体の実行時に獲得されているべき
ロックの型の集合 (cf. example)
p
– 型は s → t
Examples
P1 new-lock x:m in
let y = refm 1 in
sync x !y
P2 new-lock x:m in
let y1 = refm 1
f = y {m}:Refm Int. (y := !y + 1)
in
sync x ( f y1)
Abstract Machine (1/4)
評価方法:call-by-value
S State = (, , T)
– : ロックから {0, 1} への写像 (1: acquired)
– : 参照セルの location から値への写像
– T : スレッドの列 / Ti : i 番目の要素
(T0 : 初期/main スレッド)
Exp に構文を追加
– in-sync l e: ロックを獲得しているスレッド
Abstract Machine (2/4)
評価の例:
P1 new-lock x:m in
new-lock y:n in
let z = refm 1 in
sync y !z
初期状態:
(, , P1)
Abstract Machine (3/4)
状態遷移:
– (, , new-lock x:m in
new-lock y:n in
let z = refm 1 in
sync y !z)
→ ([l1 0], , new-lock y:n in
let z = refol1 1 in
sync y !z)
→ ([l1 0, l2 0], , let z = refol1 1 in sync l2 !z)
Abstract Machine (4/4)
状態遷移 (続き):
– ([l1 0, l2 0], , let z = refol1 1 in sync l2 !z)
→ ([l1 0, l2 0], [z: Refol1 Int 1], sync l2 !z)
→ ([l1 0, l2 1], [z: Refol1 Int 1], in-sync l2 !z)
→ ([l1 0, l2 1], [z: Refol1 Int 1], 1)
ロックの獲得は考慮していない
上の状態は正しく型付けされた式では起こらない
Typing Rules
Judgment form: E; p├ e: t
– E: 環境
E ::= | E, x:t | E, m::Lock
– p: permission
「式 e は以下の条件で型は t であり、
正しく実行される」
– 環境は E
– p に含まれる型のロックを獲得している
Typing Rules - for locks
E, m::Lock, x:m; p├ e: t,
t は E で有効な型
E; p├ (new-lock x:m in e): t
– 返り値に x を含むことはできない
E; p├ e1: m, E; p {m}├ e2: t
E; p├ sync e1 e2: t
– m は lock type を表す
– e2 内部では型 m のロックを獲得
Typing Rules - for ref. cells
E; p├ e: Refm t, m p E; p├ !e: t
E; p├ e1: Refm t,
E; p├ e2: t,
mp
E; p├ (e1 := e2 ): t
– 参照セルにアクセスするにはロックが必要
Typing Rules - for functions
E, x: s; p├ e: t
E; ├ x:s.e: s → t
p
p
– 関数呼び出し時に必要な permission を付加
p
E; p├ e1: s → t, E; p├ e2: s
E; p├ e1 e2: t
– 関数呼び出し時の permission をチェック
Typing Rules - for subtyping
subpermission
– E├ p,
E├ q,
pq
E├ p q
subtype rule
– E├ s1 t1, E├ t2 s2, E├ p q
p
q
E├ (t1 → t2) (s1 → s2)
subtyping
– E; p├ e : t,
E├ p q,
E├ t s
E; q├ e: s
Race-free Property
スレッド T がセル r にアクセス
– f = E[ !r ] or f = E[ r := V ]
– E : evaluation context
E ::= [] | E e | V E | refm E | !E | E := e
| r := E | sync E e | in-sync l E
Race-free Property
スレッド T がセル r にアクセス
– f = E[ !r ]
or
f = E[ r := V ]
Race condition
– 複数のスレッドがセル r をアクセス
例: T = in-sync l1 !r | in-sync l2 r := 5
Race-free Property
スレッド T がセル r にアクセス
–
f = E[ !r ]
or
f = E[ r := V ]
Race condition
– 複数のスレッドがセル r をアクセス
Race-free property
1.
2.
3.
4.
各 critical section には高々1つのスレッド … ()
() はリダクションで保存される
well-typed かつ () なら race condition にない
well-typed な式 → race condition に陥らない
Extensions
Polymorphism over Lock Types
– ロック変数を引数に
Existential Types
Readers-writer Locks
Deadlock-free types
Deadlock Elimination
Deadlock
– T=
in-sync l1 (sync l2 e1) | in-sync l2 (sync l1 e2)
のようなスレッドを含んでいる状態
Key Idea
– Lock type に順序を導入
– new-lock x:m :: (M1, M2) in e
Mi は lock type の集合
順序: M1 m M2
Typing Rules (1/2)
Judgment form: E; p, L├ e: t
– L: locking level
L ::= m | | T
「式 e は well-typed で型は t である」
– p に含まれる型のロックを獲得している
– e が獲得できるロックは L より大
Typing Rules (2/2)
E; p, L├ e1: m,
L m,
E; p {m},m├ e2 : t
E; p, L ├ sync e1 e2 : t
– ロックの順序をチェック
Future Work
型推論
前述の拡張の正当性の証明
© Copyright 2026 ExpyDoc