본문 바로가기

KNU_study/운영체제

운영체제(4) Thread

728x90
반응형

 
 

1. Thread

 
Thread : CPU utilization의 기본 단위.
-> PC, register set, stack space로 구성된다. 
-> 다른 스레드와 Task(code section, data section, operating-system resources)를 공유한다. 
-> fork()와 pthread_create()는 각각 프로세스, 스레드를 만드는 명령어다. 
-> [heavyweight process] or [traditional process] = [a task with one thread]
 
 

2. Multithreaded Server Architecture

 
(1) 한 프로세스에 여러 개의 스레드를 연결할 수 있다. 
    -> 각 thread에는 일련의 PC값들과 고유한 TID(Thread id)가 있다. 
    -> thread들은 서로 same code, data, kernel context를 공유한다. 
[11쪽 그림 참고]
 
(2) 하나의 서버 스레드가 차단되어 대기할 동안, 동일한 Task의 두 번째 스레드가 실행될 수 있다.
    -> 동일한 작업에 여러 개의 스레드를 함께 사용하면 처리량과 성능이 향상된다.
    -> 공통 버퍼(생산자, 소비자)를 공유해야 하는 애플리케이션은 스레드 활용의 이점을 누릴 수 있다.
 
(3) 스레드는 순차적 프로세스가 시스템 호출을 차단하는 동시에, 병렬 처리를 수행할 수 있는 메커니즘 제공

 
(4) multithread의 이점
    Responrsiveness : 프로세스의 일부가 차단된 경우에도 지속적인 실행이 가능
    Resource sharing : 스레드끼리 자원을 공유하므로 easy한 부분이 있다. 
    Economy : 프로세스 생성보다 비용이 저렴하고, 스레드 스위칭이 오버헤드가 낮다. 
    Scalability : 프로세스가 multicore architecture를 활용할 수 있다. 
 
 

3. Multicore Programming

 
Multicore 또는 Multiprocessor 시스템의 과제는 다음과 같다. 
-> Dividing activities, Balance, Data splitting, Data dependency, Testging and debugging

single core system
multi core system

 
<Multicore Programming의 특징>
(1) Parallelism : 시스템이 두 개 이상의 작업을 동시에 수행할 수 있다. 
    -> Data parallelism : 동일한 데이터의 하위 집합을 여러 코어에 분산시키고, 각 코어에서 동일 작업 수행
    -> Task parallelism : 코어 간에 스레드 분산, 각 스레드가 고유한 작업을 수행

data parallelism과 task parallelism

 
(2) Concurrency : 진행 중인 두 개 이상의 Task를 동시에 지원한다. 
 
<Amdahl's Law>
직렬 및 병렬 구성 요소가 모두 포함된 Application에 core를 추가할 경우의 성능 향상을 파악하자.
(1) S : serial한 부분
(2) N : CPU 안에 있는 core의 개수

 
(ex) Application이 75% parallel, 25% serial인 경우 1개 코어에서 2개 코어로 이동하면 속도가 1.6배 향상됨
-> N이 무한대에 가까워질수록 속도는 1/S에 가까워진다. 
Application의 직렬 부분이 [코어를 추가하여 얻는] 성능에 불균형적인 영향을 미친다. 
 
 

4. User threads and Kernel threads

 
(1) User threads 
    user-level 스레드 라이브러리에서 수행하는 관리
    (ex) POSIX Pthreads, Windows threads, Java threads
 
(2) Kernel threads
    Kernel에서 지원됨, 좀 더 performance가 높다.
    (ex) Windows, Linux, Mac OS X, iOS, Android
 

 
<Multithreading Models>
(1) Many-to-One
    kernel 스레드 하나가 모든 user 스레드를 관리한다. 
    스레드 하나가 차단되면 모든 스레드가 차단된다. 현재 거의 사용 X.

    
(2) One-to-One
    kernel 스레드 하나 당 user 스레드가 하나씩 매핑된다.
    overhead로 인해, 프로세스 당 스레드 수가 제한되는 경우가 있다. 

 
(3) Many-to-Many
    여러 user 스레드를 여러 kernel 스레드에 매핑할 수 있다. 
    OS에서 충분한 수의 kernel 스레드를 생성할 수 있다. 

 
(4) Two-level Model
    추가적인 특징으로 user 스레드를 kernel 스레드에  바인딩할 수 있다. 
 
 

5.  Thread Libraries

 
프로그래머에게 스레드 생성 및 관리를 위한 API를 제공한다. 
(1) 라이브러리 전체가 user space에 있음
(2) OS에서 지원하는 kernel-level 라이브러리
-> 원래 스레드는 HDD에 있다가 RUN 명령을 받으면 메모리에 올라와 수행된다. 
    프로세스 안에 스레드 라이브러리를 만들 경우, HDD까지 안 가고 프로세스에 머무르다가 실행 가능
 

thread pool library

 
 

6. thread 문법

 
<Creation of Threads>

int pthread_create(pthread_t *thread, const pthread_attr_t*attr, void *(*start_routine) (void), void *arg);

(1) pthread_t *thread : 새로운 스레드의 TID(스레드 아이디)
(2) const pthread_attr_t*attr : ㅇㅇ
(3) 
(4)
 
<pthread example>

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

void fatal_error(int err_num, char *function);
void threa1_func();

int main(){
	pthread_t tid;
    int return_val;
    
    return val = pthread_create(&tid, (pthread_attr_t*)NULL, (void*(*)())thread1_func, (void*)NULL);
    if (return_val != 0)
    	fatal_error(return_val, "Pthread_create()");
    return_val = pthread_join(tid,(void**)NULL);
    if (return_val != 0)
    	fatal_error(return_val, "pthread_join()");
    printf("Bye..\n");
    exit(0);
}
// Thread function
void thread1_func(){
	printf("Hello World!\n");
    pthread_exit((void*)NULL);
}

 
https://ypangtrouble.tistory.com/entry/Pthread-Attributes
참고하세유 스레드 attr 함수 문법 공부 ~
 
 
 
 
 
 
 
 
 
 

728x90
반응형

'KNU_study > 운영체제' 카테고리의 다른 글

운영체제(6) Synchronization Tools & Examples  (0) 2023.06.12
운영체제(5) CPU Scheduling  (1) 2023.05.18
운영체제(3) Process  (0) 2023.05.16
운영체제(2) Operating-System Structures  (0) 2023.05.16
운영체제(1) OS  (0) 2023.05.10