---
# System prepended metadata

title: OS

---

# OS

## Part2 - Process Management

### Ch4. Threads

![](https://i.imgur.com/TqMJ1IM.png)

#### Thread
- Thread 구성 
    - a thread ID
    - a program counter
    - a register set
    - a stack
- 프로세스 내 다른 스레드들과 공유하는 부분 
    - code section
    - data section
    - os resources(open files, signals, ...)


#### Thread 예시
![](https://i.imgur.com/skRh0UR.png)

- 서버는 클라이언트로부터 요청이 올 때 마다 스레드를 만들어서 스레드가 서비스를 수행하게 하고 계속 요청 listen

#### Thread 이점
1. 반응성(민감성) - 
2. 자원 공유 - 
3. 경제성 - 
4. 확장성 - 


#### 암달의 법칙?
- ??

#### 멀티스레드 프로그래밍 5가지 유의점
1. 구분할 tasks 나누기
2. task 간 균형
3. 데이터 나누기
4. 데이터 의존성(data syncronized)
5. 테스팅, 디버깅

#### Parallelism 종류
1. Data parallelism - 
2. Task parallelism - 
- 보통 두가지 hybrid

#### 멀티스레딩 모델
1. Many-to-One Model
- 한번에 하나의 스레드만 커널에 접근할 수 있어 멀티 스레드들이 멀티 코어 시스템에서 동시에 실행되어질 수 없음
- However, the entire process will block if a thread makes a blocking system cal
2. One-to-One Model
- Many-to-One Model의 단점을 보완했으나, 유저 스레드 하나당 커널 스레드 하나를 대응시켜 만드는 오버헤드 발생.
- Linux, Windows
3. Many-to-Many Model (two-level model)
- 위 두가지 모델의 단점 보완.
- when a thread performs a blocking system call, the kernel can schedule another thread for execution.

#### Thread Libraries
- ##### Syncronous threading vs Asyncronous threading

||Asyncronous threading|Syncronous threading|
|:--:|:--:|:--:|
|예시|multithreaded server|주로 스레드간 중요한 data sharing|
|특| -parent, child executes concurrently<br> -little data sharing| -parent waits (모든 child threads 종료될때까지)<br>`- fork-join` strategy|




- ##### POSIX Pthreads

```C=
#include <pthread.h>
#include <stdio.h>

int sum; /* this data is shared by the thread(s) */
void *runner(void *param); /* threads call this function */
int main(int argc, char *argv[]) {
    
    pthread_t tid; /* the thread identifier */
    pthread_attr_t attr; /* set of thread attributes */
    
    if (argc != 2) {
        fprintf(stderr, "usage: a.out <integer value>\n");
        return -1;
    }
    if (atoi(argv[1]) < 0) {
        fprintf(stderr, "%d must be >= 0\n", atoi(argv[1]));
        return -1;
    }
    
    /* get the default attributes */
    pthread_attr_init(&attr);
    /* create the thread */
    pthread_create(&tid,&attr,runner,argv[1]);
    /* wait for the thread to exit */
    pthread_join(tid,NULL);
    
    printf("sum = %d\n", sum);
}

/* The thread will begin control in this function */ 
void *runner(void *param) {
    int i, upper = atoi(param);
    sum = 0;
    for (i = 1; i <= upper; i++)
        sum += i;
    pthread_exit(0);
}
```

#### Implicit Threading
 - Thread pools
     - ㅇㄹㄴㅁㄹ
     - ㄹ
 - OpenMP
 - GCD
