더북(TheBook)

자, 그러면 소수 구하는 프로그램에서 어느 부분이 잘못되었는지 짚어 볼까요?

▲ 그림 1-22 아까 다루었던 소수 구하는 프로그램

 

우선 여러 스레드가 동시에 num을 읽습니다. 그리고 num을 증가시킵니다. num을 증가시키는 연산은 기계어로 컴파일하면 다음과 같이 여러 줄이 나옵니다.6

코드 num 연산의 기계어 코드

r1 = num
r1 = r1 + 1
num = r1

 

여러 줄이기 때문에 컨텍스트 스위치를 할 때 어디서 실행하다 멈추어야 할지 모를 수밖에 없습니다. 이 때문에 같은 값을 두 번 연산한다든지 아니면 값을 건너뛰고 연산한다든지 같은 여러 가지 문제가 발생합니다.

그런데 뭔가 이상합니다. 우리가 경험한 것은 앞서 본 것처럼 이상한 값이 들어간 정도의 문제가 아니라, 충돌(crash)이 난 상황입니다. 건드려서는 안 되는 메모리 공간을 건드린 것입니다. Array<int> primes에서요. 왜 충돌이 발생했을까요?

 

6 실제로는 MOV, INC 같은 기계어(명령어)로 만들어집니다. 여기서는 여러분 이해를 돕고자 C 언어 형식으로 표현했습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.