운영체제 - Process Abstraction

eucartio·2024년 4월 12일

운영체제

목록 보기
5/19

CPU Virtualization

하나의 CPU를 여러 개인 것처럼 사용하는 것이다. OS를 통해서 진행되는 CPU Virtualization은 Time Sharing 기법을 통해 가능하다. 이것을 통해 하나의 CPU로 동시에 여러 개의 프로세스를 실행할 수 있다. 이는 한 프로세스를 실행한 다음 이를 중지하고 다른 프로세스를 실행하는 Round-Robin 방식으로 진행된다.

그림 우측에 나타난 Context Switch는 한 프로세스가 중지되었을 때의 모든 정보를 저장하는 것이 이다. Context는 저장되고 복구되는 레지스터 정보를 의미한다. 이것을 통해 이후에도 그 프로세스가 문제없이 재개될 수 있는 것이다. 그리고 한 프로세스가 중지되었을 때, 프로세스 간의 우선 순위에 따라 다음 수행될 프로세스가 정해진다. 이것을 결정하는 것이 우측 하단의 Scheduling Policies이다.

Process

프로세스는 수행 중인 프로그램을 의미한다. 즉, 현재 메모리 내에 존재하여 실행 가능한 프로그램이 프로세스인 것이다. 그렇지 못하고 디스크에 존재하여 실행이 불가능하면 프로세스가 아닌 프로그램이다. 프로세스는 또한 프로그램과 달리 시간에 따라 다른 상태(Ready/Running/Blocked)를 가진다.

Process Creation

  • 프로그램 코드를 메모리, 프로세스의 주소 공간에 로드한다. (Fetch)
    • 프로그램은 처음에 실행 가능한 형태로 디스크에 존재한다.
    • OS가 Load 프로세스를 느리게 수행한다. (미리 올리면 메모리 낭비)
      ⠀⠀
  • 프로그램의 실행 시간 스택이 할당된다. (Allocation)
    • 지역 변수, 함수 매개변수 및 반환 주소 등에 스택을 사용한다.
      ⠀⠀
  • 프로그램의 힙이 생성된다. (Allocation)
    • 명시적으로 요청됨과 동시에 동적으로 할당된 데이터에 사용된다.
    • 프로그램은 malloc()을 호출하여 해당 공간을 요청하고 free()를 호출하여 공간을 비운다.
      ⠀⠀
  • OS는 다른 초기화 작업을 수행한다.
    • 입출력 설정
      • 기본적으로 각 프로세스에는 세 개의 Open File Descriptor가 있다.
      • Standard Input, Output and Error
        ⠀⠀
  • 진입점, 즉 main()에서 실행 중인 프로그램을 시작한다.
    • OS는 새로 생성된 프로세스에 CPU 제어권을 넘긴다.

Process States

3-State Model

3-State Model에서 프로세스의 상태는 리소스CPU에 대한 권한을 기준으로 구분된다.

Running
리소스도 존재하고 CPU에 대한 권한도 가지고 있는 상태이다. 프로세서에서 실행 중인 프로세스라고 할 수 있다. 그림에서 알 수 있듯이 Descheduled(CPU 권한 빼앗김)되면 Ready 상태로, 입출력 작업이 시작되면 Blocked 상태로 변한다. Running 상태에서 Ready 상태로 바뀌는 것, 현재 수행 중인 프로세스를 멈추는 것Preemption이라고 표현한다.

Ready
프로세스가 실행될 준비, 즉 리소스는 있지만 OS에 의해 CPU에 대한 권한을 받지 못한 상태이다. Queue 형태로 이루어져 일종의 Running 상태의 대기열이라고 볼 수 있다. 만약 Scheduled(CPU 권한 생김)되면 Running 상태가 되어 실행 가능해진다.

Blocked (Wait)
마지막으로 리소스와 CPU에 대한 권한이 모두 주어지지 않은 상태이다. 입출력 작업 명령이 들어오면 리소스의 변경 가능성이 존재하므로 Blocked 상태가 된다. 입출력 작업이 완료되면 리소스가 준비되지만, 여전히 CPU에 대한 권한은 존재하지 않기 때문에 Ready 상태가 된다.

5-State Model

3-State Model에서 NewExit 두 가지 상태가 추가된 것이다. 이것은 메모리 내 존재 여부로 구분된다.

