Computer Science/Operating System

Process, 프로세스

rueMi 2024. 3. 28. 16:10

프로세스

프로세스는 무엇을까? 이걸 알기 전에 우선 프로그램의 개념부터 정리할 필요가 있다.

 

❓ 프로그램

프로그램이란 어떤 작업을 위해 실행할 수 있는 파일이다.

 

❓ 프로세스

프로세스란 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적 개체)를 말한다. 즉, 프로그램을 실행 시켜 정적인 프로그램이 동적으로 변하여 돌아가는 상태를 프로세스라고 말한다.

 

프로그램과 프로세스의 차이를 정리하면 다음과 같다.

프로그램 프로세스
어떤 작업을 하기 위해 실행할 수 있는 파일 실행되어 작업 중인 컴퓨터 프로그램
파일 저장 장치에 있지만 메모리에는 올라가 있지 않은 정적인 상태 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태
쉽게 말해 그냥 코드 덩어리 코드 덩어리를 실행한 것

프로세스의 구성 요소

프로세스는 운영체제로부터 시스템 자원을 할당 받는 작업의 단위이다. 여기서 시스템 자원이란 다음과 같다.

  • CPU 시간
  • 주소 공간
  • 메모리 공간 : Code, Data, Stack, Heap으로 이루어진 구조
Code 코드를 CPU가 해석 가능한 기계어로 저장 코드
Data 각종 데이터 영역 - .data : 전역변수, static 변수
- .BSS : 초기값이 없는 전역 변수, static 변수
- .rodata : const 변수, 문자열 상수
Stack  임시 메모리 영역 지역변수, 매개변수, 리턴 값
Heap 동적 할당 시 사용 new(), malloc()

 

메모리 영역 구조

그림으로 메모리 영역 구조를 그리면 다음과 같다.

stack과 heap에는 화살표가 그려져 있다. 이는 code 영역과 data 영역은 선언할 때 그 크기가 결정되는 정적 영역이지만, stack 영역과 heap 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어들기도 하는 동적 영역이기 때문이다.

 

그럼 왜 이렇게 구역을 나눈 것일까?

최대한 데이터를 공유해서 메모리 사용량을 줄이기 위함이다.

 

Code는 같은 프로그램 내에서는 모두 같은 내용이기 때문에 따로 관리하여 공유한다.

 

Stack과 Data를 나눈 이유는, 프로그램의 함수와 지역 변수는 LIFO 특성을 가진 스택 구조에 잘 맞지만, 전역 변수의 경우에는 이 모든 함수들 안에서 공통으로 사용되는 변수이기 때문에 Data 영역에서 따로 관리함으로써 메모리를 아낄 수 있다.


프로그램의 실행

프로그램이 실행되어 프로세스로 메모리에 올라왔을 때에 어떤 일이 일어날까? 여기에 대해 알아보자.

프로세스의 생명 주기

프로세스 생명 주기란, 프로그램이 실행되어 메모리에 프로세스가 올라왔을 시점부터, 실행되고, 대기하고, 종료되는 시점까지의 주기를 말한다.

 

이는 다음과 같이 정리할 수 있다.

New  프로세스가 막 메모리에 올라온 상태로, 실행은 불가능하다.
Ready 변수 초기화 등 기초 준비 작업을 마치고, 실행할 수 있는 상태이다.
Running CPU가 실제로 프로세스를 수행하고 있는 상태이다.
Terminated 최종적으로 프로세스가 종료된 상태이다. 사용하던 메모리 영역이 해제된다.
Waiting 수행 도중 I/O 작업이나 인터럽트가 발생하여 대기하는 상태이다. 이때 CPU는 I/O 작업을 기다리며 다른 프로세스를 수행한다.

 

PCB, Process Control Block

 

프로세스가 생성되면 PCB도 메모리에 함께 생성된다.

PCB, Process Control Block

운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조이다.

