- 순서
- 컨텍스트란?
- 컨텍스트 스위칭이란?
- 컨텍스트 스위칭의 과정
- 컨텍스트 스위칭 주의점
- 컨텍스트 스위칭의 비용
- 프로세스 vs 스레드에서의 컨텍스트 스위칭 차이
- C++/UE 관점
- 레이스 컨디션
- 컨텍스트란?
- 프로세스나 스레드가 실행되던 상태를 말함
- 레지스터 값
- 프로세스 메모리 상태
- CPU 상태
- 커널에서 관리하는 PCB 정보
- 위 정보들을 저장해뒀다가 나중에 다시 불러오면 마치 중단된 지점에서 다시 이어서 실행되는 것 처럼 보이게 됨.
- 프로세스나 스레드가 실행되던 상태를 말함
- 컨텍스트 스위칭이란?
- CPU가 실행 중인 프로세스나 스레드의 상태를 저장하고, 다른 프로세스나 스레드의 상태로 교체하는 과정
- 운영체제가 멀티태스킹을 지원하기 위해 필수적으로 수행하는 작업
- 즉, 하나의 CPU에서 여러 프로그램 또는 스레드가 동시에 실행되는 것처럼 보이게 하는 핵심 기술
- 컨텍스트 스위칭 과정
- 실행 중인 프로세스/스레드의 상태를 PCB에 저장
- 실행할 다른 프로세스/스레드의 PCB를 읽어 상태 복원
- CPU가 새로운 작업을 실행 시작
- 컨텍스트 스위칭 주의점
- 성능 비용(오버헤드, 캐시 무효화)
- 동기화 문제(레이스 컨디션 ,데드락)
- 스케줄링 문제(기아상태, 응답 지연)
- 실시간성(지연 허용 불가한 환경에서 위험)
- 보안/안전성(주소 공간 전환 시 메모리 침범에 대한 보호 필요)
- 컨텍스트 스위칭의 비용
- 저장/복원 오버헤드: 레지스터 값 등 저장.로드 필요함
- 캐시 미스 증가: CPU 캐시가 다른 프로세스로 바뀌며 무효화됨
- TLP 제한: 너무 자주 바뀌면 오히려 성능이 저하됨
- 즉 스레드 개수를 무조건 많이 늘린다고 성능이 좋아지지 않음
- 프로세스 vs 스레드에서의 컨텍스트 스위칭 차이
- 프로세스 컨텍스트 스위칭
- 주소 공간까지 바뀌므로 페이지 테이블 교체가 필요함
- 비용이 큼
- 스레드 컨텍스트 스위칭
- 같은 프로세스 안에서 실행되므로 주소 공간을 공유함
- 메모리 맵핑은 유지, 레지스터/스택만 교체함 => 비용이 상대적으로 적음
- 프로세스 컨텍스트 스위칭
- C++/UE 관점
- C++에서 thread 여러 개를 만들면 OS 스레드 위에서 동작함 => 운영체제가 스레드 스케줄링하며 컨텍스트 스위칭이 발생
- 언리얼 엔진에서도 게임 쓰레드, 렌더 쓰레드, 작업 쓰레드 등 여러 스레드가 존재함.
- 컨텍스트 스위칭이 많으면 프레임 드롭 발생 가능
- 레이스 컨디션
- 레이스 컨디션이란 두 개 이상의 프로세스나 스레드가 공유된 자원에 접근하고, 그 결과 접근 순서나 타이밍에 따라 달라질 수 있는 상황을 의미하는데, 이로 인해 결과값이 달라지거나, 데이터가 손상될 수 있음
- 레이스 컨디션이 발생하는 이유
- 데이터 접근 타이밍: 만약 중단 시점에 해당 프로세스가 공유된 자원을 사용하던 중이었다면, 컨텍스트 스위칭 후 다른 프로세스가 해당 자원에 접근하게 됨.
- 동기화 부족: 공유 자원에 대한 접근을 제어하는 동기화 메커니즘이 적절히 사용되지 않았을 때
- 레이스 컨디션 해결 방법
- 공유 자원에 하나의 스레드만 접근할 수 있도록 상호배제를 구현하는 것이 중요함. 이를 위해 세마포어나 뮤텍스를 사용하여 해결할 수 있음.
- 하지만 데드락의 조건 중 하나인 상호배제를 충족하므로 잘못 구현시 컨텍스트 스위칭과 맞물리며 데드락이 발생할 수 있음
- 공유 자원에 하나의 스레드만 접근할 수 있도록 상호배제를 구현하는 것이 중요함. 이를 위해 세마포어나 뮤텍스를 사용하여 해결할 수 있음.
'CS' 카테고리의 다른 글
| [CS]busy-waiting (3) | 2025.08.28 |
|---|---|
| [CS]임계영역과 데드락 (0) | 2025.08.28 |
| [CS] 캐시의 지역성 (0) | 2025.08.28 |
| [CS] 프로세스와 스레드 (2) | 2025.08.28 |
| [CS]메모리 단편화 (1) | 2025.08.28 |