스레드
스레드(thread)란 프로세스를 구성하는 실행의 단위이다. 그리고 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
스레드라는 개념은 하드웨어, 소프트웨어를 망라하고 다양한 곳에서 사용된다. 여기서 사용될 스레드는 소프트웨어 관점에 스레드이다.
프로세스와 스레드
앞서 학습했듯이 프로세스는 한 번에 하나의 일을 처리한다고 했다. 웹 브라우저, 게임, 워드 프로세서가 있을 때 각각 하나의 부분(기능)만 실행된다면 해당 프로세스는 `실행의 흐름 단위가 하나`라고 할 수 있다. 그러한 프로세스를 `단일 스레드 프로세스`라고 칭하게 된다.
하지만 현재의 프로세스를 생각해 보면 각각의 프로세스들이 여러 개의 기능들이 구현되어 있는 경우가 많다. 그렇기 때문에 하나의 프로세스에서 한 번에 여러 일을 동시에 처리할 수 있게 되어야 한다.
즉, 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있게 해주는 것이 `스레드`역할이다. 이렇게 실행 흐름이 여러 개인 프로세스를 `멀티 스레드 프로세스`라고 한다.
스레드의 구성 요소
하나의 스레드의 구성 요소는 다음과 같다.
- 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택으로 구성됨
구성 요소를 보면 각자 프로그램 카운터를 비롯한 레지스터 값과 스택을 가지고 있기 때문에 스레드마다 각기 다른 코드에서 실행될 수 있다.
여기서 중요한 점은 스레드들은 실행에 필요한 최소한의 정보(위 구성요소의 정보들)만을 유지한 채 프로세스 자원을 공유하며 실행된다는 점이다.
프로세스의 자원을 공유한다는 것이 스레드의 핵심이며, 앞으로도 굉장히 중요하게 다뤄질 내용이다.!!
멀티 프로세스와 멀티스레드
컴퓨터에서 여러 작업을 동시에 처리하는 방식에는 멀티프로세스(multiprocess)와 멀티스레드(multithread)가 있다.
- 멀티프로세스: 여러 개의 독립적인 프로세스를 동시에 실행
- 멀티스레드: 하나의 프로세스 내에서 여러 스레드를 동시에 실행
1. 차이점
다음과 같은 조건을 가지는 예시로 확인해 보자.
- 멀티프로세스: `hello.os`를 출력하는 프로그램을 3번 `fork`하여 실행하면, 각 프로세스는 독립적인 메모리와 PID를 가지며 hello.os를 출력한다.
- 멀티스레드: 하나의 프로세스 내에서 3개의 스레드가 생성되어 동일한 자원을 공유하며 `hello.os`를 출력한다.
`hello.os`가 3개의 출력되는 동일한 결과가 나오게 된다.
여기에는 큰 차이가 있다. 프로세서끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다.
프로세스를 fork 해보면 부모 프로세스의 코드, 데이터, 힙 영역을 비롯한 모든 자원이 그대로 복제된다. 한 마디로 서로 다른 PID를 가진 독립적인 프로세스가 생성되게 된다. 그렇기 때문에 같은 작업을 동시에 수행하기 위해선 각각의 프로세스가 메모리를 점유하고 있는 개념이 되게 된다. 같은 프로그램을 실행하기 위해 메모리에 동일한 내용들이 중복해서 존재하는 것이므로 메모리의 낭비가 될 수도 있다.
개념적으로 동일한 작업을 수행하는 프로세스가 각각의 메모리를 점유하는 것 같지만, fork 한 직후 같은 프로세스를 통째로 메모리에 중복 저장하진 않는다. 쓰기 시 복사(copy on write) 기법이라고 하는 방법으로 진행되며, 이는 운영체제 메모리 할당에서 자세히 다룰 예정이다.
이에 반해 스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택 같은 실행에 최소한 자원만 가지고 있으며, 나머지는 프로세스가 가지고 있는 자원(코드, 데이터, 힙, 파일)을 공유한다. 그러므로 여러 프로세스를 병행 실행하는 것보다 메모리를 효율적으로 사용할 수 있다.
2. 멀티프로세스와 멀티스레드 비교 (자원 공유 여부 및 메모리 효율성)
항목 | 멀티프로세스 | 멀티스레드 |
자원 공유 여부 | 독립적인 자원(PID, 메모리 영역 등)을 각각 점유 | 같은 프로세스의 자원(코드, 데이터, 힙 등)을 공유 |
메모리 효율성 | 각각의 메모리를 사용하므로 메모리 낭비 가능성 단, Copy-on-Write 기법으로 초기 복사는 지연 처리 |
자원을 공유하여 메모리를 효율적으로 사용 |
협력과 통신 | 자원을 공유하지 않으므로, 남남처럼 독립적으로 실행 | 자원을 공유함으로 서로 협력과 통신에 유리 |
연관성 | 각각 독립적으로 실행되므로 하나가 문제가 생겨도 다른 프로세서의 영향을 미치지 못한다. | 자원을 공유함에 따라 한 스레드의 문제가 발생되면 다른 스레도도 영향을 받을 수 있다. |
출처
'Knowledge > 컴퓨터구조&운영체제' 카테고리의 다른 글
[운영체제] CPU 스케줄링 - (1) 프로세스 우선순위와 스케줄링 큐 (2) | 2024.12.27 |
---|---|
[운영체제] 프로세스 간 통신(IPC) (1) | 2024.12.11 |
[운영체제] 프로세스 상태와 계층 구조 (1) | 2024.12.06 |
[운영체제] 커널 영역과 사용자 영역의 프로세스 (PCB, 문맥교환, 메모리 영역) (2) | 2024.12.06 |
[운영체제] 운영체제의 역할과 앞으로 학습할 내용 정리 (1) | 2024.12.04 |