Pointer : 프로세스의 현재 위치
Process State : 생명 주기 중 현 상태 저장
Process ID : 프로세스 식별자
Program counter : 프로세스를 위해 실행될 다음 명령어 주소
Register : 누산기, 베이스, 레지스터 등 CPU 레지스터에 있는 정보
Memory Limits : 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보
List of open file : 프로세스를 위해 열린 파일 목록 

 

운영 체제는 PCB에 담긴 고유 정보를 통해 프로세스의 실행 상태를 파악하고, 우선순위를 조정하며, 다음 실행할 프로세스를 선택하게 된다.


CPU의 프로세스 관리

위에서 살펴봤던 것처럼, 프로그램을 실행 했을 때 프로세스가 생성된다. 하지만 컴퓨터에서 항상 하나의 프로세스만 실행되지는 않을 것이다. 여러 프로그램이 실행되면 프로세스도 여러 개 생성될 것이고, 아직 배우진 않았지만 하나의 프로그램이 여러 개의 프로세스로 이루어진 멀티 프로세스로 실행될 수도 있다.

 

이때 여러 프로세스를 동시에, 병렬적으로 실행하여 여러 작업을 처리해주는 것이 바로 CPU이다.

 

❓ CPU의 작업 처리 방식

 

[병렬성]

CPU의 코어마다 프로세스 및 스레드를 돌려 작업을 병렬적으로 수행한다. CPU 코어 개수에 성능이 달려있다.

 

[동시성]

CPU가 각 작업을 잘게 나누어 매우 빠르게 번갈아 실행하면서 여러 작업을 동시에 실행하는 것처럼 보이게 한다. 이때 실행하는 작업을 바꾸는 과정을 Context Switching이라 한다.

 

이처럼 CPU가 병렬성과 동시성을 바탕으로 여러 프로세스의 실행을 보장하기 때문에 우리는 웹 서핑을 하며 카카오톡도 실행할 수 있는 것이다.

 

Waiting Queue, 대기 큐

그렇다면 메모리에 올라온 프로세스를 CPU가 구체적으로 어떻게 관리하는 것일까? 바로 프로세스의 상태에 따라 큐를 활용하여 관리한다.

 

 

먼저 Queue는 위와 같이 Job Queue, Ready Queue, Device Queue 세 개가 존재한다.

 

프로세스 상태 변화 Waiting Queue Description
New → Ready Job Queue HDD에 있던 프로그램들이 메모리에 올라올 때, 메인 메모리가 가득 찼거나 CPU가 다른 작업을 수행 중일 때 잠시 기다리는 곳이다.
Ready → Running Ready Queue 메모리에 올라온 프로세스들이 실행을 위해 대기하는 곳이다. 메인 메모리에 올라오더라도 바로 CPU를 할당 받을 수는 없으며, 자신의 차례를 기다린다.
Running → Waiting Device Queue I/O 장치(프린터, 키보드, 마우스)를 이용하려면 기존 I/O 작업이 끝나기를 기다렸다가 밀려있던 작업이 끝난 후 이용할 수 있다. 각 장치마다 대기 큐를 가지고 있는데, 이런 큐를 통틀어서 Device Queue라고 한다.

 

이처럼 CPU는 프로세스 상태 변화에 따라서 Queue를 통해 순차적으로 프로세스의 실행을 관리한다.

 

여기서 Terminated의 상태는 없는데, 프로세스가 종료될 때는 기다릴 필요 없이 바로 종료되기 때문에 Terminated 상태를 위한 큐는 필요하지 않다.

 

Scheduling, 스케줄링

그렇다면 프로세스의 상태 변화에 따라 큐에 담고 순차적으로 실행, 대기, 종료 시켜주는데, 이때 큐는 단순한 큐가 아니고 우선순위 큐라고 볼 수 있다. 즉, 특정한 기준을 가지고 어떤 프로세스를 먼저 큐에서 내보낼 지 결정해야 하는데, 그걸 스케줄링이라 한다.

 

스케줄링에도 Queue에 따라 다양한 종류가 있다.

Job Scheduler Job Queue의 프로그램들을 어떤 순서로 메모리에 올릴 것인지 결정한다.

