Computer Science

프로세스에 관하여

Developer.Paul() 2021. 7. 7. 09:55

1. 프로세스란?

 

프로그램은 보조 기억 장치에 존재하며 실행되기를 기다리는 명령어(코드)와 정적인 데이터의 묶음이다. 이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면, 프로세스가 된다. 즉 프로세스란 실행 중인 프로그램을 의미한다. 하나의 CPU(프로세서)는 한 순간에 하나의 프로세스만 실행할 수 있다. 프로세스가 동시에 여러개가 실행될 수 있는 이유는 운영체제가 'CPU가 어떤 프로세스를 실행할 지' 판단해 계속 교체하고 있기 때문이다. 이를 시분할 방식이라고 한다.

 

2. 프로세스의 구성

 

프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block) 또는 프로세스 기술자(Process Description)이라고 불리는 자료구조에 저장된다. 대부분 PCB라고 부르는 이 자료구조는 크게 다음과 같은 정보를 담고 있다.

PID
운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호(PID, Process IDentification)이다.
프로세스 상태
CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행 중인 프로세스도 있고 대기 중인 프로세스도 있다. 그런 프로세스의 상태를 저장한다. 
프로그램 카운터
CPU가 다음으로 실행할 명령어를 가리키는 값이다. CPU는 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 메모리 주소를 가리키는 값이다.
스케쥴링 우선순위
운영체제가 여러 개의 프로세스가 CPU에 실행되는 순서를 결정하는 것을 스케쥴링이라고 한다. 이 스케쥴링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케쥴링 우선순위라고 한다.
권한
프로세스가 접근할 수 있는 자원을 결정하는 정보이다. 모바일 앱을 예로 들면 아무 앱이나 휴대폰 통화내역을 볼 수 있는 권한을 가지면 이를 악의적으로 이용할 수 있다. 그래서 프로세스마다 어디까지 접근할 수 있는지에 대한 권한이 필요하다.
프로세스의 부모와 자식 프로세스
최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제해서 생성되고 이 계층관계는 트리를 형성한다. 그래서 각 프로세스는 자식 프로세스와 부모 프로세스에 대한 정보를 가지고 있다.
프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터
프로세스는 실행중인 프로그램이다. 따라서 프로그램에 대한 정보를 가지고 있어야 한다. 프로그램에 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장된다. 이 공간에 대한 포인터 값을 가진다. 
프로세스에 할당된 자원들을 가리키는 포인터
프로세스가 실행 상태에서 마지막으로 실행한 프로세서의 레지스터 내용을 담고 있다. CPU에 의해 실행되는 프로세스는 운영체제에 의해 계속 교체되는데, 교체되었다가 다시 자신의 차례가 되어서 실행될 때 마치 연속적으로 실행된것 처럼하기 위해 이 레지스터 정보를 가지고 있다.

 

3. 프로세스와 메모리

 

PCB 구성 요소 중 '프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터'를 자세히 살펴보자. 프로세스의 데이터와 명령어가 있는 메모리는 구체적으로 어떻게 구성되어있을까? 이 주소 공간은 Text, Data, BSS, Heap, Stack 영역으로 구성되는데, 아래처럼 각 영역에 프로그램의 어떤 정보를 저장하는지 나와있다. 

프로세스 메모리 공간

스택 영역과 힙 영역 사이에 빈 공간은 컴파일 타임에 지역 변수를 얼마나 사용할지 미리 계산할 수 없기 때문에 런타임에 지역 변수 선언 순서에 따라 스택영역은 위쪽으로 주소 값을 매기고 동적 할당될 때 힙 영역은 아래쪽으로 주소값을 매긴다.

 

4. 프로세스 관리

 

운영체재는 실행 중인 프로세스들을 교체하고 재시작할 때 오류가 발생하지 않도록 관리해야 한다. 이를 위해 운영체제는 프로세스의 상태를 실행(running), 준비(ready), 블록(block) 상태로 분류하고 프로세스들의 상태전이(state transition)를 통해 체계적으로 관리한다. 

프로세스 상태 전이

1) 사용자가 프로그램을 실행하면 프로세스가 생성되고 준비 리스트에 추가된다.

2) 프로세스는 프로세서(CPU)가 사용가능한 상태가 되면 CPU를 할당받습니다. 이를 준비상태에서 실행상태로 상태전이 된다고 합니다. 이 과정을 디스패칭(Dispatching)이라고 하고 디스패처(Dispatcher)가 이 일을 수행합니다.

3) 프로세스는 실행상태에서 CPU를 이용해 연산 후 CPU를 자발적으로 반납하고 작업이 끝나지 않았으면 다시 준비상태에 들어간다. 운영체제는 다시 준비리스트의 첫 번째에 있는 프로세스를 실행상태로 바꾸고 이 과정을 반복한다.

4) 만약 프로세스를 다시 사용하기 전에 입출력이 완료대기를 기다려야 하는 상황이라면 완료될 때까지 자신을 블록한다. 입출력이 완료되면 운영체제가 프로세스를 블록상태에서 준비상태로 다시 전이시킨다.

운영체제는 프로세스가 CPU를 자발적으로 반납하지 않고 독점하는 경우를 반지하기 위해 하드웨어적으로 인터럽팅 클록을 주기적으로 발생시켜 프로세스가 특정 시간 간격 동안만 실행할 수 있도록 한다. 인터럽팅 클록이 발생되면, 강제로 실행 중인 프로세스의 CPU의 제어권을 운영체제에게 빼앗기고 프로세스는 준비상태로 상태전이된다. 

 

5. bowbowbow님의 블로그를 참고했습니다.

https://bowbowbow.tistory.com/16