앞에서 스레드에 관해서 알아보았다.
싱글스레드와 멀티스레드를 알아보기 위해 프로세스 메모리에 대해 잠깐 살펴보자
운영체제는 code, data, stack, heap 영역으로 메모리를 할당한다.
앞에서 알아본것과 같이 프로세스는 독립적으로 할당하기 때문에 공유하지 않는다.
그러나 스레드는
code, data, heap을 공유하고 stack만 할당 받는다.
싱글스레드
하나의 프로세스에 하나의 스레드가 실행
하나의 레지스터, 스택으로 표현된다.
*레지스터는 저장된 상태를 의미한다고 한다.
장점
- 문맥교환 (context switch)이 필요없다.
- 자원 접근에 대한 동기화에 신경 쓸 필요가 없다.
-> 프로세스의 자원에 여러 스레드가 접근을 시도하거나 작업을 할 때 오류가 나지 않도록 제어해주어야 한다.즉, 프로그래머가 힘들다.
- 프로그래밍 난이도가 쉽고, CPU, 메모리를 적게 사용한다.
단점
- 작업량이 많은 경우, 한 작업이 끝나야 다른 작업을 시작할 수 있다.
-> 게임 같은 경우 하나의 동작을 하면서 ui조작 같은 다른 조작을 할 수 있어야 한다.
- 싱글 스레드 모델은 에러처리를 못하면 멈춘다........
멀티 스레드
멀티스레드는 동시에 여러작업을 할 수 있다. 고 생각하면 편한다.
사실은 문맥교환(context switching)을 통해 번갈아가며 작업이 이루어지는 것 이지만 사용자가 보기에는 동시에 일어나는 것 처럼 보인다.
두 개 이상의 스레드가 프로세스 내부의 자원을 공유하여 작업을 수행!
장점
- 문맥교환이 빠르다
->프로세스에 비해 공유자원은 교환이 필요하지 않기 때문에 더 빠르다
- CPU활용
->이점은 싱글스레드의 단점이기도 한다. 다중 CPU구조에서 각 스레드가 다른 프로세서에서 병렬구조로 수행할 수 있다.
단점
- 동기화 문제
-> 공유 자원에 두 개 이상의 스레드가 동시에 접근한다면 다른 스레드의 값을 읽어 동기화 문제가 발생할 수 있다.
- 프로그래밍 난이도가 높고, 자원을 많이 사용한다.