이는 프로그램이 시작될 때 메인 메모리가 가득 찬 경우 등에만 발생하므로, 자주 일어나지 않고 어쩌다 한 번(수분~수십분) 일어난다. 이러한 스케줄러를 Long Term Scheduler라고도 한다.
CPU Scheduler Ready Queue의 프로세스들을 어떤 순서로 서비스할 것인지 결정한다.

이러한 과정은 1초에도 수십 번에서 많게는 수백 번도 일어나기 때문에, 이러한 스케줄러를 Short Term Scheduler라고도 한다.
Device Scheduler Device Queue의 프로세스들을 어떤 순서로 I/O 장치를 이용하게 할 것인지 결정한다.

이는 Disk Scheduler, Printer Scheduler, Mouse Scheduler 등 I/O, 보조 기억 장치 스케줄러를 통틀어 가리키는 말이다.

 

이중에서도 CPU Scheduler가 가장 중요하며, 앞서 말했던 여러 프로세스를 동시에 실행시킬 수 있도록 하는 context switching에 사용되는 스케줄러이다.

 

Swapping, 스와핑

❓ Swapping

오랫동안 동작이 없는 프로세스를 잠시 HDD로 내려 메모리를 더 효율적으로 사용하는 기법

 

서버와 같이 여러 사용자가 하나의 메모리를 공유하는 경우에, 만약 한 사용자가 자리를 비우면 그 사용자가 돌아올 때까지 해당 프로세스에 메모리를 할당할 이유가 없다. 이 때문에 PCB의 CPU Time 등을 확인해서, 오랫동안 동작이 없는 프로세스는 잠시 HDD로 내려놓고, 다른 프로세스를 실행하거나 기존 프로세스에 메모리를 더 할당하는 등 메모리를 더 효율적으로 활용하다가, 해당 사용자가 돌아와서 작업을 수행하면 다시 메모리에 프로세스를 올리는 기법이다.

  • Swap Out : 메모리에서 HDD로 내리는 작업
  • Swap In : HDD에서 메모리로 올리는 작업
  • Backing Store, Swap Device : Swapping 목적으로 사용되는 HDD 공간
  • Swapping Scheduler
    • Swapping 역시 여러 프로세스들이 HDD로 내려가고 다시 메모리로 올리는 작업을 하기 때문에, 어떤 순서로 프로세스를 내리고 올릴 지 결정해야 한다.
    • 이는 Short Term Scheduler보다는 적게 일어나지만 Long Term Scheduler보다는 자주 일어나기 때문에 Medium Term Scheduler라고 한다.

 

Context Switching, 컨텍스트 스위칭

그렇다면 Context Switching이 어떤 것인지, 어떤 기준으로 동작하는지 자세하게 살펴보자.

 

❓ Context Switching

CPU는 한정된 컴퓨터 자원이기 때문에, 프로세스마다 일정 시간이 지나 타이머 인터럽트의 발생 등에 의해 다른 프로세스로 교체되어 실행된다.
이때 동작 중인 프로세스 A가 대기 상태로 바뀌면서 프로세스 A의 상태(Context)를 저장하고, 대기하고 있던 다음 순서의 프로세스 B가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 일련의 과정Context Switching이라 한다.

 

프로세스 상태의 저장과 복구, PCB와 Dispatcher

만일 프로세스 A의 코드 중 100번 라인까지 실행했고, 작업 중에 10개의 데이터를 레지스터에 저장했다고 가정하자. 그러면 Context Switching 시 이 정보들을 어딘가에 저장해 두어야 A의 차례가 다시 돌아왔을 때 이전에 수행하던 작업이 끊기지 않고 수행될 수 있다. 이러한 상태 정보를 저장하는 자료구조가 바로 위에서 살펴보았던 PCB이다.

 

이를 이용해 프로세스 A를 수행하다가 B로 넘어가면 PCB_A를 저장하고, 다시 A의 차례가 왔을 때 PCB_A를 꺼내서 PC, SP, Register 등에 할당함으로써 여러 프로세스를 번갈아가며 실행할 수 있다. 이러한 작업을 수행하는 프로그램을 Dispatcher라고 한다.

 

