computer science

[OS] 운영체제 Thread management

yjs3819 2021. 7. 20. 11:13
728x90

쓰레드에 대해서 알아보자.

프로세스와 쓰레드

프로세스는 자원을 할당받고, 프로세스는 자원을 제어한다.
여기서 자원의 제어를 맡는 부분이 쓰레드이다. (쓰레드는 실이란 의미로 ~로 표시한다.)

하나의 프로세스엔 여러개의 쓰레드가 존재할수 있어서, 여러개의 자원을 동시에 제어할수 있다.

쓰레드의 개념

쓰레드는 공유자원에 대해서 제어할수 있다.

싱글 쓰레드

프로세스내 쓰레드가 한개여서 공유 자원에 대해서 하나의 쓰레드로만 제어하는 것을 싱글 쓰레드라한다.

쓰레드에는 이렇게 자원을 제어할수 있는 제어정보가 존재한다.

멀티 쓰레드

프로세스 내 쓰레드가 여러개있어서 공유자원에 대해서 여러개의 쓰레드가 동시에 제어할수 있다. 이를 멀티 쓰레드라한다.

쓰레드가 프로세스의 메모리공간에 어떻게 존재하는지, 공유데이터를 어떻게 접근하는지에 대한 그림이다.

쓰레드 정리

  • Light Weight Process
    프로세스는 자원을 할당받아 제어도하는 반면 쓰레드는 공유 자원에 대해서 제어만하기 때문에 프로세스보다 경량이므로 LWP라 부른다.
  • 프로세서(CPU)활용의 기본단위이다.
  • 구성요소
    쓰레드 내에는 프로세스의 ID와, Program Counter, Stack pointer등이 존재한다.
  • 제어 요소 외 공유 자원(코드, 데이터 및 자원들)은 프로세스 내 다른 쓰레드와 함께 공유한다.
  • 전통적인 프로세스는 단일 쓰레드 프로세스이다.

쓰레드 장점

  • 사용자 응답성
    공유자원을 제어할수 있는 쓰레드가 여러개이기 때문에 쓰레드 하나의 처리가 지연되더라도, 나머지 쓰레드는 작업을 계속 처리 가능하다.

    게임을 하는데 마이크에대한 쓰레드의 처리가 지연되더라도 마우스에 대한 다른 쓰레드는 계속작업을 하기에, 마이크로 내 음성이 전송은 되지 않아도 마우스로 총을 쏠수있다.

  • 자원 공유
    자원을 공유하므로 효율성이 증가한다. ---? 무슨말일까?

    하나의 자원에 대해서 프로세스는 하나만 접근할수 있고 다른 프로세스가 자원에 대해 접근하려면 context switching비용이 발생한다. 그런데 하나의 프로세스 내에 여러개의 쓰레드가 자원에 접근하면 위와 같은 context switching비용이 발생하지 않아서 효율성이 증가한다.

  • 경제성
    프로세스의 생성, context switch에 비해 효율적이다. (프로세스보다 더경량이고, context switch비용이 발생하지 않으므로)
  • 멀티 프로세서 활용
    여러개의 cpu core에 대해서 여러개의 쓰레드가 동시에 병렬로 처리할수 있으므로 시스템의 효율은 더 증가 될수 있다.

쓰레드 사용의 예

  • 프로세스 내에 쓰레드가 단 하나밖에 없다면?

    하나의 자원에 대해서 한번에 하나씩만제어 할수있다. 그래서 게임을 하다가 마우스를 움직이면 (running -> blocked상태로 프로세스 변경) 게임화면이 멈추는 답답함을 느낄수있다.
  • 프로세스 내에 쓰레드가 여러개면?

    여러개의 자원을 쓰레드가 하나씩 맡아서 제어할수 있기 때문에 동시에 자원을 사용할수 있게 된다.

쓰레드의 구현

  • 사용자 수준의 쓰레드
  • 커널 수준의 쓰레드

사용자 수준 쓰레드(User Thread)

  • 사용자 영역의 스레드 라이브러리로 구현된다.
  • 커널은 스레드의 존재자체를 모른다.
    커널이 관리하지않기 때문에 관리의 부하가 더적고, 더 유연하다.
    이식성이 높은데, 스레드 라이브러리만 있으면 어디에서든 멀티 쓰레드 프로그램을 어디서든 사용할수 있다.(like OS상관없는 JVM)
  • 사용자수준의 쓰레드 N : 커널수준의 쓰레드 1
    다대일 이므로 하나의 스레드가 block상태가되면 모든 스레드가 대기하는 단점이 있다.

커널 수준 쓰레드(Kernel Thread)

  • Kernel이 직접관리한다.
  • 커널 영역에서 쓰레드 생성 및 관리를 한다.
    커널 영역이므로 여러개의 쓰레드가 cpu를 사용하는데 쓰레드 context swtich비용이 발생해서 overhead가 크다.
  • 커널이 각 쓰레드를 개별적으로 관리한다.
    이는 하나의 스레드가 block상태가 되어도 나머지 쓰레드는 계속 작업을 수행할수 있다는 의미이다.

혼합 쓰레드(Multi-Threading Model)

  • 사용자수준 쓰레드(n : 1) + 커널 수준 쓰레드(1 : 1) = 다대다(n : m)모델
  • 사용자 수준의 쓰레드의 장점인 원하는 만큼의 스레드를 사용할수있다.
  • 커널 수준의 쓰레드의 장점인 하나의 스레드가 block상태가 되더라도 다른 스레드는 수행가능하다.

혼합 쓰레드는 효율적이면서도 유연하기에 요즘 OS들은 혼합형 쓰레드를 사용한다.

정리

OS가 쓰레드를 어떻게 관리하는지 정리하기위해 쓰레드가 뭔지, 쓰레드를 왜 사용하는지, 그리고 쓰레드 종류와 실제 쓰레드가 어떻게 구현되어있는지에 대해서 알아보았다. 쓰레드는 공유 자원에 대해서 여러개의 쓰레드가 동시에 제어할수 있다는 장점을 통해서 프로세스의 context switch 비용을 줄여주기에 효율적이고 cpu에대해서 병렬처리가 가능해서 시스템 자체의 효율을 높일수 있고 사용자 응답성도 좋게 만드는 다양한 장점을 가지고 있다. 그러나 공유자원에 대해서 여러개의 쓰레드가 동시에 접근하는 동시성문제는 어떻게 해결할지 고민이 된다.

김덕수 교수님의 운영체제 강의

https://www.youtube.com/watch?v=YlnvCIZQDkw&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index

728x90