CS/운영체제

프로세스?

Geisha 2025. 1. 11. 17:05

 

프로세스를 왜 알아야 할까?
프로세스는 단순히 프로그램이 실행 중이라는 상태를 넘어,
컴퓨터 시스템이 동작하는 기본 단위다.
우리가 작성하는 모든 코드는 결국 하나의 프로세스가 되며,
프로세스 간 자원 경쟁, 동기화, 통신 등 다양한 문제를 마주하게 된다.

그렇기에 개발자는 프로세스가 어떻게 생성되고, 관리되며, 종료되는지를 이해해야 한다.
이는 프로그램 최적화와 문제 해결에 직결되며,
특히 멀티태스킹 환경에서 효율적인 코드를 작성하는 데 필수적이다.

그렇기에 프로세스를 공부해야한다.

프로세스란?

정의

프로세스실행 중인 프로그램을 의미한다. 프로그램은 단순한 정적인 파일이지만, 실행되면 메모리와 CPU를 할당받아 활동을 시작하며 이를 프로세스라고 부른다. 예를 들어, 웹 브라우저나 음악 플레이어가 실행 중이라면 각각이 하나의 프로세스다.


프로세스의 종류

프로세스는 사용자와 직접 상호작용을 하느냐 마느냐에 따른 구분으로 포그라운드와 백그라운드로 나뉜다.

포그라운드 프로세스

 

  • 사용자가 직접 상호작용하는 프로세스.
  • 키보드, 마우스와 같은 입력 장치로 제어하며, 화면에 출력이 나타난다.
  • 예: 웹 브라우저, 문서 편집기, 게임.

 

백그라운드 프로세스

 

  • 사용자가 직접 상호작용하지 않아도 시스템에서 조용히 실행되는 프로세스.
  • 주로 보조 작업(데이터 동기화, 알림 수신 등)을 처리.
  • 예: 백업 프로그램, 클라우드 동기화 앱, 데몬, 서비스.

 

데몬? 서비스?

- 데몬(Daemon)과 서비스는 백그라운드에서 실행되며, 시스템 운영을 지원하는 프로세스다.

특정 작업(예: 네트워크 요청 처리, 로그 기록)을 수행하며, 사용자가 직접 실행하지 않아도 시스템이 자동으로 시작한다.

Unix/Linux에서는 Daemon, Window에서는 서비스로 칭한다.


 

프로그램은 파일이고 이게 실행되면 프로세스가 된다. 프로세스가 되기위해서는 프로그램을 메모리에 로드 해야하며 CPU를 할당 받아야한다. 하지만 앞선 운영체제 파트에서 말했듯 CPU를 접근하기위해서는 운영체제를 거쳐야 한다. 운영체제가 프로세스와 연관되어 어떠한 역할을 하는지 알아보자.

 

 

인터럽트

컴퓨터 시스템에서 한 프로세스가 실행 중이라고 가정하자. 예를 들어, 사용자가 음악 플레이어를 실행하여 음악을 듣고 있다면, 이 음악 플레이어는 프로세스로 CPU 시간을 받아 실행되고 있다.

 

그런데 이때 사용자가 키보드를 눌러 메일을 작성하려고 한다. 키보드 입력은 음악 플레이어와 직접적으로 관련이 없지만, 이 입력을 처리하기 위해 시스템은 즉각적으로 반응해야 한다. 바로 이 순간 인터럽트가 발생한다.

이러한 인터럽트를 운영체제가 관리하여 어떤 프로세스가 먼저 시행되어야 하는지 얼마만큼의 CPU사용시간을 할당할 것인지 어떤 순서로 프로세스가 CPU를 할당받을 것인지에 대한 결정과 같은 주요한 역할을 한다.

 

여기서 궁금한점이 발생한다. 중지되었던 프로세스 1이 다시 CPU를 할당받을때 어떻게 일처리가 되나? 라는 부분이다.

여기서 PCB가 필요해진다.

 


프로세스 제어 블록 (PCB)

PCB(Process Control Block)는 운영체제가 프로세스의 상태와 정보를 관리하기 위해 사용하는 데이터 구조

운영체제는 커널에서 작동하고 커널에는 여러 프로세스의 PCB들이 담겨있다. 

 

