問題3.48、問題3.49 – SICP(計算機プログラムの構造と解釈)その144
問題3.48 デッドロックになるプロセスの推移 デッドロックを回避するプロセスの推移(口座番号小さい a2 から先にアクセスする) (define (exchange account1 account2) (let ((difference (- (account1 ‘balance) (account2 ‘balance)))) ((account1 ‘withdraw) difference)…続きを読む
問題3.48 デッドロックになるプロセスの推移 デッドロックを回避するプロセスの推移(口座番号小さい a2 から先にアクセスする) (define (exchange account1 account2) (let ((difference (- (account1 ‘balance) (account2 ‘balance)))) ((account1 ‘withdraw) difference)…続きを読む
問題3.47 a. 相互排除器を使った場合 (define (make-semaphore n) (let ((counter 0) (mutex (make-mutex))) (define (the-semaphore m) (cond ((eq? m ‘acquire) (mutex ‘acquire) (if (> counter n) (begin (mutex ‘release)…続きを読む
問題3.46 cell が true の間は他のプロセスは 相互排除器(mutex)を使えない。 2つのプロセスが同時に相互排除器を獲得するとプロセスの相互排除機能が破綻する。 計算機プログラムの構造と解釈 posted with amazlet at 08.11.07 ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン ピアソンエデュケーション 売り上げランキング: 654…続きを読む
問題3.44 交換(exchange)の場合とは違い残高の差(difference)を計算する必要がなく、transfer 実行時に指定するために Ben Bitdiddle の主張の方が正しい。 問題3.45 withdraw、deposit 手続きの部分で serializer が入れ子になるので処理が終わらない。 計算機プログラムの構造と解釈 posted with amazlet at 0…続きを読む
問題3.43 残高の順序が 10, 20, 30 でなくなる場合 残高の合計の保存が破れる場合 Paul が withdraw、 deposit 実行時に、 a の値を調べるプロセスと a に新値を Set するプロセスとの間に Peter が a の値を新値に Set してしまう。 計算機プログラムの構造と解釈 posted with amazlet at 08.11.07 ジェラルド・ジェイ …続きを読む
問題3.41 変更した部分は、アクセス時点での balance を返すだけで、書き換えによる変化がないために直列化は必要ない。 ((eq? m ‘balance) balance) ; ↓ 直列化 ((eq? m ‘balance) ((protected (lambda () balance)))) 問題3.42 安全な変更。 並列性に違いはない。 計算機プログラムの構造と解釈 posted w…続きを読む
問題3.40 P1 : (lambda () (set! x (* x x))) P2 : (lambda () (set! x (* x x x))) プロセスを次のように分割する。 X1-1 : P1 の1番目の x へのアクセス X1-2 : P1 の2番目の x へのアクセス Xe1 : P1 の x への設定 X2-1 : P2 の 1番目の x へのアクセス X2-2 : P2 の 2…続きを読む
問題3.39 P1 : (lambda () (set! x ((s (lambda () (* x x)))))) P2 : (s (lambda () (set! x (+ x 1)))) 以下の3つの結果が残る。 101 : P1 が x を 100 にセットし、P2 が x を 101 にセットする。 121 : P2 が x を 11 にセットし、P1 が x を 121 にセットする。…続きを読む
問題3.38 問題a. 6通りある。 Peter -> Paul -> Mary => 110 -> 90 -> 45 Peter -> Mary -> Paul => 110 -> 55 -> 35 Paul -> Peter -> Mary => 80 -> 90 -> 45 Paul -> Mar…続きを読む
問題3.37 除算については、 x / y = z は x = y * z として multiplier で演算する。 (define (c+ x y) (let ((z (make-connector))) (adder x y z) z)) (define (c* x y) (let ((z (make-connector))) (multiplier x y z) z)) (define (…続きを読む