스레드
○ Single and Multithreaded Processes
스레드는 메인 스레드의 스택을 제외한 메모리를 공유하고, 각 서브 스레드는 독립적인 스택 공간을 가진다.
○ Concurrency(병행) VS Parallelism(병렬)
Concurrnecy(병행) : supports more than one task making progess. 멀티 태스킹. 사람이 한명
Parallelism(병렬) : system can perform more than one task simultaneously. 실제로 따로 실행. 사람이 여러명
○ Parallelism 종류
1. Data Parallelism : 각 코어가 데이터를 나눠서 같은 일을 한다.
2. Task Parallelism : 같은 데이터를 가지고 각 코어는 다른 일을 한다.
○ Amdahl's Law (암달의 법칙)
Identifies performance gains from adding additional cores to an application that has both serial and parallel components
프로세서를 병렬화, 직렬화 한 부분에 따라 성능이 어떻게 된다는 법칙이며, 컴퓨터 프로그램은 병렬처리가 불가능한 부분과 불가능한 부분으로 구성되므로 더 이상 성능 향상이 불가능한 한계가 존재한다는 법칙.
USER / KERNEL 스레드
○ 과거
스케줄링 기본단위가 프로세스 단위로, 커널이 스레드를 신경쓰지 않던 시기. User는 배정된 시간을 스레드에 나눠서 사용.
○ 현재
현재는 스케줄링 기본 단위가 스레드. 커널이 스레드 기준으로 스케줄리을 하고 Task로 취급
○Multithreading Models
1. Many-to-one (과거)
Many user-level threads mapped to single kernel thread.
One thread blocking causes all to block in a process
Multiple threads may not run in parallel on multicore system because only one may be in kernel at a time
2. One-to-one (현재 Windows, Linux)
Each user-level thread maps to kernel thread
More concurrency than many-to-one
3. Many-to-Many
multiplexing으로 만들고 구현 어렵다. 추가로 One-to-one을 더하면 Two-level Model이라 한다.
Pthreads
UNIX OS에 대표적이다. (Linux & Max OS X)
명세(Specification)에 대한 것이지, 구현정의(implementation)이 아니다. 즉, pthread 라이브러리 간 호환이 안될 수도 있다. pthread manual 등에서 찾아보면 np(not portable)이 붙어있는 경우가 그렇다.
참고 : https://man7.org/linux/man-pages/man7/pthreads.7.html
○ Pthreads Create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void* arg);
pthread_t : pthread_type. 각 프로세서 별로 type이 다를 수 있으니.
*thread = thread id , *attr = thread attributes,
void *(*start_routine)(void *) = start_routine은 주소, input이 void *고, output이 void *인 함수.
void* arg = 함수에 인자.
void * 는 어떤 형태의 인자여도 상관이 없다. > 나중에 pointer casting으로 사용할 타입으로 변경
*pthread_create, fork 모두 내부적으로 clone() 시스템콜을 사용
pthread_exit() : 스레드 종료
pthread_join(pthread_t, state) : 스레드 종료까지 대기
○Thread cancellation
1. 즉시 철회 : 스레드를 즉시 종료하고, 할당 자우너 모두 free를 못하는 상황 생길 수 있다.
2. 지연 철회 : 종료지점(cancellation point)에서 스레드 캔슬, 주기적으로 체크한다.
일반적으로 read()와 같은 blocking system call이 종료지점이 된다. (I/O, err등)
pthread_cancel(tid) : 종료 요청을 하고, 스레드는 상태에 따라 즉시 혹은 지연 철회. 종료지점을 만나면 종료된다.
pthread_testcancel(tid) : 인위적으로 종료지점을 지정할 때 사용한다. 스레드가 만나면 종료요청이 온 상태면 종료된다.
이 함수가 호출되면, 스레드 종료되고 다시 이 자리로 리턴하지 않는다.
*리눅스 시스템에서는 thread cancellation이 signal로 handle됨.
○ TLS ( Thread Local Storage)
스레드는 자신이 속한 프로세스의 데이터를 공유하는데, 경우에 따라서 자신만의 데이터를 필요로 할 때 사용된다.
'강의 > OS' 카테고리의 다른 글
OS - Thread (0) | 2023.06.29 |
---|---|
OS - Processes (0) | 2023.06.27 |
OS - Structure (0) | 2023.06.26 |
CPU스케줄링(5장) - 시험 요약 (0) | 2023.04.20 |
프로세스(3장)시험 요약 (1) | 2023.04.20 |