프로세스 개념
운영체제에서 특정 프로그램을 더블 클릭하여 실행할 때, 해당 프로그램은 프로세스라고 불립니다.
시분할 시스템 (Time-Shared Systems)
시분할 시스템(Time-Shared Systems)은 여러 개의 프로그램을 동시에 실행할 수 있도록 진화한 시스템으로, **멀티태스킹(Multitasking)**이라고도 합니다. 이는 운영체제가 여러 작업을 스와핑(Swapping) 하면서 실행하는 방식으로, 사용자가 여러 작업을 번갈아 수행하는 것과 유사합니다.
프로그램과 프로세스
프로세스는 실행 중인 프로그램을 의미합니다. 반면, 프로그램은 실행되지 않은 상태로 존재하는 수동적인 개체입니다. 프로그램이 실행되면 Active(활성화) 상태가 되며, 운영체제로부터 메모리 공간을 할당받아 실행됩니다.
프로세스의 메모리 구조
프로세스의 메모리 구조는 다음과 같이 구성됩니다:
- 텍스트(Text) 영역: 실행할 프로그램의 소스코드가 저장되는 영역으로, 텍스트 섹션(Text Section)이라고도 합니다.
- 데이터(Data) 영역: 프로그램이 사용하는 전역 변수 및 정적 변수가 저장되는 공간입니다.
- 힙(Heap) 영역: 동적으로 할당되는 메모리 영역으로, malloc()과 같은 함수 호출을 통해 할당되며, 아래에서 위로 성장합니다.
- 스택(Stack) 영역: 함수 호출 시 생성되는 지역 변수 및 함수 호출 정보를 저장하는 공간으로, 상위 주소에서 하위 주소로 성장합니다.
스택(Stack) 동작 원리
스택은 선입후출(First In, Last Out, FILO) 방식으로 동작합니다. 즉, 가장 나중에 저장된 데이터가 먼저 제거됩니다.
- 함수가 호출될 때마다 해당 함수에서 선언한 변수들은 스택(Stack)에 저장됩니다.
- 새로운 함수를 호출하면 현재 함수의 실행 정보를 스택에 저장한 후, 새로운 함수가 실행됩니다.
- 함수 실행이 끝나면, 스택에 저장된 이전 함수의 실행 정보가 복원되면서 원래 함수로 돌아갑니다.
함수 호출 예시
- a() 함수가 b() 함수를 호출하는 경우:
- a() 함수 실행 중 b() 함수를 호출하면, a() 함수의 지역 변수를 스택에 저장한 후 b() 함수가 실행됩니다.
- b() 함수가 c() 함수를 호출하는 경우:
- b() 함수 실행 중 c() 함수를 호출하면, b() 함수의 지역 변수를 스택에 저장한 후 c() 함수가 실행됩니다.
- c() 함수가 종료되면, 스택에서 b() 함수의 변수를 복원하고 b() 함수 실행을 계속합니다.
- 이후 b() 함수가 종료되면 다시 a() 함수로 돌아갑니다.
메모리 주소 체계
- 메모리는 0번지에서 시작하여 상위 주소로 증가합니다.
- 스택(Stack)은 상위 주소에서 하위 주소로 성장하며, 힙(Heap)은 반대로 하위 주소에서 상위 주소로 성장합니다
프로세스 상태
- new : 프로그램이 만들어짐
- running : 프로세스가 실행이 되는 중
- waiting : 프로세스가 어떤 이벤트를 기다리는 것
- ready : 프로세스가 할당되길 기다리는 것
- terminated : 프로세스의 실행이 끝났을 때

