- 프로세스(Process)란?
프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다.
프로그램은 하드 디스크 등에 저장되어 있는 실행코드를 뜻하며, 프로세스는 프로그램을 구동해서 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 의미한다. 스케줄링의 대상이 되는 task(작업)이라는 용어와 같은 의미로 쓰이기도 한다.
여러 개의 프로세스를 사용하는 걸 '멀티 프로세싱'이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 '멀티 태스킹'이라고 한다
프로세서의 상태에는 생성, 실행, 준비, 대기, 종료가 있다. 커널 내 준비 큐, 대기 큐, 실행 큐 등의 자료 구조가 있고 커널은 이것들을 이용해 프로세스의 상태를 관리한다.
생성(create) : 프로세스가 생성 중인 상태이다.
실행(running) : 프로세스가 CPU를 차지하여 명령어들이 실행되고 있는 상태이다.
준비(ready) : 프로세스가 CPU를 사용하고 있지 않지만 언제든지 사용할 수 있는 상태로 CPU가 할당되기를 기다리고 있는 상태이다.
대기(waiting) : 보류(block)라고 부르기도 하며 프로세스가 입출력 오나료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태이다.
종료(terminated) : 프로세스의 실행이 종료된 상태이다.
프로세스는 코드영역, 데이터 영역, 스택 영역, 힙 영역으로 이루어져 있다.
코드 영역(code) : 코드 자체를 구성하는 메모리 영역으로 프로그램을 명령하는 영역이다.
데이터 영역(data) : 전역 변수, 정적 변수, 배열 등 초기화된 데이터가 있다.
스택 영역(stack) : 지역 변수, 매개 변수, 리턴 값 등 임시 메모리가 있는 영역이다.
힙 영역(heap) : 동적 할당시 사용된다. (ex. new(), mallock() 등)
- 스레드(Thread)란?
스레드는 어떤 프로그램 내에서 실행되는 흐름의 단위를 말한다. 특히 프로세스 내에서 실행되는 흐름의 단위를 말하며 일반적으로 한 프로그램은 하나의 스레드를 가진다.
프로세스 하나에 자원을 공유하면서 과정들을 여러 개 동시에 실행시킬 수 있다.
프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수도 있으며 이런 방식은 '멀티 스레드'라고 한다.
위의 그림은 두 개의 스레드를 실행하고 있는 하나의 프로세스를 나타낸 것이다.
스레드의 종류는 스레드를 지원하는 주체에 따라 사용자 레벨 스레드와 커널 레벨 스레드, 2가지로 나눌 수 있다.
사용자 레벨 스레드는 커널 영역의 상위에서 지원되며 일반적으로 사용자 레벨의 라이브러리를 통해 구현된다. 동일한 메모리 영역에서 스레드가 생성 및 관리되기 때문에 속도가 빠르지만 여러 개의 사용자 스레드 중 하나의 스레드가 시스템 호출과 같은 중단이 되면 나머지 스레드도 중단되는 단점이 있다.
커널 레벨 스레드는 운영체제가 지원하는 스레드 기능으로 구현되며 커널이 스레드의 생성 및 스케줄링 등을 관리한다. 스레드가 시스템 호출 등으로 중단되어도 커널은 프로세스 내의 다른 스레드를 중단하지 않고 계속 실행시킨다. 하지만 사용자 스레드에 비해 생성 및 관리가 느리다는 단점이 있다.
- 프로세스와 스레드 비교
멀티 프로세스와 멀티 스레드는 여러 흐름이 동시에 진행되는 공통점이 있다.
멀티 프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있기 때문에 안정성이 높다. 하지만 각각 독립된 메모리 영역을 가지고 있기 때문에 작업량이 많을수록 오버헤드가 발생한다는 단점이 있다.
멀티 스레드는 프로세스 내의 메모리를 공유해서 사용하며 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다는 특징이 있다. 때문에 시스템의 처리율이 향상되며 자원 소모도 감소한다.
멀티 스레드는 CPU가 여러 개일 경우 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문에 각각 CPU가 스레드 하나씩 담당하는 방식으로 속도를 높일 수 있다.
하지만 멀티 스레드는 각각 스레드 중 어떤 것이 먼저 실행될지 알 수 없으며 어떤 스레드가 먼저 실행될지 보장되지 않는다. 이런 문제는 스레드 실행 조건에 따라 결과가 다르게 나오기 때문에 오류 발생 시 원인을 찾기 힘들다. 이런 문제를 '경쟁 조건'이라고 하며 문제를 막기 위해 공유 데이터에 접근하는 스레드의 개수를 한개 이하로 유지하는 방법을 사용할 수도 있다.