pint os에는 생소한 thread가 몇 등장한다.
자료가 많지 않아서 GPT와 진득한 대화를 나눴다.
전부 믿을 수는 없지만 GPT와의 대화 속에서 납득이 되는 것만 취하였고, 그 내용을 기록한다.
각각이 무슨 일을 하는 지 인지하지 않으면 헷갈려서 우울해진다.(경험담ㅎ)
부팅 → main thread 생성 → main thread가 테스트 케이스 thread 생성 → 테스트 thread running →
테스트 thread 종료 → main thread 복귀 → (ready_list 비었을 경우 idle_thread running)
짧게 보자면 아래 표와 같다.
| Pintos thread | 정체 |
|---|---|
| main thread | Pintos 부팅 직후 init.c:main() 호출 시 실행 중인 thread |
| idle thread | 아무도 할 게 없을 때 돌아가는 dummy thread |
| 테스트 thread | 각 테스트에서 생성된 각각의 테스트 목적 thread (Thread priority XX) |

https://beststar-1.tistory.com/6
부팅 이후, 최초의 커널도 하나의 스레드를 갖는데 이를 메인 스레드(Main Thread)라고 한다.
메인 스레드는 프로그램이 시작하면 가장 먼저 실행되는 스레드이며 모든 스레드는 메인 스레드로부터 생성된다.
다른 스레드를 생성해서 실행하지 않는다면 메인 스레드가 종료되는 순간 프로그램도 종료된다.
하지만, 여러 스레드를 실행하면 메인 스레드가 종료돼도 다른 스레드가 작업을 마칠 때까지 프로그램이 종료되지 않는다.
main thread는 자기 priority가 낮아도 직접 yield 호출하지 않으면 running 유지된다.
Q. main thread는 루트 thread인가?
핀토스의 main thread는 가장 최초로 만들어지는 “부트스트랩 thread”,
→ 그래서 OS 부팅 후, 테스트 케이스(priority-sema 같은)를 직접 실행하는 주체 thread야.
Q. 다른 thread로 전환해주는 것도 main thread 인가? 모든 일의 주체인가?
✔️ 즉, OS가 스스로 스케줄러를 돌려줘야 thread 전환이 일어남.
✔️ 너가 기대하는 “다른 thread 일이 끝났으니까 자동으로 main thread 돌아감”이 아니라,
→ 남은 thread 중 priority 가장 높은 thread가 running 상태가 됨.
→ 그게 main thread일 수도 있고, 다른 thread일 수도 있어.
Q. 그러면 어떨 때 main thread가 종료되나?
CPU는 쉬지 않고 늘 일한다. 일이 없을 때, 즉 실행하려고 대기 중인 스레드가 단 한 개도 없을 때 조차 쉬지 않는다. 그래야, 다른 일이 들어와도 즉시 처리할 수 있다.
이렇게 아무 일 없을 때도 마지막까지 남아, 다른 일이 생기는 지 확인할 수 있도록 돕는 thread가 바로 idle thread이다. idle thread는 절대 ready_list에 올라가지 않는다. idle thread가 running 상태가 되는 순간은 단 한 번이다. next_thread_to_run() 에서 ready_list가 비어있을 때만 idle_thread로 제어를 넘긴다.
따라서 idle thread는 CPU를 점유하고 있더라도 interrupt가 발생하거나, 다른 thread가 ready 상태가 되면 즉시 양보한다.
즉, idle thread의 목적은 ready queue가 비어있을 때를 대비하여 최소한의 전력을 소비하며 CPU에게 할 일을 주는 역할을 한다.
Q. 다른 모든 thread가 비면 idle thread가 running 하잖아. 그런데, 위에서 main thread는 종료하지 않는다고 하지 않았나? 그러면 idle thread는 언제 실행 되지?
맞아.
Q. main thread가 늘 존재한다면 idle thread는 왜 존재하지?
idle_thread는 main thread와 역할이 근본적으로 다르기 때문이야.
| main thread | idle thread |
|---|---|
| OS 부팅과 테스트를 실행하는 업무를 수행하는 thread | CPU가 놀지 않게, 최소한의 전력을 소모하며 대기하는 dummy thread |
| 실제 작업 thread와 동등하게 경쟁 (ready_list 포함) | ready_list가 완전히 비었을 때 fallback으로만 선택됨 |
| 절대 자동으로 idle 상태가 되지 않음 (직접 block or exit 필요) | OS가 스케줄러에서 자동으로 선택하는 thread |
| 종료 안 하면 계속 running 가능 | 항상 존재, 절대 종료되지 않음 |
idle thread는 “아무것도 할 일이 없는 경우를 대비해서 항상 존재”하는 thread이다.
main thread는 할 일이 있는 주체 thread이기 때문에 idle thread와 다르다.
main thread가 존재하더라도 main thread가 block 상태일 수도 있고, 종료했을 수도 있으니 → OS는 항상 fallback으로 idle thread를 둬야 한다.