2024년 9월 23일 월요일

테스크 스위칭과 TSS

오랜만에 글을 쓴다.

일이 많아 글을 쓸 여유가 없다, 나이가 먹고 더 기억력이 나빠지기 전에 해왔던 생각들을 글로 남겨 놓는 것도 좋을 것 같아 쓰기 시작한다.


OS에서 여러 개의 TASK들을 돌아가며 돌리기 위해서는 운용할 TASK 리스트를 준비 해 두고, CPU의 타이머 인터럽트가 발생 할 때 실행 우선 순번이 높은 TASK쪽으로 복귀하는 식으로 multitasking 을 운용한다.

코어가 1개인 CPU (hyper threading 은 제외한다)에서 실행되는 multitasking은 결국 timer interrupt 에 의한 CPU 노가다 인 샘이다.

하지만 이것은 그만큼 CPU들의 성능이 비약적으로 빨라졌기 때문에 가능해 진 것이다.

일반적으로 timer interrupt는 x86 계열 CPU에서는 초 당 1000번 (1ms 간격) , 그 외 CPU에서는 대부분 초 당 100번 (10ms  간격) 으로 발생한다.

CPU가 느리다면 하나의 task 당 1ms, 혹은 10ms 에 실행할 수 있는 코드의 양은 매우 적기 때문에 매우 느리고 답답할 것이다.

하지만 근래 CPU들의 경우 클럭이 최소 500Mhz 부터 5GHz까지 높은 속도로 실행된다.

이 뜻은 클럭 당 1개의 명령을 수행한다고 가정할 때 10ms 인터럽트 간격 동안 5,000,000 ~ 50,000,000 개의 명령을 실행할 수 있다는 뜻이다.

즉, 초 당 위 명령 정도만 실행하는 task는 동시에 100개 가량 운용해도 속도 저하가 없다는 뜻이다.

이 외에도 OS 차원에서 대기 중인 task (sleep 이나 이벤트 대기)의 경우 아직 wake 상태가 아니면 실행 안 하는 등의 최적화를 통하여 multitasking의 효율은 더욱 높아지게 되었다.


그래도 여전히 multitasking에서 부담스러운 부분이 있는데 바로 context switching 이다.

즉 task 교환이다.

A라는 task에서 연산을 하던 중, 타이머 인터럽트가 발생하여 B라는 task로 이동할 때 해상 task가 마지막에 운용되던 상태를 그대로 복원해야 하는 작업이 context switching 시 수행된다.

task가 사용하던 stack과 register의 마지막 상태 들을 저장 및 복원해야 한다.

이를 위하여 x86에서는 TSS를 지원하고 ARM계열에서는 레지스터를 동시에 여러 개를 stack에 push 하는 명령을 지원하였다.

32bit 초기 시절 32bit OS개발 업무를 하던 당시, x86의 TSS라는 지원이 뭔가 고급스럽게 느껴지게 되었고, 이 후 tss를 지원하지 않는 OS나 CPU들이 답답하게 느껴 졌었다.


TSS는 task state segment 라 하며 x86에서 테스크의 마지막 상태를 저장하고, 복원하기 위한 메모리 영역과 descriptor 였다.  따라서 테스크 이동을 할 경우 TSS의 NT 기능을 활용하면 FPU등 부분만 주의만 하면 비교적 고급스럽게 context switching을 할 수 있게 되었다.


하지만 시간이 흐르고 64bit 시절이 오며 x86역시 TSS를 호환상 유지하기는 하지만 context switching에서 큰 비중을 차지하지 않게 되었다.

이 시절이 되니, 나에게도 역시 TSS가 context switching에 더 이상은 유용해 보이지 않았다.

이유는 CPU의 많은 확장과 다양성 때문이었다.

예전에는 context switching을 하기 위하여 저장하고 복원해야 하는 것들이 general, stack, FPU 레지스터 정도였다.

하지만 지금은 CPU 종류 별로 다양한 부가 기능을 지원하다 보니, SIMD 계열 레지스터도 다양하게 늘어났고, NPU 연산까지 추가되고 있기 때문에 OS에서는 context switching 시 CPU가 지원하는 기능을 파악하고, 그에 맞춰 저장 및 복원해야 하는 항목들이 달라지는 상황이 온 것이다.

이럴 때 편하기는 하지만, 유연성이 떨어지는 TSS의 경우 효율이 좋기 어렵고 CPU 개발에 부담만 가중 시키는 것이라 생각된다.


세상이 변하면서 TSS에 대한 나의 생각도 변하게 되었다는 것이 생각나 글을 적어보았다.

앞으로 글을 쓸 거리가 생각나고 시간이 날 때 마다 글을 쓸 예정이다.

그럼 다음에...