: 프로세스의 실행 단위. 프로세스 내 주소 공간이나 자원 공유.
- 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성
- 다른 스레드와 stack, PC register 제외 나머지 영역 공유해 상호간 통신
- 프로세스와 비교했을 때 context switch 시간이 짧음(캐시를 비우지 않아도 됨)
- 스레드 크기는 1MB. 프로세스에 할당되는 한 어플리케이션 메모리 최대한도가 일반적으로 2GB이므로약 2천개가 최대?
- 따라서, 스레드 생성 불가라는 에러는 메모리 문제
멀티 스레드
: 프로세스 내에 다수의 스레드가 존재해, 자원을 공유해 수행 능력을 향상 시키는 것.
스레드마다 독립적으로 할당받는 것
- 스택 영역
- 로컬 변수, 되돌아갈 함수 주소, 매개변수 인자 등 함수 내에서 사용하는 것들을 저장하는 공간이므로 독립적으로 함수를 호출하기 위해.
- 따라서 스레드마다 독립적인 실행 흐름을 갖게 됨.
- PC 레지스터
- 스레드가 명령어 어디까지 수행했는지를 저장.
- PCB에서 CPU 레지스터 중 하나.
- 독립적인 흐름 내에서 각 스레드가 어디까지 수행했는지를 알기 위해 이 부분을 독립적 할당
멀티 스레드에서 스레드간 통신방법
: 스레드간 통신이 필요한 경우 별도 자원을 사용하진 않고, data영역과 heap영역, code영역을 공유.
- 프로세스간 통신 방법에 비해 간단함.
- 프로세스간 통신(IPC)에는 공유 메모리 사용, 메시지 큐, 소켓 등 다른 기법들이 존재
- context switch시 캐시 메모리를 비울 필요 없음. -> context switch 빠름
멀티 스레드 문제점
- 데이터, 힙을 공유하기 때문에 공유 자원(임계영역)에서 의도하지 않은 값을 불러오는 경우가 발생할 수 있음
- 동기화 작업이 필요(스핀 Lock, Mutex, Semaphore 등) => 과도할 경우 성능 저하
멀티 스레드 vs 멀티 프로세스
- 멀티 스레드
- 하나의 프로세스 내부에서 여러 스레드 동시 수행
- 동기화 문제: 스레드 하나 종료시 전체 스레드 종료
- 멀티 프로세스
- 멀티 쓰레드처럼 여러 개의 CPU 사용해 동시 수행.
- 동기화 문제: 하나의 프로세스 종료 시 다른 프로세스에 영향 없음. 그러나, 많은 메모리, CPU 시간 차지
- 차이점을 이해하고, 시스템에서 적절한 것을 선택해야 함
병렬성과 동시성
- 병렬성: 실제로 동시에 병렬적으로 처리하는 Task 수는 CPU의 코어 수이다. 2 코어라고 한다면, 두 task에서 수행되는 쓰레드들은 병렬적이라고 볼 수 있다.
- 동시성: 한 코어 내에서 아주 빠른 context switch를 발생시키며 동시에 처리하는 것처럼 보이는(엄밀히 말하면 아니다) 멀티스레드의 환경은 동시성의 특징을 갖는다.
Reference)
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#cpu-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%9F%AC
https://goodgid.github.io/What-is-Thread/