앞에서 스레드에 관해서 알아보았다.
싱글스레드와 멀티스레드를 알아보기 위해 프로세스 메모리에 대해 잠깐 살펴보자
![](https://media.vlpt.us/images/dovra_/post/345d2d30-5631-4f9d-9d33-d7dc98aab709/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-04-02%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.34.31.png)
운영체제는 code, data, stack, heap 영역으로 메모리를 할당한다.
앞에서 알아본것과 같이 프로세스는 독립적으로 할당하기 때문에 공유하지 않는다.
![](https://media.vlpt.us/images/dovra_/post/e04c3f61-1b1b-4967-9874-10e13db1cd49/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-04-02%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.35.39.png)
그러나 스레드는
code, data, heap을 공유하고 stack만 할당 받는다.
싱글스레드
하나의 프로세스에 하나의 스레드가 실행
하나의 레지스터, 스택으로 표현된다.
*레지스터는 저장된 상태를 의미한다고 한다.
장점
- 문맥교환 (context switch)이 필요없다.
- 자원 접근에 대한 동기화에 신경 쓸 필요가 없다.
-> 프로세스의 자원에 여러 스레드가 접근을 시도하거나 작업을 할 때 오류가 나지 않도록 제어해주어야 한다.즉, 프로그래머가 힘들다.
- 프로그래밍 난이도가 쉽고, CPU, 메모리를 적게 사용한다.
단점
- 작업량이 많은 경우, 한 작업이 끝나야 다른 작업을 시작할 수 있다.
-> 게임 같은 경우 하나의 동작을 하면서 ui조작 같은 다른 조작을 할 수 있어야 한다.
- 싱글 스레드 모델은 에러처리를 못하면 멈춘다........
멀티 스레드
멀티스레드는 동시에 여러작업을 할 수 있다. 고 생각하면 편한다.
사실은 문맥교환(context switching)을 통해 번갈아가며 작업이 이루어지는 것 이지만 사용자가 보기에는 동시에 일어나는 것 처럼 보인다.
두 개 이상의 스레드가 프로세스 내부의 자원을 공유하여 작업을 수행!
장점
- 문맥교환이 빠르다
->프로세스에 비해 공유자원은 교환이 필요하지 않기 때문에 더 빠르다
- CPU활용
->이점은 싱글스레드의 단점이기도 한다. 다중 CPU구조에서 각 스레드가 다른 프로세서에서 병렬구조로 수행할 수 있다.
단점
- 동기화 문제
-> 공유 자원에 두 개 이상의 스레드가 동시에 접근한다면 다른 스레드의 값을 읽어 동기화 문제가 발생할 수 있다.
- 프로그래밍 난이도가 높고, 자원을 많이 사용한다.