반응형

Outline


① Motivation

② Overview

③ Multicore programming

④ Multithreading models

⑤ Thread libraries

⑥ Threading issues

⑦ Thread programming API

 

① Motivation


새 요청 받을 때마다 프로세스 생성 (fork() 호출) 하면 리소스, 시간 많이 필요

쓰레드 사용 시 overhead 줄일 수 있음

② Overview


● Thread

  - CPU 이용의 기본 단위

  - 같은 프로세스에 속한 다른 쓰레드와 운영체제 자원 공유 (콛, 데이터 섹션, 열린 파일, 신호 등)

 

● 장점

1. 응답성

  - 특정 쓰레드가 block 되어도 나머지 쓰레드 실행 가능

 

2. 자원 공유

  - 프로세스: IPC 통해서 공유

  - 쓰레드: 자동적으로 프로세스의 자원, 메모리 공유 (code, data, file)

 

3. 경제성

  - 프로세스 생성을 위해 메모리와 자원 할당 하는 것은 비용 많이 듦

  - 쓰레드는 자신이 속한 프로세스의 자원 공유. 쓰레드 생성, 문맥 교환이 더 경제적

 

4. 규모 적응성

  - 다중 처리기 구조이므로 각 쓰레드가 다른 처리기에서 병렬로 수행 (multi processor 활용 가능)

 

③ Multicore programming


여러 개의 쓰레드 동시에 실행 가능

코어가 여러 CPU 칩 형태를 띠거나, 칩 안에 여러 개의 코어가 존재

 

1. 병행성 (Concurrent)

  - 모든 태스크가 진행되게끔 함으로써 하나 이상의 태스크 지원

  - 동시에 수행되는 것처럼 보임

 

2. 병렬성 (Parallelism)

  - 하나 이상의 태스크를 동시에 수행

  - 실제 병렬적으로 수행

  1) 데이터 병렬 (Data parallelism)

  - 동일한 데이터의 부분 집합을 다수의 계산 코어에 분배한 뒤, 각 코어에서 동일한 연산 실행

  - 하나의 일을 여러 개로 쪼개서 처리

 

  2) 태스크 병렬 (Task parallelism)

  - 태스크를 다수의 코어에 분배. 각 쓰레드는 고유의 연산 실행

  - 여러 개의 일을 처리

 

● 멀티코어 프로그래밍이 어려운 이유

1. 태스크 인식

  - 응용 프로그램을 분석하여 독립된 병행가능 태스크로 나눌 수 있는 영역 찾아야 함

  - 태스크는 독립적이고 개별코어에서 병렬실행 가능해야 함

 

2. 밸런싱

  - 찾아진 부분들이 균등한 기여도를 가지도록 태스크를 나누어야 함 (전체 성능 저하될 수 있음)

 

3. 데이터 분리

  - 응용 프로그램이 독립된 태스크로 나눠지는 것처럼, 태스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용가능하도록 나눠져야 함

 

4. 데이터 종속성

  - 태스크가 접근하는 데이터는 둘 이상의 태스크 사이에 종속성이 없는지 검토해야 함

 

5. 시험 및 디버깅

  - 다양한 실행경로 존재

 

=> 이 때문에 Multi Threading 사용

 

④ Multithreading models


● 종류

1. 사용자 쓰레드 (user thread)

  - 커널 위에서 수행됨. 커널과 관련 없음

 

2. 커널 쓰레드 (kernel thread)

  - 커널 내부에서 생성, 파괴됨.

  - 운영체제에 의해서 관리됨

 

● 모델

1. Many-to-One

  - user thread 여러 개

  - kernel thread 한 개

  - 장점: 쓰레드가 커널이 아닌 사용자 공간의 쓰레드 라이브러리에 의해 행해지므로 빠르고 오버헤드가 적음

  - 단점: blocking system call 호출하면 전체 프로세스가 block됨. 다중 코어 시스템에서 병렬로 실행 불가

 

2. One-to-One

  - user thread 한 개

  - kernel thread 한 개

  - 장점: blocking system call 호출해도 다른 작업 가능. 다중 코어 시스템에서 병렬로 실행 가능

  - 단점: 커널 쓰레드 많이 생성하므로 오버헤드 증가

 

