thread.h & thread.c

struct thread

스레드는 총 4kb의 메모리 공간을 가진다. 커널 스택이 위에서부터 내려오는 구조.

0에서 magic까지의 공간이 스레드의 TCB 공간이다. 총 4kb의 공간 중에 TCB를 뺀 공간을 커널 스택으로 사용한다.

											4 kB +---------------------------------+
                           |         kernel stack            |
                           |               |                 |
                           |               V                 |
                           |        grows downward           |
                           |                                 |
                           |                                 |
                           |                                 |
                           |                                 |
    sizeof (struct thread) +---------------------------------+
                           |             magic               |
                           |          intr_frame             |
                           |               :                 |
                           |               :                 |
                           |             status              |
                           |              tid                |
                      0 kB +---------------------------------+

thread를 struct로 구현한 코드.

struct thread {
	/* Owned by thread.c. */
	tid_t tid;                          /* Thread identifier. */
	enum thread_status status;          /* Thread state. */
	char name[16];                      /* Name (for debugging purposes). */
	int priority;                       /* Priority. */

	/* Shared between thread.c and synch.c. */
	struct list_elem elem;              /* List element. */

#ifdef USERPROG
	/* Owned by userprog/process.c. */
	uint64_t *pml4;                     /* Page map level 4 */
#endif
#ifdef VM
	/* Table for whole virtual memory owned by thread. */
	struct supplemental_page_table spt;
#endif

	/* Owned by thread.c. */
	struct intr_frame tf;               /* Information for switching */
	unsigned magic;                     /* Detects stack overflow. */
};

thread_start()

Idle 스레드를 만들고, Preemptive thread scheduling을 시작한다.

/* Starts preemptive thread scheduling by enabling interrupts.
   Also creates the idle thread. */
void
thread_start (void) {
	/* Create the idle thread. */
	struct semaphore idle_started;
	sema_init (&idle_started, 0);

	// idle 스레드를 만들고 맨 처음 ready queue에 들어간다.
	// semaphore를 1로 UP 시켜 공유 자원의 접근을 가능하게 한 다음 바로 BLOCK된다.
	thread_create ("idle", PRI_MIN, idle, &idle_started);

	/* Start preemptive thread scheduling. */
	// thread_create(idle)에서 disable했던 인터럽트 상태를 enable로 만듦.
	// 이제 스레드 스케줄링이 가능하다. 인터럽트가 가능하므로.
	intr_enable ();  

	/* Wait for the idle thread to initialize idle_thread. */
	sema_down (&idle_started);
}

idle(&semaphore)

idle 스레드 : 어떤 스레드들도 실행되고 있지 않을 때 실행되는 스레드. 맨 처음 thread_start()가 호출될 때 ready queue에 먼저 들어가 있는다.