티스토리 뷰

CS/OS

5. Thread(스레드)

Sueaty 2020. 1. 10. 19:49

이 글은 스레드 대해 다루겠습니다. OS? Oh Yes! 서적 기반, 숙명여대 김주균 교수님 강의, Chegg 등을 정리했습니다. 공부한 것을 정리하는 형식으로 작성되었으므로 오류가 있을 수 있습니다. 오류 발견시 댓글로 꼭 말씀해주세요! 시작해볼까요?

Thread (스레드)

지난 글은 프로세스를 다뤄보았습니다. 오늘 정리할 스레드는 프로세스와 매우 관련이 깊으니 그 관계를 예시를 통해 살펴보겠습니다. 유튜브를 시청할 때 동영상도 나오지만 옆에 추천 영상도 뜨고, 하단에는 댓글란과 광고 배너들이 동작하죠. 이렇게 유튜브라는 큰 프로세스에 각각의 작은 일, 즉 스레드가 작동하는 것이라고 생각하면 쉬울 것 같습니다. 

 

 [ Multi-Threading ] (다중스레딩) 

한 프로세스에 속한 여러 스레드들은 프로세스가 가지는 자원(주소 공간도 자원의 종류)을 공유하면서도 스레드 각자의 실행환경(PC값, 스택, 레지스터 값들)을 따로 가지게 됩니다. 아래의 그림에서 알 수 있겠지만 하나의 프로세스 내에 있는 스레드들은 자신만의 Thread Control Block(스레드 제어 블록)과 스택을 가집니다. 그러면서 자신이 속한 프로세스의 PCB와 사용자 주소 공간은 공유하고 있습니다. 즉, 자신이 속한 프로세스의 상태와 자원들은 자연스럽게 공유가 되는 것입니다.

 

단일 스레드와 다중 스레드 프로세스

스레드의 가장 큰 장점은 작은 일들 각각을 프로세스로 만드는 것 보다 스레드로 만들었을 때 더 저렴해서 시스템의 성능을 향상 시킬 수 있다는 것입니다. 또한 프로세스들 간의 통신(Inter Process Communication)을 위해서는 커널의 개입을 필요로 하지만 한 프로세스 내에 있는 스레드들은 메모리와 파일을 공유하므로 통신시 커널의 개입이 필요없기 때문에 큰 이점이 됩니다.

 

 [ Thread State] (스레드의 상태) 

스레드는 실행, 준비, 대기와 같은 상태를 가지지만 보류는 프로세스 레벨에 존재하는 개념이라 스레드에는 존재하지 않습니다.

 

 [ Synchornization ] (동기화) 

한 프로세스에 속해있는 여러 스레드들은 프로세스의 주소공간과 자원들을 공유한다고 말했습니다. 그렇기 때문에 한 스레드가 공유되는 자원의 내용을 변경시키면 다른 스레드들에게 영향을 미치게 됩니다. 이 때문에 발생할 수 있는 오류 및 데이터의 파괴등을 방지하기 위해 스레드 실행의 동기화가 요구됩니다. 스레드 동기화 문제에 대한 해결책은 프로세스 간의 동기화에서 발생하는 문제의 해결책과 같으므로 뒤에 나올 '병행 프로세스와 동기화'에서 더 깊이 알아보겠습니다.

 

스레드의 종류

사용자 레벨과 커널 레벨 스레드

(a)는 pure user-level thread로 사용자 레벨 스레드이고 (b)는 pure kernel-level thread로 커널 레벨 스레드입니다. (c)의 경우는 앞의 두 스레드 종류를 합친 것인데 사용자 레벨 스레드와 커널 레벨 스레드에 대해서 알아보겠습니다. 둘의 차이를 간단히 구분 하자면 운영체제가 스레드의 존재를 아느냐 모르나느냐의 차이라고 생각하면 될 것 같습니다. 사용자 레벨 스레드에서는 운영체제가 스레드의 존재를 모르고, 커널 레벨 스레드에서는 스레드의 존재를 압니다.

 [ User Level Thread ] (사용자 레벨 스레드) 

사용자 레벨 스레드는 스레드 라이브러리에 의해 관리가 되고 위 그림에서 볼 수 있듯이 스레드와 관련된 모든 행위들은 user space(사용자 공간)에서 이루어지므로 커널의 입장에서는 어떤 스레드가 무슨 행위를 했던 간에 그 스레드가 속한 프로세스가 한 행위로 인식을 하게 됩니다. 

어떤 스레드가 실행 중에 대기 상태가 되면 자신이 속한 그 프로세스 전체의 대기를 초래하게 됩니다. 이 때 실행 중이던 스레드는 스레드 라이브러리에 의해 실행으로 간주되고 있다가(대기지만) 다시 이 프로세스가 CPU를 할당받으면 이어서 실행을 할 수 있게끔 도와줍니다. 만약 스레드 실행 중 프로세가 시간 초과가 될 경우 커널은 프로세스 스위칭을 수행하게 되는데 이때도 아까와 마찬가지로 스레드 라이브러리에 의해 실행으로 간주되고 있다가 다시 CPU가 할당되면 스레드는 작업을 이어갑니다. 또 이런 경우가 있을 수도 있겠죠? 스레드 스위칭이 일어나는 도중 프로세스 스위칭이 일어날 수도 있습니다. 이때도 마찬가지로 CPU를 할당받으면 이어서 스레드 스위칭이 일어나게 됩니다.(스레드 스위칭도 스레드 라이브러리가 관리함)

사용자 레벨 스레드의 장점은 다음과 같이 정리할 수 있습니다.

  • 스레드 스위칭 시 커널의 개입이 필요가 없음.
  • 스레드 스위칭 시 운영체제가 정한 스케줄링을 따를 필요가 없고 독자적인 스케줄링 사용 가능(스레드 라이브러리의 역할)

사용자 레벨 스레드의 단점은 다음과 같이 정리할 수 있습니다.

  • 한 스레드의 대기로 인해 전체 프로세스가 대기를 초래
  • 다중처리 환경이여도 한 프로세스에 있는 여러 스레드마다 CPU를 할당 받지 못하니 동시에 실행될 수 없음

 [ Kernel Level Thread ] (커널 레벨 스레드) 

사용자 레벨 스레드의 관리를 스레들 라이브러리가 했다면 커널 레벨 스레드의 관리는 커널이 합니다. 사용자 레벨 스레드는 한 프로세스 내 스레드가 여럿 있어도 하나의 CPU밖에 할당 되지 않는 단점이 있었습니다. 이를 커널 레벨 스레드에서는 극복이 가능합니다. 왜냐하면 스레드를 커널이 관리하므로 한 프로세스에 있더라도 각 스레드마다 처리기를 할당 받아 병렬 실행이 가능하기 때문입니다.(장점) 하지만 스레드 스위칭을 커널이 관리하기 때문에 유저모드 → 커널모드 → 유저모드로의 커널 개입이 요구됩니다.(단점)

 

 

사진 출처 : OS? Oh Yes! 본문 그림 3.3, https://www.crocus.co.kr/1255

'CS > OS' 카테고리의 다른 글

7. 병행 프로세스와 동기화 ①  (2) 2020.01.11
6. CPU 스케줄링  (0) 2020.01.11
4. Process (프로세스)  (0) 2020.01.10
3. 들어가기 전에 ③  (0) 2020.01.09
2. 들어가기 전에②  (0) 2020.01.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함