: 일반적으로 프로세스란 실행 중인 프로그램으로 정의한다.
프로세스의 구성 요소를 이해하기 위해선 하드웨어 상태를 이해해야 한다.
프로세스의 하드웨어 상태 중 가장 중요한 구성 요소는 메모리(주소 공간(address space))라고 할 수 있다. 물론 레지스터도 중요하지만 지금은 프로세스 생성에 대해 자세히 적어보려고 한다.
운영체제는 어떻게 프로그램을 준비하고 실행시킬까?
우선 프로그램과 프로세스의 차이점에 대해 설명하자면 프로그램 자체는 생명이 없다.
프로그램은 보조 기억장치(하드디스크, SSD)에 실행 파일 형식으로 존재하며 실행되기를 기다리는 코드와 정적인 데이터의 묶음이다.
프로그램을 메모리에 할당 즉, 프로세스의 메모리 영역인 주소공간에 탑재(load)하기 위해 운영체제는 디스크의 해당 바이트를 읽고 탑재시키면 비로소 프로세스라고 부를 수 있게 된다.
코드와 정적 데이터가 메모리로 탑재된 후, 프로세스를 실행시키기 전에 운영체제가 해야 할 일이 몇 가지 있다.
일정량의 메모리가 프로그램의 스택으로 할당되어야 한다.
운영체제는 스택을 주어진 인자로 초기화하고, 힙(heap)을 위한 메모리 영역을 할당한다.
프로그램은 malloc()을 호출하여 필요한 공간을 요청하고 free()를 호출하여 사용했던 공간을 반환하여 다른 프로그램이 사용할 수 있도록 한다.
프로그램이 실행되면 malloc() 라이브러리API를 호출하여 메모리를 요청하고, 운영체제가 이를 충족하도록 메모리를 할당한다.
또한 입출력과 관계된 초기화 작업을 수행한다.
정리하자면, 코드와 정적 데이터를 메모리에 탑재하고, 스택과 힙을 생성, 초기화하며 입출력 셋업과 관계된 다른 작업을 마치게 되면 운영체제는 프로그램 실행을 위한 준비를 마치게 된다. 이후 운영체제는 CPU를 새로 생성된 프로세스에게 넘기게 되고 프로그램 실행이 시작된다.
스케줄링(Schedulling)은 실행중인 모든 프로세스들에게 CPU 할당 순서 및 방법을 결정하는 일이다.
대부분의 OS에선 알고리즘을 우선 순위(Priority)와 라운드 로빈(Round Robin)을 혼합해서 스케줄링한다고 한다
운영체제는 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리하는 방법이 있는데 프로세스 상태를 실행(Running), 준비(Ready), 대기(Blocked)으로 분류하고 상태 전이(state transition)를 통해 체계적으로 관리한다.
사용자가 프로그램을 실행하면 프로세스가 생성되고 준비상태가 된다.
프로세스는 프로세서(CPU)가 사용가능한 상태가 되면 CPU를 할당 받는다.
이를 준비에서 실행으로 상태 전이(state transition) 된다고 하며, 이 과정을 디스패칭(dispatching)이라고 하고 디스패처(dispatcher)가 이 일을 수행한다.
만약 프로세스를 다시 사용하기 전에 입출력이 완료대기를 기다려야 한다면 완료될때 까지 자신을 대기(Blocked)한다.
프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block)또는 프로세스 기술자(process descriptor)라고 부르는 자료구조에 저장된다.
PID
운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호(PID, Process IDentification)
프로세스 상태
CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행중인 프로세스도 있고 대기 중인 프로세스도 있는데 그런 프로세스의 상태를 저장한다.
프로그램 카운터(program counter, PC)
프로그램의 어느 명령어가 실행 중인지를 알려준다. 프로그램 카운터는 명령어 포인터(instruction pointer, IP)라고도 불린다.
스케줄링 우선순위
프로세스 스케줄링에 작성했던 위의 내용과 일치한다.
권한
프로세스가 접근할 수 있는 자원을 결정하는 정보다.
프로세스의 부모와 자식 프로세스
다른 프로세스를 생성하는 프로세스를 부모 프로세스(Parent Process)라 하고, 다른 프로세스에 의해 생성된 프로세스를 자식 프로세스(Child Process)라 한다. 프로세스의 부모-자식 관계들은 트리 구조로 나타나게 된다.
프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터
프로세스는 실행중인 프로그램이기 때문에 프로그램에 대한 정보를 가지고 있어야 한다. 프로그램에 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장된다. 이 공간에 대한 포인터 값을 가진다.
프로세스에 할당된 자원들을 가리키는 포인터
문맥 교환(Context Switch)
CPU에서 한번에 하나의 프로세스만 실행시키며 여러 프로세스를 돌아가면서 작업을 처리하는 과정이다.
위에 설명했던 시분할 방법과 일치한다.