실행 중인 프로그램으로 메인메모리를 할당받은 프로그램을 의미한다. 프로세스는 주소 공간과 PCB(Process Control Block)로 구성된다.
코드(Code): 프로그램 코드를 저장한다.
데이터(Data): 전역 변수, 정적 변수를 저장한다.
스택(Stack): 매개변수, 지역 변수를 저장한다. 컴파일 시간에 크기가 결정된다.
힙(Heap): 동적으로 할당되는 값(new로 생성된 객체, 배열 등)을 저장한다. 실행시간에 동적으로 크기가 결정된다.
메모리 공간을 보호하고 효율적으로 사용하기위함이다.
예를 들어 코드영역은 Read-only 영역으로 지정함으로서, 실행 중에 변경될 위험으로부터 보호할 수 있다.
또한 데이터, 스택, 힙 영역을 구분하여 값들의 특성에 맞게 효율적으로 메모리를 사용할 수 있다.
new: 프로세스가 생성 중인 상태
ready: CPU를 할당받기를 기다리는 상태
running: CPU를 할당받아 실행 중인 상태
blocked: I/O와 같은 이벤트가 완료되기를 기다리는 상태
terminated: 실행이 끝난 상태
여러 개의 프로세스를 이용해 병렬적으로 작업을 수행하는 것이다. 각 프로세스는 독립적인 주소 공간을 가진다.
장점은 안정성이다. 독립적인 자원을 사용하므로 동기화 문제와 같이 공유자원으로 인한 문제가 발생하지않기 때문이다.
단점은 많은 메모리 공간을 차지하는 것이다. 또한 Context switching 시 캐시 메모리를 비워야 해서 많은 비용이 발생한다는 것이다.
프로세스 내 작업 실행 단위이다. 스레드는 스택, 레지스터 집합으로 구성된다. 또한 프로세스처럼 스레드의 문맥을 저장할 수 있는 TCB(Thread Control Block)를 할당받는다.
스레드간에 독립적인 작업을 수행해야하기 때문이다.
작업 흐름을 저장하는 스택을 각 스레드 마다 할당해줌으로서 독립적으로 작업을 수행할 수 있다.
여러 개의 스레드를 이용해 병렬적으로 작업을 수행하는 것이다. 각 스레드는 스택을 제외한 프로세스 주소 공간을 공유한다.
장점은 적은 메모리 공간을 차지하는 것이다. 또한 Context switching 시 캐시 메모리를 비우지 않아도 돼서 비용이 적다.
단점은 안정성에 취약한 것이다. 이는 공유자원 사용 시 동기화 문제가 발생할 수 있기 때문이다.