이론/기초

OS - 쓰레드

tsyang 2023. 8. 6. 20:47

컨텍스트 스위칭

 

프로세스와 마찬가지로 쓰레드도 컨텍스트 스위칭이 존재하는데, 프로세스보다는 훨씬 빠르다.

 

주된 이유는 캐쉬 메모리때문인데, 프로세스와 달리 쓰레드끼리는 스택영역을 제외한 메모리들을 공유하기 때문에 캐쉬 활용율이 높다.

 

+ 프로세스 전환에 비하여 일부 레지스터를 더 공유할 수 있긴 한데 이런 차이는 크지 않을 것.

 

.

 

커널모드 유저모드

 

프로세스는 독립된 메모리 공간을 갖는데, 시스템 함수 등의 호출을 위해서 본인에게 할당받은 메모리 공간을 벗어날 필요가 있다. 이런 경우를 지원하기 위해 커널모드가 있으며, 커널이 실행되어야 하는 경우에 프로세스가 커널모드에서 돈다. 커널에 접근할 필요가 없는 경우라면 프로세스는 유저모드에서 돌고, 커널 영역으로의 접근이 차단된다.

 

그러나, 이런 모드 전환은 꽤 무거운 작업이라 성능 이슈가 있을 수 있다. 참고로 커널모드와 유저모드는 OS가 제공하는 것이 아니라 프로세서가 제공하는 것이다.

 

.

 

커널레벨 쓰레드와 유저레벨 쓰레드

 

커널이 쓰레드를 만들고 관리한다면 커널레벨 쓰레드이다. 이런 경우 OS가 제공하는 시스템 함수 호출을 통해서 스레드 생성을 요구했을 것이다. OS의 스케줄러가 적용된다.

 

pros) 커널에서 제공하기 때문에 안저성 높고 기능 다양

cons) 커널에서 제공해주는거라 모드 전환이 빈번함. 그래서 성능 저하

 

 

반면에 커널이 쓰레드를 지원하지 않거나, 모종의 이유로 커널 쓰레드를 쓰고싶지 않다면 유저 레벨 쓰레드를 만들 수 있다. 유저 레벨 쓰레드는 유저 영역에서 돌아간다. 

 

pros)커널은 쓰레드 모름. 그러니까 모드 전환도 없음. 그래서 빠름

cons)프로세스 하나에 100개의 쓰레드가 있는데, 하나가 시스템 함수를 호출해서 커널이 블로킹함. 그러면 나머지 99개도 실행되지 않음. 프로세스 전체가 블로킹 되는거임. 커널 입장에서는 프로세스만 알고 안에 몇 개의 쓰레드가 있는지 알 방법이 없기 때문이다. 이것도 해결방법이 있지만 결국 구현이 어렵고 에러가 발생하기 쉽다.

 

.

 

쓰레드는 얼마나 생성할 수 있는가?

 

윈도우즈의 경우 메모리가 허용하는 만큼 생성할 수 있다. 쓰레드 생성 시 스택 사이즈를 지정해줄 수 있으며 지정해준 스택 사이즈가 클 수록 스레드 할당에 소모되는 메모리 양도 늘어난다.

 

.

 

쓰레드의 소멸

 

쓰레드 함수에서 return을 만나면 쓰레드는 종료 및 소멸한다. main 쓰레드의 종료는 프로세스의 종료로 이어진다.

 

명시적으로 ExitThread를 호출하여 쓰레드를 종료할 수 있음 (return을 쓰기 어려운 경우)

 

외부 코드에서도 특정 쓰레드를 종료시킬 수 있는 기능이 제공되기도 하는데, 이걸 쓰는 경우 코드 구조에 문제가 있을 확률이 높다.

 

쓰레드를 종료할때는 리소스를 잘 정리했는지 체크해야 한다.

 

.

 

쓰레드 동기화

 

https://tsyang.tistory.com/106

 

CLR 단순 동기화1

스레드 동기화 스레드 동기화는 일반적으로 다수의 스레드가 공유 데이터에 '동시에' 접근하는 경우에도 데이터가 손상되는 것을 막기 위해서 사용된다. 그러나 스레드 동기화는 많은 문제를

tsyang.tistory.com

 

 

'이론 > 기초' 카테고리의 다른 글

OS - 라이브러리  (0) 2023.08.20
OS - 메모리 관리 기초  (0) 2023.08.13
OS - 프로세스  (0) 2023.07.30
아스키코드 & 유니코드  (0) 2023.07.23
컴퓨터 구조 기초 - 4  (0) 2023.07.16