프로세스란

프로세스는 실행 중인 프로그램이다.

즉, 디스크에 존재하는 exe 파일은 단순한 프로그램이고,
이 프로그램이 메모리에 올라와 CPU에 의해 실행되는 순간 프로세스가 된다.


프로세스의 메모리 구조

프로세스가 생성될 때 다음과 같은 메모리 영역이 구성된다.

Code(Text)

  • 실행할 기계어 명령어가 저장되는 영역
  • 일반적으로 읽기 전용
  • 코드가 실행 중 임의로 변경되는 것을 막기 위함

Data

  • 전역 변수, static 변수 저장
  • 초기화된 데이터 / 초기화되지 않은 데이터(BSS)로 나뉨

Heap

  • 동적 메모리 할당 영역 (malloc, new 등)
  • 런타임에 크기가 변함
  • 낮은 주소에서 높은 주소 방향으로 증가
  • new, malloc을 많이 할수록 위쪽으로 커짐

Stack

  • 함수 호출 정보 저장 (지역 변수, 매개변수, 반환 주소)
  • 함수 호출 시 생성되고, 종료 시 제거됨
  • 높은 주소에서 낮은 주소 방향으로 증가
  • 함수 호출이 깊어질수록 아래쪽으로 커짐

실행되고 있는 프로세스의 개수 만큼 생성 컴퓨터 시스템의 주요 구조 에서 이야기하는 로더가 만들어줌


참고 1

Stack과 Heap의 성장 방향이 반대인 이유

Stack과 Heap은 둘 다 실행 중에 크기가 변하는 영역이다.

  • Stack: 함수 호출이 깊어질수록 증가
  • Heap: 동적 할당이 많아질수록 증가

두 영역을 같은 방향으로 증가시키면, 처음부터 각 영역의 최대 크기를 고정해두어야 한다.

하지만 반대 방향으로 성장시키면, 두 영역 사이의 빈 공간을 공유하면서 사용할 수 있다.

즉, Stack은 한쪽 끝에서 자라고, Heap은 반대쪽 끝에서 자라기 때문에 런타임 상황에 따라 메모리를 더 유연하게 사용할 수 있다.

단, 두 영역이 서로 가까워지다가 충돌하면 Stack Overflow 또는 메모리 부족 문제가 발생할 수 있다.


참고 3

Data 영역이 Data와 BSS로 나뉘는 이유

전역 변수와 static 변수는 프로그램 시작부터 종료까지 유지된다. 이 중에서 초기값이 있는 변수는 Data 영역에 저장된다.

예: int globalValue = 10;

이 값은 프로그램 시작 시 반드시 10이어야 하므로, 실행 파일 안에 초기값 10이 저장되어 있어야 한다.

반면 초기값이 없거나 0으로 초기화되는 변수는 BSS 영역에 저장된다.

예: int globalCount; static int staticCount;

이 변수들은 프로그램 시작 시 0으로 초기화되면 된다. 따라서 실행 파일 안에 0 값을 전부 저장할 필요가 없다.

대신 실행 파일에는 “이만큼의 BSS 공간이 필요하다”는 정보만 저장하고, 프로세스가 생성될 때 운영체제가 해당 영역을 0으로 초기화한다.

그래서 Data와 BSS를 나누면 실행 파일 크기를 줄이고, 초기화 방식도 효율적으로 관리할 수 있다.


참고 2

프로세스는 단순히 메모리 구조만 있는 것이 아니라,

  • 메모리 (Code, Data, Heap, Stack)
  • 레지스터 상태 (Register Set)
  • 프로그램 카운터 (PC)
  • 프로세스 상태 (Ready, Running 등)
  • 열린 파일, 자원 정보

이 모든 것을 포함한 실행 단위이다.


레지스터 셋

레지스터 셋은 CPU 내부 레지스터들의 상태를 의미한다.프로세스가 실행될 때 레지스터에는- 현재 연산 값- 프로그램 카운터 (다음 실행 명령어 주소)- 스택 포인터 등이 저장된다.따라서 레지스터 상태 역시 프로세스의 중요한 구성 요소이다.


프로세스 (프로세스의 스케줄링)

프로세스 스케줄링

프로세스 스케줄링은 어떤 프로세스에게 CPU를 할당할지 결정하는 과정이다.스케줄러는 Ready 상태의 프로세스 중 하나를 선택하여 실행시킨다.

프로세스의 스케줄링 : 프로세스의 CPU 할당 순서 및 방법을 결정 짓는 작업 스케줄링 알고리즘 : 스케줄링에 사용되는 알고리즘 스케줄러 : 스케줄링 알고리즘을 적용해서 실제 프로세스를 관리하는 운영체제 요소(모듈)

프로세스의 상태

프로세스는 다음과 같은 상태를 가진다.

New : 생성됨 Ready : 실행 대기 상태 Running : CPU에서 실행 중 Blocked : I/O 등으로 대기 중 Terminated: 종료됨

