코딩하는 해달이

[운영체제] 5주차 - 스레드와 멀티스레딩 본문

학교 공부/운영체제

[운영체제] 5주차 - 스레드와 멀티스레딩

코딩하는 해달 2023. 4. 21. 02:27

프로세스의 문제점

다중 프로세스를 이용한 멀티태스킹

 - 응용프로그램에서 여러 프로세스를 생성하여 동시에 여러 작업 실행

 - 운영체제는 스케줄링을 통해 여러 프로세스를 번갈아 실행

 

프로세스를 실행단위로 하는 멀티태스킹의 문제점

1. 프로세스 생성의 큰 오버헤드

  - 프로세스를 위한 메모리 할당, 부모 프로세스로 부터 복사

  - PCB 생성, 매핑 테이블 생성 등

2. 프로세스 컨텍스트 스위칭의 큰 오버헤드

  - CPU 레지스터들을 컨텍스트로 PCB에 저장, 새 프로세스 컨텍스트를 PCB에서 CPU
로 옮기는 시간

  - CPU가 참고할 매핑 테이블(페이지 테이블)의 교체 시간

  - CPU 캐시에 새 프로세스의 코드와 데이터가 채워지는데 걸리는 시간 등

3. 프로세스 간 통신의 어려움

  - 프로세스가 다른 프로세스의 메모리에 접근 불가

  - 프로세스 사이의 통신을 위한 제 3의 방법 필요

  - 커널 메모리나 커널에 의해 마련된 메모리 공간을 이용하여 데이터 송수신

  - 이 방법들은 코딩이 어렵고, 실행 속도 느리고, 운영체제 호환성 부족

 

스레드의 개념

스레드의 출현 목적

프로세스를 실행 단위로 하는 멀티태스킹의 문제점을 해결하기 위해서

(커널에 많은 시간, 공간 부담 → 시스템 전체 속도 저하)

효율적인 새로운 실행 단위가 필요해서

  1. 프로세스보다 크기가 작다.

  2. 프로세스보다 생성 및 소멸이 빠르다.

  3. 컨텍스트 스위칭이 빠르다.

  4. 통신이 쉽고, 실행 단위가 필요하다.

 

스레드는 실행 단위이며 스케줄링 단위이다.

  - 스레드는 응용프로그램 개발자에게는 작업을 만드는 단위

  - 스레드는 운영체제에게 실행 단위이고, 스케줄링 단위

  - 스레드는 코드, 데이터, 힙, 스택을 가진 실체

  - 스레드마다 스레드 정보를 저장하는 구조체 (TCB - Thread Control Block) 있음

 

프로세스는 스레드들의 컨테이너

  - 프로세스 개념이 스레드들의 컨테이너 역할로 수정됨

  - 프로세스는 반드시 1개 이상의 스레드로 구성

  - PCB와 TCB의 관계 ↓ (프로세스는 회사, 스레드는 직원에 비유)

 

프로세스는 스레드들의 공유 공간(환경) 제공

  - 모든 스레드는 프로세스의 코드, 데이터, 힙을 공유하며, 프로세스의 스택 공간을 나누어 사용

  - 공유되는 공간을 이용하면 스레드 사이의 통신 용이

 

스레드가 실행할 작업은 함수로 작성

  - 응용프로그램 개발자는 스레드가 실행할 작업을 함수로 작성

    - 함수를 실행할 스레드 생성을 운영체제에게 요청할 때 스레드 생성

    - 운영체제는 TCB 생성, 함수의 주소를 스레드 실행 시작 주소로 TCB에 등록.

    - 스레드 생성은 곧 TCB 생성

 

  - 운영체제는 TCB 리스트로 전체 스레드 관리

    - 스레드 스케줄 : TCB 중에서 하나 선택, 스레드 단위로 스케줄

    - TCB에 기록된 스레드의 시작 주소를 CPU에 적재하면 실행 시작됨

 

스레드의 생명과 프로세스의 생명

  - 스레드로 만든 함수가 종료하면 스레드 종료

  - 스레드가 종료하면 TCB 등 스레드 관련 정보 모두 제거

  - 프로세스에 속한 모든 스레드가 종료될 때, 프로세스 종료

 

멀티스레드 응용 프로그램 사례

멀티스레드 응용프로그램 사례

멀티스레딩과 concurrency, parallelism

 - 동시성 (concurrency)

   - 1개의 CPU에서 2개 이상의 스레드가 동시에 실행 중인 상태

