실행 중인 프로그램을 프로세스이라고 한다. 프로그램은 실행되기 전까지는 보조기억장치에 있는 데이터이지만, 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다.
윈도우에서 작업 관리자의 프로세스 탭을 보면 현재 많은 프로세스가 실행되고 있는 것을 볼 수 있다.
그 중에는 사용자가 볼 수 없는 공간에서 실행 되고 있는 프로세스가 있는데 이를 백그라운드 프로세스(background process)라고 하고 볼 수 있는 공간에서 실행되는 프로세스는 포그라운드 프로세스(foreground process)라고 한다.
백그라운드 프로세스 중에는 사용자와 상호작용하는 백그라운드 프로세스가 있지만, 반대로 상호작용 하지 않는 프로세스가 있는데 이를 윈도우에서는 서비스(service)라고 부르며 유닉스 체계의 운영체제에서는 데몬(daemon)이라고 부른다.
CPU자원은 한정되어 있기에 모든 프로세스들은 차례대로 돌아가며 제한된 시간만큼만 CPU를 이용한다.
이때, 프로세스는 타이머 인터럽트를 통해 자신의 차례가 끝났음을 알 수 있다. 타이머 인터럽트는 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트이다.
운영체제는 프로세스의 실행 순서와, 시스템 자원을 관리하고 분배해야한다. 이를 위해 운영체제는 프로세스 제어 블록(Process Control Block)을 사용한다.
프로세스 제어 블록(PCB라 부른다.)은 커널 영역에 생성되며 프로세스와 관련된 정보를 저장하는 자료구조이다.
PCB는 프로세스가 생성될 때 같이 생성되고 프로세스가 종료될 때 같이 없어진다.
아래는 PCB에 담기는 정보에 대한 설명이다.
프로세스 ID(Process ID)는 프로세스를 식별하기 위해 부여하는 고유 번호이다.
같은 프로세스라도 두 번 실행하면 ID가 다른 프로세스가 생성된다.
프로세스는 자신의 실행 차례가 돌아오면 이전에 사용했던 레지스터의 값들을 복원한다.
즉, PCB 안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값이 담 긴다.
프로세스가 언제 CPU를 할당받을지에 대한 정보가 PCB에 기록된다.
프로세스가 어느 주소에 저장되어 있는지에 대한 정보가 기록된다. 또 페이지 테이블 정보도 PCB에 담긴다.
프로세스가 사용한 파일들의 정보와 입출력장치에 대한 정보가 PCB에 기록된다.
현재 자원을 할당받고 실행 중인 프로세스가 자신의 차례가 종료되고 다음 프로세스로 넘어갈 때 실행 중이었던 프로세스는 다음 실행 때 이어서 실행하기 위해 각종 레지스터 값을 비롯한 여러 중간 정보들을 백업한다.
여기서 중간 정보를 문맥(context)라고 하는데, 이렇게 다음 프로세스로 실행 차례가 넘어갈 때 문맥 또한 다음 프로세스의 PCB에 표현되어 있는 문맥으로 교체되어 실행한다. 이를 문맥 교환(context switching)라고 한다.
문맥 교환은 여러 프로세스가 빠른속도로 번갈아 가며 실행된다. 그래서 신기하게도 우리의 눈에는 동시에 실행되는 것처럼 보인다.
사용자 영역에서 프로세스가 어떻게 배치되는지 보자.
하나의 프로세스는 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나누어 저장된다. 모르긴 몰라도 자바 JVM을 공부하며 익숙해진 용어들인 것 같다.
각 영역은 어떤 역할을 하는지 보자.
코드 영역(code segment)는 텍스트 영역(text segment)라고도 부른다. 이곳에는 기계어로 이루어진 명령어들이 저장된다. 이곳에는 CPU가 실행할 명령어가 담겨있기 때문에 쓰기가 불가능하고 오로지 읽기만 가능하다.
데이터 영역(data segment)는 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. 이런 데이터는 전역 변수(global variable)이 대표적이다.
데이터 영역과 코드영역은 바뀌지 않는 영역이라 정적 할당 영역이라고도 부른다.
힙 영역(heap segment)는 프로그래머가 직접 할당할 수 있는 저장 공간이다. 그리고 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 한다. 그렇지 않는다면 메모리 내에 계속 남아 낭비를 초래하는 메모리 누수(memory leak)가 발생한다.
스택 영역(stack segment)는 데이터를 일시적으로 저장하는 공간이다. 즉, 잠깐 쓰다가 쓰지 않는 값들이 저장되는 공간이다. 매개 변수, 지역 변수가 대표적이다.
일시적으로 저장하는 데이터는 스택에 PUSH 되고, 필요하지 않은 데이터는 POP 된다.
힙 영역과 스택 영역은 크기가 실시간으로 변할 수 있기 때문에 동적 할당 영역라고 부른다.
두 영역은 메모리 내에서 곂치는 것을 방지하기 위해 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택은 높은 주소에서 낮은 주소로 할당된다.