New → Ready → Running → Terminated

Running → Ready (시간 할당 종료, 선점) Running → Blocked (I/O 요청) Blocked → Ready (I/O 완료) 여기서 중요한 포인트:

  • CPU는 Ready 상태의 프로세스만 선택 가능

컨텍스트 스위칭

컨텍스트 스위칭은 실행 중인 프로세스를 중단하고,다른 프로세스로 CPU를 전환하는 과정이다.이때 기존 프로세스의 상태를 저장하고,다음 프로세스의 상태를 복원한다.

저장/복원 대상

  • 레지스터 값
  • 프로그램 카운터 (PC)
  • 스택 포인터 (SP)
  • CPU 상태 정보

컨텍스트 스위칭은 필수적이지만, 오버헤드가 발생하기 때문에 너무 자주 발생하면 성능이 저하된다.

Program Counter가 컨텍스트 스위칭에서 중요한 이유

PC는 현재 프로세스가 다음에 실행해야 할 명령어의 주소를 저장하는 레지스터이다.

컨텍스트 스위칭이 발생하면 실행 중이던 프로세스는 CPU 사용을 멈추고, 다른 프로세스가 CPU를 사용하게 된다.

이때 기존 프로세스의 PC 값을 저장하지 않으면, 나중에 다시 실행될 때 어디서부터 이어서 실행해야 하는지 알 수 없다.

따라서 운영체제는 컨텍스트 스위칭 시 현재 프로세스의 PC 값을 PCB 등에 저장하고, 다음에 실행할 프로세스의 PC 값을 복원한다.

즉, PC는 프로세스 실행 흐름을 이어가기 위한 핵심 정보이다.


  1. 프로세스와 프로그램의 차이를 “운영체제 관점”에서 설명해보세요. 프로그램은 디스크에 존재하는 정적인 실행 파일입니다. 반면 프로세스는 운영체제가 프로그램을 메모리에 적재하고, 독립적인 주소 공간과 실행 상태를 부여한 실행 단위입니다.

    운영체제는 각 프로세스의 메모리 영역, 레지스터 상태, 프로그램 카운터, 열린 파일 정보, 프로세스 상태 등을 관리하며, 스케줄러를 통해 Ready 상태의 프로세스 중 하나에 CPU를 할당합니다.

    따라서 프로세스는 단순히 실행 중인 코드가 아니라, 운영체제가 자원과 실행 상태를 관리하는 단위라고 볼 수 있습니다. 컨테이너로 보는 이유와 동일함 “프로세스 단위로 묶어서 관리하기 때문”

  2. 프로세스에 레지스터 상태까지 포함해야 하는 이유는 무엇인가요?

  3. Program Counter(PC)가 컨텍스트 스위칭에서 중요한 이유는 무엇인가요?

  4. 컨텍스트 스위칭 시 반드시 저장해야 하는 정보는 무엇인가요? (우선순위 포함)

  5. 컨텍스트 스위칭 비용이 발생하는 근본적인 이유는 무엇인가요?

  6. 컨텍스트 스위칭이 많아지면 성능이 왜 나빠지나요? (캐시 관점 포함)

  7. 프로세스 상태 전이에서 Running → Blocked가 발생하는 정확한 조건은 무엇인가요?

  8. Blocked 상태의 프로세스는 왜 스케줄링 대상이 아닌가요?

  9. Ready 상태 프로세스가 많을 때 스케줄러는 어떤 기준으로 선택하나요?

  10. 부모 프로세스와 자식 프로세스의 관계는 메모리 관점에서 어떻게 이루어지나요? 부모와 자식 프로세스는 기본적으로 서로 독립적인 주소 공간을 가진다.

    생성 시 부모의 메모리를 복사한 것처럼 보이지만, 실제로는 Copy-On-Write 기법을 사용하여 처음에는 메모리를 공유하다가, 한쪽에서 수정이 발생하면 그때 실제로 복사한다.

    즉, 논리적으로는 복사된 상태, 물리적으로는 필요할 때만 복사된다.

  11. CreateProcess 같은 시스템 콜이 필요한 이유는 무엇인가요? 프로세스 생성은 단순 함수 호출이 아니라, 메모리 할당, 주소 공간 생성, PCB 생성, 보안 설정 등 운영체제 커널이 직접 수행해야 하는 작업이다.

    따라서 사용자 프로그램이 직접 만들 수 없고, 커널에 요청하는 시스템 콜이 필요하다.

  12. 프로세스와 스레드의 차이를 설명해보세요. 프로세스

    • 독립적인 주소 공간
    • 자원 소유 단위
    • 컨텍스트 스위칭 비용 큼

    스레드

    • 같은 프로세스 내에서 실행
    • 메모리(Heap, Data) 공유
    • Stack과 레지스터는 개별
    • 컨텍스트 스위칭 비용 작음