프로세스는 실행 중 여러 가지 상태를 가질 수 있으며, 기본적으로 5가지 상태가 있습니다.
- New (생성)
- 프로세스가 생성되었지만 아직 실행을 기다리는 상태입니다.
- Ready (준비)
- CPU를 사용할 수 있도록 대기하는 상태입니다.
- CPU가 할당되면 Running 상태로 전환됩니다.
- Running (실행)
- CPU가 프로세스를 실행하는 상태입니다.
- 실행 도중 I/O 이벤트가 발생하면 잠시 Waiting 상태가 됩니다.
- 인터럽트(Interrupt)가 발생하면 더 중요한 작업을 위해 다시 Ready 상태로 돌아갑니다.
- Waiting (대기)
- I/O 작업이 완료될 때까지 기다리는 상태입니다.
- I/O가 끝나면 Ready 상태가 되어 다시 CPU를 할당받을 준비를 합니다.
- Terminated (종료)
- 프로세스가 실행을 마치고 종료된 상태입니다.
이러한 프로세스의 상태와 관련된 정보는 PCB (Process Control Block) 에 저장됩니다.
PCB에는 다음과 같은 정보가 포함됩니다.
- Process State (현재 상태: Ready, Running 등)
- Process ID (고유한 프로세스 번호)
- Program Counter (다음 실행할 명령의 위치)
- Registers (CPU가 사용 중인 레지스터 값)
- Memory Limits (프로세스가 사용할 수 있는 메모리 범위)
- List of Open Files (프로세스가 사용 중인 파일 목록)
PCB(Process Control Block)는 프로세스의 중요한 정보를 관리하는 데이터 구조로, 운영체제가 프로세스를 효과적으로 스케줄링하고 관리하는 데 사용됩니다.
이 PCB는 RAM(메모리)에 저장되며, 하드디스크에 저장하면 입출력 속도가 느려지므로 빠른 접근이 가능한 RAM을 사용합니다.
📌 프로세스 관리와 식별
운영체제가 여러 개의 프로세스를 관리하려면 각 프로세스를 구별할 수 있어야 합니다.
컴퓨터는 이를 위해 고유한 프로세스 ID(Process ID, PID) 를 부여합니다.
CPU가 실행 중인 프로세스를 변경할 때는 프로세스 간 전환(Process Switching) 이 발생합니다.
📌 시분할 시스템과 프로세스 전환
현대 운영체제는 시분할 시스템(Time-Sharing System) 을 사용합니다.
CPU는 여러 개의 실행 중인 프로그램을 번갈아 가며 실행하는데, A라는 프로세스를 잠시 실행한 후 B 프로세스를 실행하는 방식입니다.
이 과정에서 인터럽트(Interrupt) 가 발생하면 운영체제는 즉시 개입하여 중요한 작업을 처리합니다.
예를 들어, 사용자가 프로그램을 실행하는 도중 시스템 호출(System Call)이나 하드웨어 이벤트가 발생하면, 운영체제는 현재 실행 중인 프로세스를 멈추고 더 중요한 작업을 수행합니다.
📌 문맥 교환(Context Switching)
운영체제는 프로세스 전환을 할 때 문맥(Context) 을 저장하고 복원하는데, 이를 문맥 교환(Context Switching) 이라고 합니다.
- 현재 실행 중인 프로세스(예: Process 0)의 상태를 PCB에 저장하고 Waiting 상태로 변경합니다.
- 다음 실행할 프로세스(예: Process 1)의 정보를 PCB에서 가져와 Running 상태로 전환합니다.
- 만약 다시 인터럽트가 발생하면 Process 1의 정보를 PCB에 저장하고, Process 0의 정보를 복원하여 실행을 재개합니다.
📌 비유: 책갈피를 이용한 독서
문맥 교환을 책 읽기에 비유할 수 있습니다.
한 권의 책을 읽다가 다른 책으로 넘어가야 할 경우, 현재 페이지에 책갈피를 꽂아 놓고 다른 책을 펼쳐 읽습니다.
그리고 다시 첫 번째 책으로 돌아오면 책갈피를 보고 이어서 읽는 것과 같습니다.
이처럼 운영체제는 각 프로세스의 진행 상태를 저장하고 복원하여 멀티태스킹을 가능하게 합니다.
Threads
하나의 프로세스에서 실행할 수 있는 여러개의 프로그램 실행입니다. 프로세스라고 하는 것은 여러 개의 thread를 가질 수 있습니다.
Process Scheduling

