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
<Multicore Programming의 특징>
(1) 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까지 안 가고 프로세스에 머무르다가 실행 가능
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 함수 문법 공부 ~
'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 |