프로세스의 구조와 상태

Dev.Dana·2024년 10월 23일

Operating System

목록 보기
1/11
post-thumbnail

프로세스란?

프로세스는 컴퓨터에서 실행되고 있는 프로그램을 의미하며 CPU 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다.

프로그램 자체는 디스크에 저장된 실행 파일이지만 이 프로그램이 메모리에 로드되어서 실제로 실행되는 순간부터 프로세스라고 부른다.

프로그램이 실행되어 메모리에 올라가면 프로세스가 인스턴스화되며, 운영체제의 CPU스케줄러가 이 프로세스를 관리하고 CPU를 할당하여 실행한다.

프로세스의 5가지 상태

1. New (생성 상태)

  • 프로세스가 생성되고 있는 상태
  • 아직 실행이 시작되지 않은 단계 운영체제는 프로세스의 메모리 할당과 준비 작업을 수행한다.

2. Ready (준비 상태)

  • 프로세스가 실행될 준비가 완료된 상태
  • CPU 할당을 기다리고 있으며, 이때 메모리와 필요한 자원은 할당되어 있지만, CPU는 할당되지 않은 상태이다.

3. Running (실행 상태)

  • 프로세스가 CPU를 할당받아 실제로 실행되고 있는 상태
  • 이 상태에서 프로세스는 명령어를 처리하며 작업을 수행한다.

4. Blocked (대기 상태)

  • 프로세스가 특정 사건(ex. 입출력 작업, 자원 할당 등)을 기다리는 상태
  • 이 상태에서는 CPU를 사용하지 않고, 필요한 자원이 준비되면 다시 준비 상태로 전환된다.

5. Terminated (종료 상태)

  • 프로세스가 작업을 완료하고 종료된 상태
  • 이 상태에서는 프로세스가 사용하던 모든 자원이 운영체제에 의해 회수되고, 메모리에서 제거된다.

프로세스의 메모리 구조

프로세스가 실행되려면 먼저 메모리에 로드되어야 한다. 운영체제는 프로그램 실행을 위해 여러 메모리 공간을 제공하고, 각 공간은 프로그램이 제대로 동작하도록 도와준다.

메모리 공간은 크게 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack) 이렇게 4가지로 나뉜다.

▶ 코드(Code) 영역

  • 작성한 소스 코드가 기계어 형태로 저장되는 영역
  • 이 영역은 프로그램의 명령어들이 저장되어 수정이 불가능한 읽기 전용이다.
  • 함수, 제어문, 상수 등 프로그램 실행에 필요한 명령어들이 포함되며, CPU는 이 코드 영역에서 명령어를 가져와 실행한다.

▶ 데이터(Data) 영역

  • 전역 변수정적 변수(static)가 저장되는 영역
  • 프로그램이 시작될 때 할당되고, 프로그램이 종료될 때 메모리세어 소멸된다.
  • BSS 영역 : 초기화되지 않은 전역 변수와 정적 변수가 저장되며, 자동으로 0으로 초기화된다.
  • Data 영역 : 초기화된 전역 변수와 정적 변수가 저장되며, 0이 아닌 값으로 초기화된 변수들이 여기에 할당된다.

▶ 힙(Heap) 영역

  • 동적 메모리 할당을 위한 영역
  • 프로그램이 실행 중일 때 사용자가 필요에 따라 메모리를 할당하고, 사용이 끝나면 메모리를 해제해야한다.
  • 동적 할당은 new와 같은 함수를 통해 이루어지며, 사용이 끝나면 반드시 메모리를 해제해야 한다. (Java에서는 가비지 컬렉터가 자동으로 메모리 해제를 수행)
  • 참조형 데이터(객체, 배열 등)이 저장된다. 이 힙 영역의 크기는 런타임 동안 결정되고, 메모리의 낮은 주소부터 할당되는 선입선출(FIFO) 구조

▶ 스택(Stack) 영역

  • 함수 호출 시 사용되는 임시 메모리 공간
  • 함수가 호출될 때마다 스택에 지역 변수매개 변수가 저장되고, 함수가 종료되면 메모리가 자동으로 해제된다. 스택은 후입선출(LIFO) 구조로 동작하며, 메모리의 높은 주소부터 할당된다.
  • 스택영역에서는 함수 호출 시 필요한 데이터와 함께 함수가 반환될 주소가 저장된다.

더 알아보기

💡
Q. Java에서 static으로 선언된 변수는 프로세스 메모리 구조에서 데이터 영역에 저장된다고 하는데, 만약 static ArrayList를 선언했다면, 이 ArrayList는 메모리의 어느 영역에 저장되나요?
A. Java에서 static 변수는 데이터 영역에 저장되지만, ArrayList는 참조 타입 객체이므로, 두 가지 다른 메모리 영역에 걸쳐 저장됩니다.
static 참조 변수 (ArrayList 자체의 참조)는 데이터 영역에 저장됩니다. 모든 static 변수와 마찬가지로, 이는 프로그램 시작 시 메모리에 할당되고, 프로그램 종료 시까지 유지됩니다.
ArrayList 객체와 그 내부에 저장된 실제 데이터들은 힙(Heap) 영역에 저장됩니다. Java에서는 모든 객체가 동적으로 할당되고, 힙 메모리에 위치하기 때문입니다.

💡
Q. reference(참조변수)는 어떻게 크기가 결정되나요?
A. 참조변수는 C언어에서의 포인터처럼 객체의 주소를 가리키는 역할을 합니다. 참조변수 자체는 메모리 내 객체의 위치 주소를 저장합니다.
참조변수의 크기는 JVM이 실행되는 플랫폼의 아키텍쳐에 따라 결정됩니다.
32비트 시스템에서는 4Bytes(32Bits) , 64비트 시스템에서는 8Bytes(64Bits)의 크기를 가집니다.

💡
Q. 프로세스들은 독립적인 메모리 공간을 가진다고 하는데 서로 데이터를 공유할 순 없나요?
A. 공유할 수 있습니다. 기본적으로 프로세스는 독립적인 메모리 공간을 가지며, 서로의 메모리를 직접적으로 공유하지 않습니다. 하지만 프로세스 간 데이터를 주고받는 방법인 프로세스 간 통신(IPC: Inter-Process Communication)을 사용하여 데이터를 공유할 수 있습니다.
1. 공유메모리 (Shared Memory) ex. 복사-붙여넣기 (Clipboard)
2. 파이프 (Pipe)
3. 메시지 큐 (Message Queue)
4. 소켓 (Socket)
5. 파일 시스템 (File System)

profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글