-
[운영체제] 스레드와 멀티태스킹개발공부/운영체제 2021. 1. 10. 03:04
스레드란?
프로세스의 주소 공간에서 독립적으로 실행되는 작은 단위의 코드
OR
스케줄러에 의해 스케줄되는 단위
스레드 코드는 함수로 작성되며, 스케줄러는 멀티 스레드 라이브러리나 운영체제에 있다.
스케줄러에 의해 실행, 중지, 재실행, 종료 등으로 제어된다.
스레드 기반 운영체제(멀티스레드 운영체제)
프로세스는 스레드의 공유 환경을 제공한다. 모든 프로세스는 반드시 한 개 이상의 스레드로 구성된다.
프로세스가 생성될 때, main 스레드를 생성하며, 각 스레드는 프로세서 내의 독립적인 주소 공간을 가진다.
현대의 거의 모든 운영체제를 뜻한다.
스레드 출현 배경
프로세스의 문제점 해결을 위해 고안되었다.
프로세스의 문제점?
1. 프로세스 생성 시간 오버헤드 : 프로세스를 위한 메모리할당, PCB 생성, 페이지 테이블 생성 등
2. 프로세스 사이의 컨텍스트 스위칭 오버헤드 : MMU 내에 페이지 테이블 전환에 따른 지연 시간등, PCB 현재 상태저장, 캐시변경 등
3. 프로세스 사이 통신의 어려움 : 프로세스들은 완전한 독립적인 주소공간을 가지고 있음, 한프로세스가 다른 프로세스의 메모리에 접근불가, 두 프로세스 사이에 데이터를 주고받기 위해서는 제 3의 공간이나 방법이 필요하다.
출현의 목적
1. 프로세스보다 더 작은 실행 단위 : 운영체제의 스케줄링 단위
2. 생성하고 소멸하기 쉽고 : 적은 오버헤드
3. 컨텍스트 스위칭이 빠르고 : 적은 오버헤드
4. 통신하기 쉽고 : 적은 오버헤드, 통신 코딩 간단
프로세스와 스레드 포함 관계
TCB(Thread Control Block) : 스레드에 관한 다양한 정보를 저장하는 구조체로
스레드 엔터티, 스케줄링 엔터티라고도 불린다.
PCB 가 TCB를 리스트 형식으로 가르키고 있다.
프로세스와 스레드 비교
프로세스 스레드 생성 새로운 프로세스를 위한 메모리 할당
페이지 테이블 생성
PCB 생성TCB 생성 컨텍스트 스위칭 PCB <-> PCB
페이지 테이블 교체(MMU, TLB)
캐시 플러시와 교체TCB <->TCB
캐시 플러시와 교체통신 프로세스 사이에 주소 공간의 공유 없음
공유메모리, 메시징, 파이프 등의 방법 사용
통신 시간과 메모리의 오버헤드 큼
부담스러운 프로그래밍스레드 내의 공유 변수 이용 가능
(스레드들은 프로세스의 자원을 공유함)
프로세스간 통신 기법도 사용가능스레드를 사용해야 하는 이유
1. 생성속도 : 스레드가 프로세스에 비해 운영체제에 의해 생성되는 시간이 빠르다.
2. 스위칭 속도 : 스레드 사이의 스위칭이 프로세스 사이의 스위칭보다 훨씬 빠르다.
3. 메모리 공유 : 스레드들은 프로세스의 주소 공간을 공유하므로 프로세스 주소 공간에
만들어진 함수들이나 프로세스에 데이터 공간에 만들어진 전역변수, 힙을 공유할 수 있다.
4. 통신의 편리성 및 높은 통신 속도 : 스레드사이의 통신은 프로세스의 공유 공간을 이용하여
다양한 방법으로 정보를 주고 받을 수 있어 매우 편리하다
5. 프로그램 구조의 간결성 : 멀티스레드 프로그램의 구조가 멀티프로세스의 구조보다 간결하다.
스레드 주소 공간
개별 스레드에게 할당된 메모리 영역으로
스레드가 실행되는 동안 접근하는 모든 메모리 영역과 스레드가 실행되기 위해 형성된 메모리 영역을 뜻한다.
공간은 다음과 같이 3가지 분류로 총 6가지를 담고 있다.
스레드 사적 공간(스레드마다 주어지는 공간) :
1. 스레드 코드 (Thread code)
2. 스레드 전용 전역 데이터 공간(TLS, Thread local storage)
3. 스레드 전용 스택공간 (Thread stack)
스레드 사이의 공유 공간(프로세스 내의 공간)
4. 다른 스레드와 공유하는 데이터 공간(Data)
5. 다른 스레드와 공유하는 힙 공간(Heap)
커널 모드에서 필요한 커널 스택
6. 각 스레드는 별도로 커널 스택을 가진다.
스레드 컨텍스트
멀티스레드 운영체제에서 하나의 스레드의 실행중인 상태 정보
CPU의 내부 정보, CPU 레지스터들의 값, PC,SP 등
스레드 제어 블록(TCB)
TCB, Thread Control Block
커널이 스레드를 실행 단위로 다루기 위한 커널 내 정보(구조체)를 뜻한다.
스레드가 생성될 때 만들어지며, 소멸되면 함께 사라진다.
구조는 다음 표와 같다.
구분 요소 설명 스레드 정보 TID 스레드 번호. 스레드마다 유일한 번호가 부여되고, 스레드를 구분할 때 사용 State 스레드의 상태를 나타내는 정보로, 실행(running), 준비(ready), 대기(waiting), 블록(blocked) ... 컨텍스트 PC 스레드의 다음에 실행할 코드의 주소 SP 스레드 스택의 톱 주소 레지스터들값 스레드가 중지될 때의 CPU 레지스터 값들 스케줄링 우선순위 커널이 스케줄링할 때 참고하는 스레드의 스케줄링 우선순위 CPU 사용 시간 스레드가 지금까지 CPU를 할당받아 사용한(실행한) 시간 관리를 위한
포인터들PCB에 대한 주소 스레드가 속한 프로세스의 프로세스 제어 블록에 대한 주소 다른 TCB에 대한 주소 다른 TCB들을 연결하기 위한 링크 I/O wait 리스트/준비
스레드 리스트스레드 스케줄링을 위한 링크 스레드 컨텍스트 스위칭
스레드 스위칭 : 현재 실행중인 스레드를 중단시키고, 다른 스레드에게 CPU를 할당하여 실행시키는 과정
스레드 스위칭을 컨텍스트 스위칭이라고도 부르며, 오버헤드이다.
발생하는 경우는 4가지로 다음과 같다.
1. 스레드가 자발적으로 다른 스레드에게 양보 : yield() 등의 시스템호출을 통해
2. 스레드가 시스템 호출을 실행하여 블록되는 경우 : I/O가 발생하거나 대기할 수 밖에 없을 때
3. 스레드의 타임 슬롯, 타임 할당량이 다한 경우 : 타이머 인터럽트
4. 하드웨어 인터럽트가 발생하는 경우 : 더 높은 우선순위의 스레드가 I/O 작업을 끝낸 경우
스레드 스위칭 과정
(스레드 1 = A, 스레드 2 = B 라고 가정)
1. A에서 시스템 호출
2. 사용자 모드에서 커널 모드로 진입
3. 사용자 스택의 주소를 커널 스택에 저장
4. 시스템 호출 실행
5. 시스템 호출 동안에 커널 스택 활용
6. 시스템 호출 중 스케줄러 호출
7. 스케줄러는 B 선택
8. 스위칭 진행
(A의 컨텍스트를 CPU로 부터 TCB1에 저장-> B의 컨텍스트를 TCB2로부터 CPU복귀)
9. B 의 사용자 스택의 주소를 커널 스택으로부터 CPU로 복귀
10. 스레드2의 커널 코드를 실행하여 시스템 호출로부터 복귀(사용자 모드로 변환)
스레드 스위칭 오버헤드
1. 같은 프로세스 내의 스레드 스위칭의 경우
- 현재 CPU의 컨텍스트 TCB에 저장
-> TCB로부터 스레드 컨텍스트를 CPU에 복귀
-> TCB 리스트 조작
-> 캐시
2. 다른 프로세스의 스레드로 스위칭하는 경우, 추가적인 작업
- MMU 수정 (페이지 맵 변경 때문에)
-> L1, L2 캐시(가상 주소로 액세스) flush
-> L1, L2 캐시를 새 프로세스의 데이터로 채우기
커널 레벨 스레드와 사용자 레벨 스레드
스레드는 스케줄링 주체에 따라 kernel-level 스레드와 user-level 스레드 2종류로 구분한다.
1. 커널 레벨 스레드
- 커널이 직접 스케줄링하는 스레드
- 스레드에 대한 정보를 커널이 가지고 있다.
- 프로세스는 시스템 호출을 통해 커널 레벨 스레드 생성이 가능하다.
2. 사용자 레벨 스레드
- 스레드 라이브러리가 스케줄링하는 스레드
- 사용자 공간에서 스레드 라이브러리가 스레드에 관한 정보 관리
- 커널은 사용자 레벨 스레드의 존재를 모름
- 실행되기 위해선 커널 스레드의 도움을 받아야 한다.
커널 스레드와 커널 레벨 스레드
커널 스레드 : 스레드 주소 공간이 커널 공간에 형성된 스레드
커널 레벨 스레드 : 커널에 의해 스케줄링되는 스레드 ex) 사용자가 생성한 스레드, 커널 스레드
'개발공부 > 운영체제' 카테고리의 다른 글
[운영체제] 메모리 관리 (0) 2021.01.21 [운영체제] Deadlock(교착 상태) (0) 2021.01.20 [운영체제] CPU 스케줄링 (0) 2021.01.18 [운영체제] 프로세스와 프로세스 관리 (20210104 스터디) (0) 2021.01.04 [운영체제] 운영체제 역사와 기초 (20201228 스터디) (0) 2020.12.28