3. Many-to-Many

  - user thread 한 개

  - kernel thread 한 개

  - 다대일, 일대일 모델의 장점 모두 가짐

  - 개발자는 필요한 만큼 user thread 생성

  - kernel thread는 멀티 프로세서에서 병렬 실행 가능

  - blocking system call 호출하면 커널이 다른 쓰레드의 수행을 스케줄링 가능

 

4. Two-Level

  - 다대다, 일대일 둘 다 사용

  - Bound thread: One-to-One 모델을 쓰고 있는 쓰레드

⑤ Thread libraries


프로그래머에게 쓰레드를 생성하고 관리하기 위한 API 제공

 

● 구현

1. 사용자 공간에서만 라이브러리 제공

  - 라이브러리 호출 시 사용자 공간의 지역함수 호출. 시스템 콜 호출 안함

 

2. 커널 수준 라이브러리 구현

  - 라이브러리 호출 시 커널 시스템 콜 호출

 

● 종류

1. POSIX Pthread

  - 사용자 / 커널

 

2. Win32 thread

  - 커널

 

3. Java thread

  - 호스트 시스템에 따라 다름

 

⑥ Threading issues


● 쓰레드가 fork() 호출 시 새 프로세스는 모든 쓰레드 복사? 한 개의 쓰레드만 복사?

1. fork() 호출 후 exec() 호출

  - fork()를 호출한 쓰레드만 복사

 

2. fork() 호출 후 exec() 호출 안함

  - 모든 쓰레드 복사

 

● 신호 처리

- 신호: 프로세스에게 어떤 사건이 일어났음을 알려줌

1. 동기식 신호

  - 실행 중인 프로세스에서 발생

  - 연산을 수행한 동일한 프로세스에게 전달됨

  - ex) 잘못된 메모리 접근, div by 0

 

2. 비동기식 신호

  - 실행중인 프로세스 외부에서 발생

  - 다른 프로세스에게 전달됨

  - ex) 타이머 만료, ctrl+c

 

※ 신호 전달: pthread_kill(pthread_t tid, int signal) (프로세스 kill 하는 것 아님!!)

 

● 쓰레드 취소

쓰레드가 끝나기 전에 그것을 강제종료 시킴

1. 비동기식 취소

  - 한 쓰레드가 목적 쓰레드를 즉시 강제종료

  - 모든 시스템 자원 다 회수 못하는 경우 있음

 

2. 지연 취소

  - 자신이 취소되어도 안전하다고 판단되는 시점에서 취소 여부 검사

  - 목적 쓰레드가 주기적으로 자신이 강제종료 되어야 할 지 점검

  - 목적 쓰레드 질서정연하게 강제종료 될 수 있음

 

● 쓰레드 풀

프로세스를 시작할 때 일정한 수의 쓰레드들을 미리 쓰레드 풀로 만들어 둠

CPU 시간, 메모리 공간 등 시스템 자원의 고갈을 막아줌

일 없으면 기다리다가 요청 들어오면 쓰레드 풀에서 한 쓰레드에 할당

장점: 새 쓰레드 생성하는 것보다 기존 쓰레드 할당하는 것이 더 빠름

쓰레드 개수 재한하면 많은 수의 쓰레드를 병렬처리 할 수 없는 시스템에 도움을 줌

 

● Thread specific data

  - Allows each thread to have its own copy of data

  - Most thread libraries provide some form of support for thread-specific data

⑦ Thread programming API


pthread_create: 새 쓰레드 생성

pthread_join: 특정 쓰레드의 종료를 기다림

pthread_exit: 쓰레드를 종료시키고 join 호출한 쓰레드에게 메시지를 전달

반응형

'CS 공부 > 운영체제' 카테고리의 다른 글

Chapter 6, 7 Process Synchronization  (0) 2021.09.23
Chapter 5. Process scheduling  (0) 2021.09.23
Chapter 3. Process Concept  (0) 2021.09.16
Chapter 2  (0) 2021.09.16
Chapter 1  (0) 2021.09.16

+ Recent posts