THREAD_RUNNING 현재 CPU에서 실행 중
THREAD_READY 실행 대기 중이며 ready_list에 있음
THREAD_BLOCKED 이벤트를 기다리며 대기 중
THREAD_DYING 종료 예정이며 제거 대기 중

Create thread → READY
스케줄러에 의해 선택되면 → RUNNING
yield() 또는 타임 슬라이스 종료 → READY
I/O 등으로 대기 → BLOCKED
이벤트 완료 → 다시 READY
exit() → DYING
⸻
tid_t thread_create (const char name, int priority, thread_func , void *);
수행 과정:
1. struct thread 구조체 메모리 할당 및 초기화
2. 스레드를 all_list에 추가
3. thread_unblock() 호출로 상태를 THREAD_READY로 변경
4. ready_list에 삽입 → 스케줄러가 선택 가능해짐
⸻
목적:
현재 실행 중인 스레드에서 다음 실행할 스레드로 컨텍스트 스위칭
호출되는 상황:
자발적(voluntary):
thread_yield() – CPU 양보
thread_block() – 이벤트 대기
thread_exit() – 스레드 종료
비자발적(involuntary):
타임 슬라이스 종료 또는 더 높은 우선순위 스레드 등장
주요 흐름:
schedule():
curr = running_thread()
next = next_thread_to_run()
if (curr != next):
if (curr->status == THREAD_DYING)
destruction_req에 추가
thread_launch(next) // 실제 스레드 전환
⸻
User Stack: 사용자 모드에서 사용, 제한된 권한
Kernel Stack: 커널 모드에서 사용, 모든 리소스 접근 가능
전환 시점: 시스템 콜 또는 인터럽트 발생 시 자동 전환
ESP (스택 포인터): 현재 스택의 최상단을 가리킴. 모드에 따라 자동 전환됨
각 스레드는 자신만의 유저 스택, 커널 스택을 모두 가짐
⸻
thread_launch(next):
1. 현재 스레드의 레지스터 상태를 커널 스택에 저장
2. 현재 스레드의 ESP 저장
3. 다음 스레드의 ESP를 CPU에 로드
4. 레지스터 복원 → 다음 스레드 실행
※ 실제 스택 및 레지스터 교체가 여기서 수행됨
⸻
• ready_list = 실행 준비된 모든 스레드
• thread_create() → unblock() → ready 상태로 전환됨
• schedule()은 스레드 종료, 양보, 블록 시 호출됨
• 컨텍스트 스위칭은 thread_launch()에서 수행됨
• 유저 ↔ 커널 스택 전환은 시스템 콜/인터럽트 시 자동 처리됨
⸻