2 min read

스레드로 인한 메모리 시각화

스레드의 메모리영역의 읽기 쓰기 수정 같은 작업을 시각화 해주는 온라인 서비스를 발견하였습니다.

사이트는 http://svr-pes20-cppmem.cl.cam.ac.uk/cppmem/

해당 프로그램은 모든 교차 실행을 판단하고 각 스레드를 시각해주는 역할을 합니다. 메모리 모델에 대해서는 다음의 링크를 참조해주시기 바랍니다.

http://egloos.zum.com/sweeper/v/3059861
https://en.cppreference.com/w/cpp/atomic/memory_order

해당툴로 스레드를 정의할려면 삼중 중괄호를 해주고 그안의 작업에 대해 정의를 할려면 괄호를 해주면됩니다. 일단 간단하게 두개의 스레드를 만들고 data race를 유발 시켜봅겠습니다. 다음은 아래의 코드입니다.

// contrasting with data_race.c, this 
// shows a concurrent use of sc_atomic that does
// not have a data race
int main() {
  int x=0;
  int y = 0;
{{{ {
    x=1000;
    y=3000;
    }
}}}
{{{ {
    x=3333;
    y=3000;
    }
}}}
  return 0; }

이와 같은 코드를 치고 run을 쳐주면 어디부분에 data race가 발생하는지 어떤결과가 나올지의 대해 데이터시각화를 해줍니다.

여기의 용어는 http://svr-pes20-cppmem.cl.cam.ac.uk/cppmem/help.html 사이트에 정리되어있습니다.

위의 그래프를 설명해주자면 wna는 write-non-atomic의 의미로 보시면됩니다.

sb는 Sequnced-Before의 의미로 a가 b보다 먼저 실행된다는 것입니다. 

b는 총 두가지의 경우가 있는데 하나는 c랑 e입니다. 여기서 데이터경쟁이 일어나게 됩니다. d와 f도 마찬가지로 데이터경쟁상태입니다. 이툴은 이런식으로 간단한 스레드의 읽기 쓰기 수정에 대해 시각화를 해주게 됩니다.