프로세스의 문제점
1) 프로세스를 다루는 문제점
- 프로세스 생성의 큰 오버헤드 발생 ← 프로세스를 위한 메모리 할당
- 프로세스 컨텍스트 스위칭의 큰 오버헤드 ← cpu가 참고할 매핑 테이블 전환에 따른 지연
- 프로세스 사이의 통신 어려움 ← 프로세스들은 완전한 독립적인 주소 공간을 소유
스레드 개념
1) 스레드 출현 목적
- 프로세스보다 더 작은 실행 단위의 필요성
- 프로세스 생성 및 소멸에 따른 오버헤드의 감소 필요
- 빠른 컨텍스트 스위칭 필요
- 프로세스의 복잡한 통신, 느린 실행 속도, 코딩의 어려움 해소
2) 스레드 개념
#1 스레드는 실행, 스케줄링 단위
- 스레드는 개발자에게 작업을 만드는 단위, 운영체제에는 실행 단위, cpu를 할당하는 스케줄링 단위
- 코드, 데이터, 힙, 스택을 가진 실체
- 스레드마다 정보를 저장하는 TCB 구조체 존재
#2 프로세스는 스레드들의 컨테이너
- 프로세스는 스레드의 컨테이너
- 프로세스는 반드시 하나 이상의 스레드로 구성
- 프로세스가 생성될 때 운영체제에 의해 자동으로 하나의 스레드 생성 : 메인 스레드
#3 프로세스는 스레드들의 공유 공간 제공
- 모든 스레드는 프로세스의 코드, 데이터, 힙을 공유, 프로세스의 스택 공간을 나누어 사용
- 공유 공간을 통해 스레드 간의 통신 용이
#4 스레드는 함수로 작성
- 스레드가 실행할 작업은 함수로 작성
- 운영체제는 스레드 생성을 요청할 때 스레드를 만들며, 함수의 주소를 스레드 실행 시작 주소로 TCB 등록
- 운영체제는 TCB 리스트로 스레드 관리, 스케줄
#5 스레드와 생명과 프로세스의 생명
- 스레드로 만든 함수가 종료 → 스레드 종료
- 스레드가 종료하면 TCB 등 스레드 관련 정보 제거
- 프로세스가 속한 모든 스레드 종료 → 프로세스 종료
3) 스레드에 대한 이해
- 프로세스가 생성되면 자동으로 main 스레드 생성
- 스레드 코드는 함수로 만들어짐
- 스레드 생성은 라이브러리 함수나 시스템 호출을 통해 스레드 생성
- 스레드마다 TCB 1개 생성 - 시작 주소나 실행 재개 주소를 저장
- 스레드는 스케줄링되고 실행되는 실행 단위
- 프로세스는 스레드들의 컨테이너
- 프로세스는 스레드들에게 공유 공간을 제공
4) 멀티스레딩과 concurrency, parallelism
#concurrency(동시성)
- 1개의 cpu에서 2개 이상의 스레드가 동시에 실행 중인 상태
- 타임 슬라이스/입출력 등을 통해 cpu를 번갈아가며 스레드 실행
#parallelism(병렬성)
- 2개 이상의 스레드가 다른 cpu에서 같은 시간에 동시에 실행
스레드 주소 공간과 컨텍스트
1) 스레드 주소 공간
- 스레드가 생성되고 실행되는 동안 접근 가능한 메모리 영역
- 프로세스 주소 공간 내에 형성
- 스레드 주소 공간 구성요소
- 사적 공간 ( 스레드 코드, 스레드 로컬 스토리지 )
- 공유 공간 ( 프로세스 코드, 데이터, 힙 영역 ) - 프로세스 내에 존재
2) 스레드 주소 공간의 요소
#1 스레드 코드영역
- 스레드가 실행할 작업의 함수
- 스레드는 프로세스 코드 영역에 있는 다른 함수 호출 가능
#2 스레드 데이터 영역
- 스레드가 사용할 수 있는 데이터 공간
- 개별 스레드 전용 공간 (TLS) 와 스레드에 의해 공유가 가능한 프로세스 데이터 공간으로 구분
#3 스레드 힙
- 모든 스레드가 동적 할당받는 공간으로 프로세스의 힙 공간 사용
#4 스레드 스택
- 스레드가 생성될 때 마다 프로세스의 사용자 스택의 일부분 할당
- 시스템 호출로 커널 진입 시 커널 내에 스레드를 위한 스택 생성
3) 스레드 상태
- 스레드는 생성, 실행, 중단, 소멸의 여러 상태를 거침
- 스레드 상태는 TCB에 저장
#스레드 상태
- 준비 상태 : 스레드가 스케줄 되기를 기다리는 상태
- 실행 상태 : 스레드가 cpu에 의해 실행 중인 상태
- 대기 상태 : 스레드가 입출력을 요청하거나 sleep() 과 같은 시스템 호출로 인해 중단된 상태
- 종료 상태 : 스레드가 종료된 상태
4) 스레드 운용
- 스레드 생성, 종료, 조인, 양보 등 응용프로그램이 스레드에 대해 할 수 있는 것
#스레드 생성
- 스레드를 생성하는 시스템 호출이나 라이브러리 함수를 통해 생성
- 프로세스 생성 시 자동으로 main 스레드 생성
#스레드 종료
- 스레드만 종료하는 함수 호출 시 해당 스레드만 종료되며 main도 마찬가지
- 프로세스는 모든 스레드가 종료되어야 프로세스 종료
- 프로세스를 종료하는 exit 시스템 호출의 경우 모든 스레드가 종료됨
- 메인 스레드의 종료는 다른 스레드들도 종료
#스레드 조인
- 스레드가 다른 스레드 종료까지 대기
#스레드 양보
- 자신의 실행을 중단하고 다른 스레드가 스케줄되도록 지시
5) 스레드 컨텍스트
- 스레드의 실행 중인 상태 정보
- PC, SP, 상태 레지스터를 저장
- cpu의 레지스터를 저장해놓으면 이전에 실행 상태로 복귀 가능
6) 스레드 제어 블록
- 스레드를 실행 단위로 다루기 위해 스레드에 관한 정보를 담은 구조체
- 커널 영역에 만들어지고 커널에 의해 관리
- 프로세스 PCB와 링크드 리스트로 연결
#준비 리스트
- 준비 상태의 스레드들의 TCB를 연결하여 관리하는 링크드 리스트
- 준비 리스트의 TCB 중에서 하나 선택하여 스케줄링
#블록 리스트
- 블록 상태의 스레드들의 TCB를 연결하여 관리하는 링크드 리스트
7) 스레드 컨텍스트 스위칭
- 현재 실행 중인 스레드를 중단시키고 다른 스레드들에게 cpu 할당
#스레드 스위칭 발생 이유
- 스레드가 자발적으로 다른 스레드에게 양보
- 입출력 작업에 관련된 시스템 호출로 블록
- 스레드의 타임 슬라이스를 소진한 경우
- 입출력 장치로부터 인터럽트 발생한 경우
#스레드 스위칭 과정
- cpu 레지스터 저장 및 복귀 → 현재 실행 중인 스레드 컨텍스트를 저장 / 실행할 스레드의 컨텍스트를 cpu에 적재
- 커널 정보 수정 → 스레드의 상태 정보나 cpu 사용 시간 등 수정 → 준비 리스트 및 블록 리스트 수정
8) 컨텍스트 스위칭 오버헤드
- cpu 시간 소모, 스위칭 시간이 길거나 잦을 경우 컴퓨터의 처리율이 저하
#구체적인 스위칭 오버헤드
- 동일한 프로세스의 다른 스레드로 스위칭
- 컨텍스트 저장 및 목귀
- TCB 리스트 조작
- 캐시 플러시와 채우기 시간
- 다른 프로세스의 스레드로 스위칭
- 다른 프로세스로 교체 시 cpu가 실행하는 주소 공간이 바뀜
- 동일한 프로세스 안의 스레드 스위칭에 추가적인 오버헤드 소요
- 메모리 오버헤드 ( 새로운 프로세스의 매핑 테이블로 교체 )
- 캐시 오버헤드 ( CPU 캐시에 담긴 코드와 데이터가 무력화되므로 캐시가 채위지는 데 상당한 시간 소요
'Computer Science > Operating System' 카테고리의 다른 글
First Come First Served (FCFS) 구현 (0) | 2023.07.11 |
---|---|
[운영체제] CPU 스케줄링 (0) | 2023.07.11 |
[운영체제] 프로세스와 프로세스 관리 (1) | 2023.07.09 |
[운영체제] 컴퓨터 시스템과 운영체제 (0) | 2023.07.08 |
[운영체제] 운영체제의 시작과 발전 (0) | 2023.07.07 |