프로세스란
프로세스는 실행 중인 프로그램이다.
즉, 디스크에 존재하는 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는 프로세스 실행 흐름을 이어가기 위한 핵심 정보이다.
-
프로세스와 프로그램의 차이를 “운영체제 관점”에서 설명해보세요. 프로그램은 디스크에 존재하는 정적인 실행 파일입니다. 반면 프로세스는 운영체제가 프로그램을 메모리에 적재하고, 독립적인 주소 공간과 실행 상태를 부여한 실행 단위입니다.
운영체제는 각 프로세스의 메모리 영역, 레지스터 상태, 프로그램 카운터, 열린 파일 정보, 프로세스 상태 등을 관리하며, 스케줄러를 통해 Ready 상태의 프로세스 중 하나에 CPU를 할당합니다.
따라서 프로세스는 단순히 실행 중인 코드가 아니라, 운영체제가 자원과 실행 상태를 관리하는 단위라고 볼 수 있습니다. → 컨테이너로 보는 이유와 동일함 “프로세스 단위로 묶어서 관리하기 때문”
-
프로세스에 레지스터 상태까지 포함해야 하는 이유는 무엇인가요?
-
Program Counter(PC)가 컨텍스트 스위칭에서 중요한 이유는 무엇인가요?
-
컨텍스트 스위칭 시 반드시 저장해야 하는 정보는 무엇인가요? (우선순위 포함)
-
컨텍스트 스위칭 비용이 발생하는 근본적인 이유는 무엇인가요?
-
컨텍스트 스위칭이 많아지면 성능이 왜 나빠지나요? (캐시 관점 포함)
-
프로세스 상태 전이에서 Running → Blocked가 발생하는 정확한 조건은 무엇인가요?
-
Blocked 상태의 프로세스는 왜 스케줄링 대상이 아닌가요?
-
Ready 상태 프로세스가 많을 때 스케줄러는 어떤 기준으로 선택하나요?
-
부모 프로세스와 자식 프로세스의 관계는 메모리 관점에서 어떻게 이루어지나요? 부모와 자식 프로세스는 기본적으로 서로 독립적인 주소 공간을 가진다.
생성 시 부모의 메모리를 복사한 것처럼 보이지만, 실제로는 Copy-On-Write 기법을 사용하여 처음에는 메모리를 공유하다가, 한쪽에서 수정이 발생하면 그때 실제로 복사한다.
즉, 논리적으로는 복사된 상태, 물리적으로는 필요할 때만 복사된다.
-
CreateProcess 같은 시스템 콜이 필요한 이유는 무엇인가요? 프로세스 생성은 단순 함수 호출이 아니라, 메모리 할당, 주소 공간 생성, PCB 생성, 보안 설정 등 운영체제 커널이 직접 수행해야 하는 작업이다.
따라서 사용자 프로그램이 직접 만들 수 없고, 커널에 요청하는 시스템 콜이 필요하다.
-
프로세스와 스레드의 차이를 설명해보세요. 프로세스
- 독립적인 주소 공간
- 자원 소유 단위
- 컨텍스트 스위칭 비용 큼
스레드
- 같은 프로세스 내에서 실행
- 메모리(Heap, Data) 공유
- Stack과 레지스터는 개별
- 컨텍스트 스위칭 비용 작음