PCB에 담기는 주요 정보

 

  • 프로세스 상태: 현재 프로세스의 상태(실행 중, 대기 중, 준비 상태 등).
  • 프로세스 식별자 (PID): 프로세스를 구별하기 위한 고유 ID.
  • CPU 레지스터 정보: 프로세스가 실행 중인 동안 사용하던 CPU 레지스터 값(컨텍스트 스위칭 시 필요).
  • 메모리 관리 정보: 프로세스가 사용하는 메모리 주소 공간 정보.
  • 스케줄링 정보: 프로세스 우선순위 및 CPU 스케줄링에 필요한 정보.
  • I/O 상태 정보: 프로세스가 사용하는 입출력 장치와 관련된 정보.
  • 계정 정보: 프로세스 실행 시간, 소유자 정보 등.

운영체제는 이러한 PCB를 기반으로 하여 프로세스를 관리한다.

또한 이러한 PCB를 활용하여 Context switch 를 통해서 현재 실행 중인 프로세스의 상태를 저장하고, 새로 실행할 프로세스의 상태를 복원한다.

 


문맥교환 (Context switch)

문맥 교환은 CPU가 한 프로세스에서 다른 프로세스로 전환될 때 발생하는 과정을 말한다. 멀티태스킹 운영체제에서 여러 프로세스가 동시에 실행되는 것처럼 보이는 이유는 CPU가 문맥 교환을 통해 프로세스 간에 빠르게 전환하기 때문이다.

문맥 교환의 주요 과정

  1. 현재 프로세스 상태 저장
    • CPU는 실행 중인 프로세스의 상태(프로그램 카운터, 레지스터 값 등)를 **PCB(Process Control Block)**에 저장
    • 저장된 상태는 나중에 해당 프로세스를 재개할 때 필요
  2. 새로운 프로세스 선택
    • 운영체제의 스케줄러가 준비 상태(Ready Queue)에 있는 프로세스 중 하나를 선택
  3. 새로운 프로세스 상태 복원
    • 선택된 프로세스의 PCB를 읽어 CPU에 로드. 이를 통해 이전에 중단된 시점에서 작업을 이어서 실행가능.
  4. 새로운 프로세스 실행
    • CPU가 새로운 프로세스를 실행합니다.

 

위그림에서 빨간색 부분이 문맥 교환이 된다.


 

프로세스의 메모리 영역

 

코드(Code) 영역

  • 특징:
    • 프로그램의 실행 코드(CPU가 실행할 명령어)가 저장되는 영역.
    • 실행 파일로부터 메모리에 로드되며, 일반적으로 읽기 전용.
  • 역할:
    • 실행 중인 프로그램의 명령어를 저장하며, 이를 CPU가 실행한다.
    • 코드 영역은 수정되지 않기 때문에 공유될 수 있다(예: 다중 프로세스에서 동일한 프로그램을 실행할 경우).
  • 주요 내용:
    • 함수 정의, 제어 흐름을 위한 명령어 등.

데이터(Data) 영역

  • 특징:
    • 정적 할당 영역으로 불리며, 프로그램 실행 중 전역 변수정적 변수가 저장되는 공간.
    • 초기화된 데이터(int x = 5;)와 초기화되지 않은 데이터(int y;)로 구분.
  • 역할:
    • 전역 변수나 정적 변수는 프로그램의 실행 시작부터 종료 시점까지 메모리를 점유.
    • 프로그램 전체에서 접근 가능한 데이터를 유지한다.
  • 주요 내용:
    • 초기화된 전역 변수, 초기화되지 않은 전역 변수, 정적 변수 등.

동적 할당 영역(Heap)

  • 특징:
    • 동적으로 메모리를 할당받는 영역으로, 프로그램 실행 중에 필요에 따라 메모리를 요청하여 사용.
    • 메모리 할당과 해제는 프로그래머의 책임이며, 적절히 해제하지 않으면 메모리 누수가 발생할 수 있다.
  • 역할:
    • 객체, 동적으로 생성된 배열 등 런타임에 크기를 알 수 없는 데이터의 저장 공간으로 사용된다.
    • 유연한 메모리 사용을 가능케 한다.
  • 메모리 누수 문제:
    • 동적으로 할당한 메모리를 해제하지 않으면 메모리 공간이 반환되지 않아 프로그램의 성능 저하 및 시스템 리소스 부족을 초래.
  • 주요 내용:
    • malloc, new 등을 사용해 할당한 메모리, 동적으로 생성된 데이터.

