개인 공부를 위해 작성했습니다
기술면접에서 단골 질문 사항으로 나온다고 하는 프로세스와 스레드에 대해 공부한 내용 정리해본다.
프로세스: 운영체제로부터 자원을 할당받은 작업의 단위.
스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.
어렵게만 들릴 수 있는데, 프로세스의 정의에서 작업이라는 단어와 스레드의 정의에서 실행 흐름이라는 단어를 기억하자.
프로세스와 스레드에 대해 이해하기 위해서는 우선 프로그램에 대해 알아둘 필요가 있다. 그럼 프로그램은 무엇일까? 프로그램이란
풀어서 다시 정리해보면,
결국 프로그램이라는 단어는 아직 실행되지 않은, 일련의 명령문의 집합체 그 자체를 가리키는 말이다.
일련의 명령문의 집합체인 실행 파일(프로그램)을 실행 시키는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적(動的)인 상태라고 하며 이 상태의 프로그램을 프로세스라고 한다.
즉, 프로세스라는 단어는 작업 중인 프로그램을 의미한다
과거에는 프로그램 실행 시작부터 실행 종료까지 하나의 프로세스 만으로 진행되었다고 한다. 하지만 시간이 흐를수록 프로그램은 복잡해졌고 하나의 프로세스로 실행 시키기에는 벅차게 되었다. 실제로 프로그램이 하나의 작업만 실행하는 경우는 없다. 그럼 어떻게 해야할까?
프로세스를 여러개 실행하면 되지 않을까? 라고 생각할 수 있지만 불가능했다. 왜냐하면 운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생하기 때문이다.
아무튼 프로세스와는 다른 더 작은 실행 단위 개념이 필요하게 되었고, 이 개념이 바로 스레드다.
즉, 프로세스의 한계를 해결하기 위해 만들어진 개념이 스레드다.
스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로다.
조금 더 자세히 풀어보면,
프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는데 이 때 운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해 준다. 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
반면 스레드는 메모리를 서로 공유할 수 있다. 조금 더 자세히 풀어보면, 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
여기서 프로세스와 스레드의 차이점을 알 수 있다.
프로세스는 각각의 독립된 메모리를 할당받기 때문에 오류가 발생해서 프로세스가 강제로 종료된다면, 공유하고 있는 파일을 손상시키는 경우가 아니라면 다른 프로세스에게 아무런 영향을 주지 않는다.
스레드는 메모리를 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.
프로그램은 코드 덩어리 파일, 그 프로그램을 실행한 게 프로세스.
스레드를 코드(프로세스) 내에서의 함수(스레드)에 빗대어 표현해보면 이해하기 훨씬 쉽다. 코드 내 어떤 함수 하나에서 오류가 발생하면 어떤 함수에서 발생했든 간에 작업을 중단하고 프로세스 실행을 끝내버리는 것을 생각하면 보다 이해하기 쉽다!
: 하나의 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다.