동시성의 사례

 - 병렬성 (parallelism)

   - 2개 이상의 스레드가 다른 CPU에서 같은 시간에 동시 실행

병렬성의 사례

스레드 주소 공간과 컨텍스트

스레드 주소 공간

- 스레드가 실행 중에 사용하는 메모리 공간

- 프로세스의 주소 공간 내에 형성

 

스레드 주소 공간은 프로세스 주소 공간 내에서 사적 공간과 공유 공간으로 구분

- 스레드 사적 공간

  - 스레드 스택

  - 스레드 로컬 스토리지(TLS - Thread local storage)

- 스레드 사이의 공유 공간

  - 프로세스의 코드

  - 프로세스의 데이터 공간

  - 프로세스의 힙 영역

스레드 주소 공간 사례

스레드 주소 공간에 대한 설명

스레드 코드 영역

- 스레드가 실행할 작업의 함수, 프로세스의 코드 영역에 있음

- 스레드는 프로세스의 코드 영역에 있는 다른 모든 함수 호출 가능

 

스레드 데이터 영역

- 스레드가 사용할 수 있는 데이터 공간

- 2개의 공간

   - 프로세스에 선언된 모든 전역 변수들 - 프로세스의 데이터 영역

   - 개별 스레드의 전용 변수 공간

 

스레드

- 모든 스레드가 동적 할당받는 공간, 프로세스 힙 공간을 공유하여 사용

- 스레드에서 malloc()을 호출하면 프로세스의 힙 공간에서 메모리 할당

 

스레드 스택

- 스레드가 생성될 때,

- 스레드가 시스템 호출로 커널에 진입할 때, 커널 스택 활용

- 스레드 종료시, 스레드가 할당 받은 사용자 스택과 커널 스택 반환

 

스레드 상태

- 스레드는 생성, 실행, 중단, 실행, 소멸의 여러 상태를 거치면서 실행

- 스레드의 상태는 TCB에 저장

- 상태

   1) 준비 상태(Ready) - 스레드가 스케줄 되기를 기다리는 상태

   2) 실행 상태(Running) - 스레드가 CPU에 의해 실행 중인 상태

   3) 대기 상태(Blocked) - 스레드가 입출력을 요청하거나 sleep() 같은 시스템 호출로 인해 중단된 상태

   4) 종료 상태(Terminated) - 스레드가 종료한 상태

스레드 운용

운용의 종류

  1) 스레드 생성

    - 프로세스가 생성되면 운영체제에 의해 자동으로 main 스레드 생성

    - 스레드는 시스템 호출이나 라이브러리 함수를 호출하여 새 스레드 생성 가능

  2) 스레드 종료

    - 프로세스 종료와 스레드 종료의 구분 필요

    - 프로세스 종료

    - 스레드 종료

  3) 스레드 조인

    - 스레드가 다른 스레드가 종료할 때까지 대기

  4) 스레드 양보

    - 스레드가 자발적으로 yield()와 같은 함수 호출을 통해 스스로 실행을 중단하고 다른 스레드를 스케줄하도록 요청

스레드 조인 예시

스레드 컨텍스트

- 스레드가 현재 실행중인 일체의 상황

- CPU 레지스터 값들

- 스레드 컨텍스트 정보

  - PC 레지스터 : 실행중인 코드 주소

  - SP 레지스터 : 실행중인 함수의 스택 주소

  - 상태 레지스터 : 현재 CPU의 상태 정보

  - CPU에 기타 수십 개의 레지스터 있음 : 데이터 레지스터 등

  - 컨텍스트가 스위치 될 때 TCB에 저장

 

 

 

 

 

 

스레드 제어 블록, TCB(Thread Control Block)

- 스레드를 실행 단위로 다루기 위해 스레드에 관한 정보를 담은 구조체

- 커널 영역에 만들어지고, 커널에 의해 관리

 

스레드와 TCB, 그리고 PCB와의 관계

프로세스 : 스레드들이 생기고 활동하는 자원의 컨테이너

TCB들은 연결리스트로 연결

 

 

 

 

 

 

준비 리스트와 블록 리스트

- 준비 리스트

  - 준비 상태에 있는 스레드들의 TCB를 연결하는 연결리스트

  - 스레드 스케줄링은 준비 리스트의 TCB들 중 하나 선택

- 블록 리스트

  - 블록 상태에 있는 스레드들의 TCB를 연결하는 연결리스트

준비 리스트와 블록 리스트 예제

스레드 컨텍스트 스위칭(스레드 스위칭) 