스택(Stack) 영역

  • 특징:
    • 함수 호출 시 자동으로 할당되고 함수가 종료되면 자동으로 해제되는 메모리 공간.
    • LIFO(Last In, First Out) 방식으로 동작하며, 매개변수지역 변수를 저장.
  • 역할:
    • 함수 호출과 반환을 관리하며, 함수의 호출 정보를 기록한다(예: 반환 주소, 매개변수, 지역 변수).
    • 재귀 함수 호출 시 스택 사용량이 증가하며, 과도한 호출은 스택 오버플로우를 초래할 수 있다.
  • 주요 내용:
    • 함수 호출 시의 매개변수, 지역 변수, 함수의 반환 주소 등.

스택 오버플로우?

- 스 택 영역이 초과 사용되어 더 이상 데이터를 저장할 수 없는 상태


각 영역 간 관계

  1. 코드 영역은 고정된 크기와 읽기 전용 특성을 가진다.
  2. 데이터 영역은 프로그램의 전역 데이터를 실행 기간 동안 유지한다.
  3. 은 프로그램 실행 중에 크기가 가변적이며, 동적 메모리 할당을 통해 필요한 만큼 사용된다.
  4. 스택은 함수 호출 및 반환 시 필요한 임시 데이터를 저장하는 데 사용되며, 공간이 제한되어 있다.

프로세스 상태

프로세스는 실행 중 다양한 상태를 가지며, 이는 운영체제가 프로세스를 관리하고 스케줄링하는 데 중요한 역할을 합니다. 주요 상태는 다음과 같다.

  1. 생성 상태 (New)
    프로세스가 생성되고 운영체제에 의해 초기화되는 단계입니다. 아직 실행 준비가 되지 않았으며, 자원이 할당되기를 기다립니다.
  2. 준비 상태 (Ready)
    프로세스가 실행되기 위해 필요한 자원이 할당되었으며, CPU 스케줄러에 의해 선택되기를 기다리는 상태입니다.
  3. 실행 상태 (Running)
    프로세스가 실제로 CPU를 점유하고 실행 중인 상태입니다. 한 번에 하나의 프로세스만 실행 상태를 가질 수 있습니다(CPU 코어가 하나인 경우).
  4. 대기 상태 (Waiting)
    프로세스가 특정 이벤트(예: I/O 작업 완료)를 기다리는 상태입니다. 이 상태에서는 CPU를 사용하지 않습니다.
  5. 종료 상태 (Terminated)
    프로세스의 실행이 완료되거나 강제로 종료된 상태입니다. 운영체제는 프로세스의 자원을 회수하고 프로세스를 시스템에서 제거합니다.

디스패치?

- 운영체제에서 준비 상태(Ready)에 있는 프로세스 중 하나를 선택하여 실행 상태(Running)로 전환시키는 과정

 


프로세스 계층구조

프로세스는 실행 도중 시스템 호출(System Call)을 통해 다른 프로세스를 생성할 수 있습니다. 이를 통해 프로세스는 부모-자식 관계를 가지며, 계층적인 구조를 형성합니다.

 

  • 부모 프로세스
    새로운 프로세스를 생성한 주체로, 자식 프로세스의 생성과 관리에 관여합니다.
  • 자식 프로세스
    부모 프로세스에 의해 생성된 프로세스로, 독립적인 PID(Process ID)를 가집니다. 자식 프로세스는 부모 프로세스와 자원을 공유하거나, 완전히 독립적으로 동작할 수 있습니다.

프로세스 생성 기법

복제와 옷 갈아입기

운영체제에서 부모 프로세스가 자식 프로세스를 생성하는 방식은 "복제와 옷 갈아입기"라는 개념으로 설명됩니다. 이는 다음 두 단계로 이루어집니다.

 

  • 복제 (Fork)
    부모 프로세스의 메모리와 상태를 그대로 복사하여 자식 프로세스를 생성합니다. 이 단계에서 부모와 자식은 동일한 코드를 실행하며, 독립적인 PID를 갖게 됩니다.
  • 옷 갈아입기 (Exec)
    복제된 자식 프로세스는 새로운 프로그램으로 자신의 코드를 변경합니다. 이를 통해 자식 프로세스는 부모와는 다른 동작을 수행할 수 있습니다.

Fork와 Exec?

- UNIX 계열 운영체제에서 새로운 프로세스를 생성하고 실행하는 데 사용되는 중요한 시스템 호출. 이 둘은 각각 프로세스 복제새로운 프로그램 실행을 담당하며, 운영체제에서 프로세스의 생명 주기를 관리하는 기본 메커니즘을 제공