운영체제에서는 메인 메모리에 할당되어 실행 중인 하나의 애플리케이션을 프로세스
라고 부른다.
사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당 받아 애플리케이션의 코드를 실행한다.
이때 실행되는 애플리케이션을 프로세스
라고 부른다.
예를 들어 Chrome 브라우저를 두 개 실행하면, 두 개의 프로세스가 생성된다.
이렇게 하나의 애플리케이션은 여러 프로세스(다중 프로세스)를 만들기도 한다.
하단의 사진(활성 상태창)에서 확인할 수 있는 항목 하나하나가 전부 프로세스.
프로그램은 일반적으로 하드 디스크 등에 저장되어 있는 실행 코드.
어떤 작업을 하기 위해 실행할 수 있는 파일.
프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위.
메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태.
프로세스는 실행하면서 stack, pointer, text, data, register 등 끊임없이 변한다.
job
, task
등으로 불리기도 한다.
OS를 통해 CPU가 작업하는데 필요한 자원을 프로세스 또는 스레드 간에 나누는 행위를 멀티 태스킹
이라고 한다.
이를 통해 여러 응용 프로그램을 동시에 열고 작업할 수 있다는 장점이 있다.
여러 Process를 관리하는 운영체제의 모습을 도식화함
여러 프로세스가 동시에 실행되고 관리되는 것처럼 보이지만, 사실 CPU는 한번에 한 가지 명령어 밖에 처리하지 못한다.
CPU가 상상 이상으로 빠르기 때문에 프로세스들을 번갈아가며 실행하고 관리하는 것이 마치 동시에 하는 것처럼 보일 뿐이다.(Context Switching
)
프로세스 내에서 실행되는 흐름의 단위.
일반적으로 하나의 애플리케이션(프로그램)은 하나 이상의 프로세스를 가지고 있다.
하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다.
즉, 프로세스를 생성하면 기본적으로 하나의 (메인)스레드가 생성된다고 생각하자.
하나의 프로세스를 구성하는 스레드들은 프로세스에 할당된 메모리, 자원 등을 공유한다.
하나의 프로세스는 여러 개의 스레드로 구성이 가능하다.
하나의 스레드는 코드가 실행되는 하나의 흐름이기 때문에, 한 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개 생긴다는 의미다.
프로세스는 실행될 때 운영체제로부터 각각 독립된 메모리 영역을 할당 받는다.
스레드는 한 프로세스 내에서 동작되는 흐름으로서, 프로세스 내에서 Stack영역만 별도로 할당 받고, 부모 프로세스의 Code, Data, Heap 영역은 공유한다.
즉, 프로세스내에서 자식 스레드들을 서로 주소 공간이나 자원들을 공유하면서 실행될 수 있다.
하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 하나의 작업을 수행하는 것.
멀티 프로세스
가 애플리케이션 단위의 멀티 태스킹이라면, 멀티 스레드
는 애플리케이션 내부에서의 멀티 태스킹이라고 할 수 있다.
멀티 스레드는 하나의 애플리케이션을 여러 개의 스레드로 구성하여 하나의 스레드가 하나의 작업을 처리하도록 하는 것을 말한다.
멀티 스레드는 다양한 곳에서 사용된다.
대용량 데이터의 처리시간을 줄이기 위해 데이터를 분할하여 병렬로 처리하는 데에 사용할 수도 있고, UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용할 수도 있다.
그리고 여러 클라이언트의 요청을 처리하는 서버를 개발할 때에도 사용된다.
멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 비용이 적어진다.
스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
프로세스간 IPC를 사용하여 통신하는 것은 상대적으로 비용이 크다.
하지만 스레드는 프로세스 메모리 영역을 공유하여 스레드 간의 통신 비용이 적게 든다.
멀티 프로세스는 프로그램이 문제가 생기면 해당 프로세스가 중단되거나, 중단 시키고 다시 시작하면된다.
하지만 멀티 스레드 방식의 프로그램에서는 하나의 스레드가 자신이 사용하던 데이터 공간을 망가뜨린다면, 해당 데이터 공간을 공유하는 모든 스레드를 망가뜨릴 수 있다.