Threads

c4fiber·2023년 12월 25일
0

SW사관학교 정글7기

목록 보기
37/49

struct thread


핀토스의 메인 data structure는 struct thread 이다. threads/thread.h 에 정의되어 있다.


struct thread;

이 구조체는 user process 또는 thread를 표현한다. 이 ㅂ프로젝트에서는 당신은 당신의 members를 struct thread 에 추가할 것이다. 당신은 또한 존재하는 멤버들의 정의를 변경하거나 수정할 것이다. 모든 구조체 스레드는 각각의 page(of memory)의 시작부분을 차지할 것이며 나머지의 페이지 부분이 스레드의 스택이 된다. 스택은 페이지의 마지막 부터 아래방향으로 성장하며 다음과 같이 생겼다.

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

두 가지의 결과
1. 구조체 스레드는 너무 크게 성장하지 않도록 제한된다. -> 구조체 크기가 너무 크면 커널 스택이 성장할 수 없다. 기반 구조체 스레드의 크기는 겨우 몇 바이트 밖에 되지 않으며 1kb 보다 작은 편이 좋다.
2. 커널 스택은 너무 크게 성장하지 않아야 한다. 만약 stack overflow가 발생하면 스레드의 상태를 오염시킨다. 그래서 커널 기능(함수)들은 너무 큰 structures 또는 arrays를 할당하지 않아야 한다. non-static local variables도 마찬가지다.
따라서 malloc() 혹은 palloc_get_page() 를 사용해라. (see Memory Allocation).

스레드의 상태


profile
amazing idiot

0개의 댓글