prj1.threads.introduction {pintos}


dump

스레드가 생성될 때마다 스케줄에 컨텍스트가 하나씩 추가된다. thread_create 함수를 호출하며 넣은 함수 포인터는 스레드 단위의 main 함수가 되어 해당 함수를 벗어나면 스레드가 종료된다.

스케줄러는 스레드가 정확히 하나씩 실행할 수 있도록 스케줄링을 한다. 아무 스레드도 돌지 않는다면, 특수 스레드인 idle 스레드를 만들어 돌린다.

"Idle 스레드"는 시스템이나 프로그램에서 사용되는 스레드 중 하나로, 주로 다른 스레드들이 작업을 수행하지 않는 시간에 시스템 리소스(예: CPU 시간)를 활용하거나 관리하기 위해 사용됩니다. 이 스레드는 일반적으로 아무런 작업을 하지 않고 대기 상태에 들어가며, CPU 자원을 점유하지 않습니다. 따라서 busy wait와는 대조적으로 CPU를 무한히 점유하지 않습니다.

일반적인 운영체제에서 idle 스레드는 CPU 스케줄링을 조절하고 전력 관리를 위해 사용됩니다. 예를 들어, 다른 스레드가 실행 중이 아니라면 CPU가 idle 스레드에게 할당되어 전력을 절약하거나 리소스 관리를 수행할 수 있습니다. 이는 시스템의 성능을 최적화하고 전력 소비를 관리하는 데 도움이 됩니다.

활성상태를 유지하면서 전력소비를 줄이기 위한 깡통 스레드.


스레드, 컨텍스트는 1대1로 존재하며, 스케줄러가 강제적으로 한 스레드에서 다른 스레드로 문맥전환(context-switch) 하기 위해 기존 스레드의 컨텍스트를 저장하고 다음 스레드를 복원하는 작업을 수행하여야 한다. 이 작업을 thread_launch 함수에서 수행한다.

GDB를 사용하면서 컨텍스트 스위칭이 일어나는 타이밍을 확인할 수도 있다. 대표적으로 do_iret() 함수에서 iret을 실행할 때 어떻게 되는지 확인해보자.

기본적으로, PintOS는 새 스레드를 만들때 고정 크기의 실행스택이 할당된다. 따라서 유저 프로그램이 너무 큰 지역변수를 스레드 안에서 선언해버리면 커널패닉이 발생할 수도 있다. 대안으로 블록/페이지 할당자가 있다고. (Memory Allocation)

file structure in threads/