IT 프로그래밍/운영체제

[FT][운영체제] 프로세스와 스레드

기술1 2025. 3. 28. 22:23

실행 중인 프로그램을 프로세스(Process) 라고 합니다.

 

메모리는 커널 영역(Kernel Space)사용자 영역(User Space) 으로 나뉘며, 프로세스는 사용자 영역에서 실행됩니다.

 

같은 프로그램이라도 여러 개의 프로세스로 실행될 수 있습니다. 즉, 동일한 프로그램을 여러 번 실행하면 각각 독립적인 프로세스로 동작합니다. 하지만 같은 프로그램이 여러 번 실행된다고 해서 반드시 메모리에 중복 적재될 필요는 없습니다.

프로세스 제어 블록

모든 프로세스는 프로세스 제어 블록(PCB, Process Control Block) 이라는 데이터 구조를 갖습니다. 운영체제는 PCB를 통해 각 프로세스를 식별하고 관리합니다.

 

PCB는 운영체제의 커널 영역 에 위치하며, 실행 중인 모든 프로세스의 PCB가 저장되어 있습니다. 새로운 프로세스가 생성되면 PCB가 할당되며, 프로세스가 종료되면 해당 PCB도 제거됩니다.

 

PCB에는 다음과 같은 주요 정보가 포함됩니다:

  • PID (Process ID): 프로세스를 식별하는 고유한 번호
  • PPID (Parent Process ID): 부모 프로세스의 ID (존재하는 경우)
  • 레지스터 정보: 프로세스 실행 시 저장해야 하는 CPU 레지스터 값
  • 스케줄링 정보: CPU 점유 및 우선순위에 관한 정보
  • 메모리 관리 정보: 프로세스가 사용하는 메모리 영역에 대한 정보
  • 파일 및 입출력 정보: 프로세스가 사용하는 파일 및 입출력 장치 정보

운영체제는 PCB를 통해 프로세스를 관리하며, 컨텍스트 스위칭 시에도 PCB의 정보를 활용하여 프로세스 상태를 복원합니다.

#include <stdio.h>
#include <unistd.h>

int main()
{
	pid_t pid, ppid;

	pit = getpid();
	ppid = getppid();

	printf("Process ID: %d\n", pid);
	printf("Parent Process ID: %d\n", ppid);

	return 0;
}

$ ./a.out
Process ID : 4460
Parent Process ID : 1125

운영체제는 PCB(Process Control Block) 를 통해 프로세스를 식별하고, 프로세스에 필요한 자원을 할당합니다. 하지만 CPU를 포함한 시스템 자원은 제한되어 있으며, 실행되는 프로세스의 수는 일반적으로 이를 초과합니다. 따라서 다양한 프로세스들은 한정된 자원을 번갈아 가며 사용 하게 됩니다.

 

특히 CPU 자원 은 여러 프로세스가 돌아가면서 할당받게 되며, 이 과정에서 문맥 교환(Context Switching) 이 발생합니다.

문맥(Context)

프로세스가 실행을 재개하기 위해 기억해야 할 정보로, 레지스터 상태, 스택, 메모리 정보 등 이 포함됩니다.

문맥 교환(Context Switching)

여러 프로세스가 번갈아 가며 실행 되도록 하기 위해, 운영체제가 현재 실행 중인 프로세스의 문맥을 저장하고, 다음 실행할 프로세스의 문맥을 복원하는 과정입니다.

 

문맥 교환이 빠르면 여러 프로세스가 동시에 실행되는 것처럼 보이는 효과 를 얻을 수 있습니다. 하지만 문맥 교환 자체에도 비용이 발생하며, 너무 자주 발생하면 시스템 성능이 저하될 수 있습니다. 따라서 운영체제는 적절한 빈도로 문맥 교환을 수행하여 처리 효율과 응답성을 조절 합니다.

 

사용자 영역

메모리 영역 구조

프로세스가 실행될 때, 메모리는 여러 개의 영역으로 나뉘어 관리됩니다. 주요 메모리 영역은 코드 영역, 데이터 영역, 힙 영역, 스택 영역 으로 구성됩니다.


1. 코드(Code) 영역

  • 실행 가능한 기계어 명령어 가 저장되는 영역
  • Read-Only(읽기 전용) 로 설정되어 있어 코드가 변경되지 않음

2. 데이터(Data) 영역

  • 프로그램 실행 동안 유지 되는 데이터를 저장
  • 주로 전역 변수, 정적 변수 가 포함됨
  • 정적 할당(static allocation) 영역

BSS (Block Started by Symbol) 영역

  • 초기값이 없는 전역 변수 및 정적 변수가 저장됨
  • 실행 시 기본값(0)으로 초기화됨

3. 힙(Heap) 영역

  • 사용자가 직접 메모리를 할당 할 수 있는 영역
  • 동적 할당(dynamic allocation) 이 이루어짐
  • 사용 후 반드시 해제해야 함 (명시적 해제 또는 가비지 컬렉션 을 통해 자동 해제)

4. 스택(Stack) 영역

  • 함수 호출 시 임시 데이터 를 저장하는 영역
  • 매개변수, 지역 변수, 리턴 주소 가 저장됨
  • 함수 호출 시 스택에 데이터가 쌓이고, 함수 종료 시 데이터가 제거됨 (LIFO 방식)

🔹 정적 할당 vs 동적 할당

메모리 영역할당 방식

 

코드 영역, 데이터 영역 정적 할당(Static Allocation)
힙 영역, 스택 영역 동적 할당(Dynamic Allocation)

힙과 스택은 프로그램 실행 중 동적으로 크기가 변할 수 있으며, 잘못된 메모리 관리 시 메모리 누수(memory leak) 또는 스택 오버플로우(stack overflow) 가 발생할 수 있습니다.