저는 컴공의 유사한 학과이긴 하지만 엄연히 다른 과를 다니고 있습니다.
개발을 하며 컴공이 아니기에 불편한 점은 몇가지 없었지만 딱 2가지 있었습니다.
이번년도 3학년에 올라가기에 슬슬 CS를 공부하며 기반을 다져야한다고 생각했기에 근 1달간 '혼자 공부하는 컴퓨터 구조 + 운영체제' 를 통해 운영체제를 공부했습니다.
공부를 더욱 효율적으로 하기 위해 이번 글부터 CS Interview에 답해보며 공부를 하려고 합니다.
첫 질문은 '프로세스와 스레드의 차이' 입니다.
프로세스를 간단하게 표현하면 '실행 중인 프로그램'이라고 할 수 있다.
프로그램은 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다.
모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU 자원은 한정되어 있다. 즉 모든 프로세스가 CPU를 동시에 사용할 수는 없다. 그렇기에 프로세스들은 차례대로 돌아가며 한정된 시간만큼만 CPU를 이용한다.
자신의 차례가 되면 정해진 시간만큼 CPU를 이용하고, 시간이 끝났음을 알리는 인터럽트(타이머 인터럽트)가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다린다.
그렇다면 운영체제는 어떻게 빠르게 번걸아 수행되는 프로세스의 실행 순서는 어떻게 관리하고, 프로세스에 CPU를 비롯한 자원을 배분할까?
이를 위해 운영체제는 PCB(Process Control Block, 프로세스 제어 블록)을 이용한다.
스레드는 실행의 단위이다.
정확하게 표현하면, 스레드란 프로세스를 구성하는 실행의 흐름 단위이다. 하나의 프로세스는 여러 개의 스레드(멀티스레드)를 가질 수 있다. 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.
전통적인 관점에서 하나의 프로세스는 하나의 일만을 처리했다. '실행의 흐름 단위가 하나'라는 점에서 이렇게 실행되는 프로세스들은 단일 스레드 프로세스라고 볼 수 있다.
하지만 스레드(Thread)라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다.
즉, 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있게 된 것이다.
이런 점에서 볼 때 스레드는 '프로세스를 구성하는 실행 단위'라고 볼 수 있다.
스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다. 각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기에 스레드마다 각기 다른 코드를 실행할 수 있다.
여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행된다는 것이다. 프로세스의 자원을 공유한다는 것이 스레드의 핵심이다.
정리하면, 프로세스가 실행되는 프로그램이라면 스레드는 프로세스를 구성하는 실행의 흐름 단위이다.
프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다.
프로세스마다 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당받는다. (code, data, heap, stack)
스레드는 이중에 stack만 따로 할당받고 나머지 영역은 스레드끼리 서로 공유한다.
[요약]