Thread

[스레드의 개념을 알아보자!]

스레드(Thread)

프로세스 내부의 CPU 수행 단위

  • 보통 프로세스가 하나 주어지면 code, data, stack으로 구성된 주소공간이 프로세스마다 만들어지고, 프로세스를 관리하기 위해 운영체제 내부에 프로세스의 상태를 나타내는 PCB를 가지고 있다.

  • 주소공간은 하나만 띄워놓고, instruction을 실행하기 위해 program counter만 여러 개를 두어 현재 어느 부분의 code를 수행하고 있는지를 나타내고, 그 CPU에서 실행되면서 메모리에 register에 어떤 값을 가지고 있는지를 가진다.

  • 프로세스 하나에서 공유할 수 있는 건 최대한 공유하고(메모리 주소공간, 프로세스 상태, 사용하는 자원), 나머지는 별도로 가진다.(register, stack, program counter)

Thread의 구성

  • program counter
  • register set
  • stack space

Thread끼리 서로 공유하는 부분(task)

  • code section
  • data section
  • OS resources

프로세스를 별도로 두는 것보다 프로세스안에 스레드를 여러개 두는 게 훨씬 가볍기 때문에 프로세스를 스레드로 관리하게 되면 그 스레드를 lightweight process라고 부르고, 전통적인 개념의 thread는 heavyweight process라고 부른다.

스레드의 장점

  • 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.

  • Responsiveness(응답성)
    • 하나의 프로세스안에 스레드를 여러개 두게 되면 스레드 하나가 blocked 상태일 때에도 다른 스레드가 CPU를 잡고 running을 할 수 있어서 응답시간이 빨라진다.
    • ex) web을 띄워놓고 홈페이지 주소를 치게 되면 가장 먼저 html문서가 날아오게 된다. 이를 display하려고 할때 embedded된 image들이 있는데 이를 web이 해석을 해서 다시 서버에 image를 요청한다. 이를 모두 완성시킨 후에 사용자에게 html을 보여준다.
    • 스레드가 html요청 -> html요청한 스레드만 blocked -> 다른 스레드가 서버에게 image요청 -> image를 가져오는 동안 텍스트를 먼저 display해준 후에 image가 돌아오면 나중에 뿌려줌
  • Resource Sharing(자원 공유)
    • 같은 일을 수행하는 작업을 별도의 프로세스로 여러개 만들게 되면 각 프로세스마다 독자적인 주소공간이 만들어져야 하기 때문에 메모리공간(자원)이 낭비되게 된다. 반면 하나의 프로세스에 스레드만 여러개를 두면 자원을 공유함으로써 낭비를 줄일 수 있다.
  • Economy(경제성)
    • 응답성하고 약간 다른 의미
    • 프로세스를 하나 만드는 것도 오버헤드가 상당히 큼. 하지만 프로세스 하나에 스레드만 추가하는 것은 약간 숟가락만 얹는 느낌적인 느낌으로 오버헤드가 크지 않다.
    • context switch를 할 때에도 PCB에 정보를 저장하고, cache flush때문에 오버헤드가 크다. 하지만 내부에서 스레드간에 switch가 일어나는 것은 대부분의 문맥을 그대로 가져다 사용하므로 오버헤드가 작다.
  • Utilization of MP Architectures(멀티프로세서 환경)
    • 위의 장점들은 CPU가 하나인 환경에서도 적용 가능한 일반적인 이야기지만, 이 장점은 CPU가 여러 개 있는 환경에서 스레드를 두었을 때 얻을 수 있는 장점이다.
    • 이례적인 경우(CPU가 여러개 달린 컴퓨터같은)에 스레드를 사용하면 병렬성을 높일 수 있다.(ex)1000x1000 행렬의 연산을 할 경우 각각의 행과 열의 곱을 각각의 CPU에 할당할 수 있다.)

스레드를 구현할 수 있는 방법

  • Kernel Threads(kernel의 지원을 받아 구현)
    • 스레드가 여러 개 있다는 사실을 운영체제의 kernel이 알고 있다.
    • 하나의 스레드에서 다른 스레드로 CPU가 넘어가는 것도 kernel이 CPU scheduling을 하듯이 넘겨준다.
  • User Threads(library 형태로 구현)
    • 스레드가 여러 개 있다는 사실을 운영체제가 모른다.
    • User program이 스스로 여러 스레드들을 관리한다.
    • kernel이 볼 때는 그냥 일반적인 프로세스로 보이지만 프로세스가 내부적으로 스레드를 여러 개 두기 때문에 약간 제약점이 있을 수 있다.
  • Real-time Threads

© 2019. All rights reserved.

Powered by Hydejack v8.5.2