Race Condition을 이해하기 위해서 기초를 다시 다지려고 한다.
오늘은 Process에 대해서 설명하려고 한다.
Process란 무엇인지 우선 생각을 해봐야 한다. 영어로 번역하면 일의 과정을 process라고 한다. 그렇다면 컴퓨터에서는 어떻게 뜻이 적용되는지 파악해야 한다. 컴퓨터에서의 process는 프로그램을 실행시키기 위해 하드웨어에 저장되어 있는 데이터를 cpu에 올려서 명령어를 실행시켜 프로그램을 돌리는 그런 과정을 수행한는 것을 process라고 한다. 즉 프로그램을 cpu가 실행시켜 동작하는 프로그램을 process라고 한다. 프로그램을 실행시키면 계속 명령어를 처리하기 때문이다. process는 독립적인 메모리 즉 리소스를 할당 받는다. 만약 다른 process에서 리소스를 공유해서 사용해야한다면 보다 복잡한 파이프나 소켓과 같은 방식을 이용해서 사용해야 한다.
그렇다면 processor가 무엇인지도 궁금 할 것이다.
process는 cpu에서 데이터를 처리한다고 했으니 process를 처리하는 cpu를 processor로 이해하는 것이 더욱 편할 것이다.
그렇다면 processor에서 process를 처리하는데 task를 처리하는 단위를 thread라고 한다. 그렇다면 thread에 대해서 자세히 알아보도록 하겠다.
영어로 Thread의 뜻은 실이라는 의미를 갖고 있다. 쉽게 이해하기 위해서 예시를 들어 보려고 한다. 어떤 건물을 지을 때 건축하는 사람을 processor, 도면을 process, 재료를 thread라고 이해하면 편하다. 왜 재료를 thread라고 예시로 들었는지는 아래와 같다.
process에서 실행해야하는 task들을 처리하는 것이 thread인데, 그렇게 task를 처리해서 얻은 값들을 processor가 사용하기 때문에 그렇게 설명했다. 그래서 task를 처리하는 단위를 thread 즉 실이라고 이름을 붙인 것 같다.
Thread 종류가 존재하는데 user level thread와 kernel level thread가 있다.
커널에는 유저 모드와 커널 모드가 있다. 그 이유는 커널 모드여야 커널에 접근하여 리소스와 같은 것들을 관리 할 수 있기 때문이다. user level thread는 말 그대로 user mode에서 사용하는 thread를 말하고 kernel level thread는 말 그대로 커널 모드에서 사용하는 thread를 말한다. 예시를 들면 갑자기 process가 중단되면 커널에서 유저 모드에 가서 user level thread에게 응답을 기다리고 응답을 받고 커널 모드로 들어가서 kernel level thread에게 전달해주는 방식이 있다.

thread 개수에 따라서 한번에 task를 처리 가능한 것을 확인 할 수 있다. 이것을 멀티 쓰레드(Muti-Threads)라고 한다. 하지만 이것이 race condition을 불어올 수 있다.
그렇다면 왜 멀티 쓰레드를 이용하면 이런 현상이 발생하는 원인인 멀티 쓰레드와 race condition이 무엇인지 먼저 알아보도록 하겠다.
말 그대로 여러 쓰레드를 사용하는 것을 말한다. 아래 사진을 보면 이해가 좀 더 쉬울 것 같다.

하지만 멀티 프로세싱이라해도 단일 쓰레드만 사용하는 것은 아니다. 멀티 프로세싱과 멀티 쓰레드를 같이 할 수도 있는 것이다. 우선 설명을 위해서 단일 프로세스에서 사용하는 멀티 쓰레드에 대해서 설명해 보려고 한다. 사진을 보면 코드, 데이터, 자원(heap)등을 공유하는 것을 확인 할 수 있다. 하지만 각 쓰레드는 스택 영역을 독립적으로 갖고 있다. 이렇게 한 프로세스가 가지고 있는 자원을 여러 쓰레드가 자원을 나워서 쓰는데 이 때 문제가 발생할 수가 있다.
다음 시간에는 race condition에 대해서 자세히 알아보도록 하겠다.