티스토리 뷰
Instruction execution
프로세스가 시작된 이후 CPU가 프로그램을 실행할 때의 순서
- 프로세스를 위한 메모리 초기화
- file -> memory code segment load
- rip를 메모리 code의 entry point로 이동
- instruction 실행
PCB (Process Control Block)
운영체제는 여러 프로세스를 동시에 실행해야 하므로, 실행 중인 프로세스를 전환할 때마다 현재 프로세스의 상태를 저장해야 한다. 이를 PCB(Process Control Block) 에 저장하며, PCB는 커널 영역의 메모리에 위치한다.
PCB에는 다음과 같은 정보가 포함된다.
- 프로세스 ID (PID): 프로세스 고유 식별자
- 프로세스 상태 (Process State): 실행(Running), 대기(Waiting), 준비(Ready) 등
- CPU 레지스터 정보: RIP, RSP, RAX 등의 레지스터 값
- 스케줄링 정보: 우선순위, 타임 슬라이스(Quota)
- 메모리 정보: 코드, 데이터, 힙, 스택 영역의 위치
- 파일 핸들 및 입출력 상태
운영체제는 PCB를 이용해 프로세스의 문맥(Context)을 저장 및 복구하며, 이 과정이 Context Switching이다.
Timer Interrupt & Context Switching
운영체제는 특정 프로세스가 CPU를 독점하는 것을 방지하기 위해 타이머 인터럽트(Timer Interrupt) 를 사용한다.
- 운영체제는 각 프로세스가 CPU를 사용할 수 있는 시간(Quota) 을 설정한다.
- CPU 내부의 타이머가 일정 시간이 지나면 Timer Interrupt 를 발생시킨다.
- 인터럽트 핸들러가 호출되어 현재 실행 중인 프로세스의 시간을 체크한다.
- 만약 할당된 시간이 초과되었으면, 현재 프로세스를 중단하고 Context Switching을 수행한다.
Context switching
- A 프로세스 실행 중
- Timer Interrupt 발생 → 커널 모드 진입
- 현재 A의 레지스터 값을 Kernel Stack에 Push
- 커널 모드에서 Context Switching Handler 실행
- A 프로세스의 정보를 PCB에 저장
- 스케줄러가 다음 실행할 B 프로세스를 결정
- B의 PCB에서 레지스터 값을 Kernel Stack에 복원 (Pop)
- B 프로세스의 Kernel Stack에서 User Stack으로 전환
- 유저 모드로 돌아가 B 프로세스 실행
리눅스 커널 변경사항
과거의 운영체제와 비교할 때, 현대의 리눅스 시스템은 더 최적화된 Context Switching 기법과 효율적인 스케줄러를 사용한다.
https://en.wikipedia.org/wiki/Linux_kernel_version_history
리눅스 2.6 – 선점형 커널 도입
- Preemptible Kernel 추가
기존 리눅스에서는 커널 모드에서 실행 중인 코드가 끝날 때까지 문맥 전환이 불가능했으나, 리눅스 2.6부터 커널 코드 실행 중에도 선점(Context Switching)이 가능해짐.
→ IO 작업 시에도, context switching 가능
→ 실시간 시스템 및 응답성이 중요한 애플리케이션의 성능 개선
리눅스 3.x – RCU 최적화
- RCU(Read-Copy-Update) 개선
다중 코어 환경에서 데이터 동기화 시 기존의 락(lock) 기반 방식보다 더 효율적인 RCU 기법을 최적화.
→ 커널 데이터 보호 중에도 Context Switching 오버헤드 최소화
리눅스 4.x – Lazy TLB Switching 도입
- Lazy TLB Switching
기존 방식은 프로세스 전환 시마다 TLB(Translation Lookaside Buffer)를 모두 초기화해야 했음.
→ 불필요한 TLB 플러시를 최소화하여 문맥 전환 속도 향상 - Zero-Copy 최적화
네트워크 패킷 전송 및 파일 I/O 시 CPU가 데이터를 중복 복사하지 않도록 개선.
→ I/O 작업 중 불필요한 Context Switching 발생 빈도 감소
리눅스 5.x – 커널 스레드 전환 최적화
- 커널 스레드와 유저 스레드 간 전환 속도 개선
커널 모드에서 실행되는 작업이 많을 경우 스레드 간 전환 속도를 최적화하여 지연 시간 감소.
→ 멀티태스킹 환경에서 Context Switching 오버헤드 감소
리눅스 6.x – Futex2 & MGLRU 도입
- Futex2 시스템 콜 도입
기존 Futex(Fast Userspace Mutex)보다 더 효율적인 동기화 메커니즘을 제공하여, 멀티스레드 환경에서 문맥 전환 비용 감소. - MGLRU(Multi-Gen LRU) 적용
기존 LRU(Least Recently Used) 방식보다 더 효율적으로 메모리 캐시를 관리하여 TLB 캐시 미스 감소.
→ context switching 시 메모리 접근 속도 향상 및 캐시 활용률 증가
'CS > OS' 카테고리의 다른 글
system call deep dive (0) | 2024.06.01 |
---|---|
Pintos 디버깅 팁 (2) | 2023.12.30 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 해커톤
- codeanywhere
- 웹IDE
- 토이프로젝트
- 시간 초과
- C
- ttyd
- 분할 정복
- vector search
- 사이버정보지식방
- pvm
- OpenSearch
- 뿌요뿌요
- FastAPI
- 프로젝트
- Python
- os
- Web
- react
- io blocking
- 구름ide
- letsencrypt
- HNSW
- 코딩
- 백준
- 정보보호병
- 싸지방
- pintos
- 뿌요뿌요 테트리스
- 리눅스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함