Context Switching 과정

그렇다면 컴퓨터에서 돌아가는 프로세스가 단 두 개라고 가정했을 때, 두 프로세스 간 Context Switching 과정을 자세히 정리해보자.

  1. 초기에는 CPU는 P1을 실행 중인 상태이다.
  2. 일정 시간이 지나 Timer Interrupt 또는 System call이 발생했다
    1. 현재 실행 중인 P1의 상태를 PCB1에 저장한다
    2. Ready Queue에서 다음 실행할 P2를 선택한다(CPU 스케줄링)
    3. 다음 실행할 P2의 상태를 PCB2에서 불러온다
  3. CPU는 P2를 실행한다.
  4. 일정 시간이 지나 Timer Interrupt 또는 System call이 발생했다
    1. 현재 실행 중인 P2의 상태를 PCB2에 저장한다
    2. Ready Queue에서 다음 실행할 P1을 선택한다(CPU 스케줄링)
    3. 다음 실행할 P1의 상태를 PCB1에서 불러온다
  5. CPU는 P1을 이전에 중단한 지점부터 실행한다

위와 같은 과정으로 프로세스가 실행된다.

 

CPU 스케줄링

그렇다면 Ready Queue에서 다음 실행할 프로세스를 선택하는 과정인 CPU 스케줄링에 대해 자세히 알아보자.

❓ CPU 스케줄링

CPU 스케줄링이란, 운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업
이다. 프로세스의 우선 순위, 작업량 등을 고려하여 효율적으로 선택한다.

 

CPU스케줄링 기법

스케줄링 기법의 종류와 특징에 대해 간단하게 정리해보자.

FCFS(First-Come, First-Served) = FIFO 우선순위, 실행 시간 등 다른 요소는 고려하지 않고, 무조건 먼저 준비되는 것부터 실행시켜준다.
SJF(Shortest-Job-First) 실행 시간이 가장 짧은 작업을 먼저 실행시켜준다.
Priority 수행 시간, CPU 사용량 등에 대해 우선순위가 높은 것부터 실행시켜준다.
RR(Round-Robin) 일정 시간(Time Slice)를 정하여 해당 시간만큼 돌아가며 실행시킨다.
Multilevel Queue 시스템 프로세스, 인터렉티브 프로세스, 배치 프로세스로 그룹핑하여 여러 개의 큐를 사용해 큐의 우선순위에 따라 실행시킨다.

 

위와 같이 우선 순위, 실행 시간 등 여러가지 요소를 고려해서 스케줄링을 수행하게 된다.

 

Context Switching Overhead, 컨텍스트 스위칭 오버헤드

컨텍스트 스위칭 과정은 사용자로 하여금 빠른 반응성과 동시성을 제공한다. 하지만 실행되는 프로세스의 변경 과정 속에서, 프로세스의 상태(PCB), 레지스터 값 등이 저장되고 불러오는 작업이 수행되기 때문에 시스템에 많은 부담을 줄 수 있다.

위 컨텍스트 스위칭 과정을 보면 P1이 execute에서 idle이 될 때, P2가 바로 execute되지 않고 idle한 상태에 조금 있다가 execute 되는 걸 볼 수 있다. 이 간극이 바로 컨텍스트 스위칭 오버헤드이다.

 

프로세스의 컨텍스트 스위칭 오버헤드는 다음과 같은 행위에 의해 발생한다.

  • PCB 저장 및 복원 비용
  • CPU의 캐시 메모리 무효화에 대한 비용
  • 프로세스 스케줄링 비용

참고자료

 

Process Management

1. Process 란? 우리가 흔히 알고있는 프로그램은 해당 프로그램이 하드디스크에 존재할 때를 의미하고, 만약 그 프로그램이 실행되어 메인메모리로 올라오게 되면, 그 프로그램을 프로세스라고

gusdnd852.tistory.com