현재 실행중인 스레드의 상태정보를 저장하고, 다음 실행할 스레드의 상태정보를 읽어 들이는 작업

스레드 스케줄링 후, 현재 실행중인 스레드를 중단시키고, 선택된 스레드에게 CPU 할당

(현재 CPU컨텍스트를 TCB에 저장 → 선택된 스레드의 TCB에서 컨텍스트를 CPU에 적재, CPU는 선택된 스레드 실행)

스레드 컨텍스트 스위칭

발생하는 경우

1) 스레드가 자발적으로 다른 스레드에게 양보 : yield() 등의 시스템 호출을 통해

2) 스레드가 시스템 호출을 실행하여 블록되는 경우 : read(),sleep(),wait()등 I/O가 발생하거나 대기할 수 밖에 없는 경우

3) 스레드의 타임 슬라이스(시간 할당량)를 소진한 경우 : 타이머 인터럽트에 의해 체크되어 진행

4) I/O 장치로 부터 인터럽트가 발생한 경우 : 현재 실행중인 스레드보다 높은 순위의 스레드가 I/O작업을 끝낸 경우 

 

발생 위치

1. 스레드가 시스템 호출을 하여, 커널이 시스템 호출을 처리하는 과정에서

2. 인터럽트가 발생하여 인터럽트 서비스 루틴이 실행되는 도중 커널 코드에서

 

과정

1) CPU 레지스터 저장 및 복귀

 - 현재 실행 중인 스레드 A의 컨텍스트를 TCB-A에 저장

 - TCB-B에 저장된 스레드 B의 컨텍스트를 CPU에 적재

2) 커널 정보 수정

 - 스레드의 상태정보와 CPU사용 시간 등 수정

 - TCB-A를 준비 리스트나 블록 리스트로 옮김

 - TCB-B를 준비 리스트에서 분리

 

컨텍스트 스위칭 오버헤드

어떤 부담이 있는가?

- 컨텍스트 스위칭은 모두 CPU 작업 → CPU 시간 소모

- 컨텍스트 스위칭의 시간이 길거나, 잦은 경우 컴퓨터 처리율 저하

 

구체적인 컨텍스트 스위칭 오버헤드

동일한 프로세스 내 다른 스레드로 스위칭되는 경우

1) 컨텍스트 저장 및 복귀

2) TCB 리스트 조작

3) 캐시 플러시와 채우기 시간

다른 프로세스의 스레드로 스위칭하는 경우

다른 프로세스로 교체되면, CPU가 실행하는 주소 공간이 바뀌는 큰 변화로 인한 추가적인 오버헤드 발생

1) 추가적인 메모리 오버헤드

2) 추가적인 캐시 오버헤드

 

스레드 스케줄링 주체에 따라 2종류의 스레드로 구분

- 커널 레벨 스레드 : 커널에 의해 스케줄링되는 스레드

- 사용자 레벨 스레드 : 스레드 라이브러리에 의해 스케줄링되는 스레드

 

커널 레벨 스레드

- 스레드에 대한 정보(TCB)는 커널 공간에 생성되며 커널에 의해 소유됨

- 응용 프로그램이 시스템 호출을 통해 커널 레벨 스레드 생성

- 커널이 만들고, 커널에 의해 스케줄

- 스레드 주소 공간(스레드 코드와 데이터) : 사용자 공간에 존재

- main 스레드는 커널 스레드

  - 응용프로그램을 적재하고 프로세스를 생성할 때 커널은 자동으로 main 스레드 생성

main 스레드의 TCB는 커널에 생성

 

사용자 레벨 스레드

- 응용프로그램이 라이브러리 함수를 호출하여 사용자 레벨 스레드 생성

- 스레드 라이브러리가 스레드 정보(U-TCB)를 사용자 공간에 생성하고 소유

- 스레드 라이브러리에 의해 스케줄

- 스레드 주소 공간(스레드 코드와 데이터) : 사용자 공간에 존재

 

순수 커널 레벨 스레드

- 부팅 때부터 커널의 기능을 돕기 위해 만들어진 스레드

- 커널 코드를 실행하는 커널 스레드

- 스레드의 주소 공간은 모두 커널공간에 형성

- 커널 모드에서 작동, 사용자 모드에서 실행되는 일은 없음

 

멀티스레드 구현

- 응용프로그램에서 작성한 스레드가 시스템에서 실행되도록 구현하는 방법

