[OS] 11. Threads

dnjstjt12·2024년 11월 4일

Thread

  • Process가 할당받은 자원을 이용하는 실행흐름의 단위이다.
  • 모든 Process는 하나 이상의 Thread가 존재한다. Single core에서도 Thread는 존재한다.

Single Thread Process: Thread 하나만 가짐
Multi Thread Process: Thread 둘 이상 가짐

Thread in Memory

  • Thread간에 Code,Data,Heap부분은 공유한다.
  • Program Counter(PC)와 Stack부분은 Thread마다 독립적으로 가진다.

PC를 독립적으로 가지는 이유:
Multi Threading에서 여러 Thread가 하나의 Process내에서 동시에 실행될 때, 각 Thread는 다른 코드 실행 흐름을 가질 수 있다.
그래서 각 Thread가 자신의 PC를 독립적으로 관리함으로써, 동시에 다른 명령어를 실행할 수 있고, 다른 코드 경로를 따라갈 수 있다.
만약 PC를 공유하면 모든 Thread가 동시에 같은 명령어를 수행하게 되어 Thread들은 독립적으로 수행하지 못한다.

Paralleism

  • Data Parallelism: 같은 데이터의 부분집합에서 동일한 작업을 수행한다.
  • Task Parallelism: 동일하거나 다른 데이터에 대해 다른 작업을 수행한다.

Model

  • Kernel Thread: OS에서 지원하고 관리하는 Thread
  • User Thread: User-Level Library에 의해 만들어지고 관리되는 Thread

One-to-One

  • User-level Thread마다 하나의 Kernel Thread로 매핑된다.
  • 장점: 각각 병렬적이게 처리가능하다.
  • 단점: overhead가 클 수 있다는 단점이 있다.
    ex) Linux, windows

Many-to-One

  • 많은 User level Thread가 하나의 Kernel Thread로 매핑된다.
  • 장점: User thread와 kernel thread의 context switch가 빠르다.
  • 단점: multi core에서 병렬적이게 실행이 되지 않을 수도 있다.
    ex) Solaris Green Threads, GNU Portable Threads

Many to Many

  • User Thread의 수 이하 만큼 Kernel Thread에 매핑된다.
  • 연결된 Kernel Thread가 Block되어도 다른 Kernel Thread를 매핑해 병렬처리를 사용할 수 있다. 위의 두 모델을 극복한 모델이다.

Pthread

  • POSIX Standard API
#include<pthread.h>
  • pthread_create()
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
					void *(*start_routine) (void *), void *arg);

thread를 만들 때 사용하는 함수
첫 번째 인자: Thread의 ID를 저장할 변수이다.
두 번째 인자: Thread의 특성을 설정할 때 사용하는데, 보통NULL을 쓴다.
세 번째 인자: Thread생성 후 실행되는 함수이다.
네 번째 인자: Thread가 실행할 함수에 전달되는 파라미터다.

  • pthread_detach()
int pthread_detach(pthread_t thread);

thread를 main thread와 분리시키는 함수
main thread에서 join하지 않아도 해당 thread가 종료되면 즉시 리소스를 free한다.
첫 번째 인자: main thread에서 분리시킬 thread이다.

  • pthread_exit()
 void pthread_exit(void *retval);

첫 번째 인자: Thread의 종료 값이다.

  • pthread_join()
int pthread_join(pthread_t thread, void **retval);

thread가 반환될 때까지 기다리는 함수
첫 번째 인자: 반환될 Thread이다.
두 번째 인자: 대상 스레드의 종료 상태가 저장될 위치를 가리킨다.

  • 이 함수들 이외에 thread_self(), thread_cleanup_push(), thread_pop()등이 있다.

exec()

  • exec family 함수를 호출할 경우 모든 thread를 다지우고 thread하나만 남는다.

fork()

  • fork(): UNIX에서 모든 thread를 복사
  • fork1(): UNIX에서 fork를 호출한 thread만 남긴다.
profile
안녕하세요!

0개의 댓글