모든 프로세스는 부모 프로세스 (Parent Process)와 자식 프로세스 (Child Process)를 갖고 있다. 또한 같은 선상에 있는 프로세스를 형제 프로세스 (Sibling Processes)라고 한다.
이렇게 프로세스의 관계를 트리 형식으로 나타낸 그림을 프로세스 트리 (Process Tree)라고 한다.
각 프로세스마다 식별할 수 있는 Process Identifier (PID)를 갖고 있으며 일반적으로 정수형이다.
프로세스는 시스템 콜을 통해 생성되는데, fork() 시스템 콜을 통해 부모의 프로세스를 복사하여 새로운 프로세스를 생성한다. 이렇게 만들어진 프로세스 안에서 어떤 파일을 실행하려면 exec() 콜을 통해 실행 파일을 메모리로 가져올 수 있다.
프로세스는 exit() 시스템 콜을 통해 종료할 수 있다.
종료된 프로세스는 갖고 있던 모든 자원 (메모리, 파일, 입출력장치 등)을 운영체제에게 반환한다.
프로그램 내부에서 코드의 흐름 또는 맥
class Test {
constructor() {
const n = 0;
const m = 6;
console.log(n+m);
while(n < m) {
n++;
console.log("Bye");
}
}
다음과 같이 위에서부터 아래로 코드가 진행되는 하나의 흐름을 쓰레드라고 한다.
한 프로그램에 2개 이상의 흐름이 있는 것을 의미한다.
하나의 프로그램에는 하나의 쓰레드만 실행될 수 있다. 하지만 다중 쓰레드는 여러 개의 쓰레드를 빠른 간격으로 Switching하여 마치 동시에 실행되는 것 처럼 보이도록 하는 방법이다.
하나의 CPU를 두고 여러 개의 쓰레드가 스위칭을 통해 동시에 실행되는 듯한 효과를 Concurrent라고 한다.
여러 개의 CPU에서 여러 개의 쓰레드가 실제로 동시에 실행되는 효과를 Simultaneous라고 한다.
예전 운영체제는 하나의 프로세스가 동작하다가 일정한 Time Quantum이 지나면 다음 프로세스로 넘어가는 방식으로 동작했다.
현대 운영체제는 하나의 프로세스가 특정 쓰레드를 동작하고 또 다른 프로세스가 특정 쓰레드를 동작하고 다시 이전 프로세스가 또 다른 쓰레드를 동작하는 다중 쓰레드 (Multithreads)를 지원한다.
따라서 현대 운영체제의 Context Switching 단위는 프로세스가 아닌 쓰레드 단위이다.
쓰레드의 구조는 다음과 같다.