프로그램은 실행되기 전까지 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 메모리에 적재되고 실행하는 순간 프로세스가 된다.
컴퓨터가 부팅되는 순간부터 수많은 프로세스들이 실행된다. 윈도우에서는 작업 관리자의 [프로세스] 탭에서 확인할 수 있다.
직접 실행한 프로세스 외에도 여러 프로세스가 실행되고 있는 것을 알 수 있다. 그 중에는 사용자가 볼 수 있는 공간에서 실행되는 포그라운드 프로세스foreground process, 사용자가 보지 못하는 뒤편에서 실행되는 백그라운드 프로세스background process가 있다.
백그라운드 프로세스 중에는 사용자와 직접 상호작용할 수 있는 프로세스도 있지만, 상호작용하지 않고 묵묵히 정해진 일만 수행하는 프로세스도 있다. 유닉스 체계의 운영체제에서는 데몬daemon, 윈도우 운영체제에서는 서비스service라고 부른다.
모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU자원은 한정되어 있다. 프로세스들은 차례대로 돌아가며 한정된 시간만큼 CPU를 이용하고 시간이 끝났음을 알리는 인터럽트(=타이머 인터럽트(타임아웃 인터럽트): 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트)가 발생하면 자신의 차례를 양보하고 다음 차례까지 기다린다.
운영체제는 프로세스 제어 블록PCB: Process Control Block을 이용해 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다.
PCB는 커널 영역에 생성되어 프로세스와 관련된 정보를 저장하는 자료 구조다.
PID는 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
같은 프로그램도 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성
해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
현재 프로세스가 어떤 상태인지 기록 되어있다.
프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
프로세스마다 메모리에 저장된 위치가 다르기 때문에 어느 주소에 저장되어 있는지에 대한 정보가 있어야 한다. 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담긴다. 또한 프로세스의 주소를 알기 위한 중요 정보중 하나인 페이지 테이블 정보도 담긴다.
프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시된다. 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 기록된다.
프로세스 A가 운영체제로부터 CPU를 할당받아 실행되다가 시간이 다 되어 프로세스 B에 CPU 사용을 양보한다고 가정해 보자.
이 상황에서서 바로 직전까지 실행되던 프로세스 A는 프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력장치 등 지금가지의 중간 정보를 백업해야 한다. 그래야 다음 차례가 왔을 때 이전까지 실행했던 내용에 이어 재개할 수 있을 것이다.
이러한 중간 정보, 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥context라고 한다. 하나의 프로세스 문맥은 해당 프로세스의 PGB에 표현되어 있다.
해당 프로세스가 CPU 사용 시간이 다 되거나 예끼치 못한 상홍이 발생해 인터럽트가 발생하면 운영체제는 해당 프로세스의 PGB에 문맥을 백업하고 뒤이어 실행할 프로세스의 문맥을 복구해 실행 하는 것을 문맥 교환context switching이라고 한다.
문맥 교환은 여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리다. 문맥 교환이 자주 일어나면 프로세스는 그만큼 빨리 번갈아 가며 수행되기 때문에 동시에 실행되는 것처럼 보인다.
하나의 프로세스는 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나위어 저장된다.
코드 영역code segment은 텍스트 영역text segment이라고도 부른다. 실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장된다. 데이터가 아니 CPU가 실행할 명령어 담겨있기 때문에 읽기 전용 공간read-only이다.