스레드(Thread) 의 개념

  • 프로세스의 처리속도를 높이기 위해 하나의 프로세스가 수행해야 할 여러 작업들을 나누어 수행할 수 있도록 설계된 것이 스레드

    • 1개의 프로세스를 3개의 스레드로 구성한 것은 3개의 프로세스와 같은 처리속도를 낼 수 있다.
    • 프로세스는 자신만의 영역을 갖고 있지만, 스레드는 그렇지 않다.
      • 한 프로세스에 존재하는 모든 스레드들은 프로세스의 상태를 공유한다,
      • 즉, 스레드간의 별도의 통신이 필요하지 않다.(프로세스는 IPC필요)
  • Light Weight Process 라고도 함

  • 프로세스

    • 프로세스 간에는 각 프로세스의 데이터 접근이 불가(IPC필요)
  • 쓰레드

    • 하나의 프로세스에 여러개의 스레드 생성 가능
    • 스레드들은 동시에 실행 가능
    • 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능(IPC필요 없음)

image.png

스레드의 등장

커널 내의 스택이 하나이기 때문에 처리속도가 떨어지는 것을 걱정한 시스템 설계자는 커널스레드를 구상하기 시작했다. 커널스레드 각자가 스택을 가짐으로써 동시에 여러 프로세스나 커널 내부에서 수행을 할 수 있게 되는 것이다.

image.png

스레드(Thread) 의 동작

하나의 프로세스에서 가장 핵심이 되는 것은, PC(Progrem Counter)와 SP(Stack Pointer)이다. 스레드는 하나의 프로세스에 여러개가 생성되는데 과연 어떻게 동작을 하는 것 일까? 스레드는 각각의 스택영역을 가지고 있는 하나의 함수라고 생각하면 이해가 쉽다. heap,data,bss,code영역은 하나의 프로세스 내에서 공유하고 있다.

image.png

image.png

멀티 스레드

  • 소프트웨어 병행 작업 처리를 위해 Multi Thread를 사용한다.

image.png

멀티 프로세싱 vs Thread

  • 멀티 태스킹

    • cpu가 하나 있는데, 하나의 cpu가 수시로 프로세스를 변경하면서 프로그램을 실행하는 것 이다. (결과적으로 사람의 눈에는 모든 프로세스가 동시에 실행되는 것 처럼 보임)
    • 하나의 cpu가 여러 프로세스를 번갈아 가면서 실행
  • 멀티 프로세싱

    • 하나의 프로세스를 여러개의 cpu를 사용해서 실행 시키는 행위
    • 여러 cpu여러 프로세스를 병랭실행해서 속도를 높인다.
  • 멀티 쓰레드

    • 쓰레드를 여러 개 만들어, 멀티 코어를 통해 활용도를 높임
    • 실행속도 향상에 도움이 된다.

image.png

멀티 프레스스와 멀티 태스킹

image.png

스레드의 장단점

장점

    1. 사용자에 대한 응답성 향상

      • 하나의 프로세스를 생성 했는데, 해당 프로세스가 하는 일은 두가지가 있다. 하나는 1부터 100까지 더하는 기능이고, 다른 하나는 다른 프로세스가 지금까지 더한 수를 전달하는 기능이다. 두개의 기능을 각가 다른 쓰레드에 할당 시켜서 작업처리 시간 향샹을 올릴 수 있다.
      • 서버가 동시에 접속한 클라이언트에 대응하기 위해서 별도의 쓰레드를 생성해서 응답한다.(어떻게 하면 클라이언트들에게 빠르게 웹 페이지를 보여줄까?)

image.png

    1. 자원 공유 효율
  • ipc기법과 같이 프로세스간 자원 공유를 위해 번거러운 작업이 필요 없음
  • 프로세스 안에 있으므로 ,프로세스의 데이터를 모두 접근 가능

image.png

    1. 작업이 분리되어 코드가 간결

단점

    1. 스레드 중 한 스레드만 문제가 있어도, 전체 프로세스가 영향 받음

image.png

    1. 스레드를 많이 생성하면, context switching이 많이 일어나서 성능 저하

      • 예) 리눅스 os에서는 thread를 process와 같이 다룬다.
        • 스레드를 많이 생성하면, 모든 스레드를 스케쥴링해야 하므로, context switching이 빈번할 수 밖에 없다.

프로세스 vs 스레드

  • 프로세스는 독립적, 스레드는 프로세스의 서브셋
  • 프로세스는 각각 독립적인 자원을 가지는 반면 스레드는 프로세스의 자원 공유
  • 프로세스는 자신만의 주소영역을 가진다. 스레드는 주소영역 공유
  • 프로세스간에는 ipc기법으로 통신해야 한다. 스레드는 필요 없음

쓰레드의 동기화(Synchronization)

동기화 이슈 예제

  • 프로세스 안에는 여러개의 스레드가 형성
  • 프로세스 안에 있는 영역을 공유하게 된다.
  • 쓰레드 A,B,C가 있다고 가정하면, 공유하고 있는 프로세스 자원에 동기화 문제가 발생할 수 있다.
  • 쓰레드 A,B,C의 실행순서는 스케쥴러가 상황에 맞게 결정되기 때문에 동기화 문제 발생

교착상태(deadlocck)와 기아상태(Starvation)

교착상태란?

  • 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태
  • 배치 처리 시스템에서는 일어나지 않는 문제
  • 프로세스,스레드 둘다 이와 같은 상태가 일어날 수 있음
  • 예를 들어, 파이썬 코드상에서 쓰레드 A는 lock.acquire(a)를 통해서 a를 locking하고 내부에서 lock.acquire(b)를 하였다. 쓰레드 B는 lock.acquire(b)를 하고 내부에서 a를 사용한 후 lock.acquire(a)를 하도록 코드가 작성되어 있다.
    • 쓰레드 a는 a를 locing하고 b를 요청
    • 쓰레드 b는 b를 locking하고, a를 요청
    • 쓰레드 a가 자원 a를 소유, 쓰레드 b가 자원 b를 소유한 상태인데 각각 의 쓰레드는 서로가 서유한 쓰레드를 요청하기 때문에 무한대기상태에 빠지게된다.
      image.png

교착상태 발생 조건

다음 네 가지 조건이 모두 성립될 때, 교착상태 발생 가능성이 있음

  • 상호배제 : 프로세스들이 필요로 하는 자원에 대한 배타적인 통제권을 요구한다.
  • 점유대기 : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
  • 비선점 : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
  • 순환대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.

기아상태(starvation)

  • 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태
  • 교착상태와 기아상태
    • 교착상태는 여러 프로세스가 동일 자원 점유를 요청할 때 발생
    • 기아상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 영원히 자원이 할당이 안되는 경우를 의미