PintOS_Project01_0

전두엽힘주기·2025년 5월 12일

PintOS

목록 보기
2/20
post-thumbnail

1. 스레드 상태 (enum thread_status)

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

Create thread → READY
스케줄러에 의해 선택되면 → RUNNING
yield() 또는 타임 슬라이스 종료 → READY
I/O 등으로 대기 → BLOCKED
이벤트 완료 → 다시 READY
exit() → DYING

2. 스레드 생성 과정 (thread_create)

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에 삽입 → 스케줄러가 선택 가능해짐

3. 스케줄링 함수 (schedule)

목적:

현재 실행 중인 스레드에서 다음 실행할 스레드로 컨텍스트 스위칭

호출되는 상황:
자발적(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) // 실제 스레드 전환

4. 커널 스택 vs 유저 스택

User Stack: 사용자 모드에서 사용, 제한된 권한
Kernel Stack: 커널 모드에서 사용, 모든 리소스 접근 가능
전환 시점: 시스템 콜 또는 인터럽트 발생 시 자동 전환
ESP (스택 포인터): 현재 스택의 최상단을 가리킴. 모드에 따라 자동 전환됨

각 스레드는 자신만의 유저 스택, 커널 스택을 모두 가짐

5. 컨텍스트 스위칭 (thread_launch)

thread_launch(next):
1. 현재 스레드의 레지스터 상태를 커널 스택에 저장
2. 현재 스레드의 ESP 저장
3. 다음 스레드의 ESP를 CPU에 로드
4. 레지스터 복원 → 다음 스레드 실행

※ 실제 스택 및 레지스터 교체가 여기서 수행됨

•	ready_list = 실행 준비된 모든 스레드
•	thread_create() → unblock() → ready 상태로 전환됨
•	schedule()은 스레드 종료, 양보, 블록 시 호출됨
•	컨텍스트 스위칭은 thread_launch()에서 수행됨
•	유저 ↔ 커널 스택 전환은 시스템 콜/인터럽트 시 자동 처리됨

0개의 댓글