학습 개요
- 프로그램을 실행시키면 운영 체제로부터 프로그램이 동작하는 데 필요한 자원을 할당 받아 동작을 시작함
- 이처럼 실행 상태에 들어간 프로그램을 프로세스라고 함
- 프로세스의 동작은 CPU가 그 프로세스의 명령들을 실행하는 것임
- 이때 CPU도 기억 장치나 입출력 장치와 마찬가지로 프로세스가 동작하는데 필요한 자원임
- 그리고 프로세스 내 에서의 다중 처리를 위해 한 프로세스 안에 여러 개의 쓰레드를 두기도 함
- 운영 체제의 핵심적인 구성 요소 중 하나인 프로세스에 대한 기본적인 이해와 함께 쓰레드의 개념을 학습함
학습 목표
- 프로세스의 개념을 설명할 수 있음
- 쓰레드의 개념을 설명할 수 있음
- 프로세스와 쓰레드의 관계를 설명할 수 있음
강의록
프로세스
프로세스의 개요
프로세스(process)
- 작업 관리자
- 앱
- 사용자가 실행 시킨 프로세스
- 백 그라운드 프로세스
- 시스템 프로세스
- PID
- 프로세스 아이디
- 프로세스에 해당하는 번호
- 운영 체제가 같은 파일 이름을 갖는 여러 개의 다른 프로세스를 별도로 구분해 관리해주기 위해 이용
- 앱
- 실행 중인 프로그램
- 프로그램
- 동작을 하지 않는 정적·수동적 개체
- 저장 장치에 있을 때는 프로그램에 관련된 명령어들의 리스트들이 쭉 들어있음
- 프로세스
- 동작을 하는 능동적 개체
- 실제 프로세스가 되면 메모리 공간에는 그 프로그램 자체에다가 부가적인 다양한 데이터들이 더 필요해져 용량이 더 커짐
- 프로세스 자체는 프로그램 사이즈보다 훨씬 큼
- 작업 관리자
운영 체제로부터 자원을 할당 받아 동작
- 자원
- CPU, 메모리, 입출력 장치, 파일 등
- 동작
- CPU가 프로세스의 명령을 실행
- 자원
프로세스와 운영 체제
- 프로세스를 생성 및 종료
- 프로세스를 실행시키기 위한 스케줄링 작업
- 프로세스의 상태 관리
프로세스의 구성
- 메모리 구조
프로그램 실행에 직접적으로 필요한 코드와 데이터
- 코드 영역
- 프로그램 자체
- 데이터 영역
- 프로그램 실행 시 필요한 데이터
- 상수나 변수의 값
- 서브 프로그램 호출 상태 등
- 정적 데이터 영역
- 프로그램 시작부터 끝까지 관리되어야 하는 변수(상수, 전역변수) 보관
- 스택 영역
- 함수 호출 및 지역 변수 저장
- 힙 영역
- 동적으로 할당되는 메모리 공간
- 동적 변수들 중에서 사용자가 수동으로 할당하는 것 저장
- 프로그램 실행 시 필요한 데이터
프로세스 제어 블록(PCB)
- 운영 체제가 프로세스를 관리하기 위해 필요한 정보
- 각 프로세스마다 존재
- 여러 프로세스가 번갈아 실행되는 경우 PCB에 저장된 정보 활용
- 프로그램 카운터(PC)
- 현재 실행 중인 명령어에 바로 다음 명령어의 위치 값을 가지고 있어야 함
- 제어의 흐름
프로세스 상태 관리
프로세스 상태 변화
- 디스패치
- 준비 큐에서 준비하다가 cpu 할당 받게 되는 것
- 특정 프로세스에다가 cpu를 할당해 주는 과정 자체
부모 프로세스와 자식 프로세스
- 프로세스 생성 방법
- 사용자가 프로그램을 직접 실행
- 한 프로세스가 다른 프로세스를 생성
- 프로세스 생성 시스템 호출 이용
- 시스템 호출
- 사용자 모드에서 동작을 하다가 자원 할당 같은 것이 필요할 때 커널 모드로 변화 시킴
- 부모 프로세스
- 시스템 호출을 하는 프로세스
- 자식 프로세스
- 시스템 호출을 통해 새로 생성된 프로세스
프로세스 생성 시스템 호출
- UNIX, Linux
fork();
자식 프로세스는 부모 프로세스의 복제본
- pid 값만 달라짐
fork
후 자식 pid 결과 값을 받아오기 때문에 부모 프로세스는 자식 프로세스의 pid 정보를 알 수 있음- 자식 프로세스는 포크 후 pid 결과 값 0 값을 받아와 자식 프로세스인지 구분할 수 있게 됨
- UNIX, Linux
fork();
자식 프로세스는 부모 프로세스와는 다른 프로그램 실행
- Windows
CreateProcess()
자식 프로세스는 새로운 프로그램으로 생성
쓰레드
전통적인 프로세스
하나의 프로그램을 실행하기 위한 기본적인 단위
- 코드(Code) 영역
- 실행할 프로그램 코드가 저장되는 공간
- 정적 데이터(Data) 영역
- 전역 변수 및 초기화된 데이터 저장
- 스택(Stack) 영역
- 함수 호출, 지역 변수 저장
- 힙(Heap) 영역
- 동적 메모리 할당을 위한 공간
- PCB (Process Control Block)
- 프로세스의 상태, PID(프로세스 ID), PC(Program Counter) 등 정보를 저장
- 코드(Code) 영역
- 자원 소유의 단위
- 하나의 메모리 구조
- 디스패칭의 단위
- 하나의 제어 흐름
- 프로세스 내에서 다중 처리 불가능
쓰레드(thread)
프로세스 내에서의 다중 처리를 위해 제안 된 개념
- 코드(Code) 영역
- 모든 쓰레드가 공유
- 정적 데이터(Data) 영역
- 모든 쓰레드가 공유
- 힙(Heap) 영역
- 모든 쓰레드가 공유
- 스택(Stack) 영역
- 각각의 쓰레드가 독립적으로 가짐
- PC (Program Counter)
- 각 쓰레드가 개별적으로 가짐
- 코드(Code) 영역
- 하나의 프로그램을 실행하기 위한 기본적인 단위
- 하나의 프로세스 안에서 여러 개의 작업(쓰레드)이 동시에 실행될 수 있도록 함
- 디스패칭의 단위
- 자원 소유의 단위 : 프로세스
- 하나의 프로세스 내에는 하나 이상의 쓰레드 존재
- 하나의 메모리 구조를 공유하는 여러 제어 흐름
- 프로세스의 메모리 공간(코드, 데이터, 힙)을 공유하지만, 각 쓰레드는 독립적인 스택과 레지스터를 가짐
프로세스 비교
구분 | 전통적인 프로세스 | 쓰레드가 있는 프로세스 |
---|---|---|
실행 흐름 | 단일 실행 흐름 | 다중 실행 흐름(쓰레드) |
작업 처리 방식 | 하나씩 순차 실행 | 여러 개의 작업을 동시에 수행 가능 |
메모리 공유 | 독립적인 메모리 사용 | 같은 프로세스 내에서 메모리 공유 |
속도 | 상대적으로 느림 | 상대적으로 빠름 (병렬 처리 가능) |
전통적인 프로세스
- 하나의 프로세스는 하나의 실행 흐름을 가짐
- 한 번에 하나의 작업만 수행할 수 있음
- 프로세스 내부에는 PC(Program Counter, 프로그램 카운터)가 있어서 현재 실행 중인 명령어를 추적함
쓰레드 있는 프로세스
- 하나의 프로세스 내에 여러 개의 실행 흐름(쓰레드)이 존재할 수 있음
- 각 쓰레드는 자신만의 PC를 가지고, 동시에 실행될 수 있음
- 같은 프로세스 안에서 여러 작업을 병렬로 실행할 수 있어서 성능이 향상됨
쓰레드와 프로세스
비교 항목 | 프로세스 | 쓰레드 |
---|---|---|
실행 단위 | 독립적인 실행 단위 | 프로세스 내에서 실행되는 흐름 |
자원 소유 | 자체적으로 메모리 및 자원 소유 | 프로세스의 자원을 공유 |
메모리 구조 | 독립적인 메모리 구조 | 코드, 데이터, 힙을 공유하고 스택은 개별적 |
생성 속도 | 상대적으로 느림 | 상대적으로 빠름 |
문맥 전환 속도 | 상대적으로 느림 | 상대적으로 빠름 |
다중 처리 | 프로세스 간 통신(IPC)이 필요 | 같은 프로세스 내에서 쉽게 다중 처리 가능 |
쓰레드는 실행에 필요한 최소한의 정보만 가짐
- PC를 포함한 레지스터 값
- 상태 정보
- 스택 영역
나머지 정보는 프로세스에 두고 다른 쓰레드와 공유
다중 쓰레드로 구성된 프로세스
멀티 CPU 또는 멀티 코어 컴퓨터 시스템
- 다중 쓰레드를 병렬로 처리 가능
처리 속도 별로 쓰레드가 나눠진 경우
- 효율적인 처리 가능
정리 하기
- 프로세스는 실행 중인 프로그램을 의미하며, CPU, 메모리, 파일, 입출력 장치 등 실행에 필요한 자원이 할당 됨
- 프로세스 제어 블록은 프로세스를 명시해 주는 다양한 내용을 포함하고 있음
- 프로세스는 생성, 준비, 실행, 대기, 종료의 다섯 상태 중 하나로 존재하며, CPU의 스케줄링, 입출력 대기 등에 따라 준비, 실행, 대기 등으로 상태가 변화되며 동작함
- 쓰레드는 프로세스에서 실행의 개념만 분리한 것으로 디스패칭의 단위임
- 하나의 프로세스 내에는 하나 이상의 쓰레드가 있을 수 있어, 다중 쓰레드를 생성하여 프로세스 내에서의 다중 처리를 할 수 있음