프로세스란? (PCB, Context Switching)

프로세스(Process)

프로세스를 간단히 표현하면 실행중인 프로그램이라고 표현할 수 있다.

구체적으로 메모리 상에서 실행 중인 프로그램으로 운영체제로부터 자원(주소 공간, 파일, 메모리)을 할당 받을 수 있는 것을 말한다.

 

모든 프로세스는 실행을 위해서 CPU를 필요로 하는데, CPU의 자원은 한정되어 있기 때문에 프로세스가 CPU를 동시에 사용할 수 없다. 

즉, 프로세스들은 실행을 위해 각자 자신의 차례를 기다리며 할당받은 시간만큼만 CPU를 이용한다. 

OS는 이렇게 프로세스의 실행을 관리하기 위해 프로세스 제어 블록(PCB)이란것을 이용한다.

 

프로세스 제어 블록(Process Control Block, PCB)

프로세스 제어 블록(PCB)이란 프로세스에 대한 중요한 정보들을 저장하고 있는 자료구조이다.

프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환(문맥교환)이 발생하면 진행하던 작업을 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB 에 저장하게 된다. 그리고 다시 CPU 를 할당받게 되면 PCB 에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.

 

PCB는 프로세스 생성과 동시에 만들어지고 프로세스의 실행이 끝나면 동시에 폐기가 된다. 

 

대표적으로 PCB에 저장되는 정보들은 아래와 같다.

 

1. 프로세스 식별자 (Process ID: PID)

프로세스를 식별하기 위해 부여되는 고유한 번호이다.

 

2. 프로세스 상태

현재 프로세스가 어떤 상태인지 알 수 있는 정보로 프로세스 상태의 종류와 역할은 아래와 같다.

https://wonit.tistory.com/81

생성 상태 (new)
프로세스를 생성 중인 상태(new)로 이제 막 프로세스가 생성이 되어 PCB가 생성이 된 상태를 말한다.

준비 상태 (ready)
아까 프로세스는 실행을 위해 자신의 차례를 기다린다고 했는데, 준비 상태가 바로 프로세스 실행을 위해 기다리고 있는 상태(ready)이다.

실행 상태 (running)
실행 상태는 CPU를 할당받아 실행 중인 상태(running)를 의미한다. 할당된 시간만큼만 CPU를 이용하는데 시간이 다 되면 다시 준비상태가 된다.

대기 상태 (blocked)
프로세스는 실행중 입출력장치를 사용하는 경우가 있다. 입출력 작업을 요청한 프로세스는 입출력장치의 작업이 끝날때 까지 대기 상태가 된다. 입출력 작업이 완료된 프로세스는 다시 준비상태로 돌아가 프로세스를 실행하기 위해 CPU 할당을 기다린다.

종료 상태 (terminated)
프로세스의 실행이 종료된 상태를 종료 상태라고 한다. 프로세스가 종료가 되면 OS는 프로세스와 PCB가 사용한 메모리를 정리한다.

 

3. 메모리 관리 정보

해당 프로세스가 어느 주소에 저장되어 있는지에 대한 주소 정보가 포함이 된다. 프로세스마다 메모리에 저장되는 위치가 다르기 때문에 PCB가 위치를 알기 위해 주소 정보값을 포함하고 있다.

 

4. 레지스터 값

프로세스는 자신이 할당받은 시간이 끝나면 종료하게 되는데 이후 다시 자신의 차례가 되었을때 이전까지 작업했던 부분부터 다시 시작하기 위해 프로세스가 실행하며 사용했던 프로그램에 대한 정보(레지스터 값)들을 저장하게 된다.

 

이렇게 기존에 작업했던 부분부터 작업하기 위해 레지스터의 값들을 복구해 새로운 프로세스를 실행하는 것을 context switching이라고 한다.

 

context switching에 대한 자세한 정보는 아래에서 설명하겠습니다.

 

5. CPU 스케쥴링 정보

프로세스가 언제 CPU를 할당받을지에 대한 우선순위 정보가 담겨있다.

 

6. 입출력 장치와 사용한 파일 목록

프로세스가 실행 과정에서 파일을 열거나 특정 입출력장치를 사용하면 해당 정보들이 PCB에 저장이 된다.

즉, 프로세스에 할당된 입출력 장치들과 열린 파일 목록에 대한 정보가 담겨있다.

 

 

context switching이란

context switching을 비유하자면 게임을 하다 중간 지점에서 save하고 다시 reload해서 그 부분부터 게임하는 것과 비슷하다고 생각한다.

 

