- 프로세스 제어 블록이란 무엇인지 이해한다.
- 문맥 교환의 정의와 과정을 학습한다.
- 프로세스는 메모리에 어떻게 배치되는지 학습한다.
- 프로세스 상태와 프로세스 계층 구조를 학습한다.
- 스레드의 개념을 이해하고, 멀티 프로세스와 멀티 스레드의 차이를 이해한다.
실행중인 프로그램. 보조기억장치에 있는 프로그램이 메모리에 적재되어 실행되는 순간 그 프로그램은 프로세스가 됨
프로세스 종류 | |
---|---|
포그라운드 프로세스 (foreground process) | 사용자가 보는 앞에서 실행되는 프로세스 |
백그라운드 프로세스 (background process) | 사용자가 보지 못하는 뒤에서 실행되는 프로세스 |
데몬(deamon)
이라고 하고, 윈도우에서는 서비스(service)
라고 함프로세스와 관련된 정보를 저장하는 자료구조
운영체제가 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분하기 위해 이용
PCB
는 메모리의 커널 영역
에 생성됨
운영체제
는 수많은 프로세스들 사이에서 PCB
로 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단함
PCB
는 프로세스 생성 시에 만들어지고 프로세스 종료 시에 폐기됨
PID는 프로세스를 식별하기 위해 부여하는 고유한 번호 기록
프로세스는 자신의 실행차례가 돌아오면 이전까지 사용했던 레지스터들의 중간값을 복원하여 그대로 이어 실행하므로 프로그램 카운터를 비롯한 레지스터 값들 기록
현재 프로세스가 어떤 상태인지 기록
프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록
베이스 레지스터, 한계 레지스터 값과 같은 정보와 프로세스의 주소를 알기 위한 페이지 테이블 정보도 기록
어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들 기록
기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
문맥 (context)
: 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보문맥
은 해당 프로세스의 PCB
에 저장메모리의 사용자 영역은
코드 영역
,데이터 영역
,힙 영역
,스택 영역
으로 구분됨
CPU가 실행할 명령어(기계어)가 저장.
읽기 전용(read-only) 공간
메모리 누수 (memory leak)
문제를 초래➡ 코드 영역
과 데이터 영역
은 그 크기가 변하지 않기 때문에 정적 할당 영역
이라고 하고, 힙 영역
과 스택 영역
은 그 크기가 변하기 때문에 동적 할당 영역
이라고 함
프로세스를 생성 중인 상태
CPU를 할당받기를 기다리는 상태
디스패치
: 준비상태인 프로세스가 실행 상태로 전환되는 것CPU를 할당받아 실행 중인 상태
프로세스가 할당된 시간을 모두 사용하여 타이머 인터럽트
가 발생하면 다시 준비상태
가 됨
실행 도중 입출력장치를 사용했다면 입출력장치의 작업이 끝날 때까지 기다리는 대기 상태
가 됨
입출력장치의 작업 완료를 기다리는 상태
준비 상태
가 됨프로세스가 종료된 상태
최초의 프로세스 PID
는 항상 1
이고, 모든 프로세스 최상단에 있는 부모 프로세스
이다.
유닉스에서는 init
, 리눅스에서는 systemd
, macOS에서는 launchd
이다.
부모 프로세스는 fork
시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
정보
가 상속
됨자식 프로세스는 exec
시스템 호출을 통해 자신의 메모리 공간을 새로운 프로그램 내용으로 덮어씀
exec
을 호출하면 코드 영역
과 데이터 영역
의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화됨➡ 부모가 자식 프로세스를 실행하며 프로세스 계층 구조를 이루는 과정은 fork
와 exec
가 반복되는 과정
스레드
는 프로세스를 구성하는 실행의 흐름 단위이다.
한 번에 하나의 부분만 실행되는 프로세스
한 번에 여러 부분이 동시에 실행되는 프로세스
스레드 ID
, 프로그램 카운터를 비롯한 레지스터 값
, 스택
으로 구성됨 ➡ 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터
, 스택
)만을 유지한 채 프로세스 자원
을 공유
하며 실행됨
⚪ 멀티프로세스
: 여러 프로세스를 동시에 실행하는 것
⚪ 멀티스레드
: 여러 스레드로 프로세스를 동시에 실행하는 것
➡ 같은 작업을 하는 동일한 프로그램을 반복하게 하려면
프로세스의 경우는 fork
를 통해 세 번 실행하도록 함
코드 영역
, 데이터 영역
, 힙 영역
, 스택 영역
등을 비롯한 모든 자원
이 복제되어 메모리에 적재되는 것으로 낭비
가 될 수 있음스레드의 경우에는 스레드를 세 개 만들어 세 번 실행하도록 함
스레드 ID
, 프로그램 카운터를 포함한 레지스터
, 스택
을 제외한 프로세스의 자원
은 공유하므로 메모리를 효율적으로 사용 가능
더하여 스레드는 자원을 공유하기 때문에 협력
과 통신
에 유리함
다만 멀티스레드
환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있음