CS

쓰레드에 레지스터가 있다?

VSFe 2021. 1. 15. 16:08

쓰레드를 공부하다가 이런 의문이 들었다.

  • 레지스터는 프로세스가 아닌, 프로세서에 있는것이 아닌가? 그런데 어떻게 쓰레드가 자신만의 레지스터를 갖고 있다고 하는 거지?

(출처: Operating System Concepts 10e. Abraham Silberschatz 외)

당연히 레지스터는 프로세서가 갖고 있기 때문에, (아키텍쳐에 따라 레지스터의 수나 명칭이 달라지는건 필연적이겠죠?) 이 그림이 말이 안 된다고 생각해서 텍스트를 뚫어져라 쳐다봤다.

A thread is a basic unit of CPU utilization; it comprises a thread ID, a program counter (PC), a register set, and a stack. It shares with other threads belonging to the same process its code section, data section, and other operating-system resources, such as open files and signals.

음... 분명히 레지스터를 갖고 있다고 한다. 도대체 이게 어떻게 된걸까?

 

CPU 스케쥴링을 떠올려보자. CPU는 특정 스레드만 붙잡고 있을 수가 없기 때문에, 스케쥴링 통해 모든 일을 일정한 시간 (Time-Sharing System 기준. SJF 같은 경우라면 특정 스레드만 붙잡고 있을 것이다...) 동안 돌아가면서 붙잡게 될 것 이다.

 

그렇다면 당연히 Context Switching이 발생할 것이다. 스레드 내의 Context Switching은 Code/Data/Heap Segment를 공유하고 있기 때문에, 결국 본인의 Task 어디까지 실행되었는지와, Stack Segment의 상태만 메모리에 저장하고 다른 스레드로 주도권을 넘겨주면 될 것이다.

 

프로세스는 Context Swtiching이 발생하면 PCB를 만들고, 스레드도 비슷한 방식으로 상태를 저장할 것이다.

그래서 이게 스레드가 레지스터를 갖고 있는 것과 무슨 상관일까?

 

결론만 말하면, 스레드가 갖고 있는 레지스터는 "저장된 상태"를 의미한다.

 

CPU에 의해 처리되고 있을 때는 명령어를 가져오고, CPU가 이를 처리하는 식으로 태스크가 진행될 것이다. 당연히 명령어를 가져오고, 연산 결과를 저장하는건 레지스터가 하는 일이다.

 

Context Switching이 발생하면, 당연히 현재 상태를 모두 저장하고 종료해야 하니 레지스터의 값이 스택에 넣어지고 종료된다.

 

뒤늦게 PCB를 보니 PCB에도 레지스터가 있었는데, 그때 왜 의문을 가지지 않았는지 모르겠다...