프로세스 (Process)
실행 중인 프로그램의 인스턴스
컴퓨터 시스템에서 프로그램이 실행되면 운영체제는 해당 프로그램에 메모리와 시스템 자원을 할당하여 프로세스를 생성한다.
이 때 생성된 프로세스는 자체의 메모리 공간을 가지며 각자의 프로세스가 독립된 실행 환경을 갖는다.
특징
쓰레드 (Thread)
프로세스 내에서 실행되는 작업의 작은 단위
특징
정리
프로세스와 쓰레드의 차이
| 구분 | 프로세스 | 쓰레드 |
|---|---|---|
| 메모리구조 | 독립적인 메모리 공간 사용 | 메모리 공간을 공유 |
| 통신 방식 | IPC 필요 | 메모리 공유로 빠르게 통신 가능 |
| 실행 속도 | 상대적으로 느림 | 상대적으로 빠름 |
| 오류 영향 범위 | 다른 프로세스에 영향 없음 | 같은 프로세스 내 다른 쓰레드에 영향 |
| 생성 비용 | 쓰레드에 비해 큼 | 프로세스에 비해 적음 |
프로세스와 쓰레드는 시스템 자원을 효율적으로 사용하면서 프로그램의 병렬 처리를 가능하게 한다.
멀티프로세스와 멀티쓰레딩 기법을 통해 시스템 성능을 최적화할 수 있다.
메모리 영역
1. 코드(Code) 영역
프로그램의 실행 기계어 코드(또는 명령어)가 저장되는 메모리 공간.
프로그램이 실행되는 동안 변하지 않는다.
2. 데이터(Data) 영역
프로그램이 실행되기 전에 초기화된 전역 변수와 정적 변수가 저장되는 공간.
프로그램 실행 중에 변경될 수 있다.
3. 힙(Heap) 영역
동적 메모리 할당이 이루어지는 공간.
언어에 따라 사용자가 직접 메모리 할당과 해제를 관리해야 하며,
주로 malloc(C언어), new(C++)와 같은 함수나 연산자를 사용하여 메모리를 할당받고 free, delete로 해제한다. (가비지 콜렉터가 있는 언어는 제외)
4. 스택(Stack) 영역
함수 호출 시 사용되는 메모리 공간.
지역 변수와 함수 호출 정보(리턴 주소, 매개변수 등)가 저장된다.
함수 호출이 끝나면 해당 스택 프레임이 자동으로 해제되는 구조이다.
정리
| 메모리 영역 | 내용 | 특징 |
|---|---|---|
| 코드(Code) | 프로그램의 기계어 코드 | 읽기 전용, 실행 중 변경 불가 |
| 데이터(Data) | 초기화된 전역 변수, 정적 변수 | 프로그램 시작 시 할당, 종료 시 해제 |
| 힙(Heap) | 동적으로 할당된 메모리 | 할당/해제 관리 필요, 메모리 누수 가능성 있음 |
| 스택(Stack) | 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 | 자동 할당/해제, 제한된 크기, 스택 오버플로우 가능 |
컨텍스트 스위칭
하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(컨텍스트)를 보관하고 새로운 프로세스의 상태를 적재하는 작업
CPU는 한 번에 프로세스를 하나만 처리할 수 있다.
프로세스를 여러개 동시에 실행해야 할 때 컨텍스트 스위칭을 통해 동시에 실행하는 것처럼 여러 개의 프로세스를 실행할 수 있다.
(사실, 하나의 프로세스만 실행하고 있는 상태)
프로세스의 컨텍스트 스위칭 단계
1. 현재 프로세스 상태 저장 (해당 프로세스와 매칭되는 PCB(Process Control Block)에 저장함)
2. 넘어간 프로세스의 상태를 불러옴 (CPU가 해당 프로세스와 매칭되는 PCB에서 정보를 읽어들임)
3. CPU가 넘어간 프로세스에서 작업을 시작함.
스레드의 컨텍스트 스위칭 단계
1. 스레드 상태 저장 (해당 스레드와 매칭되는 TCB(Thread Control Block)에 저장함)
2. 스케줄러 작동 (프로세스 내의 다음에 실행할 스레드 선택)
3. 새로운 스레드 상태 복원
컨텍스트 스위칭은 프로세스나 스레드나 비슷한데 해당하는 컨트롤 블록이 다를 뿐임