컴퓨터/운영체제

[운영체제] 프로세스 관리

sidedoor 2024. 1. 14. 00:03

Program& Process

  • 프로그램 (Program) - Passive Entity
    프로그램은 디스크나 다른 저장 매체에 저장된 명령어와 데이터의 집합으로 실행되기 전의 코드와 데이터를 포함한 정적인 상태이다.
    프로그램 자체는 단순히 코드와 데이터의 모음으로, 자체적으로는 아무런 동작을 수행하지 않는다.
    이러한 이유 때문에 프로그램을 passiv entity라고 한다.
    예를 들어, 워드 프로세서 프로그램이 컴퓨터에 설치되어 있지만, 사용자가 그것을 실행하지 않는 동안은 단순히 디스크에 저장된 파일이다.

  • 프로세스 (Process) - Active Entity
    프로세스는 실행 중인 프로그램입니다. 운영 체제가 프로그램을 메모리에 로드하고 실행할 때, 프로세스가 생성된다.
    프로세스는 메모리 주소 공간, 실행 중인 코드, 오픈된 파일들, 변수, 상태 정보 등을 포함하며, 실제로 CPU 시간을 소모하고 작업을 수행하는 동적인 존재이다.
    이러한 동적인 특성들 때문에 프로세스가 active entity라고 불린다.

프로세스 변환

프로그램은 내부적으로 process로 변환된다

 

만약 소수를 출력하는 C 프로그램인 prime.c 프로그램을 만들었다고 가정하고 변환 과정을 살펴보면 다음과 같다.

 

1. 컴파일러를 통한 컴파일: 먼저 프로그램인 prime.c가 GCC와 같은 컴파일러를 통해 컴파일된다.

컴파일러는 소스 코드를 기계어로 번역하는 작업을 수행한다.

 

2. 실행 파일 생성: 컴파일 과정을 통해 생성된 기계어 코드는 .out 형식의 실행 가능한 파일로 변환된다.

이 파일은 컴퓨터가 이해하고 실행할 수 있는 이진 형식으로 구성되어있다.

 

3. 프로세스 생성: 사용자가 이 실행 파일을 실행하면, 운영 체제는 이 파일을 메모리로 로드하고, 프로세스를 생성한다.

이때, 운영 체제는 프로세스에 필요한 메모리 공간을 할당하고, 실행에 필요한 다른 리소스를 준비한다.

 

프로세스의 메모리 구조에서 각 섹션의 배치는 일반적으로 다음과 같이 구성된다.

가장 먼저 실행 가능한 파일(.out)이 프로세스의 메모리 주소 공간의 맨 아래에 위치한다.

이 영역에는 실행 파일의 코드섹션과 데이터 섹션이 포함된다.

여기서 코드 섹션에는 기계어 코드가, 데이터 섹션에는 초기화된 정적 변수가 저장된다.

 

그 다음으로 정적 및 전역 변수(Static & Global Variables)가 오는데 이는 일반적으로 실행 파일의 데이터 섹션에 저장된다.

이 변수들은 프로그램의 실행이 시작될 때 할당되며, 프로그램이 종료될 때 해제된다.

그 위로 힙(Heap)이 오는데 힙 영역은 동적으로 할당된 데이터를 저장하기 위한 메모리 영역이다.

힙은 메모리 주소 공간에서 정적/전역 변수 영역 위에 위치하며, 필요에 따라 크기가 동적으로 조정된다.

마지막으로 스택 (Stack)영역은 함수 호출과 관련된 지역 변수, 매개 변수, 반환 주소 등을 저장한다. 

스택은 LIFO(Last In, First Out)방식으로 작동하며, 함수 호출이 발생할 때마다 데이터가 스택에 푸시되고, 함수가 반환될 때 데이터가 Pop된다.

 

4. 프로세스 실행: 프로세스가 생성되면, CPU는 실행 파일의 기계어 명령을 수행한다.

프로그램이 실행되는 동안 운영 체제는 프로세스가 필요로 하는 메모리나 I/O와 같은 다양한 자원을 관리한다.

