프로세스
'프로세스를 생성한다' = 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 것 (프로그램 → 프로세스)
포그라운드 프로세스(foreground process) | 백그라운드 프로세스(background process) |
---|
사용자가 볼 수 있는 공간에서 실행되는 프로세스 | 사용자가 보지 못하는 공간에서 실행되는 프로세스 |
Note. 데몬 (in unix)/서비스 (in window): 사용자와 상호작용하지 않는 백그라운드 프로세스
프로세스들은 차례대로 돌아가면서 한정된 시간만큼만 CPU를 이용
시간이 끝났음을 알리는 타이머 인터럽트(타임아웃 인터럽트)가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다림
∴ 프로세스의 실행 순서를 관리, 자원을 배분해야 함 → 프로세스 제어 블록
프로세스 제어 블록(PCB)
- 프로세스를 식별하기 위해 필요한 정보들을 저장하는 자료 구조
- 커널 영역에 생성
- 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기
- 새로운 프로세스가 생성 = 운영체제가 PCB를 생성
- 프로세스가 종료 = 운영체제가 해당 PCB를 폐기
PCB 저장 정보 | 내용 |
---|
프로세스 ID (PID) | 프로세스의 고유 번호 |
| 같은 일을 수행하는 프로그램도 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성 |
레지스터 값 | 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원 (이전 작업을 이어서 실행) |
| → 해당 프로세스가 실행하며 사용했던 프로그램 카운터 등의 레지스터 값들이 담김 |
프로세스 상태 | 프로세스가 CPU를 사용하기 위해 기다리고 있는 상태인지 등의 상태정보 |
CPU 스케줄링 정보 | 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보 |
메모리 관리 정보 | 베이스 레지스터, 한계 레지스터 값, 페이지 테이블 정보 등 |
사용한 파일과 입출력장치 목록 | 프로세스가 실행 과정에서 사용한 특정 입출력장치나 파일 정보 |
문맥 교환
- 문맥: 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
- 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현
프로세스 A의 CPU 사용 시간이 다 되거나 인터럽트가 발생하여 프로세스 B로 실행 순서가 넘어가는 상황
문맥 교환 프로세스 A의 PCB에 문맥을 백업 → 실행할 프로세스 B의 문맥을 복구
https://www.javatpoint.com/what-is-the-context-switching-in-the-operating-system
프로세스의 메모리 영역
하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장 됨
정적 할당 영역 | 동적 할당 영역 |
---|
코드 영역, 데이터 영역 | 힙 영역, 스택 영역 |
-
코드 영역(텍스트 영역): 기계어로 이루어진 명령어가 저장
- 데이터가 아닌 CPU가 실행할 명령어가 담겨 있으므로 쓰기가 금지 (read-only)
-
데이터 영역: 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
ex) 전역 변수
-
힙 영역: 프로그래머가 직접 할당할 수 있는 저장 공간
- 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 함
- 반환 X → 메모리 낭비; 메모리 누수
- 메모리의 낮은 주소 → 높은 주소로 할당
-
스택 영역: 데이터를 일시적으로 저장하는 공간 ex) 매개 변수, 지역 변수
- 메모리의 높은 주소 → 낮은 주소로 할당
프로세스 상태
https://www.javatpoint.com/os-process-states
- 생성 상태: 프로그램이 막 메모리에 적재되어 PCB를 할당받은 상태
- 준비 상태: 실행되지 않고 자신의 차례를 기다리고 있는 상태
- 실행 상태: CPU를 할당받아 실행중인 상태
- 대기 상태: 입출력장치의 작업을 기다리는 상태
- 프로세스가 실행 도중 입출력장치를 사용하는 경우, 입출력 작업은 CPU에 비해 처리 속도가 느리므로, 입출력 작업을 요청한 프로세스는 입출력 장치가 입출력을 끝낼 때까지 기다려야함
- 종료 상태: 프로세스가 종료된 상태, PCB와 프로세스가 사용한 메모리를 정리
프로세스 계층 구조
https://delightlylinux.wordpress.com/2012/06/25/what-is-pid-and-ppid/
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음
- 부모 프로세스: 새 프로세스를 생성한 프로세스
- 자식 프로세스: 부모 프로세스에 의해 생성된 프로세스
- 자식 프로세스의 PCB에 부모 프로세스의 PID (PPID)가 기록되기도 함
ex) 사용자가 컴퓨터를 킴 → 로그인 → bash shell로 Vim 실행
최초의 프로세스 → 로그인 프로세스 → bash 프로세스 → Vim 프로세스
- 사용자가 컴퓨터를 켠 순간에 생성된 최초 프로세스는 로그인을 담당하는 프로세스를 자식 프로세스로 생성
- 로그인 프로세스는 사용자 인터페이스(bash shell) 프로세스를 자식 프로세스로 생성
- 사용자 인터페이스 프로세스는 Vim 프로세스를 자식 프로세스로 생성
프로세스 생성 기법
Step 1. 부모 프로세는 fork를 통해 자신의 복사본을 자식 프로세스로 생성
Step 2 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체
- fork: 자기 자신 프로세스의 복사본을 만드는 시스템 호출
- exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
(새로운 프로그램 내용으로 전환하여 실행)
- exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램으로 바뀌고, 나머지 영역은 초기화
스레드
- 스레드: 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
- 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행 가능
- 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성
https://www.geeksforgeeks.org/multithreading-python-set-1/
확인문제
p.304
1번 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램 입니다. 1-5까지 올바른 상태를 적어보세요.

참고문헌
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=299014282&start=slayer
