본문 바로가기

CS/운영체제

프로세스와 스레드의 차이

1. 프로세스

프로세스는 운영체제로부터 자원을 할당받은 작업의 단위

 

프로그램은 아직 실행되지 않은 파일 그 자체를 말한다. 윈도우의 *.exe 파일이나 MacOS의 *.dmg 파일 등등 사용자가 눌러서 실행하기 전의 파일을 말한다. 쉽게 말해서 그냥 코드 덩어리다.

운영체제(OS)는 정적인 상태의 프로그램을 실행하고자 할 때 메모리 영역에 할당한다. 이때 이 프로그램이 동적인 상태인 프로세스가 된다.

 

2. 스레드

스레드는 프로세스가 할당받은 자원을 이용하는 실행흐름의 단위

 

과거에는 이 프로그램을 실행할 때 프로세스 하나만을 가지고 실행했지만 프로그램이 복잡해지면서 어려움이 생겼다.

따라서 프로세스와는 다른 더 작은 실행 단위 개념이 필요하게 되었고, 이 개념이 바로 스레드다.

스택을 스레드마다 독립적으로 할당하는 이유

스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.

 

PC Register 를 스레드마다 독립적으로 할당하는 이유

PC 값은 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다. 스레드는 CPU 를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다.

3. 프로세스와 스레드의 동작 방식

둘의 차이점은 개념 말고도 메모리 공유 방식에 있다!

프로세스는 운영체제가 메모리를 할당할 때 각 프로세스마다 독립된  Code/Data/Stack/Heap 메모리 영역을 할당한다. 왜냐하면 작업의 실행단위이기 때문에 변수 등의 자원을 공유해서는 안된다. 프로세스의 메모리 구조는 그림으로 간단하게 나타냈지만 다음에 자세히 써보도록 하겠다.

프로세스의 메모리 구조       (출처 - 나)

 

스레드는 프로세스 내에 한 개 이상 존재하기 때문에 같은 프로세스 내의 스레드끼리는 공유하는 영역이 존재한다.

stack영역은 독립적으로 갖게 되나, code/data/heap 영역은 공유한다. 이를 공유자원이라고 한다. 이 특성으로 인해 추후 다룰 동기화 현상도 발생한다.

스레드의 메모리 구조 (출처 - 나)

 

따라서 한 프로세스가 종료되었을 때 다른 프로세스에는 영향을 미치지 않으나 같은 프로세스 내에서 한 스레드가 오류로 중단되면 다른 스레드도 강제로 중단된다.