[운영체제] 프로세스와 스레드
프로세스
- 프로세스: 메모리에 적재되어 지금 실행중인 프로그램
- 작업 관리자에서 볼 수 있듯 동시에(사용자가 눈치채지 못하도록 빠르게 번갈아가며) 실행되는 프로세스는 매우 많다.
- 다양한 프로세스들을 관리하고 실행한다.
- 프로세스와 스레드, 프로세스 동기화, 교착상태 해결 등을 수행한다.
종류
- 포그라운드 프로세스(foreground process): 사용자가 볼 수 있는 공간에서 실행되는 프로세스
- 백그라운드 프로세스(background process): 사용자가 볼 수 없는 공간에서 실행되는 프로세스
- 백그라운드 프로세스에는 사용자와 상호작용이 가능한 프로세스와 그렇지 않고 정해진 일만 수행하는 프로세스가 있는데, 이중 후자를 데몬(demon, 유닉스) 혹은 서비스(service, 윈도우)라고 한다.
프로세스 제어 블록(PCB)
- CPU자원은 한정되어 있기 때문에 프로세스들은 돌아가며 한정된 시간만큼만 CPU를 이용한다.
- 타이며 인터럽트(타임아웃 인터럽트)가 발생하여 시간을 끝났음을 알리면 차례를 양보한다.
- 프로세스 제어 블록(PCB): 빠르게 번갈아가며 수행되는 프로세스들을 관리하기 위해 사용하는 자료구조로 프로세스에 있어 태그, 꼬리표같은 존재이다.
- PCB에는 프로세스 관련 온갖 정보를 저장한다.
- 프로세스 ID(PID)
- 레지스터 값 → 이전의 작업을 이어 실행하기 위해 사용했던 레지스터의 중간값들을 모두 복원
- 프로그램 카운터(프로세스가 다음에 실행할 명령어의 주소)
- CPU 레지스터
- (레지스터 값이란 CPU의 레지스터에 저장되어 있는 데이터를 의미한다. 레지스터는 컴퓨터의 중앙 처리 장치(CPU) 내부에 위치하며, 매우 빠르게 접근할 수 있는 작은 메모리 단위이다. CPU는 이 레지스터들을 사용하여 명령어를 실행하는 동안 필요한 데이터를 빠르게 읽고 쓴다.)
- 프로세스 상태
- CPU 스케줄링 정보 → 어떤 프로세스를 먼저, 얼마나 오래 실행할지
- 메모리 정보
- 사용한 파일과 입출력 장치 정보
- 프로세스 생성시 커널 영역에 PCB를 생성하고, 종료시 폐기한다.
문맥 교환(context switch)
- 한 프로세스에서 다른 프로세스로 실행 순서가 넘어가면 기존에 실행되던 프로세스는 중간 정보들을 백업해야 한다.
- 문맥(Context): 다음 차례가 왔을 때 실행을 재개하기 위한 정보
- 프로그램 카운터 등 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력 장치 등
- 문맥 교환(Context switching): 프로세스 전환시 기존에 실행중인 프로세스의 문맥을 백업하고 새로운 프로세스 실행을 위해 문맥을 복구하는 과정
프로세스의 메모리 영역
- 메모리의 사용자 영역은 다음 영역들과 기타 영역들로 나뉜다.
- 일반적으로 커널은 가장 높은 주소에 할당되어 있고 그 다음 순서는 다음과 같다.
- 스택 영역(stack segment)
- 데이터가 일시적으로 저장되는 공간
- 매개 변수, 지역 변수
- 크기가 변하는 동적 할당 영역
- 힙 영역(heap segment)
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 가비지 컬렉션(Garbage Collection): 프로그래밍 언어가 할당된 메모리 공간을 알아서 반환
- 메모리 누수(memory leak): 할당된 메모리 영역을 반환하지 않아 생기는 메모리 낭비(C언어)
- 크기가 변하는 동적 할당 영역
- 데이터 영역(data segment)
- 프로그램이 실행되는 동안 유지할 데이터 저장
- 전역 변수
- 크기가 고정된 정적 할당 영역
- 코드 영역(code segment)
- 텍스트 영역이라고도 한다.
- 실행할 수 있는 코드, 기계어로 이루어진 명령어를 저장한다.
- CPU가 실행할 명령어가 담긴 공간으로 쓰기가 금지되어 있다.
- 크기가 고정된 정적 할당 영역
- 가변적인 스택 영역과 힙 영역에서
- 일반적으로 스택 영역은 높은 주소에서 낮은 주소로 할당되며
- 일반적으로 힙 영역은 낮은 주소에서 높은 주소로 할당된다.
프로세스 상태와 계층 구조
- 프로세스에는 저마다의 상태가 있는데, 운영체제마다 조금씩 다르지만 일반적으로 다음 5가지가 있다.
- 생성 상태: 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
- 준비 상태: 당장 CPU를 할당받아 실행할 수 있지만 자신의 차례가 아니라서 대기중인 상태
- 실행 상태: CPU를 할당 받아 실행중인 상태
- 대기 상태: 실행중 입출력장치를 사용하면 입출력 작업 종료시까지 대기 상태, 이후 준비 상태
- 종료 상태: 프로세스가 종료되어 PCB와 프로세스의 메모리 영역 정리
- 윈도우 운영체제는 프로세스를 계층적으로 관리하지 않지만 대부분의 운영체제는 계층 구조를 가진다.
- 프로세스 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
- 이때 새 프로세스를 생성한 프로세스가 부모 프로세스, 생성된 프로세스가 자식 프로세스이다.
- 부모 프로세스(Parent Process)와 자식 프로세스(child process)는 각기 다른 PID를 가진다.
- 리눅스에서 최초의 프로세스는
systemd
, macOS에서는launchd
이다.
프로세스 생성 기법
- 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
- 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체
스레드
- 스레드(thread): 실행 프로세스를 구성하는 실행 흐름의 단위
- 스레드 ID, 프로그램 카운터를 포함한 레지스터 갑스 스택 등으로 구성
- 실행에 필요한 최소한의 정보를 유지한 채 실행된다.
- 모든 스레드는 프로세스의 자원을 공유하며 실행
- 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
- 멀티 스레드 프로세스: 실행 흐름이 여러개인 프로세스
- 프로세스를 이루는 여러 명령어 동시 실행 가능
- 리눅스에서는 프로세스와 스레드를 구분하지 않고 태스크라고 표현한다.
멀티 프로세스와 멀티 스레드
- 단일 스레드 프로세스 여러개 실행 vs 하나의 프로세스를 여러 스레드로 실행
멀티 프로세스
- 프로세스를 fork하면 메모리 주소를 제외한 모든 것이 동일한 프로세스가 복제되어 저장된다.
- 프로세스끼리 자원을 공유하지는 않는다.
- 독립적으로 실행된다.
- 프로세스 간 통신(IPC, InterProcess Communication)으로 프로세스 간에도 자원을 주고 받을 수 있다.
- 파일, 메모리를 통한 프로세스 간 통신
멀티 스레드
- 자원을 공유한다
- 협력과 통신에 유리하다.
This post is licensed under CC BY 4.0 by the author.