[운영체제] 프로세스란?

진이진이·2022년 12월 13일
0

프로세스의 개념

: 일반적으로 프로세스란 실행 중인 프로그램으로 정의한다.

프로세스의 구성 요소를 이해하기 위해선 하드웨어 상태를 이해해야 한다.
프로세스의 하드웨어 상태 중 가장 중요한 구성 요소는 메모리(주소 공간(address space))라고 할 수 있다. 물론 레지스터도 중요하지만 지금은 프로세스 생성에 대해 자세히 적어보려고 한다.

프로그램에서 프로세스로

운영체제는 어떻게 프로그램을 준비하고 실행시킬까?

우선 프로그램과 프로세스의 차이점에 대해 설명하자면 프로그램 자체는 생명이 없다.
프로그램은 보조 기억장치(하드디스크, SSD)에 실행 파일 형식으로 존재하며 실행되기를 기다리는 코드와 정적인 데이터의 묶음이다.
프로그램을 메모리에 할당 즉, 프로세스의 메모리 영역인 주소공간에 탑재(load)하기 위해 운영체제는 디스크의 해당 바이트를 읽고 탑재시키면 비로소 프로세스라고 부를 수 있게 된다.

프로세스의 메모리 구조

  • Code 영역 : 기계어 명령 형태로 변환되어 저장되는 공간
  • Data 영역 : 프로그램이 사용하는 데이터를 저장하는 공간
  • Heap 영역 : 프로그래머가 필요할 때마다 사용하는 메모리 영역
  • Stack 영역 : 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터

코드와 정적 데이터가 메모리로 탑재된 후, 프로세스를 실행시키기 전에 운영체제가 해야 할 일이 몇 가지 있다.
일정량의 메모리가 프로그램의 스택으로 할당되어야 한다.
운영체제는 스택을 주어진 인자로 초기화하고, 힙(heap)을 위한 메모리 영역을 할당한다.
프로그램은 malloc()을 호출하여 필요한 공간을 요청하고 free()를 호출하여 사용했던 공간을 반환하여 다른 프로그램이 사용할 수 있도록 한다.
프로그램이 실행되면 malloc() 라이브러리API를 호출하여 메모리를 요청하고, 운영체제가 이를 충족하도록 메모리를 할당한다.
또한 입출력과 관계된 초기화 작업을 수행한다.
정리하자면, 코드와 정적 데이터를 메모리에 탑재하고, 스택과 힙을 생성, 초기화하며 입출력 셋업과 관계된 다른 작업을 마치게 되면 운영체제는 프로그램 실행을 위한 준비를 마치게 된다. 이후 운영체제는 CPU를 새로 생성된 프로세스에게 넘기게 되고 프로그램 실행이 시작된다.

CPU가 여러 개 존재한다는 생각을 어떻게 하는가?

  • 운영체제는 CPU를 가상화하여 이러한 환상을 만들어 낸다.
    하나의 CPU 즉 프로세서는 한 순간에 하나의 프로세스만 실행할 수 있지만 운영체제가 빠르게 CPU가 실행할 프로세스를 실행과 중단을 반복하며 교체하고 있기 때문에 동시에 여러개의 프로세스가 실행되고 있다고 느끼는 것이다.
    시분할(time sharing)이라고 불리는 이 기법은 원하는 수 만큼의 프로세스를 동시에 실행할 수 있게 하지만 각 프로세스의 성능은 낮아질 수 밖에 없다.
    시분할 시스템은 라운드 로빈 스케줄링이라고 불리는데 스케줄링은 아래서 설명하겠다.

프로세스 스케줄링

스케줄링(Schedulling)은 실행중인 모든 프로세스들에게 CPU 할당 순서 및 방법을 결정하는 일이다.

대부분의 OS에선 알고리즘을 우선 순위(Priority)와 라운드 로빈(Round Robin)을 혼합해서 스케줄링한다고 한다
  • 우선 순위 스케줄링
    : 각각의 프로세스마다 우선순위를 부여해서 우선순위가 높은 프로세스를 먼저 실행시킨은 방법
  • 라운드 로빈 스케줄링
    : 시분할 시스템을 위해 설계된 선점형 스케줄링의 하나로서, 타임퀀텀(Time Quantum) 또는 타임슬라이스(Time Slice)라고 불리는 실행의 최소 단위시간을 기준으로 CPU를 할당하는 방식

프로세스 상태 관리

운영체제는 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리하는 방법이 있는데 프로세스 상태를 실행(Running), 준비(Ready), 대기(Blocked)으로 분류하고 상태 전이(state transition)를 통해 체계적으로 관리한다.

  • 실행 (Running)
    : 실행 상태에서 프로세스는 프로세서에서 실행 중이다. 즉, 프로세스는 명령어를 실행하고 있다.
  • 준비 (Ready)
    : 준비 상태에서 프로세스는 실행할 준비가 되어 있지만 운영체제가
    다른 프로세스를 실행하고 있는 등의 이유로 대기 중이다.
  • 대기 (Blocked)
    : 프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시키는 연산이다.

사용자가 프로그램을 실행하면 프로세스가 생성되고 준비상태가 된다.
프로세스는 프로세서(CPU)가 사용가능한 상태가 되면 CPU를 할당 받는다.
이를 준비에서 실행으로 상태 전이(state transition) 된다고 하며, 이 과정을 디스패칭(dispatching)이라고 하고 디스패처(dispatcher)가 이 일을 수행한다.
만약 프로세스를 다시 사용하기 전에 입출력이 완료대기를 기다려야 한다면 완료될때 까지 자신을 대기(Blocked)한다.

프로세스의 구성

프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block)또는 프로세스 기술자(process descriptor)라고 부르는 자료구조에 저장된다.

  • PID
    운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호(PID, Process IDentification)

  • 프로세스 상태
    CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행중인 프로세스도 있고 대기 중인 프로세스도 있는데 그런 프로세스의 상태를 저장한다.

  • 프로그램 카운터(program counter, PC)
    프로그램의 어느 명령어가 실행 중인지를 알려준다. 프로그램 카운터는 명령어 포인터(instruction pointer, IP)라고도 불린다.

  • 스케줄링 우선순위
    프로세스 스케줄링에 작성했던 위의 내용과 일치한다.

  • 권한
    프로세스가 접근할 수 있는 자원을 결정하는 정보다.

  • 프로세스의 부모와 자식 프로세스
    다른 프로세스를 생성하는 프로세스를 부모 프로세스(Parent Process)라 하고, 다른 프로세스에 의해 생성된 프로세스를 자식 프로세스(Child Process)라 한다. 프로세스의 부모-자식 관계들은 트리 구조로 나타나게 된다.

  • 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터
    프로세스는 실행중인 프로그램이기 때문에 프로그램에 대한 정보를 가지고 있어야 한다. 프로그램에 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장된다. 이 공간에 대한 포인터 값을 가진다.

  • 프로세스에 할당된 자원들을 가리키는 포인터

  • 문맥 교환(Context Switch)
    CPU에서 한번에 하나의 프로세스만 실행시키며 여러 프로세스를 돌아가면서 작업을 처리하는 과정이다.
    위에 설명했던 시분할 방법과 일치한다.

profile
개발 어린이

0개의 댓글