Process의 속성

  1. 프로세스 ID (Process ID)
    각 프로세스를 고유하게 식별하는 번호로운영 체제는 이 ID를 사용하여 프로세스를 구별한다.

  2. 프로그램 카운터 (Program Counter)
    프로세스가 다음에 실행할 명령어의 주소를 가리키는 레지스터이다.
    프로그램 카운터는 프로세스의 현재 실행 상태를 나타낸다.
    그래서 만약 중간에 작업이 멈췄다가 다시 실행될 경우 작업을 처음부터 실행하는 것이 아니라 이미 실행 된 부분 다음부터 프로그램을 다시 실행하게 한다.
  3. 프로세스 상태 (Process State)
    프로세스의 현재 상태를 나타내는 것으로 실행 중(Running), 준비(Ready), 대기(Waiting) 등의 다양한 상태가 있을 수 있다.

    • New (Secondary Memory)
      프로세스가 생성되려고 하는 초기 상태로 이 상태에서 프로세스는 메모리에 로드되기를 기다린다.

    • Ready (Main Memory, RAM)
      프로세스가 CPU에 의해 실행되기 위해 준비되는 상태로 프로세스가 실행을 위해 CPU time을 기다린다.

    • Run (Main Memory)
      프로세스가 CPU에서 실제로 실행되고 있는 상태이다.

    • Block or Wait (Main Memory)
      프로세스가 I/O 작업이나 다른 이벤트를 기다리는 동안 혹은 우선순위가 높은 다른 프로세스 때문에 일시적으로 중지된 상태이다.

    • Termination or Completion
      프로세스가 작업을 완료하고 종료되는 상태이다.

    • Suspend Ready (Secondary Memory)
      메인 메모리의 자원 부족 등의 이유로 실행 준비는 되었지만, 현재 실행할 수 없는 상태의 프로세스가 보조 메모리(Secondary Memory)로 이동하는 상태이다.

    • Suspend Wait or Suspend Block (Secondary Memory)
      Block 또는 Wait 상태의 프로세스가 보조 메모리로 이동하는 상태이다.
      이 상태는 메인 메모리에 자리가 없거나, 우선순위가 더 높은 다른 프로세스로 인해 발생할 수 있습니다.
      
  4. 우선순위 (Priority)
    프로세스 스케줄링에 사용되는 우선순위로 프로세스가 CPU 시간을 얼마나 자주 및 얼마나 오래 사용할 수 있는지를 결정한다.

  5. 범용 레지스터 (General Purpose Registers)
    프로세스의 실행 중에 사용되는 데이터를 저장하는 레지스터로 프로세스의 현재 작업 상태를 나타낸다.

  6. 열린 장치 목록 (List of Open Devices)
    프로세스가 현재 사용하고 있는 입출력 장치의 목록으로 파일, 네트워크 연결, 기타 입출력 장치 등과 같이 많은 하드웨어들이 해당한다.

  7. 보호 (Protection)
    프로세스의 메모리와 자원 접근을 보호하는 메커니즘으로 프로세스마다 각자 고유한 공간이 있고 다른 프로세스나 시스템 자원에 대한 무단 접근을 방지한다.

 

State Transition Diagram

Operation on process

  1. 생성 (Creation)
    프로세스 Creation은 어플리케이션이 실행될 때 발생하는 것으로 사용자가 프로그램을 실행하거나, 운영 체제가 시스템 작업을 위해 프로세스를 생성할 때 이 작업이 이루어진다.
    프로세스 생성 과정에서는 프로세스 제어 블록(Process Control Block, PCB)이 생성되며, 이는 프로세스의 상태, 프로그램 카운터, CPU 레지스터, 메모리 관리 정보 등 중요 정보를 담고 있다.

  2. 스케줄링 (Scheduling)
    CPU 스케줄링은 Ready 상태에 있는 프로세스들 중 어느 하나를 선택하여 CPU에 할당하는 과정이다.
    이 작업은 단기 스케줄러(Short-Term Scheduler)에 의해 수행되며, FIFO, Round-Robin, Priority Scheduling 등 다양한 스케줄링 알고리즘이 사용될 수 있다.

  3. 실행 (Executing)
    프로세스가 CPU를 할당받으면 해당 프로세스의 명령어가 실행되고, 프로세스는 Run 상태에 있게 된다.
    실행 과정에서 프로세스는 CPU 시간을 사용하여 프로그램 코드를 처리하고, 필요한 작업을 수행한다.

  4. 종료/삭제 (Killing/Delete)
    프로세스가 작업을 완료하면, 종료되고, 이 과정에서 프로세스의 PCB와 할당받았던 모든 자원은 해제되고, 메모리는 다음 작업을 위해 확보된다.
    프로세스 종료는 정상적으로 작업을 마친 후에 발생할 수도 있고, 운영 체제에 의해 강제로 종료될 수도 있다.

Scheduler

- Long-Term Scheduler

New 에서 Ready로 연결되는 Schedulerlong-term scheduler라고 한다.

Long term에서는 multi-programming의 Degree of multiprogramming을 결정하는데 이는 ready상태에 동시에 있을 수 있는 process의 수를 의미한다.

long-term scheduler는 프로세스의 입장과 출구를 관리하여 시스템의 성능 및 자원 활용을 최적화한다.

 

- Short-Term Scheduler

Ready 상태의 프로세스 중 어느 하나를 Run 상태로 전환할지 결정하는 것을 short-term scheduler라고 한다.

CPU의 알고리즘에 의해서 결정이 되는데 만약 CPU가 FIFO을 택한다면 가장 먼저 입력된 process가 먼저 출력된다.

이는 Context switching이라고도 불리는데 Context switching은 CPU가 현재 실행 중인 프로세스를 다른 프로세스로 변경하는 과정을 뜻한다.

 

- Medium-Term Scheduler

Medium term schedular는 어떤 process가 메인 메모리에서 실행될지 보조 메모리에서 실행될지 메인 메모리와 보조 메모리 간의 스왑(swap)을 결정한다.

이는 시스템의 전반적인 성능과 메모리 사용의 균형을 맞추기 위해 수행된다.

또한 메인 메모리를 효율적으로 관리하기 위해 프로세스를 일시적으로 보조 메모리로 이동시켜 Suspend 상태로 만드는 것을 포함한다.