“프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다.”[위키백과 – 프로세스] 프로그램은 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 저장된 파일을 의미한다. 프로세스는 프로그램을 실행하면 OS가 메모리위로 올리게 된다. 그러면 프로세스가 된다. 프로그램을 메모리 위에 올리는 이유는 CPU는 메모리 위에 있는 것만 읽을 수 있기 때문에 OS가 프로그램을 메모리 위로 올리는 것이다. 즉 프로세스는 CPU가 읽고 실행할 수 있는 상태로 바뀐 것을 의미한 것이고, 프로그램이 실행되어서 돌아가고 있는 상태를 의미한다. 간단하게 정리하면 프로그램은 저장되어 있는 정적인 상태이고, 프로세스는 실행되고 있는 동적인 상태로 생각하면 된다.
Program Header는 실행 파일(바이너리 파일)의 Segment들에 대한 정보를 포함하는 데이터 구조이다. 주로 ELF(Executable and Linkable Format) 형식의 실행 파일에서 사용된다. 프로그램 헤더는 실행 파일이 로드될 때 운영체제가 참조하여 필요한 메모리 공간을 할당하고 초기화하기 위한 정보를 제공해준다.
Program Header는 Segment 타입, 위치, 가상 주소, 크기, 권한 등의 정보를 가지고 있다. Segment 타입은 Code, Data, Heap등의 Segment 종류에 대한 정보이다. Segment의 위치는 실행하고 있는 파일의 어디인지에 대한 정보를 가지고 있고 loader가 이 정보를 사용해서 segment의 위치를 찾을 수 있다. Segment의 가상 주소는 실행되는 파일이 메모리에 올라갈 때 실제로 사용되는 주소에 대한 정보이다. Segment의 크기는 loader가 사용해서 얼마만큼의 메모리 크기에 할당을 해야하는지를 계산하는 정보이다. Segment의 권한은 일기, 쓰기, 실행 등, OS가 실행하고 있는 파일의 메모리 영역에 대한 접근 권한을 설정할 수 있는 정보이다.
이처럼 Program Header는 실행하고 있는 파일과 그에 해당하는 메모리 할당에 대한 정보를 가지고 있고 OS와 loader가 이를 사용해서 작업할 수 있게 해준다.
PCB, Code Segment, Data Segment, Stack Segment, Heap Segment는 프로세스가 실행되는 과정을 나타내는 중요한 개념이다.
PCB(Process Control Block)는 OS가 프로세스를 관리하기 위해 사용하는 구조이다. 프로세스 제어 블록이라고 부르며, 하나의 프로세스를 관리할 때 필요한 정보를 담고 있는 자료구조이다. 간단하게 설명하자면 PCB란 OS가 프로세스를 표현한 것이라고 생각할 수 있다. OS가 프로세스를 관리하기 위해 특정한 프로세스에 관한 정보를 모두 가지고 있는 것을 PCB라고도 생각하면 된다. 각각의 프로그램이 메모리위로 올라가 프로세스가 되면 그때마다 각각의 PCB도 생성된다.
CPU는 작업하고 있는 내용들을 PCB에 저장을 하고, 다른 작업들을 하다가 다시 PCB에서 작업하던 내용들을 PCB에서 가져와서 남은 작업을 진행할 수 있게 된다. PCB에는 프로세스 식별자, 프로세스 상태, 프로그램 계수기, CPU 레지스터, CPU 스케쥴링 정보, 메모리 관리 정보, 프로세스 계정 정보, 입출력 상태 정보 포인터등 프로세스 관리에 필요한 모든 정보들을 포함하고 있다.
Code Segment, Data Segment, Stack Segment, Heap Segment는 앞 보고서에서도 정리했으니 간단하게 정리해보자면, 이 Segment들은 프로세스 주소 공간이다. 이 주소 공간을 우리는 가상 메모리라고 부른다. Code Segment는 작성한 코드들이 CPU에서 실행할 수 있는 기계어로 바뀌어 저장되는 공간이다. Data Segment는 전역 변수, static 변수 등 프로그램이 사용하는 변수들을 저장하는 공간이다. Stack Segment는 함수를 호출할 때 필요한 정보들을 저장하는 공간이다. 함수가 호출되고 난 뒤 다시 돌아갈 주소, 함수의 지역변수, 매개변수, 반환값 등 함수에 관한 정보를 저장하는 공간이다. Heap Segment는 동적으로 할당되는 공간이다. 가령 객체를 new로 생성할 때 객체의 크기만큼 할당되는 공간이다. Heap 영역은 런타임일 때 결정된다. 그리고 Garbage Collector에 의해 정리된다.