컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음(집합).
HDD나 SDD같은 보조기억장치에 저장된 사용자가 작성한 코드 또는 컴파일 된 결과물로 대부분의 프로그램은 사용자의 입력에 반응하도록 구현된 일련의 명령어들이 바이너리 형식으로 저장되어 있다.
보조기억장치에 저장되어 있던 프로그램이 실행되어 리소스를 할당받아 주기억장치(메모리)에 올라온 것.
하드웨어적 측면에서 컴퓨터 내에서 프로세스를 처리하는 유닛으로 일반적으로 중앙처리장치(CPU)를 칭한다.
Concurrency & parallelism from Pithikos
현재 실행되고 있는 프로그램.
Process Memory Structure from Operating System Concepts, 10th
프로세스는 크게 4가지 영역으로 구분되는 독립된 메모리를 할당받는다.
여기서 Text와 Data는 고정된 영역으로 실행 시점에 영역의 크기가 변하지 않으며, Stack과 Heap 영역은 동적 영역으로 줄었다 늘었다한다.
JavaScript나 Java같은 고수준 언어는 직접적으로 메모리 영역에 접근하지 않고 자동으로 메모리가 할당되며 필요하지 않을 때 자동으로 GC가 동작하여 메모리를 해제한다. Node JS의 경우 최대 heap 메모리 크기를 설정할 수 있으며, Heap 영역이 초과되면 out of heap memory 에러를, 너무 많은 재귀 함수 호출 등으로 Stack 영역이 초과되면 Maximum call stack size exceeded 에러가 발생된다.
Diagram of process state from Operating System Concepts, 10th
프로세스는 실행과 함께 상태가 변하며, 프로세스의 상태는 해당 프로세스의 현재 활동에 의해 정의된다.
Process Control Block from Operating System Concepts, 10th
운영 체제는 각각의 프로세스를 Process Control Block(PCB)
로서 나타낸다.
PCB는 특정 프로세스의 관리가 필요한 정보들을 담고 있으며, 사용자가 접근 불가능한 메모리 영역에 존재한다.
일반적으로 CPU는 여러 프로세스를 계속 바꿔가며 실행하므로, 중단 후의 작업을 위해 이전의 작업 정보를 어딘가에 보관해야 한다. 이 정보를 저장하는 곳이 PCB이며, 프로세스의 상태, 프로세스 번호, 다음 실행할 명령문의 주소(program counter), 레지스터 값, 할당받은 I/O 디바이스 리스트 등이 저장된다.
멀티 스레드 프로세스 개념도 from heejeong Kwon
프로세스가 할당받은 자원을 이용하는 실행, 작업의 단위.
기본적으로 프로세스는 적어도 하나의 스레드(작업 흐름)을 가진다.
스레드는 프로세스 내에서 각각의 Stack 영역과 Register, Program Counter를 가지며, 나머지 영역은 공유한다. 즉, 한 프로세스 내부의 스레드는 독자적인 실행환경을 가지고 코드를 실행할 수 있으며, 다른 스레드들과 동일한 자원을 공유하여 읽고 쓰기가 가능하다.