학습목표

  • 쓰레드와 프로세스의 차이를 설명할 수 있다.
  • 프로세스 동기화는 무엇이며 어떤 상황에서 사용되는지에 대해 설명할 수 있다.

1. 쓰레드(Thread)란 무엇인가?

쓰레드는 프로그램 내부의 흐름, 맥을 의미합니다.
혼동하지 말아야할 점은 프로세스는 메모리에 적재된 프로그램을 의미하고 쓰레드는 프로세스의 안에서의 실행 흐름을 의미합니다.
쓰레드는 프로세스의 메모리 공간과 파일, I/O등의 자원을 공유하지만 다른 프로세스의 메모리와 자원에는 접근할 수 없다는 특징이 있습니다.

2. 쓰레드(Thread) vs 프로세스(Process)

하나의 프로세스에는 기본적으로 1개의 쓰레드(Main thread)가 있으며 경우에 따라서는 여러개의 쓰레드가 존재할 수 있습니다.
쓰레드의 개수에 따라 프로그램을 부르는 방법도 달라집니다.
쓰레드가 1개인 프로그램을 단일(싱글) 쓰레드(Single thread) 프로그램이라고 하며, 여러개의 쓰레드가 있는 경우에는 다중(멀티) 쓰레드(Multi thread)프로그램이라고 합니다.
멀티 프로세스와 멀티 쓰레드의 개념이 조금 헷갈리실 수 있지만 잘 구분해야합니다.
멀티 프로세스는 '여러 프로그램을 동시에 실행하는 개념'이고, 멀티 쓰레드는 '하나의 프로세스에 여러 실행흐름이 있는 개념'을 의미합니다.

3. 프로세스 스위칭 vs 쓰레드 스위칭

멀티 프로세스는 프로세스 스위칭을 빠르게해서 동시에 여러 프로세스를 실행하는것 처럼 보이게하는 개념입니다.
멀티 쓰레드도 마찬가지로 쓰레드 스위칭을 빠르게해서 동시에 여러 쓰레드를 실행하는것 처럼 보이게 하는것을 의미합니다.
앞서 공부한 내용에서는 CPU가 프로세스를 기준으로 스위칭한다고 했지만, 실제로 현대 운영체제는 쓰레드 단위로 작업을 스위칭하며 처리합니다.

4. 프로세스(쓰레드) 동기화

시스템의 공유자원을 여러 쓰레드가 동시에 접근하는 경우에는 데이터 일관성이 꺠질수 있습니다.
예를 들어 아래와 같이 쓰레드 A, B가 동시에 자원 R(int: 100)을 사용하는 경우를 생각해볼 수 있습니다.

  • A는 R + 100을 수행한다.
  • B는 R + 100을 수행한다.

평화롭게 A, B 순서로 코드가 실행된다고 가정하면 R의 최종값은 300이라고 생각할 수 있습니다.
하지만, 컴퓨터는 매우 빠르게 동작합니다.
그래서 A의 실행이 채 끝나기도 전에 B가 실행되는 경우가 발생할 수 있습니다.
이런 경우에는 R의 최종 값이 200이 아니라 100이라는 결과가 나오게 됩니다.
그리고 우리는 이런 현상을 흔히 오류라고 얘기합니다.
덧붙여 이렇게 오류를 발생시키는 코드 구간을 임계 구역(critical section)이라고 부릅니다.
이 문제를 해결하려면 어떻게하는게 좋을까요?
가장 쉽게 생각할 수 있는 방법은 모든 쓰레드가 공유하는 공통 자원(R)을 동시에 하나의 쓰레드만 사용할 수 있게 만드는 것입니다.
이렇게 자원에 접근 가능한 쓰레드를 통제해서 멀티 쓰레드의 문제를 해결하는 방법을 동기화라고 합니다.

Reference