Chapter.10 - 프로세스와 스레드
모든 이미지의 저작권은 [혼자 공부하는 컴퓨터 구조 + 운영체제] 도서의 저자 강민철님에게 있습니다.
프로세스
보조기억장치에 저장되어 있는 프로그램은 메모리에 적재되고 실행되는 순간 프로세스가 된다. 즉, 실행중인 프로그램 = 프로세스
포그라운드 프로세스 : 사용자가 보이는 곳에서 실행되는 프로세스
백그라운드 프로세스 : 사용자에게 보이지 않는 곳에서 실행되는 프로세스
배치처럼 사용자와 상호작용하지 않고 정해진 일만 처리하는 백그라운드 프로세스를 유닉스 체계의 운영체제에서는 데몬
, 윈도우 운영체제에서는 서비스
라고 한다.
프로세스 제어 블록 (PCB)
프로세스와 관련된 정보를 저장하는 자료 구조
PCB는 메모리의 커널 영역에 생성
되며, 운영체제는 PCB를 이용해 수많은 프로세스의 실행 순서를 관리하고 프로세스에 CPU를 비롯한 하드웨어 자원을 배분한다.
프로그램 실행 시 메모리에 생성되고 프로그램 종료 시 폐기된다.
PCB 에 속한 대표적인 정보
이름 | 설명 |
---|---|
PID | 프로세스마다 고유하게 부여되는 값 |
레지스터 값 | 이전까지 진행했던 작업을 이어 실행하기 위한 레지스터 값 |
프로세스 상태 | |
CPU 스케줄링 정보 | 프로세스가 언제 , 어떤 순서로 CPU 를 할당받을지에 대한 정보 |
메모리 관리 정보 | 베이스 레지스터 , 한계 레지스터와 같은 정보 |
사용한 파일과 입출력장치 목록 |
컨텍스트 스위칭 (문맥 교환)
한 프로세스가 하드웨어 자원을 독점할 수 없기 때문에 여러 프로세스는 빠르게 번갈아 가면서 실행된다.
이 때, 실행중인 프로세스의 컨텍스트 (문맥)를 PCB 에 백업하고 다른 프로세스의 컨텍스트를 가져와 실행하는 것을 컨텍스트 스위칭 (문맥 교환)이라고 한다.
프로세스의 사용자 영역
- 코드 영역 (텍스트 영역)
- 기계어로 이루어진 명령어가 저장된다.
- CPU 가 실행할 명령어가 저장된 영역이기 때문에 쓰기 금지, 읽기 전용
- 데이터 영역
- 프로그램이 실행되는 동안 유지되는 데이터가 저장된다. 예를 들면, 전역 변수
- 힙 영역
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 낮은 주소에서 높은 주소로 할당된다.
- 메모리를 반환하지 않으면 메모리 누수가 발생할 수 있다.
- 낮은 주소에서 높은 주소로 할당된다.
- 스택 영역
- 데이터를 일시적으로 저장하는 공간
- 대표적으로 매개변수 , 지역변수가 저장된다.
- 높은 주소에서 낮은 주소로 할당된다.
- 대표적으로 매개변수 , 지역변수가 저장된다.
코드 영역과 데이터 영역은 크기가 고정된 영역으로
정적 할당 영역
이라고 한다.
힙 영역과 스택 영역은 크기가 변할 수 있기 때문에동적 할당 영역
이라고 한다.
프로세스 상태
- 생성 상태
- 방금 메모리에 적재되어 PCB를 할당받은 상태
- 준비 상태
- CPU 를 할당받으면 실행할 수 있지만 아직 차례가 아니어서 대기하는 상태
- 실행 상태
- 현재 CPU 를 할당받아 실행중인 상태
- 대기 상태
- 입출력장치의 작업 완료를 기다리는 상태
- 종료 상태
- 프로세스가 종료된 상태
프로세스의 생성 과정
운영체제는 프로세스가 프로세스를 낳는 계층적인 구조로 여러 프로세스를 관리한다.
최초의 프로세스가 여러 자식 프로세스를 생성하는 과정은
- 부모 프로세스는
fork
시스템 호출을 통해 자신과 똑같은 프로세스를 생성한다. - 생성된 프로세스는
exec
시스템 호출을 통해 자신의 메모리 공간을 새로운 프로그램의 내용으로 변경한다. (코드 영역, 메모리 영역의 내용을 변경하고 나머지 영역은 초기화한다.)
이 과정이 반복되어 여러 프로세스가 생성되고 실행되는 것이다.
스레드
프로세스를 구성하는 실행 흐름 단위. 쉽게 얘기해서, 브라우저를 이용하면서 파일을 다운받는 것은 브라우저 메인 스레드와 파일 다운로드 스레드가 실행되고 있다는 것
하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
여러 스레드는 각각의 스레드 ID , 프로그램 카운터를 비롯한 레지스터 값 , 스택으로 구성되어 있어서 스레드마다 다른 코드를 실행할 수 있다.
실행에 필요한 최소한의 정보만 개별적으로 가지고 있고 프로세스의 자원은 여러 스레드가 공유한다.
기본적으로 프로세스끼리는 자원을 공유하지 않지만, 프로세스 간의 자원을 공유하고 데이터를 주고 받는 것은 가능하다. 이를
IPC
라고 한다.