스레드란?
프로세스의 주소 공간에서 독립적으로 실행되는 작은 단위의 코드를 의미하며 스케줄러에 의해 스케줄되는 단위 이기도 하다.
스레드는 프로세스의 오버헤드와 통신의 어려움을 해결하기 위해 만들어 졌다.
프로세스는 컨텍스트 스위칭이 느리고 생성, 소멸과정이 어려우며 프로세스간 통신할 때 메모리 맵 파일, 공유메모리, 소켓등으로 해야하기 때문에 많은 오버헤드가 발생한다.
프로세스 | ㅅ,레드 | |
생성 | 프로세스를 위한 메모리 할당 페이지 테이블 생성 PCB 생성 |
TCB 생성 |
컨텍스트 스위칭 | PCB <-> PCB 페이지 테이블 교체(MMU,TLB) 캐시 플러시와 교체 |
TCB <-> TCB 캐시 플러스와 교체 |
통신 | 프로세스 간의 메모리 굥유 없음 통신 시간과 메모리 오버헤드 큼 많은 프로그래밍 |
스레드 내의 공유 변수 사용 (프로세스 자원 공유) 프로세스간 통신기법 사용 |
*TCB - 스레드에 관한 다양한 정보를 저장하는 구조체. 스레드 엔터티, 스케줄링 엔터티라고도 불림.
멀티스레드 운영체제(스레드 기반 운영체제)
- 프로세스는 스레드의 공유환경제공
- 프로세스가 생성될 때 main 스레드 생성
- 각 스레드는 프로세스내에서 독립적인 주소 공간을 가짐
- 스레드가 실행단위(스레드 기반 스케줄링)
스레드 장점
1.생성속도
운영체제에 의해 생성되는 속도가 프로세스보다 빠르다.
2.스위칭 속도
프로세스 간의 스위칭보다 빠르다.
3.메모리 공유
스레드들은 프로세스의 주소 공간을 공유하므로 프로세스 주고 공간에 만들어진 함수들이나 프로세스의 전역변수, 힙을 공유한다.
4.빠르고 편리성 높은 통신
스레드 간의 통신은 프로세스의 공유 공간을 이용하기 때문에 정보를 주고 받을 방법이 많고 편리하다.
5.프로그램 구조의 간결성
멀티 프로세스의 구조보다 멀티 스레드 프로그램 구조가 간결하다.
스레드 주소 공간
개별 스레드에게 할당된 메모리 영역을 말하고 스레드 속한 프로세스의 공간 내에 생성된다.
스레드 실행되기 위해 형성되는 메모리 영역과 스레드 실행되는 동안 접근하는 모든 메모리 영역을 말한다.
스레드 사적 공간
스레드 코드
스레드 전용 전역 데이터 공간
스레드 전용 스택 공간
스레드간의 공유 공간
공유 데이터 공간
공유 힙 공간
각 스레드는 별도의 커널 스택을 가짐
프로세스 주소 공간 | |||
Code | 스레드1 코드 | 스레드2 코드 | 스레드3 코드 |
스레드 간의 공통으로 호출 가능한 코드(함수) |
|||
Data | 스레드1 전용 전역 변수 공간 | 스레드2 전용 전역 변수 공간 | 스레드3 전용 전역 변수 공간 |
프로세스의 전역 변수 공간 (스레드 간의 공유 전역 변수 공간) |
|||
Heap | 스레드가 할당 받을 수 있는 힙 공간 (프로세스 힙을 스레드들이 공유) |
||
User Stack | 스레드1 유저 스택 | 스레드2 유저 스택 | 스레드3 유저 스택 |
Kernel Stack | 스레드1 커널 스택 | 스레드2 커널 스택 | 스레드3 커널 스택 |
TCB(Thread Control Block)
커널이 스레드를 다루기 위한 커널 내 정보 구조체이다.
스레드 생성과 동시에 만들어져 소멸과 함꼐 사라진다.
구분 |
요소 |
설명 |
스레드 정보 |
TID |
스레드 번호. 스레드마다 유일한 번호가 부여되고, 스레드를 구분할 때 사용 |
State |
스레드의 상태를 나타내는 정보로, 실행(running), 준비(ready), 대기(waiting), 블록(blocked) ... |
|
컨텍스트 |
PC |
스레드의 다음에 실행할 코드의 주소 |
SP |
스레드 스택의 톱 주소 |
|
레지스터들값 |
스레드가 중지될 때의 CPU 레지스터 값들 |
|
스케줄링 |
우선순위 |
커널이 스케줄링할 때 참고하는 스레드의 스케줄링 우선순위 |
CPU 사용 시간 |
스레드가 지금까지 CPU를 할당받아 사용한(실행한) 시간 |
|
관리를 위한 포인터들 |
PCB에 대한 주소 |
스레드가 속한 프로세스의 프로세스 제어 블록에 대한 주소 |
다른 TCB에 대한 주소 |
다른 TCB들을 연결하기 위한 링크 |
|
I/O wait 리스트/준비 스레드 리스트 |
스레드 스케줄링을 위한 링크 |
스레드 컨텍스트 스위칭
스레드 컨텍스트란 멀티 스레드 운영체제에서 하나의 스레드의 실행중인 상태 정보이다.
스레드 컨텍스트 스위칭은 현재 CPU에 의해 실행되고 있는 스레드의 스레드 컨텍스트를 다른 스레드의 스레드 컨텍스트로 바꿔 CPU에 할당하는 것을 말한다.
발생 경우
1. 시스템 호출 혹은 라이브러리 호출을 통해 스레드가 자발적으로 다른 스레드에게 양보
2. 스레드가 시스템 호출을 실행하여 I/O가 발생하거나 대기하는 블록상태인 경우
3. 타이머 인터럽트로 인하여 스레드의 타임 슬롯, 타임 할당량이 다한 경우
4. 하드웨어 인터럽트가 발생하는 경우( 더 높은 순위의 스레드 I/O가 끝난 경우)
과정
1번 스레드에서 시스템 호출
사용자모드에서 커널 모드 변환
사용자 스택의 주소를 커널 스택에 저장
시스템 호출 실행
시스템 호출동안 커널 스택 활용
시스템 호출 중 스케줄러 호출
스케줄러는 2번 스레드 선택
컨텍스트 스위치 진행
1번 스레드 컨텍스트를 CPU에서 TCB1에 저장
2번 스레드의 컨텍스트를 TCB2에서 CPU로 로드
2번 스레드의 사용자 스택의 주소를 커널 스택으로부터 CPU에 로드
2번 스레드의 커널 코드를 실행해 시스템 호출에서 복귀(커널 모드에서 사용자 모드로 전환)
동일 프로세스 내 스위칭 vs 다른 프로세스 간의 스위칭
현재 CPU의 컨텍스트 TCB에 저장 | MMU수정(페이지 맵 변경) |
TCB로부터 스레드 컨텍스트를 CPU에 복귀 | L1, L2 캐시 비우기 or 메모리에 저장 |
TCB 리스트 조작 | L1, L2 캐시에 새로운 프로세스 데이터 로드 |
캐시 |
'운영체제' 카테고리의 다른 글
커널, 사용자 레벨 스레드와 맵핑 (0) | 2021.01.12 |
---|---|
프로세스 (0) | 2021.01.04 |
컴퓨터 시스템과 운영체제 (0) | 2020.12.28 |
운영체제의 정의와 역사 (0) | 2020.12.28 |