안녕하수꽈
드디어 아기다리고아기다리던 핀토스가 왔습니더
핀토스가 뭣이냐라고 물으신다면
2004년 스탠포드에서 만들어진 교육용 운영체제랍니다
그걸 기반으로 카이스트에서 만든 Kaist PintOS를 5주동안 구현해볼 예정입니다
일단 첫 시작은 1주일 동안 스레드에 관해 구현합니다
핵심적인 과제는 총 세가지로 볼 수 있습니다
- Alarm Clock
- Priority Scheduling
- Advanced Scheduler
지금 이 글에선 짧게 PintOS를 위한 기본 개념들을 다뤄보겠습니다
1. 스레드(Thread)
- 스레드는 프로세스 내에서 실행되는 가장 작은 단위
- Pintos는 커널 스레드 기반 스케줄링을 직접 구현하는 프로젝트
- 각 스레드는 struct thread 구조체로 표현되며,
- 각자 스택/상태/우선순위를 가진다
2. 문맥 전환(Context Switch)
- 하나의 스레드에서 다른 스레드로 CPU를 넘기는 과정
- 스레드의 레지스터/스택 포인터 같은 정보를 저장 & 복원함
- schedule() 함수에서 이뤄지고, 이걸 제대로 구현해야 스레드가 잘 돌아감
3. Timer Interrupt (타이머 인터럽트)
- Pintos는 100Hz 주기로 인터럽트가 발생
- 매 tick마다 timer_interrupt()가 호출됨
- 여기에 알람 클락 기능이나 우선순위 선점 기능을 넣게 됨
4. Tick
- Pintos에서 시간의 기본 단위
- 1 tick ≈ 1/100초
- timer_ticks()로 현재 tick 수를 알 수 있음
- timer_sleep(x) → x tick 동안 스레드 BLOCKED
5. Thread State (스레드 상태)
| 상태 | 설명 |
| THREAD_RUNNING | CPU를 점유하고 실행 중 |
| THREAD_READY | 실행 대기 중 (ready_list에 있음) |
| THREAD_BLOCKED | 입출력, sleep 등으로 대기 중 |
| THREAD_DYING | 종료 예정 상태 |
6. Ready List & Sleep List
- ready_list: 현재 실행 가능한 스레드들의 큐
- sleep_list: 잠들어 있는 스레드들의 리스트
- 둘 다 struct list 기반으로 관리되며 정렬이 중요함
7. interrupt 관련 함수
- intr_disable(): 인터럽트 비활성화 (critical section 보호)
- intr_set_level(old_level): 원래 인터럽트 상태로 복구
- 중요한 커널 함수 (예: thread_block, thread_unblock) 내부에서 자주 사용됨
8. thread 구조체 (struct thread)
struct thread {
tid_t tid; // 스레드 ID
int priority; // 우선순위
enum thread_status; // 상태: RUNNING, READY 등
int64_t wake_up_tick; // 알람 클락용 깨어날 시간
struct list_elem elem; // 리스트에 들어갈 때 쓰임
};
- 모든 스레드의 정보는 이 구조체 하나에 들어감
결론적으로
핀토스 첫 주는 '스레드'를 중심으로 운영체제의 스케줄링 핵심 원리를 직접 구현해보게 될 것 입니다
'크래프톤정글 > Pintos' 카테고리의 다른 글
| PintOS_Priority_Scheduling_part_3_donation (1) | 2025.05.13 |
|---|---|
| 지금까지의 개념 정리_Alram Clock & Priority Scheduling (0) | 2025.05.12 |
| PintOS_Priority_Scheduling_part_2 (0) | 2025.05.11 |
| PintOS_Priority_Scheduling_part_1 (0) | 2025.05.10 |
| PintOS_Alarm Clock (2) | 2025.05.09 |