OS 개발에서 thread_sleep과 timer_interrupt 핵심 원리
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

[05.10/week09]TIL

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

DevOps

대상자

OS 개발자/시스템 프로그래머, 동시성 프로그래밍 초보자

핵심 요약

  • thread_sleep 함수는 스레드 상태를 BLOCK으로 변경하고 sleep_list에 등록하여 타이머 인터럽트로 깨우는 메커니즘 구현
  • timer_interrupt 함수가 ticks 증가와 thread_wakeup 호출로 스레드 깨우기 트리거
  • thread_current() 호출 시 스레드 상태가 THREAD_RUNNING이 아닐 경우 Kernel PANIC 발생 (스레드 상태 검증 오류)

섹션별 세부 요약

  1. timer_sleep 함수 구현
  • start 변수에 OS 부팅 후 경과 시간 저장
  • thread_sleep(start + ticks) 호출로 스레드를 BLOCKED 상태로 전환
  • thread_yield() 대신 thread_sleep 사용으로 CPU 사용률 최적화
  1. thread_sleep 함수 동작
  • 스레드 상태를 THREAD_BLOCKED로 변경
  • sleep_list에 스레드를 list_push_back으로 추가
  • set_global_tick(ticks)로 전역 ticks 업데이트
  1. timer_interrupt 함수 역할
  • ticks 증가 및 thread_tick() 호출로 CPU 사용량 업데이트
  • get_global_tick() <= ticks 조건 충족 시 thread_wakeup(ticks) 호출
  1. thread_wakeup 함수 동작
  • sleep_list 순회하며 wakeup_tick <= ticks인 스레드 제거 및 thread_unblock 호출
  • set_global_tick()으로 전역 ticks 업데이트 (조건 불충족 시)
  1. Kernel PANIC 발생 원인
  • thread_current() 호출 시 스레드 상태가 THREAD_RUNNING이 아님
  • thread_sleep에서 global_tick 갱신 누락, thread_wakeup에서 curr 변수 초기화 미흡

결론

  • 스레드 상태 관리 시 THREAD_RUNNING 검증 필수, thread_sleep에서 global_tick 업데이트 및 thread_wakeupcurr 초기화 개선 필요
  • sleep_list 순회 시 인터럽트 비활성화로 리스트 조작 보장