Thread
반갑습니다
오늘은 Thread를 공부 할 것 입니다.
그 전에 알고 가야 할 지식
메모리 (Memory)
- 메모리는 프로그램이 실행되는 동안 데이터와 명령어가 저장되는 공간
- 주 메모리(RAM) 와 보조 메모리(HDD, SSD)로 구분할 수 있다
- 계층적 구조를 띄고 있습니다 (레지스터 -> 캐시 -> 주 메모리 -> 보조 메모리) - (용량, 접근 속도, 비용)이 절충 관계이다
- 주소를 통해 접근을 합니다
레지스터 (Register)
- 레지스터는 CPU 내부에 있는 매우 빠른 소형 저장 장치입니다.
- CPU가 연산을 수행할 때 직접 접근하는 가장 빠른 메모리이고
- 데이터와 명령어를 일시적으로 저장한다
힙(Heap)
- 힙은 프로그램 실행 중에 동적으로 할당되는 메모리 영역
- 런타임에 크키가 결정
- 프로그래머가 명시적으로 메모리를 할당 및 해제
- 메모리 누수나 댕글링 포인터가 발생할 수 있음
정적 영역(Static Area)
정적은 전역 변수와 정적 변수가 저장 되는 메모리 영역이다.
프로그램 시작 시 할당 종료 시 해제한다
구성 요소
데이터 세그멘트(.data)
- 초기값이 있는 전역 변수와 정적 변수가 저장된다
- 프로그램 시작 시에 이미 값이 할당 되어 있다.
BSS 세그멘트(.bss)
- 초기값이 없는 전역 변수와 정적 변수
읽기 전용 데이터 세그멘트 (.rodata)
- 상수, 문자열 리터럴 등 변경 되지 않는 데이터
스택(Stack)
함수 호출 및 로컬 변수 관리를 위한 임시 메모리 영역
자동화된 메모리 관리가 이루어지는 구역이다.
- 운영체제나 컴파일러에 의해 미리 결정된 제한된 크기
- 스택 오버플로우 발생
- 함수 진입/종료 시 자동으로 할당 및 해제
- 쓰레드 별 독립 스택 보유
프로세스 (Process)
프로세스는 실행 중인 프로그램이라고 생각하면 됩니다.
예를 들어 여러분이 사용하시는 Chrome, Melon, PPT 등 이 각각의 프로세스입니다.
프로세스의 특징
- 자신만의 독립된 공간을 가집니다.
- 다른 프로세스와의 자원을 공유하지 않고 분리됩니다.
그럼 Thread란 무엇일까요?
Thraed란 프로세스의 작업 단위라고 하는데..
쓰레드 (Thread)
쓰레드는 프로세스 내에서 실행되는 작은 작업 단위 입니다.
쓰레드 마다 고유한 ID가 존재합니다.
하나의 프로세스는 여러개의 쓰레드를 가질 수 있고
프로세스는 최소 하나의 메인쓰레드는 갖추어야 합니다. (보통 main 함수과 같다고 보면 될 것 입니다.)
쓰레드의 특징
- 같은 프로세스 내의 쓰레드들은 메모리를 공유한다.
- 쓰레드 간 통신은 빠르고 간결한다
쓰레드는 하나의 함수(동작) 자체를 각각의 Register로 처리할 수 있다고 보면 됩니다.
간단하게 생각해보면 음식점이 있습니다
요리사 -> 쓰레드
레시피 -> 함수
재료 -> 메모리 변수 및 상수
요리사가 1명인 식당에서 모든 주문을 받아야 한다면 시간이 오래 걸리겠죠 (싱글 코어)
하나의 요리를 만들고 다음 요리를 만들 수도 있고 여러 요리를 조금씩 번갈아 가며 만들 수도 있죠
요리사의 마음대로 동작 할 것 입니다. OS도 똑같습니다.
하지만 요리사가 4명인 식당에서 동일한 양의 주문을 받는다면 시간은 확실하게 줄어들 것 입니다( 멀티 코어)
여기 이 4명의 요리사도 여러 개를 번갈아 만들든 하나씩 순서대로 만들든 그건 요리사 마음이죠
OS도 똑같습니다.
절대적인건 하나의 코어는 한 번에 하나의 쓰레드만을 처리합니다.
이 말은 쓰레드 전체 동작을 처리 할 수 도 있고 한 쓰레드가 가지는 부분적인 코드만을 처리 할 수 도 있습니다.
이제 Thread 라는 것을 알고 있다면
Thread에 관한 deadlock, mutex 등에 관해 공부해 볼 것입니다.