프로세스(Process)
프로그램(Program) / 프로세스(Process)
- 프로그램: 어떤 작업을 하기 위해 실행할 수 있는 파일 또는 프로그램(.exe 등)
- 프로세스
- 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태
- 운영체제로부터 시스템 자원을 할당받는 / 운영체제가 관리하는 단위
- PCB(Process Control Block)를 가진 프로그램
- Process Control Block(PCB): 운영체제가 프로세스에 대한 중요한 정보(프로세스 상태, PID, 레지스터 정보, 메모리 관리 정보, 포인터 정보 등)을 저장해 놓는 공간. 각 프로세스가 생성될 때마다 PCB가 생성되고, 프로세스가 종료되면 PCB가 제거된다.
멀티태스킹
OS를 통해 CPU가 작업하는데 필요한 자원(시간)을 프로세스 또는 스레드간에 나누는 행위 -> 다수의 응용 프로그램을 동시에 열고 작업 가능
Context Switching
- CPU는 한번에 하나의 명령어만 처리할 수 있다. 즉, 재빠르게 프로세스들을 번갈아가며 실행 및 관리해야 한다. (동시 실행 X)
- 이 때, 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전 프로세스의 문맥(Context)과 상태(Status)를 보관 및 변경하고 새로운 프로세스를 적재하는 작업을 Context Switching 이라고 한다.
프로세스의 특징과 주소 공간
1. 프로세스의 특징
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다.
- 프로세스당 최소 1개의 스레드(메인 스레드) 존재 - 프로세스 생성 시 기본적으로 Main Thread가 생성
- 각 프로세스는 별도의 주소 공간에서 실행되며, 다른 프로세스의 변수나 자료구조에 직접 접근 불가
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, Inter-Process Communication) 사용 - 메일슬롯, 파이프, 소켓, 시그널, 공유메모리 등
2. 프로세스의 주소 공간
-
Code : 실행할 프로그램의 코드 및 매크로 상수가 기계어 형태로 저장되는 공간으로, CPU는 코드영역에 저장된 명령어를 하나씩 처리
-
Data : 코드에서 선언한 전역변수, 정적(Static) 변수, 배열 등 저장 (초기화 된 데이터 - data 영역 / 초기화 되지 않은 데이터 - bss 영역)
-
Stack : 실행되는 함수 안에서 선언된 지역변수(Local Variable), 매개변수(Parameter), 리턴값(Return Value)등이 저장되고, 함수 호출 시 기록되는 공간
-
Heap : 동적 메모리 할당 공간(malloc() 등) -> 사용이 끝나면 운영체제로 반납
스레드(Thread)
스레드(Thread)의 정의와 특징
1. 스레드(Thread)의 사전적 의미
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스의 특정한 수행 경로
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
2. 스레드(Thread)의 특징
- 프로세스의 Code, Data, Heap 영역은 공유, Stack 공간(+레지스터/Register)은 개별 스레드에 각각 할당
- 한 스레드에서 프로세스 자원을 변경 -> 다른 이웃 스레드(Sibling Thread)에서 변경 결과를 즉시 확인 가능
멀티 프로세스와 멀티 스레드
멀티 프로세스(Multi Process)
하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 하나의 작업을 수행
멀티 프로세스의 장점
- 여러 개의 자식 프로세스 중 하나에 문제가 발생해도 다른 자식 프로세스는 영향을 받지 않음
- 구현이 간단함
- 프로세스마다 독립된 메모리 영역(자원)을 할당받게 되므로 각 프로세스들이 독립적으로 동작하기 때문에 안정적 (한 프로세스에서 오류가 발생해도 다른 프로세스는 영향을 받지 않음)
멀티 프로세스의 단점
- 멀티 스레드 방식보다 많은 메모리 공간과 CPU 시간 차지
- 프로세스 개수와 작업량이 증가하면 오버헤드 발생, Context Switching으로 인한 성능 저하 가능성
- 프로세스 간에 직접 통신 불가(IPC 사용)
멀티 스레드(Multi Thread)
하나의 응용 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 수행
멀티 스레드의 장점
- 시스템의 자원과 처리 비용 감소 -> 실행 속도 상승
- 각 스레드는 Stack 영역만 처리하면 되므로 빠른 Context Switching 가능
- 한 프로세스 내의 자원(Code, Data, Heap)을 공유하고 있기 때문에 통신의 부담이 적어 응답 시간이 빠름
멀티 스레드의 단점
- 프로그램 테스트, 디버깅이 어려움
- 전역 변수 사용으로 스레드 간의 데이터 공유 시 동기화 문제 발생
- 하나의 스레드에 오류가 발생하면 전체 프로세스에 문제 발생
멀티 스레드를 사용하는 이유
1. 자원의 효율성 증대
- 멀티 스레드를 사용하면 프로세스 생성 시 자원을 할당하는 시스템 콜(System Call) 감소
-> 자원 할당 비용 감소, 효율적인 자원 관리 가능
2. 처리 비용 감소 및 응답 시간 단축
- 스레드 간의 통신은 IPC를 사용하지 않고 같은 프로세스 내에서 메모리 영역을 공유 -> 적은 통신 비용
- Context Switching 시 CPU 레지스터, RAM과 CPU 사이의 캐시 메모리가 초기화되는 멀티 프로세스 방식에 비해 Stack 영역만 처리하면 되므로 스레드 간의 Context Switching 속도 향상
멀티 스레드의 동기화(Synchronization) 문제
여러 스레드가 전역 변수를 통해 동일한 데이터 공간(자원)을 공유하면서 생기는 동기화 문제
-> Critical Section, Mutex, Semaphore 등을 기반으로 하는 동기화 기법 사용
References