프로세스 | 스레드 | |
프로그램이 메모리 상에서 실행 중인 작업 | 프로세스 안에서 실행되는 여러 흐름 단위 | |
차이점 | 자신만의 고유 공간과 자원을 할당받아 사용 | 프로세스 내 다른 스레드와 공간, 자원을 공유하면서 사용 |
프로세스
메모리에 올라와 실행 중인 프로그램
- 운영체제로부터 주소 공간, 파일, 메모리 등을 자원을 할당받은 작업의 단위
- 각 프로세스는 할당된 메모리에만 접근이 가능하다 (독립적)
프로세스는 프로세스 스택, 데이터 섹션, 힙, 코드를 포함한다.
- 프로세스 스택 : 함수의 매개변수, 복귀 주소, 로컬 변수 등 임시 메모리 영역
- 데이터 섹션 : 전역 변수, 정적 변수 등
- 힙 : 프로세스 실행 중 동적으로 할당되는 메모리
- 코드 : 코드 자체를 구성하는 메모리 영역
프로세스 제어 블록 (Process Control Block, PCB)
특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조
- 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB를 생성한다.
- 프로세스는 CPU를 할당받아 작업을 하는 중간에 프로세스 전환이 발생하면, 진행하던 작업을 저장하고 CPU를 반환해야 한다. 이때 작업의 진행 상황을 모두 PCB에 저장한다.
- 프로세스가 다시 CPU를 할당받으면 PCB에 저장되어 있던 내용을 불러와 이전 종료 시점부터 작업을 수행한다.
PCB에 저장되는 정보
- 프로세스 식별자(Process ID, PID) : 프로세스 식별 번호
- 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
- 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
- CPU 레지스터
- CPU 스케줄링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
- 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
- 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등
스레드
프로세스 안에서 실행되는 더 작은 작업 단위
- 스레드 ID, 프로그램 카운터(PC), 레지스터 집합, 스택으로 구성된다. 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다.
- 스레드마다 Stack을 독립적으로 할당하는 이유
- 스레드는 독립적인 동작을 수행하기 위해 존재한다. > 독립적으로 함수 호출이 가능해야 함
- 때문에 함수의 매개 변수, 지역 변수 등을 저장하는 스택 메모리 영역을 독립적으로 할당받는다.
- 스레드마다 PC Register을 독립적으로 할당하는 이유
- PC는 스레드가 명령어를 어디까지 수행하였는지 나타낸다.
- 스레드는 CPU를 할당받아 작업을 수행하다 스케줄러에 의해 다시 선점당한다. 그래서 각 스레드가 어느 부분까지 수행했는지 기록하기 위해 스레드 별로 독립적으로 할당받는다.
멀티 프로세스
하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
- 장점
- 안전성 : 운영체제 차원에서 각 프로세스가 다른 프로세스의 메모리를 침범하지 못하도록 관리한다.
- 단점
- 자원 소모 많음, 오버헤드 : 프로세스 별로 독립된 메모리 영역을 할당받기 때문에, 작업량이 많을수록 오버헤드가 발생한다.
- Context switching으로 인한 성능 저하 : Context Switching은 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정이다. 프로세스는 독립적인 메모리 영역을 할당받기 때문에 캐시 메모리 초기화와 같은 무거운 작업이 진행되었을 때 오버헤드가 발생할 수 있다.
멀티 스레드
하나의 프로세스를 다수의 스레드로 구분해 각 스레드가 하나의 작업을 처리하도록 한다. 이를 통해 다수의 작업을 동시에 처리할 수 있다.
- 장점
- 메모리 공간과 시스템 자원 소모 감소 : 독립적인 프로세스에 비해 스레드는 자원을 공유하고, 이를 통해 자원의 생성과 관리의 중복성을 최소화할 수 있다.
- 통신이 간단 : heap 영역을 이용하면 스레드 간 데이터를 주고받을 수 있다. 프로세스의 통신 방법에 비해 스레드 간 통신 방법이 훨씬 간단하다.
- 빠른 context switch : 스레드의 context switch는 프로세스의 context switch와 달리 캐시 메모리를 비울 필요가 없어 더 빠르다.
- 단점
- 안정성 문제 : 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에, 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽거나 수정할 수 있다.
- 동기화 작업을 통해 작업 처리 순서를 컨트롤, 공유 자원에 대한 접근을 컨트롤한다. 하지만 이로 인한 병목 현상을 고려해야 한다.
'CS' 카테고리의 다른 글
[CS 스터디] 인터럽트 (Interrupt) (0) | 2023.07.17 |
---|---|
[CS 스터디] 운영체제(Operating System) (0) | 2023.07.13 |
[Java] Runnable, Thread (0) | 2023.07.11 |
[CS 스터디] Blocking & Non-Blocking I/O (0) | 2023.07.10 |
[CS 스터디] Blocking, Non-blocking & Synchronous, Asynchronous (0) | 2023.07.10 |