2025-09-17 23:53

Tags: 소프트웨어 공학

프로세스

  • 실행 중인 프로그램으로, 운영체제에서 작업의 기본 단위다.

  • 프로세스는 독립된 메모리 공간(코드, 데이터, , 스택)을 가지며, 그 상태는 PCB(프로세스 제어 블록)를 통해 관리된다.

  • 운영체제는 문맥 교환을 통해 여러 프로세스를 빠르게 번갈아 실행하며 다중 작업을 구현한다.

  • CPU가 일하다가 한 프로그램에서 대기 상태 그동안 다른걸로 전환해서 작업 (멀티태스킹)

    • 이때 각 프로그램이 어디까지 실행되었는지, 어떤 메모리를 사용하고 있는지, 어떤 파일을 열고 있는지 등
      • 모든 상태 정보를 독립적으로 추적하고 관리할 수 있는 새로운 단위가 필요
      • 각 프로그램을 독립적인 프로세스로 만들어 관리하기 시작.
    • 여러 개의 프로세스가 짧은 시간 간격으로 번갈아 가며 CPU를 점유하는 ‘시분할 시스템(Time-sharing System)‘이 가능해졌고,
      • 사용자는 마치 여러 프로그램이 동시에 실행되는 것처럼 느끼게 되었다.
  • 프로그램(Program): 레시피

    • 특정 작업을 수행하기 위해 작성된 코드의 묶음.
    • 하드 디스크나 SSD에 저장된, 실행 가능한 파일 상태다.
    • 그 자체로는 생명이 없는 정적인 코드 덩어리다.
  • 프로세스(Process): 요리

    • 프로그램이 실행되어 메모리에 올라온 동적인 상태.
    • 즉, ‘실행 중인 프로그램’이다.
    • 프로세스는 자신만의 메모리 공간, 자원, 그리고 실행 상태를 가진다.

프로세스의 구조: 메모리 들여다보기

  • 프로세스가 생성되면 운영체제는 해당 프로세스만을 위한 독립적인 메모리 공간을 할당한다.
  1. 코드(Code) 또는 텍스트(Text) 영역
    • 실행할 프로그램의 기계어 코드가 저장되는 공간이다
    • 이 영역은 읽기 전용(Read-Only)으로 설정되어, 프로세스가 실행 중에 자신의 코드를 수정하는 것을 방지한다.
    • 여러 프로세스가 같은 프로그램을 실행할 경우, 이 코드 영역은 메모리에서 공유될 수 있다.
  2. 데이터(Data) 영역
    • 프로그램의 전역 변수(Global variables)와 정적 변수(Static variables)가 저장되는 공간이다.
    • 이 변수들은 프로그램이 시작될 때 할당되어 프로그램이 종료될 때까지 유지된다.
    • 초기화된 데이터는 BSS(Block Started by Symbol) 세그먼트와 구분되어 관리되기도 한다.
  3. 힙] 영역
    • 프로그래머가 직접 관리하는 메모리 공간으로, 동적 메모리 할당이 일어나는 곳이다.
    • C언어의 malloc()이나 C++의 new 연산자가 바로 이 힙 영역에 메모리를 할당한다.
    • 힙은 메모리의 낮은 주소에서 높은 주소 방향으로 자란다.
    • 사용이 끝난 메모리는 프로그래머가 명시적으로 해제해야 하며(예: free(), delete), 그렇지 않으면 메모리 누수(Memory Leak)가 발생할 수 있다.
  4. 스택] 영역
    • 함수의 호출과 관련된 정보가 저장되는 공간이다.
    • 함수의 매개변수, 지역 변수, 리턴 주소 등이 여기에 저장된다.
    • 함수가 호출되면 스택에 하나의 프레임(Stack Frame)이 쌓이고, 함수 실행이 끝나면 해당 프레임은 스택에서 제거된다.
    • 스택은 메모리의 높은 주소에서 낮은 주소 방향으로 자라며, 컴파일러에 의해 자동으로 관리된다.
    • 힙과 스택 영역이 서로를 침범하면 오버플로우가 발생한다.

프로세스의 생애 주기: 태어나고, 일하고, 잠들고, 사라지다

  • 생성(New):
    • 프로세스가 막 생성된 상태.
    • 운영체제가 해당 프로세스를 위한 각종 자료구조(예: PCB)를 만들고 있지만, 아직 메모리에 완전히 올라오지는 않았다.
  • 준비(Ready):
    • 프로세스가 메모리에 적재되어 CPU를 할당받기를 기다리는 상태.
    • CPU만 있으면 언제든 실행될 수 있는 상태의 프로세스들이 준비 큐(Ready Queue)에서 대기한다.
  • 실행(Running):
    • 프로세스가 CPU를 할당받아 명령어를 실제로 실행하고 있는 상태.
    • 시스템에는 CPU 코어의 수만큼만 실행 상태의 프로세스가 존재할 수 있다.
  • 대기(Waiting 또는 Blocked):
    • 프로세스가 실행 도중 입출력(I/O) 작업이나 특정 이벤트(예: 파일 읽기 완료, 다른 프로세스의 응답)를 기다려야 할 때 들어가는 상태.
    • 이 상태의 프로세스는 CPU를 할당해 줘도 당장 작업을 수행할 수 없다.
  • 종료(Terminated):
    • 프로세스가 실행을 완료하고 메모리에서 정리되는 상태.
    • 운영체제는 해당 프로세스가 사용하던 모든 자원을 회수한다.
구분프로세스 (Process)스레드 (Thread)
정의실행 중인 프로그램, 자원 할당의 단위프로세스 내의 실행 흐름, CPU 할당의 단위
메모리 구조독립적인 메모리 공간 (코드, 데이터, 힙, 스택)스택 영역을 제외한 코드, 데이터, 힙 영역을 같은 프로세스 내 다른 스레드와 공유
자원 공유원칙적으로 공유하지 않음 (IPC를 통해 통신)같은 프로세스 내 자원을 쉽게 공유 가능
생성/전환 비용생성 및 문맥 교환 비용이 크다.생성 및 문맥 교환 비용이 작다.
안정성한 프로세스의 오류가 다른 프로세스에 영향을 주지 않음.한 스레드의 오류(예: 메모리 침범)가 전체 프로세스에 영향을 미쳐 종료될 수 있음.