본문 바로가기
Operating System

Thread

by mangstory 2021. 5. 16.

Concurrency vs Parallelism

Concurrency : 동시성,병행성

  • 동시에 진행된다.
  • 즉 (a)를 보면 단일 프로세서에서 여러 thread의 프로세스들이 interleaving(끼어들기)하며 동시에 진행이 되고있다고 표현한다.
  • concurrency는 parallelism까지도 표현하는 용어이다.

 

Parallelism : 병렬성

  • 동시에 실행된다.
  • 즉 (b)를 보면 다중 프로세서에서 여러 thread의 프로세스들이 interleaving과 overlapping을 하며 동시에 실행되고 있다.

Thread

현대의 OS는 프로세스와 thread의 개념을 분리한다.

process는 스케줄링의 단위(실행단위)이면서 자원소유권의 단위이다.

thread의 개념을 도입하여, 자원소유권을 process로 칭하고 스케줄링의 단위를 thread 혹은 LWP(light weight process)로 칭할 것이다.

한 프로그램 내에서 execution sequence를 여러개 만드는 것을 multi threading이라고 한다.

 

 

 

 

한 프로세스 내에 여러개의 thread가 존재할 수 있다.

 

 

 

한 프로세스내의 여러 thread는 code,data,heap을 공유한다!

각각의 thread는 execution stack(user/kernel)만 배타적으로 가지고 있다.

 

TCB

Thread control block : thread를 관리하기 위해 필요한 정보들의 집합

PCB에 있는 정보들이 분리되어 thread에 관련된 별도의 TCB가 유지된다. PCB에서 공유하면 안되는 부분을 TCB로 특정하면 TCB의 사이즈는 굉장히 작아져 LWP가 된다.

shared information : processor info,memory,I/O and file

private information : processor state information, scheduling and state information

여기서 private information을 TCB라고 한다.(공유될 수 없음)

 

 

LWP

Thread의 별칭!

새로운 프로세스를 만드는 것보다 이미 존재하는 프로세스에 새로운 thread를 생성하는 것이 훨씬 적은 시간이 소요된다.

또한 terminate에서도 마찬가지이다.

이러한 내용을 담아 'Light weight process'라고 부른다.

 

 

[Multithreaded Process Model]

 


process에 하나의 thread가 있으면 단일 thread라고 한다.

Multi-threading (web server)

 

Web server에서 세 가지 threading 유형을 비교해보자.

 

single-thread / single-process

  • client의 connection을 기다리고 연결이 되면 awake된다. 연결이 될 때까지 무한정 기다려야 한다.

single-thread / multi-process

  • client의 connection을 기다리면서 다른 process를 통해 또 다른 client의 connection을 기다릴 수 있다. 하지만 시간적,공간적 비용이 multi-thread에 비해 많이 든다.

multi-thread / single-process

  • client의 connection을 기다리면서 프로세스내의 또 다른 thread를 통해 다른 client의 connection을 기다릴 수 있다. 시간적,공간적 측면에서 위 두 가지에 비해 효율적이다.(light-weight하다)

 

Thread 장점

1. 응답성

한 application은 background에서 events를 기다리며 계속 실행을 이어갈 수 있다.

single-thread는 events를 기다리면서 다른 작업을 할 수 없지만 multi-thread는 다른 작업을 동시에 수행할 수 있다.

-> overlapping이 가능하다.

multi-thread 지원하지 않으면 그만큼 delay가 늘어난다.

 

2. 확장성

같은 application도 여러개의 처리기를 통해 수행될 수 있다.

한 프로세스는 module단위로 작업을 나누어 여러개의 CPU를 통해 parallel하게 수행될 수 있다.

따라서 작업이 용이하다는 장점이 있다.

 

 

<위 그림을 보고 알 수 있는 것>

1) thread 개수를 무조건 늘린다고 성능이 항상 좋은 것은 아니다. (프로세서의 개수와 동일할 때 가장 빠르다고 보여짐)

