본문 바로가기

CS Study/Operating System

Thread란? Multi-Thread, Multi-Tasking, Multi-Processing

1. Thread란?

프로세스 내에서 실행되는 여러 흐름의 단위를 뜻합니다. 즉, 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다. 이 각각의 스레드는 서로 하는 일은 서로 다르지만 스레드가 모여 하나의 프로세스를 구성합니다.

 

프로세스와 비교했을때 프로세스는 CPU자원이 부여된 자원의 소유자이고, 스레드는 스케줄링의 단위로서 존재합니다. 하나의 프로세스에 속한 각각의 스레드들은 프로세스가 가지는 자원을 공유하면서 자신의 실행환경에서 현재의 실행위치와 스택, 레지스터 값들을 따로 가지게 됩니다.

 

 

스레드는 프로세스내에서 각각 Stack만 할당받고 Code, Data, Heap 영역은 공유합니다. 한 프로세스내부에서 프로세스들은 주소공간이나 자원(Heap)과 같은 영역을 공유하면서 실행됩니다.

 

Code,Data Heap 영역은 공유하면서 스택만 독립적으로 사용하나요?'

Code(코드 자체를 구성하는 메모리 영역), Data(전역변수, 정적변수, 배열 등 초기화된 데이터), Heap(동적 할당시 사용되는 new() 명령어) 영역을 공유하는것은 문제가 안됩니다. 하지만 Stack은 지역변수, 매개변수, 리턴값 정보를 가지고 있는 임시 메모리 영역입니다.

Stack 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이를 통해 독립적인 실행 흐름이 추가되는 것입니다. 따라서 스레드의 역할에 따라 독립적인 실행 흐름을 추가하기 위해 독립된 스택을 할당해야 합니다. 


1.2 스레드 관련 용어

  • 멀티 태스킹 : OS가 CPU에 작업을 줄때 시간을 잘게 나누어 배분하는 기법입니다. 이렇게 여러 스레드에 시간을 잘게 나누어주는 시스템을 시분할 시스템이라고 합니다.
  • 멀티 프로세싱 : CPU를 여러개 사용하여 여러개의 스레드를 동시에 처리하는 작업을 의미합니다. 멀티프로세싱은 하나의 컴퓨터에 여러개의 CPU 혹은 하나의 CPU내 여러개의 코어에 스레드를 배정하여 동시에 처리하도록 합니다. 네트워크로 연결된 여러 컴퓨터에 스레드를 나누는 분산 시스템도 멀티프로세싱이라 지칭합니다.
  • CPU 멀티스레드 : 한번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법입니다.
'멀티 프로세싱 vs 멀티 스레딩?'

멀티 프로세싱은 fork를 통해 프로세스를 다수개로 늘려 여러 개의 프로그램들을 병렬로 처리합니다. 멀티 스레딩은 하나의 프로그램 안에서 병렬 처리를 합니다.
'멀티 스레딩 vs 멀티 태스킹?'

멀티 스레딩은 스레드들끼리 자원 공유가 가능합니다. 멀티 태스킹은 OS에서 지원하는것으로 서로 독립된 메모리를 가지며 서로 자원 공유를 하기 위해선 IPC(Inter-Process Communication)를 구현해야 합니다. 이러한 점 때문에 멀티 태스킹은 멀티 스레딩에 비해 OS에게 부담을 줄 수 있습니다.

2. 멀티 스레드

하나의 프로세스를 다수의 스레드를 만들어 처리하는것을 의미합니다. 작업의 수행에 필요한 자원들을 Stack영역을 제외하고 모두 공유하고 있기 때문에 자원의 생성과 관리가 중복되는 것을 줄일 수 있습니다.

 

많은 OS들이 멀티 스레딩을 기본으로한 멀티 프로세싱을 지원하고 있습니다. 대표적으로 웹 서버가 멀티 스레드 응용 프로그램입니다.

출처 : Udacity course "Introduction to Operating Systems"

 

  • 다중 스레드 프로그램의 경우 일부 스레드가 Block되어도 나머지 스레드들은 계속 실행될수있습니다.
  • 같은 프로세스의 스레드는 메모리와 자원을 공유하기 때문에 스레드간 통신에 용이합니다. → 프로그램 응답 시간 단축

3. 멀티 스레드 모델

스레드 지원 주체에 따라 커널 레벨 스레드와 사용자 레벨 스레드로 분류할 수 있습니다.

3.1 사용자 레벨 스레드

OS가 멀티스레드를 지원하지 않을 때 사용하던 방법으로 초기의 스레드 시스템에서 이용되었습니다.

 

이 스레드는 스레드 라이브러리에 의해 관리 되어 커널에 진입하지 않아도 됩니다. 스레드와 관련된 모든 행위는 사용자 공간에서 이루어지기 때문에 커널은 스레드의 존재를 알 수 없습니다.

 

커널은 특정 프로세스에 속한 스레드들이 행동을 특정 프로세스의 행위로만 인식합니다. 따라서 하나의 스레드가 중단되면 같은 프로세스 내의 모든 스레드가 중단됩니다.

 

  • 장점
    1. 스케쥴링과 동기화를 위해 System call을 하지 않기 때문에 오버헤드가 적다.
    2. 커널이 스레드의 존재를 모르기 때문에 User모드와 Kernel 모드 간 전환이 필요하지 않다.
  • 단점
    1. 스케쥴링 우선순위를 지원하지 않으므로 어떤 스레드가 먼저 동작할지 모른다.
    2. 하나의 스레드가 System call을 하면 해당 프로세스내의 모든 스레드가 중단된다.
    3. 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러개의 CPU를 동시에 사용할 수 없습니다.
    4. 커널 레벨에서는 공유 변수를 보호하는 장치가 있으나 이러한 서비스를 라이브러리에서 구현해야 하기 때문에 보안에 취약합니다.

3.2 커널 레벨 스레드

커널 스레드는 OS에서 구현됩니다. 그렇기 때문에 OS는 프로세스내의 스레드들의 존재를 알고 있습니다. 즉, 커널이 스레드의 생성 및 스케쥴링등을 모두 관리합니다.

 

한 스레드가 중단되어도, 같은 프로세스 내의 다른 스레드들은 계속 실행이 가능합니다. 사용자 레벨 스레드에 비해 생성과 관리가 느리다는 특징이 있습니다.

  • 장점
    1. 커널이 각 스레드들을 개별적으로 관리할 수 있습니다.
    2. 동작중인 스레드가 System call해도 해당 프로세스내의 다른 스레드가 계속 실행될 수 있습니다.
  • 단점
    1. 스케쥴링과 동기화를 위해 System call하는데 오래 걸립니다.
    2. 유저모드와 커널모드 간 전환이 빈번하여 성능이 저하됩니다.