PintOS 첫시작! _ 반드시 알아야할 개념

안녕하수꽈

드디어 아기다리고아기다리던 핀토스가 왔습니더

핀토스가 뭣이냐라고 물으신다면

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; // 리스트에 들어갈 때 쓰임
};
  • 모든 스레드의 정보는 이 구조체 하나에 들어감

 

결론적으로

핀토스 첫 주는 '스레드'를 중심으로 운영체제의 스케줄링 핵심 원리를 직접 구현해보게 될 것 입니다