프로그램을 실행하면 실제로 일어나는 일
Source: Dev.to
번역을 진행하려면 번역하고자 하는 본문 텍스트를 제공해 주시겠어요?
본문이 포함된 마크다운을 알려주시면, 요청하신 대로 한국어로 번역해 드리겠습니다.
From Keystroke to Execution
명령을 입력하고 Enter 키를 누르면 프로그램이 몇 밀리초 안에 시작됩니다. 운영 체제는 셸, 커널, CPU 스케줄러 및 메모리 관리와 관련된 일련의 단계를 조정합니다.
Shell → Kernel 상호 작용
- Shell이 명령을 파싱함 – 쉘은 일반 사용자 프로세스로 실행됩니다.
- Shell이 커널에 새 프로그램 시작을 요청함.
그 후 커널은:
- 메모리에서 프로세스 구조체를 할당한다
- 고유한 PID(프로세스 식별자)를 할당한다
- 디스크에서 실행 파일을 로드한다
- 코드와 데이터를 가상 메모리에 매핑한다
- 프로세스를 준비 큐에 넣는다
실행 파일은 기계 명령어와 메타데이터를 포함합니다. 로더가 이러한 섹션을 매핑한 후, 프로세스가 존재하지만 CPU 시간을 기다려야 합니다.
권한 모드
- 사용자 모드 – 애플리케이션 코드를 실행합니다; 하드웨어 접근이 제한됩니다.
- 커널 모드 – 전체 권한을 보유하며, 하드웨어, 메모리 및 장치를 제어합니다.
프로그램이 시스템 리소스가 필요할 때 시스템 콜을 발생시키며, 이는 커널 모드로의 제어된 전환을 트리거합니다. 커널은 요청을 검증하고 작업을 수행한 뒤 사용자 모드로 제어를 반환하여, 결함이 있는 프로그램으로부터 시스템을 보호합니다.
Unix‑Style Program Launch (fork‑exec)
- fork – 부모의 메모리 공간과 파일 디스크립터 복사본을 받은 자식 프로세스를 생성합니다. 부모와 자식은 동일한 지점에서 실행을 계속합니다.
- exec – 자식이 자신의 메모리를 새로운 프로그램 이미지로 교체합니다. PID는 동일하게 유지되고, 코드와 데이터만 바뀝니다.
The shell follows this pattern:
- The shell calls
fork - The child process calls
execwith your command - The parent shell waits or continues based on job rules
This model keeps process management simple and predictable.
| 상태 | 설명 |
|---|---|
| 신규 | 프로세스가 생성됨 |
| 준비 | 프로세스가 CPU 시간을 기다림 |
| 실행 중 | 프로세스가 코어에서 실행됨 |
| 대기 | 프로세스가 I/O 또는 기타 이벤트를 위해 일시 중지됨 |
| 종료 | 프로세스가 종료됨 |
스케줄링
스케줄러는 FCFS, SJF, SRTF, Round‑Robin 등과 같은 알고리즘을 사용하여 다음에 실행될 준비된 프로세스를 선택합니다. 대부분의 스케줄러는 우선순위와 time slices—컨텍스트 스위치가 발생하기 전에 프로세스가 실행될 수 있는 시간 제한—을 사용합니다.
컨텍스트 스위치가 발생할 때 커널은:
- 현재 프로세스의 CPU 레지스터를 저장합니다
- 다음 프로세스의 레지스터를 로드합니다
- 스케줄링 데이터를 업데이트합니다
빠른 스위칭은 병렬 실행의 착시를 만들어냅니다.
프로세스 제어 블록 (PCB)
커널은 각 프로세스를 PCB로 추적하며, PCB에는 다음이 저장됩니다:
- 스케줄링 정보
- 메모리 매핑
- 열린 파일 테이블
- 회계 데이터
가상 메모리
가상 메모리는 각 프로세스에 격리된 주소 공간을 제공합니다. 페이지 테이블은 가상 주소를 물리 메모리와 매핑하고, 커널은 이러한 매핑을 통해 보호 규칙을 적용합니다.
파일 디스크립터
파일 디스크립터는 프로세스를 리소스와 연결합니다. 각 디스크립터는 파일, 장치 또는 파이프를 가리키는 커널 테이블 엔트리를 가리킵니다. 커널은 권한과 참조 카운트를 관리합니다.
프로세스 관찰
일반적인 명령어를 통해 이러한 개념이 실제로 어떻게 동작하는지 볼 수 있습니다.
ps aux
활성 프로세스의 스냅샷을 보여주며, 각 행은 CPU 및 메모리 사용량과 함께 커널이 추적하는 프로세스를 나타냅니다.
top
실시간으로 지속적으로 업데이트되는 뷰를 제공합니다. 스케줄러가 작업을 교체하면서 프로세스가 상태를 바꾸는 모습을 볼 수 있습니다.
시도해 보기:
- 한 터미널에서 장시간 실행되는 프로그램을 시작합니다.
- 다른 터미널에서
ps또는top으로 관찰합니다. - 프로그램을 중지하고 해당 항목이 사라지는 것을 확인합니다.
실행하는 모든 프로그램은 프로세스 생성, 스케줄링, 자원 추적을 긴 루프 안에서 트리거합니다. 이러한 단계는 백그라운드에서 지속적으로 일어나며 시스템 동작을 형성합니다.
다음에 터미널에서 Enter 키를 누를 때, 여러분이 제어하는 전체 프로세스 수명 주기를 시작하고 있다는 것을 기억하세요.