New (Creation)
Blocked와 마찬가지로 리소스와 CPU에 대한 권한 모두 없는 상태이다. 차이점은 PCB(Process Control Block)는 할당되었으나, 메모리에 올라오지 않은 프로세스라는 것이다. Admit 과정을 통해 그림과 같이 Ready 상태의 Queue로 이동한다. Unix 시스템의 fork()를 통해 새 프로세스를 만들어서 확인할 수 있다.

Exit (Terminated)
역시 Blocked와 마찬가지로 리소스와 CPU에 대한 권한 모두 없는 상태이지만 New와 반대로 실행이 완료되어 더이상 메모리에 남아있을 필요가 없어 Release되는 프로세스이다.

7-State Model

앞의 두 모델은 프로세스의 상황에 따라 상태가 결정되었다. 하지만 7-State Model에서는 메모리의 용량까지 고려하여 프로세스의 상태가 결정된다. 메모리에 빈 공간이 없는 상황을 대비하여 프로세스를 디스크(Swap Space)에 잠깐 옮겨두는 Suspend 상태가 두 개 추가되었다. 이때 디스크로 옮겨지는 것Swapping이라고 표현한다. (디스크에서 나갈 때는 Swap Out, 들어올 때는 Swap In) Swapping 과정 역시 입출력 작업이다. 따라서 Swapping 과정이 잦으면 성능에 영향을 미칠 수 있다.

Blocked/Suspend
메모리가 가득 찼다면 가장 먼저 디스크(Swap Space)로 보내는 것은 우선 순위가 낮은 Blocked(Wait) 상태의 프로세스이다. 그리고 오직 Blocked(Wait) 상태의 프로세스만이 Blocked/Suspend 상태로 바뀔 수 있다. Blocked/Suspend 상태의 프로세스는 디스크 내에서도 리소스가 확보된다면(입출력 작업이 완료된다면) 바로 Ready/Suspend 상태로 바뀔 수 있다. 또는 그 이전에 메모리에 일정 공간이 확보된다면 Activate 과정을 통해 다시 Blocked 상태로 바뀔 수도 있다.

Ready/Suspend
New 상태를 통해 프로세스가 Admit 되어야 하는 상황이다. 하지만 이번에는 Blocked 상태의 프로세스들을 전부 디스크로 옮겨도 필요한 프로세스가 Ready Queue에 올라올 수 없는 상황이다. 이런 상황에는 Ready Queue에서 낮은 우선 순위의 프로세스를 디스크로 보낸다. 물론 새로 들어오는 프로세스가 낮은 우선순위를 가진다면 바로 디스크로 Admit 될 수도 있다. 이후에 메모리 공간에 여유가 생긴다면 우선 순위가 높은 순서대로 프로세스가 메모리로 옮겨지고, Activate 되어 Ready 상태가 된다.

Exceptional States

Terminated State

프로그램이 완료되었거나 중단되었을 때의 상태이다. 이는 프로세스가 더 이상 실행되지 않고, 시스템 리소스가 해제되며 모든 Queue에서 사라졌음을 의미한다. 또한 PCB 역시 제거된다.

Zombie State

fork()로 생성된 Child 프로세스가 Parent 프로세스보다 먼저 종료되어 Parent 프로세스가 Child 프로세스의 최소한의 정보(PID 등)를 가지고 있는 상태이다.

Orphan State

반대로 fork()로 생성된 Child 프로세스가 남아있지만, 그것을 생성한 Parent 프로세스는 종료되었을 때의 상태이다.

PCB: Data Structure

PCB(Process Control Block)는 프로세스의 주민등록증이라고 생각하면 쉽다. PID, State, PC, 레지스터 등 프로세스의 여러 정보가 저장되어 있다. 그리고 PCB는 프로세스 별로 하나씩 생성되고 관리된다. 그림에서는 n개의 PCB가 있으므로 n개의 프로세스가 메모리에 올라와 있는 것이다. 이때, 메모리 중에서도 OS가 올라와 있는 위치 즉, 커널에 올라오게 된다. 참고로 OS는 Virtual Memory의 여러 위치(Stack, Heap, Data, Code 등)중에서도 크기가 동적으로 변할 수 있는 Stack에 존재한다.

레지스터와 Program Counter를 합쳐서 레지스터 정보, Context라고 표현한다. PCB는 CPU에서 Interrupt가 발생했을 때 레지스터 정보(Context)를 기억해두는 역할을 한다. Program Counter에는 다음 수행할 명령어의 메모리 주소가 저장되어 있고, 레지스터에는 다음 수행할 명령에 필요한 데이터가 저장되어 있어서 문제 없이 명령을 재개할 수 있다.

0개의 댓글