- 방법

  1) N:1 매핑 (N개의 사용자 레벨 스레드를 1개의 커널 레벨 스레드로 매핑)

  2) 1:1 매핑 (1개의 사용자 레벨 스레드를 1개의 커널 레벨 스레드로 매핑)

  3)  N:M 매핑 (N개의 사용자 레벨 스레드를 M개의 커널 레벨 스레드로 매핑)

 

1) N:1 매핑 개념

- 모든 프로세스를 단일 스레드 프로세스로 다룸

- 커널은 프로세스 당 1개의 커널 레벨 스레드(TCB) 생성

- 프로세스의 모든 사용자 레벨 스레드(N개)가 1개의 커널 레벨 스레드에 매핑

- 사용자 레벨 스레드는 스레드 라이브러리에 의해 스케줄되고 스위칭됨

- 매핑이란? : 사용자 레벨 스레드는 해당 커널 레벨 스레드가 스케줄되어야 실행 가능하도록 묶여있음

- 장점 : 단일 코어 CPU에서 멀티스레드 응용프로그램의 실행 속도가 전반적으로 빠르다

- 단점 : 멀티 코어 CPU가 보편화된 현대 컴퓨터에서 비효율적, 하나의 사용자 레벨 스레드가 블록되면 프로세스 전체 블록

 

2) 1:1 매핑 개념

- 사용자 레벨 스레드 당 1개의 커널 레벨 스레드(TCB) 생성

- 사용자 레벨 스레드는 매핑된 커널 레벨 스레드가 스케줄될 때 실행

- 장점

    - 개념이 단순하여 구현이 용이

    - 멀티 코어 CPU에서 멀티 스레드 응용프로그램에게 높은 병렬성 제공

    - 하나의 사용자 레벨 스레드가 블록되어도 응용프로그램 전체가 블록되지 않음

- 단점

    - 커널에게는 부담스러운 정책

    - 사용자 레벨 스레드가 많아지면 커널의 부담

 

3) N:M 매핑 개념

- N개의 사용자 레벨 스레드를 M개의 커널 레벨 스레드에 매핑

- 장점

  - 1:1 매핑에 비해 커널 엔티티 개수가 작아 커널의 부담이 적음

- 단점

  - 구현하기 복잡하여 현대의 운영체제에서 사용 X

 

멀티스레딩에 관한 이슈

프로세스와 스레드 리뷰

- 프로세스는 스레드들의 공유 공간

- 프로세스는 운영체제가 응용프로그램을 적재하는 단위이고, 스레드는 실행 단위

- PCB에 저장된 정보는 환경 컨텍스트, TCB에 저장된 정보는 실행 컨텍스트

- 다른 프로세스에 속한 스레드로의 스위칭보다 동일한 프로세스에 속한 스레드 스위칭 속도가 빠름

- 프로세스에 속한 모든 스레드가 종료할 때 프로세스 종료

 

멀티스레딩으로 응용프로그램을 작성하는 장점

- 높은 실행 성능 : 병렬 실행

- 사용자에 대한 우수한 응답성 : 한 스레드가 블록되어도 다른 스레드를 통해 사용자와의 입출력 가능

- 서버 프로그램의 우수한 응답성 : 웹 서버나 파일 서버 등은 동시에 많은 사용자들의 접근, 이들을 병렬적으로 서비스하는데 우수

- 시스템 자원 사용의 효율성 : 스레드는 프로세스에 비해 생성, 유지 시 메모리나 자원 적게 사용

- 응용프로그램 구조의 단순화 : 작업 기준으로 응용프로그램을 여러 함수로 분할하고, 각 함수 별로 스레드를 만들어 동시 실행, 새로운 기능 추가 용이, 프로그램의 높은 확장성

- 작성이 쉽고 효율적인 통신

 

멀티스레딩에 있어 주의할 점

- 여러 개의 스레드 중 한 스레드가 fork()를 호출한 경우

   - 새로 생성된 프로세스는 fork()를 호출한 스레드로만 구성

   - 심각한 문제

- 한 스레드가 exec()를 호출한 경우

   - 현재 프로세스에 새 응용프로그램이 적재되어, 현재 프로세스의 모든 스레드가 사라지는 문제

- 스레드 사이의 동기화 문제

   - 프로세스 내에 있는 공유데이터를 다수 스레드가 액세스할 때, 공유데이터 훼손 가능성 → 동기화 기법으로 해결

반응형

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

[운영체제] 스레드 동기화  (0) 2023.04.17
[운영체제] 4주차 - 프로세스와 프로세스 관리  (0) 2023.03.27
[운영체제] 3주차  (0) 2023.03.20
[운영 체제] 2주차  (0) 2023.03.13
Comments