티스토리 뷰
프로세스: 운영체제로부터 자원을 할당받은 작업의 단위
스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로그램이란?
프로그램이란 파일장치에 저장되어 있지만 메모리에는 저장되어 있지 않은 상태이다.
즉, 프로그램이 실행되고 있지 않은 상태를 의미한다. 모든 프로그램은 실행되기 위해서는 메모리에 할당되어야 한다.
프로그램을 실행하게 되면 메모리에 공간을 할당받는다. 이 상태의 프로그램을 프로세스라고 한다.
프로그램은 단순히 코드로 구성된 파일이며, 메모리에 공간을 할당받은 프로그램을 프로세스라고 한다.
스레드 개념이 생긴 이유
프로그램의 실행부터 끝까지 하나의 프로세스가 처리한다.
그러나 점차 프로그램이 복잡해짐에 따라 프로세스 1개로 처리하는 것이란 실질적으로 불가능하게 되었다.
그렇다고 해서 다른 프로세스를 현재 프로그램을 처리하는 것에 포함시키는 것 또한 불가능하다.
왜냐하면 자신이 담당하고 있는 프로그램이 있을 텐데, 다른 프로그램을 처리하기 위해 사용되는 것은 불안정을 초래하기 때문이다.
이러한 프로세스의 한계를 해결하기 위해 스레드라는 개념이 만들어졌다.
스레드는 프로세스보다 더 작은 실행 단위이다.
스레드는 특이하게도 스레드 간에 메모리를 공유한다.
반대로 프로세스 간에는 메모리를 공유하지 않는다.
스레드 간에 프로세스의 자원을 공유하면서 실행의 일부가 되는 것이다.
프로세스와 스레드의 작동 방식
프로세스는 프로그램이 실행되기 위해 메모리에 공간을 할당받는다.
스레드는 스레드 간에 프로세스가 할당받은 자원을 공유한다.
운영체제는 프로세스에게 Code/Data/Stack/Heap로 구성된 메모리 영역을 제공한다.
당연하겠지만, 프로세스는 독립된 메모리 영역을 할당받기 때문에, 다른 프로세스는 접근할 수 없다.
스레드는 프로세스가 할당받은 자원을 공유해서 사용한다.
사실 모든 자원(Code/Data/Stack/Heap)을 공유할 수 있는 것이 아니다.
Stack을 제외한 나머지만 공유할 수 있다. Stack의 경우 스레드마다 따로 할당받는다.
프로세스와 스레드가 오류로 인해 종료된다면 어떻게 될까? 먼저 두 개의 차이를 알아보자.
- 프로세스: 프로세스 간에 자원을 공유하지 않는다.
- 스레드: 스레드 간에 자원을 공유한다.
프로세스는 강제로 종료되어도 문제가 될 것이 없다.
자원을 공유하지 않기 때문에 다른 프로세스에 영향을 미치지 않는다.
그러나 스레드는 스레드 간에 자원을 공유한다.
하나의 스레드에서 오류가 발생하여 종료된다면, 이를 공유하고 있는 다른 스레드에도 영향을 미친다.
자세히는 다른 스레드도 동시에 종료된다.
멀티 스레드
하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것을 의미한다.
- 장점
- Context-Switching이 발생할 때, 메모리 자원을 아낄 수 있다.
- 스레드는 Stack을 제외한 나머지 세 개의 영역을 공유하기 때문에 응답 시간이 빠르다.
- 단점
- 하나의 스레드가 종료된다면 다른 스레드도 동시에 종료된다.
- 자원을 공유하기 때문에 동기화 문제가 발생한다.
프로세스 간에 Context-Switching이 발생하면 많은 자원이 손실된다.
그러나 스레드는 프로세스의 자원을 공유하여 사용하므로 자원 손실이 적다.