프로세스와 쓰레드
프로세스(Process)
프로세스란 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 의미한다. 프로그램을 실행하면, 실행을 위한 메모리 할당이
이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가는데 이것을 프로세스라고 부른다. 다수의 프로세스들은 동일한
시스템에서 동시에 실행될 수 있다. 이는 프로세서가 프로세스들을 바꾸어주는 방식으로 다수의 프로세스를 동시에 실행하는 것처럼
보이게 해준다. 운영체제는 문맥 전환이라는 방법을 사용해서 이러한 교차실행을 수행한다. 운영체제는 프로세스가 실행하는 데
필요한 모든 상태정보의 변화를 추적한다. 컨텍스트라고 부르는 상태정보는 PC, 레지스터 파일, 메인 메모리의 현재 값을 포함하고
있다. 운영체제는 현재 프로세스에서 새로운 프로세스로 제어를 옮기려고 할 때 현재 프로세스의 컨텍스트를 저장하고 새 프로세스의
컨텍스트를 복원시키는 문맥 전환을 실행하여 제어권을 새 프로세스로 넘겨준다. 새 프로세스는 이전에 중단했던 바로 그 위치부터
다시 실행된다. 이때 컨텍스트를 저장하는 공간을 PCB(Process Control Block)라 부르며, 이는 프로세스 생성 시 만들어지며,
주기억장치에 유지된다. 컴퓨터에서 문맥 전환은 고속으로 일어나기 때문에 사용자들은 문맥 전환이 일어나는 것을 인지하지 못하며
다중 작업을 수행하고 있다고 생각할 수 있다.
특정 프로세스가 동작하고 있을 때, 새로운 프로그램을 실행하라는 명령을 받으면 시스템 콜이라는 특수 함수를 호출하여 운영체제로
제어권을 넘겨준다. 운영체제는 기존 프로세스의 컨텍스트를 저장하고 새로운 프로세스와 컨텍스트를 생성한 뒤 제어권을 새로운
프로세스로 넘겨준다. 이후 해당 프로세스가 종료되면 처음 프로세스의 컨텍스트를 복구시키고 제어권을 넘겨주면서 다음 명령을
기다린다. 하나의 프로세스에서 다른 프로세스로의 전환은 운영체제 커널에 의해 관리된다. 커널은 운영체제 코드의 일부분으로
메모리에 상주한다. 응용프로그램이 운영체제에 의한 어떤 작업을 요청하면, 컴퓨터는 파일 읽기나 쓰기와 같은 특정 시스템 콜을
실행해서 커널에 제어를 넘겨준다. 그러면 커널은 요청된 작업을 수행하고 응용프로그램으로 리턴한다.
쓰레드(Thread)
프로세스는 쓰레드라고 하는 다수의 실행 유닛으로 구성되어 있다. 각각의 쓰레드는 해당 프로세스의 컨텍스트에서 실행되며
동일한 코드와 전역 데이터를 공유한다. 쓰레드는 프로세스보다 생성 및 종료시간, 전환 시간이 짧다. 또한 커널 도움없이
상호간에 통신이 가능하기에 프로세스들에서보다 데이터 공유가 더 쉽다. 각각의 쓰레드는 독립적인 작업을 수행할 수 있고,
각자의 스택과 PC 레지스터 값을 갖고 있다.
동시성과 병렬성
컴퓨터의 역사를 살펴보면 두 개의 요구가 지속적으로 성능 개선을 주도해왔다. 두 개의 요구란 1) 컴퓨터가 더 많은 일을 2) 더 빨리
실행하는 하는 것을 의미한다. 그런데 이 두 요구 모두 프로세서가 한번에 더 많은 일을 할 때 개선되는 특징이 있다. 동시성이라는
용어는 시스템이 다수의 동시에 벌어지는 일을 수행하는 것을 말할 때 사용하며, 병렬성이라는 용어는 동시성을 사용해서 시스템을
보다 빠르게 동작하도록 하는 것을 말할 때 사용한다. 단일 프로세서 시스템 상에서 하나의 프로세스에서 쓰레드를 이용하여 다수의
제어 흐름을 가질 수 있다. 그런데 최근에는 시스템이 여러 개의 프로세서를 가지고 하나의 운영체제에서 동작하는 멀티 프로세서
시스템이 등장하였다.