Thread
스레드가 뭘까? 왜 있는걸까?
싱글 프로세스는 멀티코어 CPU의 장점을 활용할 수가 없다.
새로운 프로세스를 만드는데는 많은 자원이 필요하다. (시간, 메모리 공간)
프로세스간의 통신 오버헤드가 크게 발생한다.
프로세스간에 context swiching 비용이 크다.
위와 같은 프로세스의 단점을 보완하기 위해서 스레드가 탄생했다.
하나의 프로세스는 여러개의 스레드를 가질 수 있다.
프로세스는 각자의 고유 메모리를 가지고 있기 때문에 프로세스 내부의 스레드들은 하나의 메모리 공간을 공유한다.
그리고 스레드는 각자의 program counter와 stack pointer를 가진다.
위 사진처럼 스레드가 많아질 수록 프로세스의 메모리 공간이 각각의 stack공간으로 채워짐을 알 수 있다.
그리고 스레드들은 각자의 레지스터를 가질 수 있다.
스레드의 장점
- 프로세스보다 context switching 속도가 빠르다. - 매우 큰 장점. 스레드가 존재하는 이유
- 프로세스내의 자원들을 스레드끼리 공유하기 때문에 스레드간의 통신 오버헤드가 적다.
-> 주로 프로세스의 자원을 공유하기 때문에 얻는 이점이 크다.
스레드의 단점
- 자원을 공유하기 때문에 공유된 자원에 2개 이상의 스레드가 동시에 접근할 경우 Race condition(병행성 문제)이 발생할 수 있다.
예를 들어 특정 공유 변수 i의 값을 증가시키는데 2개의 스레드가 관여하는 상황을 생각해 보자
위키피디아 예시를 참고했습니다
- 공유되는 변수 i의 값을 레지스터에 저장
- 레지스터의 값을 1 증가시킨다.
- 변수 i에 그 값을 저장한다.
스레드 | 동작 | i값 | 스레드 1의 레지스터 | 스레드 2의 레지스터 |
스레드 1 | i의 값을 레지스터에 저장 | 0 | 0 | |
스레드 2 | i의 값을 레지스터에 저장 | 0 | 0 | 0 |
스레드 1 | 레지스터 값을 1 증가 | 0 | 1 | 0 |
스레드 2 | 레지스터 값을 1 증가 | 0 | 1 | 1 |
스레드 1 | i에 값 저장 | 1 | 1 | 1 |
스레드 2 | i에 값 저장 | 1 | 1 | 1 |
스레드 1과 스레드 2가 i값을 증가시켜서 최종적인 i값이 2가 되는것을 기대했다.
하지만 race condition이 발생해서 스레드 2는 스레드 1에서 증가된 i값을 받아오지 못하고 초기 i값을 받아서 1을 증가시켰다.
위와 같은 오류는 디버깅을 하기 매우 까다롭다는 특징이 있다.
스레드의 개념과 특징, 장단점을 알아보았다.
단점이 있으면 해결방안도 존재한다. 해결방안을 궁금해하자
다다다음 포스팅에서 다루려고 한다.
'CS > OS' 카테고리의 다른 글
[OS] Scheduling #2 (0) | 2021.07.10 |
---|---|
[OS] Scheduling #1 (0) | 2021.07.09 |
[OS] Process #3 (Context Switching) (0) | 2021.07.07 |
[OS] Process #2 (0) | 2021.07.06 |
[OS] Process #1 (0) | 2021.07.05 |