2) 분산처리는 작업 후 merging하는 과정이 있는데 한 thread가 오래걸리면 나머지들도 기다려야 한다.

3) single core보다 dual core일 때 성능이 2배보다 작다. 병렬처리하는 영역은 성능이 향상되지만 순차처리되는 영역은 linear하게 실행된다.

 

3. 시간적,공간적으로 경제적

multi-processing에 비해 PCB를 생성하는 것이 아니라 TCB와 stack만 생성하기에 시간적,공간적으로 비용이 적게든다.

 

4. 자원 공유(communication cost가 낮다)

data를 공유한다 즉 전역변수를 공유한다.

process끼리 전역변수는 공유가 되지 않아 system call을 써야한다. (fork후 cow하기 때문이다)

하지만 thread끼리는 전역변수를 공유하기 때문에 communication cost가 낮다.

 


Thread Implementation

  • ULT(User-level thread)
  • KLT(Kernel-level thread)
  • Combined

 

Kernel-Level Threads (KLTs)

  • Thread를 management(creation,termination,synchronize)할 때 kernel에 의해 control된다.
  • kernel이 해당 thread의 상태 등 모든 정보를 알고있다. 
  • window,solaris가 이런 방식 사용. posix는 user/kernel level thread 둘 다 지원
  • 1:1 scheduling 이라고 부른다.(user space thread:kernel space thread)

단점 : user level thread에 비해 느리다(system call 요구) -> mode switch 때문

 

kernel-level threads는 user에 비해 느리고 process에 비해 빠르다

User-Level Threads (ULTs)

library 형태로 application level에서 구현

kernel은 몰라. 단일쓰레드(메인쓰레드)만ㅁ 있는 걸로 알아

함수 call하는 것과 동일한 속도

user level에서 구현할 수 있는 가장 직관적인 방법 : timer

kernel의 개입없이 user level에서 수행되기 때문에 mode switch가 필요없어서 빠르다.

상대적으로 코딩쉬움, customizing 용이

단점 : kernel이 모르기 때문에 하나의 thread만 block되어도 전체 threads가 block될 수 있다.

 

Combined ULT / KLT

solaris가 이용

ULT와 KLT를 하이브리드하게

빠르면서 block되어도 나머지는 수행할 수 있게끔

 

Gang Scheduling

하나의 프로세스에 여러 threads가 있을 때, 어떻게 scheduling할 것인가?

 

Dedicated Processor Assignment

각 thread를 전용 처리기에 mapping하는 scheduling 방식

 

Gang Scheduling

여러 threads가 공유데이터를 동시에 접근하기전에 lock, unlock을 사용해야 한다.

대기시간을 최소화하기 위해 threads가 동시에 다수의 처리기에서 parallel하게 처리할 수 있도록하는 scheduling 방식.

 

 

Thread API

Linux/Unix : POSIX Pthreads

Windows : Win32 Threads

JVM : Java Threads

 

 

<Thread Example>

pthread_create하면 thread가 생성된다.

전역변수로 x가 선언되어있다.

thread_increment와 thread_decrement는 전역변수 x를 공유하면서 동시에 실행이 되고 있다.

그렇기에 실행결과가 항상 달라질 수 있다.

이러한 문제로 결과값이 매번 달라지는 상황을 'race condition' 이라고 한다.

 

각각의 thread는 data를 공유하고 있다. 그런데 아래 그림과 같이 A를 실행중에 B도 동시에 실행되면 data를 동시에 사용하기에 원하는 값과 다른 결과를 얻을 수 있다.

이러한 문제를 '동기화(synchronization)문제' 라고 한다.

'Operating System' 카테고리의 다른 글

Deadlock  (0) 2021.06.11
Synchronization  (0) 2021.05.19
Multiprocessor scheduling  (0) 2021.05.16
Process Scheduling 2  (0) 2021.05.10
Process Scheduling  (0) 2021.04.25