📌 Process Representation (프로세스 표현)
리눅스에서는 sched.h 파일 아래에서 이중 연결 리스트(double linked list) 형태로 프로세스가 관리됩니다.
각 프로세스는 task_struct 구조체를 통해 표현되며, 이 구조체에는 다음과 같은 정보가 저장됩니다:
- 프로세스 상태 (Process State)
- 스케줄링 정보 (time_slice) → 언제 실행될지 결정
- 부모 프로세스 및 자식 프로세스 정보
- 오픈된 파일 리스트
- 프로세스 시작 메모리 주소
프로세스를 실행하면 부모 프로세스(Parent Process) 가 자식 프로세스(Child Process) 를 생성하는 구조입니다.
📌 프로세스 큐와 스케줄링
리눅스의 schedule.h 파일에는 프로세스 스케줄러 가 존재하며,
이는 프로세스를 효율적으로 실행하기 위해 여러 개의 큐(Queue) 를 관리합니다.
- Job Queue
- 시스템 내에서 실행 중인 모든 프로세스의 정보 를 저장
- Ready Queue
- 실행 준비가 완료된 Ready 상태 의 프로세스를 저장
- CPU가 할당되기를 기다리는 상태
- Device Queue
- 입출력(I/O) 작업을 수행하는 Waiting 상태 의 프로세스를 저장
- 디스크, 프린터, 네트워크 등 각 장치별 개별 큐 존재
프로세스는 상황에 따라 여러 개의 큐를 오가며 상태가 변경됩니다.
예를 들어, 프로세스가 I/O 작업을 수행하면 Device Queue 에 들어가며,
작업이 완료되면 다시 Ready Queue 로 이동합니다.
📌 Queueing Diagram (큐잉 다이어그램)
프로세스의 흐름을 시각적으로 표현하면 다음과 같습니다:
- Ready Queue → CPU 실행
- I/O 요청 발생 → Device Queue 대기
- I/O 완료 → Ready Queue 복귀
- Time Slice 종료 → 다시 Ready Queue 로 이동
- Child Process 생성 (Fork) → 새로운 프로세스 실행
🔹 Time Slice:
- 각 프로세스가 최대 실행할 수 있는 시간 을 의미
- 할당된 시간이 지나면 Ready Queue 로 돌아감
📌 예시: 프로세스와 Child Process
카카오톡을 실행하여 친구와 채팅하는 경우를 예로 들 수 있습니다.
- 메신저 앱 실행 → Parent Process (카카오톡 프로그램 실행)
- 새로운 채팅창 열기 → Child Process (별도의 채팅창 실행)
- 각 채팅창은 독립적으로 실행되며 상호작용 가능
즉, 부모 프로세스가 자식 프로세스를 실행하는 방식으로 동작합니다.
📌 프로세스 스케줄러 (Scheduler)
스케줄러는 다음 두 가지 유형으로 나뉩니다:
- Short-Term Scheduler (단기 스케줄러)
- Ready 상태 에 있는 프로세스 중, 어떤 프로세스를 CPU에 할당할지 결정
- 빠르게 실행되는 프로세스 스위칭을 담당
- Long-Term Scheduler (장기 스케줄러)
- 시스템에서 실행할 새로운 프로세스를 선택
- 멀티 프로그래밍 수준 을 조절 (한 번에 실행될 프로세스 수 결정)
🔹 초기 UNIX 시스템에서 프로세스 0번은 Kernel 프로세스 입니다.
이를 기반으로 여러 개의 자식 프로세스가 생성되며, 멀티태스킹 환경이 구성됩니다.
🔹 정리
- 프로세스는 task_struct 구조체에 저장되며, 이중 연결 리스트로 관리됨
- 여러 개의 큐 (Job Queue, Ready Queue, Device Queue) 를 통해 상태 변경이 이루어짐
- CPU 스케줄링을 통해 프로세스가 실행되며, Time Slice가 지나면 Ready Queue로 이동
- 부모 프로세스가 자식 프로세스를 생성하며, 프로그램 실행 시 새로운 프로세스를 생성할 수 있음
- Scheduler가 프로세스 실행 순서를 결정하며, UNIX 시스템에서는 Kernel이 0번 프로세스 역할을 수행
'IT 프로그래밍 > 운영체제' 카테고리의 다른 글
[운영체제] 프로세스 (0) | 2025.03.26 |
---|---|
[운영체제] 스케쥴러 (0) | 2025.03.25 |
HTTP, SSL 설명 (0) | 2024.08.21 |
DNS란? 용어 정리 DNS쿼리 8단계 (0) | 2024.08.21 |
OSI 7계층 (0) | 2024.08.21 |