다시 자세히 설명하면 프로세스는 각자 자신에게 CPU를 이용할수 있는 할당된 시간이 존재한다고 설명했다. 그러면 아직 작업이 끝나지도 않았는데 할당된 시간이 다 되서 다음 프로세스에게 차례를 넘겨줘야 한다면 어떻게 될까? 

무식하게 처음부터 다시 진행하게 될까? 아니면 끝나기 전에 중간에 하던 작업을 저장하고 다시 프로세스가 실행될때 저장된 부분부터 할까?

 

결론을 말하면 컴퓨터는 나처럼 무식하지 않다.

 

프로세스는 자신의 실행 순서가 다음 프로세스에게 넘어가기 직전에 지금까지 작업한 정보(레지스터 값, 메모리 정보, 실행을 위해 열었던 파일, 입출력 장치 등등)들을 저장한다. 그리고 다음에 자신의 차례가 왔을때 이러한 정보들을 다시 불러와서 이전에 작업했던 부분부터 작업을 다시 재게한다.  

 

https://velog.io/@phc09188/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-PCB%EC%99%80-Context-Switching

 

위의 그림을 보면 쉽게 이해할 수 있다.

 

1. 프로세스1을 실행하다 할당된 시간이 지났다는 알림(Interrupt or system call)이 울리면 PCB1에 실행하던 정보들을 저장한다. (Save state into PCB1)

2. 프로세스2에 대한 정보들이 담겨있는 PCB2를 불러온 다음에 프로세스2를 실행한다.

3. 이후 프로세스1에 대한 실행 순서가 오면 프로세스2는 PCB2에 작업하던 정보들을 저장하고 PCB1에 저장했던 정보들을 불러온다. 

 

프로세스의 메모리 영역

이번에는 프로세스의 메모리 영역에 대해 알아보자.

 

https://gaussian37.github.io/c-linux-process_and_thread/

프로세스의 메모리는 크게 스택(stack) 영역, 힙(heap) 영역, 데이터(data) 영역, 텍스트 영역 또는 코드 영역으로 나뉘어 저장이 된다.

 

스택 영역

스택 영역은 지역 변수나 매개 변수처럼 일시적으로 사용하는 데이터들이 저장되는 공간이다.

예를 들어 메서드의 실행이 끝나면 사라지는 데이터들이 저장된다.

 

그리고 스택 영역은 LIFO(Last - In - First - Out) 방식으로 관리를 하는데 저장할 데이터들을 스택 영역에 PUSH하고 필요 없는 데이터들은 최근에 PUSH한 순서대로 POP해서 제거한다.

 

힙 영역

힙 영역은 동적할당된 객체들이 저장된다. 다시 좀 더 쉽게 말해서 프로그래머가 직접 할당할 수 있는 저장 공간이다.

힙 영역에 메모리 공간을 할당했다면 이 공간을 언젠가는 반한해줘야 한다. 만일 이 반환하는 작업을 하지 않는다면 메모리 누수라는 문제가 발생한다.

 

자바에서는 이러한 메모리 관리를 GC가 해주는데 GC에 대한 내용은 아래 글을 참고하면 된다.

https://seungjjun.tistory.com/225

 

가비지 컬렉션(Garbage Collection)이란?

가비지 컬렉션(Garbage Collection, GC) C/C++과 달리 자바는 개발자가 명시적으로 객체를 해체할 필요가 없다. 이는 자바의 장점 중 하나이다. 사용하지 않는 객체를 메모리에서 삭제하는 작업을 GC라고

seungjjun.tistory.com

 

그리고 위에서 설명한 스택 영역과 힙 영역은 실시간으로 영역의 크기가 변할 수 있기 때문에 동적 할당 영역이다.

위의 그림처럼 힙 영역은 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당이 된다. 왜냐하면 힙 영역과 스택 영역에 쌓이는 데이터가 새로 할당이 되었을때 겹치는것을 방지하기 위함이다.

 

데이터 영역

데이터 영역은 스택 영역과 달리 일시적으로 사용할 데이터들을 저장하는 공간이 아닌 프로그램이 실행되는 동안 유지되는 전역 변수가 저장이 되는 공간이다. 전역 변수는 추가가 되거나 제거가 되지 않기 때문에 크기가 변하지 않기 때문에 데이터 영역은 정적 할당 역역이라고도 한다.

 

텍스트 영역

텍스트 영역 또는 코드 영역이라 불리는 이곳은 컴퓨터가 직접 판독하고 실행할 수 있는 기계어로 이루어진 명령어가 저장이 된다. 즉. CPU가 실행할 명령어가 담겨있기 때문에 읽기 전용 공간이다. 

 

'OS' 카테고리의 다른 글

Blocking, Non-Blocking I/O  (0) 2023.06.19
CPU 스케줄링과 알고리즘  (0) 2023.01.12