프로세스 : 실행 중인 프로그램, 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위
프로세스는 사용자에게 보이는 포그라운드 프로세스, 보이지 않는 곳에서 작동하는 백그라운드 프로세스가 있다.
사용자와 직접 상호작용하는 백그라운드 프로세스와 달리 사용자와 상호작용하지 않는 프로세스도 존재한다. 이를 유닉스에서는 데몬
이라 부르고, 윈도우에서는 서비스
라고 부른다.
프로세스들은 차례대로 돌아가면서 한정된 시간동안만 CPU를 사용한다.
프로세스는 자신의 차례가 되면 정해진 시간동안만 CPU를 사용하고 시간이 끝났음을 알리는 인터럽트가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다린다.
운영체제는 프로세스 실행 순서를 관리하고, 프로세스에 CPU 자원을 배분한다. 이를 위해 운영체제는 프로세스 제어 블록(PCB)을 이용한다.
PID는 특정 프로세스를 식별하기 위해 부여하는 고유 번호이다.
같은 일을 수행하는 프로그램이더라도 두 번 실행 시 PID 가 다른 두 개의 프로세스가 생성된다.
프로세스가 CPU를 일정 기간동안 사용하고 반납할 때 프로그램 카운터, 각종 레지스터 값, 메모리 정보 등 지금까지 진행해온 중간 정보를 백업해두어야 한다. 그래야 다음 차례가 왔을 때 이전까지 실행한 내용에 대해 이어 실행을 재게할 수 있다.
이후 다시 해당 프로세스의 차례가 오면 백업해 둔 프로세스의 문맥을 복구한다.
이처럼 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥교환(Context Switch)라고 한다.
프로세스가 생성되면 커널 영역에는 PCB가 생성되고 사용자 영역에는 코드영역, 스택영역, 힙영역, 데이터 영역으로 나뉘어 저장된다.
코드 영역
실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장된다.
데이터 영역
프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. 예시로는 전역변수가 있다.
코드 영역과 데이터 영역의 크기는 변하지 않는다. 이러한 영역을
정적 할당 영역
이라 하고 힙 영역, 스택 영역 같이 크기가 변하는 영역을동적 할당 영역
이라 한다
힙 영역
개발자가 직접 할당할 수 있는 저장공간이다.
동적으로 할당되고 해제되는 영역으로 주로 런타임 때 크기가 결정된다.
프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 사용 이후 해당 공간을 반환해야 한다. 만일 반환하지 않으면 할당된 공간은 메모리 내에 남아 메모리 낭비(메모리 누수)를 초래한다.
스택 영역
데이터를 일시적으로 저장하는 공간이다. 주로 지역 변수와 매개 변수가 저장된다.
일시적으로 저장될 데이터는 스택에 push 되고 더이상 필요가 없는 데이터는 pop 된다.
힙 영역은 메모리의 낮은 주소부터 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다.
덕분에 힙 영역과 스택 영역에 데이터가 쌓여도 주소가 겹칠 일이 없다.
생성 상태
프로세스 생성 중인 상태, 막 메모리에 적재되어 PCB를 할당 받은 상태이다. 생성 상태를 거쳐 실행 준비가 완료된 프로세스는 준비 상태가 되어 CPU 할당을 기다린다.
준비 상태
당장이라도 CPU를 할당받아 실행될 수 있으나, 차례를 기다리는 상태. 준비 상태 프로세스는 차례가 되면 CPU를 할당받아 실행 상태가 된다.
준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치
라고 한다.
실행 상태
CPU를 할당받아 실행 중인 상태. 실행 중인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다. 이때 할당된 시간을 모두 사용하고 타이머 인터럽트가 발생하면 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용하여 입출력장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.
대기 상태
프로세스 실행 도중 입출력장치를 사용할 때 입출력장치의 작업이 완료될 때까지 기다리는 상태. 입출력 작업이 완료되면 다시 준비 상태로 되돌아간다.
종료 상태
프로세스가 종료된 상태이다. 프로세스가 종료되면 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이떄 새 프로세스를 생성한 프로세스를 부모 프로세스, 부모 프로세스를 통해 생성한 프로세스를 자식 프로세스라 한다.
부모 프로세스와 자식 프로세스는 서로 다른 PID를 가진다. 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스 PID인 PPID가 기록되기도 한다.
하나의 부모 프로세스에 여러 자식 프로세스가 존재할 수 있다. 이를 도표로 그리면 트리 구조를 띄는데 이를 프로세스 계층 구조라고 한다.
부모 프로세스를 통해 생성된 자식 프로세스들은 복제(fork)와 옷 갈아입기(exec)로 실행된다.
부모 프로세스는 fork를 통해 자신의 복사본으로 자식 프로세스를 생성해내고,
자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.