본문 바로가기
CS

[OS] 스레드(Thread) 개념과 특징, 프로세스 vs 스레드, 멀티 스레드(Multithreaded Programming)

by 민죠미 2023. 2. 22.

 

스레드(thread)란?

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.

 

● 프로세스(process)에서 실행 단위(execution state)를 분리 시킨 개념
- execution state : PC, SP, registers, etc.

● 스레드는 같은 주소 공간(address space)를 공유(share)한다.
- Code, Global variables, Heap, Opened files

● 각각의 스레드가 가지고 있는 것
- PC&SP 를 포함한 레지스터 set
- Stack
- Thread ID

 


 

 

Single / Multithreaded Processes

● Single-threaded process
- PC (Program counter) 1개
- 완료시까지 명령을 순서대로 한 번에 수행한다.

 

● Multi-threaded process
- 각 스레드 마다 PC를 가진다

 

스레드들은 code, data, files 등을 공유하며, 독립적인 레지스터와 스택을 가지고 있다. 한 프로세스에 있는 스레드 들은 같은 address space에 있기 때문에 서로의 레지스터, 스택 간의 접근이 가능하다.

 

 


스레드 사용 기본 예제 코드

#include <stdio.h>
#include <pthread.h>

int values[4]={0,1,2,3}; //스레드 끼리 공유하는 data

void *hello(void *arg)
{
   printf("hello, world\n");
   ...
}
int main()
{
   pthread_t tid;
   pthread_create(&tid,NULL,hello,NULL);
   printf("hello from main thread\n");
   ...
}
 

프로세스 vs 스레드

  • 프로세스는 여러개의 스레드를 가질 수 있다
  • 스레드는 하나의 프로세스에 bound 된다
  • 프로세스는 스레드 실행의 틀이다
    → PID, address space, user and group ID, open file descriptors, current working directory, etc.
  • 스레드는 스케쥴링의 최소 단위이다
  • 프로세스는 정적이지만 스레드는 동적이다.

 

멀티스레드의 장점

  • Concurrency 를 구현하는데 드는 비용이 적다
  • 멀티코어구조를 활용할 수 있다
  • 리소스의 공유가 용이하다 (같은 주소 공간을 공유)
  • 프로그램의 구조를 향상시킨다
    → 큰 task를 쪼개 여러개의 스레드로 처리할 수 있음

 

 

Concurrency vs. Parallelism

● Concurrency

한가지 이상의 일을 수행할 수 있음
ex) 컴구 공부를 하다가 운체 공부를 하다가 자구 공부를 함

 

● Parallelism

한가지 이상의 일을 동시에(simultaneously) 수행할 수 있는 시스템
ex) 컴구 공부와 운체 공부를 동시에 함

 

※ Parallelism 없이 Concurrency 가 가능하다 (ex. 스케쥴러는 하나의 프로세서로 Concurrency를 제공한다)

 

 

Parallelism 의 종류

● Data parallelism

같은 데이터를 subset으로 나누어 여러개의 core(프로세서)로 같은 operation을 수행하는 개념
ex) 배열의 sum값 계산하기

● Task parallelism

각각 core(프로세서)를 매칭한 스레드들이 각자 unique 한 operation을 수행하는 개념
ex) 두 코어중 하나는 합을 구하고 하나는 표준편차를 구하기

 

Amdahl's Law

코어를 추가하여 병행 수행을 할 경우 증가하는 성능 값

 


 

 

프로세스, 프로세서, 스레드 비교

 

 

 

하나의 프로세스에는 한 개 이상의 스레드가 들어갈 수 있다. 한 개의 스레드를 가진 프로세스를 Single-threaded process 라고 하고, 여러개의 스레드를 가진 프로세스를 Multi-threaded process 라 한다.
같은 프로세스에 속한 스레드는 같은 주소공간을 공유하며, 각각의 스레드는 독립적인 레지스터와 스택을 가진다. 스레드는 프로세스의 실행 단위이며, 하나의 코어에 맵핑되어 수행된다. (스레드 단위로 코어에 맵핑하는 과정을 스케쥴링이라 한다.)
프로세서는 코어가 하나인 Single-core processor와 여러개인 Multicore processor 가 있으며 여러개의 코어를 병렬적으로 수행하여 여러 스레드를 동시에 수행시킬 수 있다. 또한, 프로세서 자체를 여러개 사용하여 성능을 높일 수 있다. (Multiprocessor system) 프로세스를 여러개 생성하여 Multiprogramming 환경을 만들 수 있다.

 

 

 

