[Pintos] 1. background
struct thread
- thread id
- thread status // running, ready, block, dying
- thread name
- stack pointer // saved stack pointer
- priority
+ allelem // list element for all threads list.
+ elem // list element
- pagedir // USER PROGRAM이 define되어 있다면 사용. page directory이다.
- magic // detects stack overflow
- 생성될 때 THREAD_MAGIC(0xcd6abf4b)으로 설정. 스택 오버플로우 발생 시 이 값이 변한다.
description
- kernel 스택 메모리가 작아서 스택 오버플로우가 일어날 수 있다. 그러니 메모리가 많이 필요한 경우 heap 메모리를 사용하자.
asm
- switch_threads(cur, next)
- cur 스레드는 현재 레지스터 셋(e.g. PC)을 저장하고 CPU의 Stack Pointer 를 stack 멤버에 저장에
- next 스레드의 레지스터 셋, 스택 포인터를 CPU에 설정
thread.c
- thread_yield
- 현재 스레드는 sleep 상태로 되는 게 아니라 곧바로 다시 스케줄링된다.
- 현재 인터럽트 상태를 저장하고 disable했다가 스케줄링이 끝나면 다시 복구한다.
- schedule()
- 실행 중인 스레드 A, 다음에 실행할 스레드 B를 가져온 후, 만약 A != B라면 B를 run 상태로 만든다.
- schedule()
-
- thread_schedule_tail()
- 새로 실행한 스레드를 run 상태로 변경
- 이전 스레드가 DYING 상태라면 페이지 메모리 해제
interrupt.c
- intr_context()
- 외부(하드웨어) 인터럽트 수행 중에는 이 값이 true로 설정된다. 그 외에는 false를 반환
- intr_disable()
- 인터럽트를 disable시키고
- pic_end_of_interrupt(int irq)
- PIC : Programmable Interrupt Controller
- 분석하자.. 어렵네
list.c
- list_end
- tail을 반환한다.
- is_interior(elem)
- elem / prev / next가 모두 != null인지 검사하고 true/false 반환
- is_tail(elem)
- 내부적으로 tail을 반환. null이면 잘못된 경우이므로 assert로 잡아주어야 한다.
- list_insert(before, elem)
- 새로운 노드 추가. 이전 노드의 앞에 추가한다.