이 문제는 연습문제 3.39와 비슷합니다.

정확하게는 책에 나오는 예제를 조금 변경하여 낸 문제입니다.

 

이 코드를 실행시키면 x는 100, 1,000, 10,000, 100,000, 1,000,000이 나옵니다.

 

먼저 1,000,000은 문제 없이 실행되었을 때 나오는 수치입니다.

두 프로시저는 어떤 것을 먼저 시켜도 동일한 결과가 나옵니다.^^

 

그 다음으로 100,000의 경우는 다음과 같습니다.

편의상 (lambda () (set! x (* x x)))은 A, (lambda () (set! x (* x x x)))은 B로 하겠습니다.

B의 첫 번재 x는 10이 들어갑니다.

하지만 두 번째 x를 불러올 때 A가 실행되어 100이 들어갑니다.

마찬가지로 세 번째 x를 불러올 때도 100이 들어갑니다.

따라서 10 * 100 * 100 = 100,000이 되는 것입니다.

 

10,000의 경우는 다음과 같습니다.

B의 첫 번째는 10, 두 번째는 10, 하지만 세 번째를 불러오기 전에 A가 실행되어 100.

따라서 10 * 10 * 100 = 10,000이 되는 것입니다.

 

1,000의 경우는 다음과 같습니다.

A가 실행될 때 첫 번째 x는 10, 두 번째 x는 B가 실행되어 100.

따라서 10 * 100 = 1,000

이 외에 A와 B가 동시에 실행되어 x를 모두 10으로 받은 후

B보다 A가 먼저 끝나 x에 100이 저장되고 다음으로 1,000이 저장되는 경우가 있습니다.

 

100의 경우는 다음과 같습니다.

A와 B가 동시에 실행되어 x를 모두 10으로 받습니다.

하지만 B가 먼저 끝나 x에 1,000이 저장된 후 A가 끝나 100이 저장됩니다.

따라서 10 * 10 = 100이 되는 것입니다.

 

하지만 이처럼 줄을 세우면 값은 1,000,000만이 나옵니다.

 

 

이를 직접 확인해보았습니다.

위의 것은 make-serializer를 쓰지 않은 것,

밑의 것은 make-serializer를 쓴 것입니다.

 

마찬가지로 분포를 확인해보았습니다.

확실히 1,000,000의 개수가 많습니다.

하지만 그 외의 값도 1/4 정도 되는군요.;;;

 

 

참조

해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 397

 

 

(require (planet "sicp-concurrency.ss" ("dyoo" "sicp-concurrency.plt" 1 1)))

(define (exercise_3_40_1)
  (define x 10)
  (parallel-execute (lambda () (set! x (* x x)))
                    (lambda () (set! x (* x x x))))
  x)

(define (exercise_3_40_2)
  (define x 10)
  (define s (make-serializer))
  (parallel-execute (s (lambda () (set! x (* x x))))
                    (s (lambda () (set! x (* x x x)))))
  x)

; execute
(define (print-pro p n)
  (define (iter k)
    (if (<= k n)
        (begin (display (p))
               (display "  ")
               (if (= (remainder k 8) 0)
                   (newline))
               (iter (+ k 1)))))
  (iter 1))

(print-pro exercise_3_40_1 (* 8 100))
(newline) (newline)
(print-pro exercise_3_40_2 (* 8 100))

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1599

댓글을 달아 주세요

[로그인][오픈아이디란?]