Pthreads (POSIX Threads)

● Pthread 라이브러리를 이용한 스레드 생성/종료

int pthread_create (pthread_t *tid, pthread_attr_t *attr, void *(start_routine)(void *), 
void *arg);
 
void pthread_exit (void *retval); 
 
int pthread_join (pthread_t tid, void **thread_return); 
 

 

#include <stdlib.h>

int sum; //스레드 공유 변수
void *runner(void *param);

int main(int argc, char* argv[])
{
        pthread_t tid;
        /* 스레드 생성 */
        pthread_create(&tid, NULL, runner, argv[1]);
        /* 스레드 종료까지 wait */
        pthread_join(tid,NULL);

        printf("sum=%d\n",sum);
        return 0;
}

void *runner(void* param)
{

        int i;
        int upper=atoi(param); /* argv[1] */
        sum=0;

        for(i=0;i<=upper;i++){
                sum+=i;
        }
        pthread_exit(0);
}
 

cf) 위의 코드로 이루어진 실행 파일이 sum 일경우

$ ./sum 10
→ argc : 2 , argv[0] : ./sum , argv[1] : 10

 

 

※ Pthread 라이브러리 사용시 컴파일 할 때 -lpthread 를 추가해주어야함

$ ls
pthread.c
$ gcc -o pthread pthread.c –lpthread
$ ./pthread 10
sum = 55
 

멀티스레드 모델

● 커널 스레드(Kernel threads)

: 운영체제에 의해 직접 관리됨. 스케쥴링의 단위. 운영체제가 보는 스레드.

 

● 사용자 스레드(User threads)

: User-level threads 라이브러리에 의해 생성되고 관리됨. 커널 위에 User-level 에서 구현됨. 응용프로그램이 보는 스레드.

 

● One-to-One

 

  • User thread 생성시마다 Kernel thread가 생성됨
  • Many-to-One 보다 Concurrency 가 높음
  • 프로세스당 스레드의 개수가 제한적임 (오버헤드 발생 우려)

 

● Many-to-One

 

 
  • 여러개의 User thread가 하나의 Kernel thread에 맵핑됨
  • User thread 간 작고 빠른 Context switch가 일어남
  • 하나의 스레드가 block 되면 모든 스레드가 block됨
  • 한번에 하나의 스레드만 커널에 진입할 수 있으므로 멀티코어 시스템에서도 여러개의 스레드가 병렬 수행 될 수 없음

 

● Many-to-Many

 

  • 여러 유저 스레드에 더 적거나 같은 수의 커널 스레드가 대응하는 모델
  • 운영체제는 충분한 수의 커널 스레드를 만들 수 있으며, 커널 스레드의 구체적인 개수는 프로그램이나 작동 기기에 따라 다름
  • 멀티 프로세서 시스템에서는 싱글 프로세서 시스템보다 더 많은 커널 스레드가 만들어짐
  • 완전한 동시성은 아니지만, Many-to-one Model에 비해 더 높은 동시성을 갖는다
  • One-to-One Model의 단점이었던 커널 스레드 생성의 오버헤드도 걱정할 필요 없다

 

● Two-level Model

 

  • Many-to-Many Model에서 확장된 개념으로, 특정 유저 스레드를 위한 커널 스레드를 별도로 제공하는 모델
  • 점유율이 높아야 하는 유저 스레드를 더 빠르게 처리할 수 있다

 

 


Reference.

https://rebro.kr/174

 

'CS' 카테고리의 다른 글

[DB] 인메모리 데이터베이스, 트랜잭션의 특징 (ACID)  (0) 2022.07.28

댓글