[운영체제] 프로세스 개요

byeol·2023년 3월 21일
0
post-thumbnail

오늘은 프로세스에 대해서 배웠다.

운영체제의 핵심 서비스는 커널이 담당하며
핵심 서비스는 프로세스 관리, 자원 접근 및 할당, 파일 시스템 관리가 있다고 배웠다.

이 핵심 서비스 중에서 프로세스 관리에 대해서 자세히 알아본다.

개발을 하면서 등장했던 모르는 단어들이
컴퓨터 과학을 공부하면서 그 단어의 의미가 명확해지고 있다.
기초가 중요한 이유를 깨닫는 요즘이다.

오늘도 🏃🏃🏃‍♂️🏃‍♂️🏃‍♂️🏃‍♀️🏃‍♀️

프로세스

프로세스
= 실행중인 프로그램
= 보조기억장치에 있던 보관중이던 프로그램이 메모리에 적재하여 실행중인 프로그램 ("프로세스를 생성한다"라고 표현한다.)

프로세스 직접 확인

내가 실행 중인 프로그램은 위와 같다.
보면 백그라운 프로세스라고 구분되어져 있는 곳을 보면 실제로 저걸 사용하고 있는지 사용자는 알지 못한다.

그래서

  • 사용자가 보는 앞에서 실행되는 프로세스를 "포그라운드 프로세스"
  • 사용자가 보지 못하는 뒷편에서 실행되는 프로스세를 "백그라운드 프로세스"라고 한다.
    • 백그라운드 프로세스 중에서 사용자와 상호작용하지 않고 묵묵히 자신의 일만 하는 프로세스가 있는데
      이를 유닉스 체계의 운영체제에서는 데몬(daemon)이라고 하며, 윈도우 운영체제에서는 서비스(service)라고 한다.

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

모든 프로세스는 CPU가 필요하다.
그러나 CPU는 한번에 하나의 프로세스만 실행할 수 있기 때문에 프로세스들은 돌아가며 CPU를 사용한다.

정해진 시간만큼 CPU를 사용하다가
➡️ 타이머 인터럽트 (클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트)가 발생
➡️ 자신의 정보를 PCB에 저장하여 백업하고
➡️ 자신의 차례를 양보한다.

여기서 PCB라는 용어가 등장한다.

PCB란
운영체제가 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고 프로세스에 CPU를 비롯한 자원을 배분할 때 이용하는 자료구조이다.

즉 PCB는 실행 중인 프로세스의 정보를 가지고 있는,
실행 중인 프로세스들을 구별할 수 있는,
옷의 태그와 같은 역할을 한다.

PCB는 커널영역에 저장되며
프로세스가 생성될 때 만들어지고 실행이 끝나면 폐기된다.

PCB에 담기는 정보

  • 프로세스 ID(PID;process ID)

    특정 프로세스를 식별하기 위해 부여하는 고유번호
    같은 일을 수행하는 프로그램이라도 두 번 실행하면 PID가 다르다.

  • 레지스터 값
    앞서 말했지만 타이머 인터럽트가 발생하면 실행중인 프로세스는 중단하고 중간 정보를 PCB에 백업한다고 했다. 또한 자신의 차례가 돌아오면 그 값을 PCB에서 가져와 복원한다.
    결국 PCB에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터의 값들이 담긴다.

  • 프로세스 상태
    현재 프로세스가 어떤 상태인지 기록되어져 있다.
    CPU를 사용하고 있는지, CPU를 사용하기를 기다리고 있는지 등의 상태가 기록된다.

  • CPU 스케줄링 정보
    프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보

  • 메모리 관리 정보
    프로세스마다 메모리에 할당된 주소가 다르다.
    따라서 PCB에는 어느 주소에 프로세스가 할당되어져 있는지에 대한 정보가 담긴다.
    앞에서 주소 지정방식에서 특정 레지스터를 이용한 주소지정방식을 배웠다. 그 때 한계 레지스터와 베이스 레지스터에 대해서 배웠다. 따라서 베이스 레지스터와 한계 레지스터 등 주소와 관련된 정보가 저장된다.

  • 사용한 파일과 입출력장치 목록
    어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 저장된다.

문맥 교환

프로세스 A가 운영체제로부터 CPU를 할당받아 사용하다가
타이머 인터럽트가 발생하여 다음 프로세스 B에게 CPU를 양보해야 한다면

프로세스 A에 대한 프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력 장치 등 지금까지의 중간 정보를 PCB에 백업해야 한다.

마찬가지로 프로세스 B는 PCB에 백업해놓았던 정보를 복원하여 실행한다.

위 흐름에서 등장하는
"프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력 장치 등 지금까지의 중간 정보"를 문맥(context)이라고 한다.

또한 위 흐름에서 등장하는
PCB의 정보를 백업하고 복원하는 작업을 문맥 교환(context switching)이라고 한다.

문맥 교환이 자주 일어나면 프로세스가 빨리 번갈아 수행되며 따라서 사용자의 눈에는 동시에 실행되는 것처럼 보인다.
하지만 문맥 교환이 너무 자주 일어나면 오버헤드가 발생될 수 있다.

프로세스의 메모리 영역✨

PCB는 커널 영역에 생성되고
프로세스는 사용자 영역에 생성된다.

그렇다면 프로세스는 어떻게 사용자 영역에 배치될까?

하나의 프로세스는 코드 영역, 데이터 영역, 힙 영역, 스택 영역에 나뉘어 저장된다.

  • 코드 영역 (또는 텍스트 영역)
    코드 영역에는 진짜 코드가 저장된다. 즉 기계어로 된 명령어가 저장된다.
    실행중일 때는 코드가 변경될 일이 없기 때문에 코드 영역의 크기는 변하지 않으며 CPU가 실행할 명령어가 담겨있기 때문에 오직 읽기만 가능하다.
  • 데이터 영역
    데이터 영역에는 프로그램이 실행되는 동안 바뀌지 않는 데이터가 저장된다. 대표적으로 전역변수가 저장된다.

따라서 위와 같이 코드영역과 데이터 영역은 '크기가 고정된 영역'이다.
이를 정적 할당 영역이라고 한다.

  • 힙 영역
    힙 영역은 프로그램을 만드는 사용자 즉 프로그래머가 직접 할당하는 영역이다. 따라서 프로그래밍 과정에서 할당받고 나서 언젠가는 꼭 영역을 반환해야 한다. 만약 반환하지 않으면 그 공간을 계속 낭비되고 있는 상태이며 이 상태를 메모리 누수라고 한다.
  • 스택 영역
    스택 영역은 데이터를 일시적으로 저장하는 공간으로 지역 변수나 매개 변수가 대표적이다. 함수의 실행이 끝나면 사라진다.

따라서 위와 같이 힙 영역과 스택 영역은 프로세스 실행 과정에서 그 크기가 변할 수 있는 영역이다. 이를 동적 할당 영역이라고 한다.
그래서 힙 영역은 낮은 주소에서 높은 주소로 할당되며
스택은 높은 주소에서 낮은 주소로 할당된다.

profile
꾸준하게 Ready, Set, Go!

0개의 댓글