sicp.io
3.4.1 · 공유 상태의 엇갈린 실행

같은 갱신도 읽기와 쓰기가 엇갈리면 결과가 달라질 수 있다.

각 읽기와 쓰기를 별도 단계로 드러내면 유한한 실행 순서 하나에서 갱신 손실을 직접 볼 수 있습니다.

생각해 볼 질문

두 갱신이 어느 쪽도 끝나기 전에 같은 잔액을 읽으면 무엇이 사라질까요?

  • 각 트랜잭션의 읽기와 이후의 쓰기를 분리하기
  • 오래된 공유 값으로부터 계산된 쓰기를 인식하기
  • 유한한 스케줄의 정확한 단계 순서 나열하기
  • 갱신 손실 결과와 직렬화된 결과 비교하기

입금은 10을 더하고 출금은 20을 뺍니다. 첫 번째 스케줄에서는 두 연산 모두 100을 읽습니다. 입금이 110을 쓰지만 출금은 여전히 이전에 읽은 값으로부터 계산하여 80을 씁니다. 나중에 실행된 쓰기가 입금 결과를 대체하므로 최종 balance에는 두 변경 사항이 모두 포함되지 않습니다.

두 번째 스케줄은 출금이 읽기 전에 입금이 읽기와 쓰기를 마치도록 합니다. 따라서 출금은 110을 보고 90을 씁니다. 이 프로그램들은 선택된 두 가지 유한 스케줄과 그에 따른 정확한 최종 잔액을 나열합니다.

SICP 코드UTF-8 461 / 1,048,576바이트
예제
결과
출력
진단
실행 추적0 / 0 개 이벤트
    실행은 브라우저 안에서 이루어지며 프로그램 결과와 실행 추적을 보여줍니다.
    예상 결과

    첫 번째 프로그램은 ((deposit read 100) (withdraw read 100) (deposit write 110) (withdraw write 80) (final 80))을 반환합니다. 직렬화된 프로그램은 ((deposit read 100) (deposit write 110) (withdraw read 110) (withdraw write 90) (final 90))을 반환합니다.

    실행 추적에서 볼 점

    첫 번째 실행에서 어느 쪽 대입도 일어나기 전에 일어난 두 번의 초기 balance 읽기를 따라간 다음, 110과 80의 쓰기 위치를 찾아보세요. 두 번째 실행에서는 110 쓰기 이후에 출금 읽기가 일어납니다. 실행 흐름은 고정된 런타임 제한 아래에서 두 명시적 스케줄을 기록합니다.

    직접 해보기

    프로그램을 수정하고 결과를 비교해 보세요.

    첫 번째 스케줄에서 출금 쓰기를 입금 쓰기 앞에 배치해 보세요. 최종 잔액을 예측하고 어느 갱신이 손실되는지 명시해 보세요.

    힌트 보기

    두 쓰기 모두 100으로부터 계산되었으므로, 마지막에 일어나는 쓰기가 최종 잔액을 결정합니다.

    이 수업 완료하기

    이 장의 총 21개 수업 중 0개 완료0%