스레드란 무엇인가?
스레드 (Thread)
--
스레드는
프로세스에서 동작(구성)하는 실행의 흐름 단위로,
간단하게 "실행의 단위"라고 생각하면 된다.
하나의 프로세스는 여러 개의 스레드를 가질 수 있으며,
스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.
--
프로세스와 스레드
--
스레드라는 개념이 없을 당시의 프로세스는 한 번에 하나의 일만 처리했다.
그래서 프로세스의 모든 동작은 [ A작업 끝 -> B작업 시작 -> B작업 끝 -> C작업 시작 ... ]처럼 순차적으로 동작한다.
한 번에 하나의 작업만 처리하는 프로세스를 "단일 스레드 프로세스"라고 부르기도 한다.
스레드라는 개념이 도입되면서
하나의 프로세스가 한 번에 여러 작업을 동시에 처리할 수 있게 되었다.
즉, 여러 명령어를 동시에 실행이 가능해진 것이다.
여러 작업을 동시에 처리하는 프로세스를 "멀티 스레드 프로세스"라고 부르기도 한다.
스레드는
프로세스 내부에서 각기 다른 "스레드 ID", "프로그램 카운터 값(을 비롯한 레지스터 값)", "스택"으로 구성된다.
스레드의 구성 요소
- 스레드 ID : 각 스레드를 구분하는 고유한 식별자
- 프로그램 카운터 : 스레드가 실행 중인 명령어의 위치를 저장
- 레지스터 값 : 현재 스레드가 실행 중인 작업에 대한 상태 정보를 저장
- 스택 : 함수 호출과 로컬(지역) 변수를 저장하는 공간
스레드는
자신만의 "프로그램 카운터(PC)"와 "레지스터 값"을 가지고 있어, 다른 스레드와 별개의 코드를 실행 가능하고,
자신만의 "스택"(공간)을 가지고 있어, 함수 호출 or 지역 변수 등이 스레드 간에 충돌하지 않도록 한다.
그래서 스레드는 각자 다른 명령어(코드)를 실행할 수 있어 병렬적으로 실행할 수 있다.
다만, "스레드 ID", "프로그램 카운터", "레지스터 값", "스택"을 제외한 프로세스의 자원을 공유하기 때문에
자원 접근 문제(경쟁 상태, 동기화 등)를 적절하게 잘 관리해야 한다.
프로세스의 스레드들은
실행에 필요한 정보(프로그램 카운터를 포함한 레지스터, 스택)만 가진 상태에서
프로세스의 자원을 서로 공유하며 실행된다.
즉, 스레드는 자신만의 값(프로그램 카운터, 레지스터, 스택)만 각자 챙겨오고 나머지는
프로세스 자원을 공유해서 사용하는 것이다.
비유하자면
사우나(프로세스)에서 사람(스레드)이 자신의 옷과 세면 도구(자신만의 고유 값)를 챙겨 와 자신만 사용하고
나머지는 사우나(프로세스)에서 제공하는 면봉, 수건, 헤어드라이기(자원) 등은 다른 사람(스레드)과 공유해서 사용
--
멀티프로세스와 멀티스레드
--
컴퓨터는
여러 프로세스를 동시에 실행할 수 있으며,
해당 프로세스는 동시에 여러 스레드를 동작 시킬 수 있다.
- 멀티프로세스 : 여러 프로세스를 동시에 실행
- 멀티스레드 : 여러 스레드를 동시에 실행
멀티프로세스로 단일 스레드 프로세스들을 실행하는 것과
단일프로세스로 멀티 스레드 프로세스를 실행하는 것의 차이
결과는 동일하지만
프로세스끼리는 기본적으로 자원을 공유하지 않고,
스레드끼리는 같은 프로세스 내의 자원을 공유하는 차이가 있다.
좌측 같은 경우
중복된 정보들이 각자 프로세스에 적재될 수 있어 메모리 낭비가 된다.
우측 같은 경우
하나의 정보를 해당 프로세스 내부에 있는 스레드끼리 공유해서 사용하므로 메모리를 효율적으로 사용할 수 있다.
다만 공유를 하기 때문에 하나의 스레드에서 장애가 발생하면 전체 스레드에 영향을 줄 수 있기 때문에
단점이 될 수도 있다.
--
'CS > 운영체제' 카테고리의 다른 글
프로세스 동기화 (0) | 2024.09.29 |
---|---|
CPU 스케줄링 알고리즘 종류 (1) | 2024.09.28 |
CPU 스케줄링 (0) | 2024.09.26 |
프로세스 (0) | 2024.09.23 |
운영체제, 커널, 모드, 핵심 서비스 (0) | 2024.09.02 |