
프로세스는 부모 프로세스 (Parent Process)와 자식 프로세스 (Child Process)를 가질 수 있으며, 이 관계로 트리 구조를 형성한다. 또한 같은 선상에 있는 프로세스를 형제 프로세스 (Sibling Processes)라고 한다.

이렇게 프로세스의 관계를 트리 형식으로 나타낸 그림을 프로세스 트리 (Process Tree)라고 한다.
각 프로세스마다 식별할 수 있는 Process Identifier (PID)를 갖고 있으며 일반적으로 정수형이다.
프로세스는 시스템 콜을 통해 생성되는데, fork() 시스템 콜을 통해 부모 프로세스를 복사하여 새로운 프로세스를 생성한다. 이렇게 만들어진 프로세스에서 다른 프로그램을 실행하려면 exec() 시스템 콜을 통해 현재 프로세스의 이미지(코드·데이터·스택)를 새로운 실행 파일로 교체한다.


프로세스는 exit() 시스템 콜을 통해 종료할 수 있다. 종료된 프로세스는 갖고 있던 모든 자원 (메모리, 파일, 입출력장치 등)을 운영체제에게 반환한다.
프로그램 내부에서 코드의 흐름 또는 맥
class Test {
public static void main(String[] args) {
int n = 0;
int m = 6;
System.out.println(n + m);
while (n < m) {
n++;
System.out.println("Bye");
}
}
}
위와 같이 위에서부터 아래로 코드가 진행되는 하나의 흐름을 스레드라고 한다.
Note한 프로그램에 2개 이상의 흐름이 있는 것을 의미한다.
기본적으로 하나의 프로그램(프로세스)은 하나의 스레드로 실행된다. 하지만 다중 스레드는 여러 개의 스레드를 빠른 간격으로 switching하여 마치 동시에 실행되는 것처럼 보이도록 하는 방법이다.
하나의 CPU에서 여러 스레드가 빠르게 전환하며 실행되는 것처럼 보이는 것을 동시성(Concurrency) 이라 한다.
여러 CPU 코어에서 여러 스레드가 실제로 동시에 실행되는 것을 병렬성(Parallelism) 이라 한다.
예전 운영체제는 하나의 프로세스가 동작하다가 일정한 Time Quantum이 지나면 다음 프로세스로 넘어가는 방식으로 동작했다.
현대 운영체제는 하나의 프로세스가 특정 스레드를 동작하고 또 다른 프로세스가 특정 스레드를 동작하고 다시 이전 프로세스가 또 다른 스레드를 동작하는 다중 스레드 (Multithreads)를 지원한다.
따라서 현대 운영체제의 Context Switching 단위는 프로세스가 아닌 스레드 단위이다.
스레드의 구조는 다음과 같다.