[PintOS] project1 : context-switching - CPU에 레지스터가 필요한 이유

binda·2024년 5월 2일

pintOS

목록 보기
1/4

참고 : https://m.yes24.com/Goods/Detail/125299750

CPU에 레지스터가 필요한 이유

레지스터와 메모리는 차이가 없지만, 정보를 저장하는 데 사용된다.

하지만, 읽/쓰기가 빠르지만 제조 비용이 비싸고 용량에 한계가 있기 때문에, 프로세스 실행 시 정보를 모두 메모리에 저장하고, CPU가 사용할 때만 레지스터에 데이터를 보관하게 된다.

CPU는 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품

상태 레지스터

CPU 내부에는 스택 레지스터 rsp , 명령어 주소 레지스터 rip 외에도 상태 레지스터가 있다.

x86에서는 이를 FLAGS 레지스터라고 하며,ARM 에서는 응용 프로그램 상태 레지스터라고 한다.

🤔 CPU가 사용자 상태에서 동작하는지 커널 상태에서 동작하는지 어떻게 알지 ?

CPU는 기계 명령어를 실행할 때 커널 상태와 사용자 상태 두 가지 상태를 가지는데, 이는 상태 레지스터를 통해서 어떤 상태에서 동작중인지 표시하는 특정한 비트를 통해 동작 상태를 변경할 수 있다. 즉 , CPU가 사용자 상태와 커널 상태 사이를 전환한다.

🤔 상황 정보를 저장하고 복원해야 하는 이유 ?

CPU가 엄격한 오름차순으로 기계 명령어를 실행하지 않기 때문

  • CPU는 함수 A에서 함수 B로 점프 가능
  • CPU는 커널 코드를 실행하기 위해 사용자 상태에서 커널 상태로 전환 가능
  • CPU는 프로그램 A의 기계 명령어 실행 상태에서 프로그램 B 기계 명령어 실행 상태로 전환 가능
  • CPU는 인터럽트를 처리하기 위해 실행하던 프로그램을 중지 가능

컨텍스트(context)는 프로그램의 실행 상태를 의미하는 정보를 포함

context는 중첩구조로 이루어져 있기 때문에, 이를 stack을 사용해서 처리하는 것이다.

  • 중첩된 함수 호출 구조에서는 호출 순서가 중요한데, 스택을 사용하면 함수의 호출과 반환 순서가 명확히 보존된다. 스택에 저장된 실행 컨텍스트를 통해 어떤 함수가 현재 실행 중인지, 그리고 각 함수가 어떤 순서로 호출되고 종료되는지를 알 수 있기에 스택을 사용

스레드 전환

타이머 인터럽트는 스레드 A에 할당된 CPU 시간 조각 (time slice) 가 전부 사용됐는지 확인 후 시간이 남아있으면 사용자 상태로 돌아가서 실행을 계속 진행

but 모두 사용 된 경우 스레드 B에 할당 해야함

할일 : 1. 주소 공간 전환 / 2. CPU를 스레드 A에서 스레드 B로 전환

모든 리눅스 스레드에는 각각에 대응하는 struct 구조체가 있거, 그안에 thread_struct 구조체가 CPU 상황 정보를 저장하는 역할을 한다.

커널 상태에서는 CPU가 모든 기계 명령어 실행가능, 모든 주소 공간 접근 가능, 제한 없이 하드웨어에 접근 가능

이를 pintos에서 어떻게 스레드의 상태가 가상메모리에 저장되고, 인터럽트가 발생했을 때, CPU와 커널 스레드에서 문맥교환이 일어나는 과정을 살펴보자

Pintos에서는 커널 모드에서 CPU와 VM(가상 메모리)을 관리하는 것을 가정한다

pintos 상황 : CPU를 스레드 A에서 스레드 B로 전환

핵심 → 스레드 A의 CPU 상황정보를 저장후 스레드 B의 CPU 상황 정보를 복원 하는 것

  1. 인터럽트가 발생하여 현재 실행중인 스레드를 실행을 중단한다

  2. 커널모드를 실행하기 시작한다.

    → 현재 스레드의 CPU상태를 저장해야 한다.

  3. 현재 실행중인 스레드 (A)의 커널 스택에 상태를 저장한다.

  4. thread 전환이 일어나서 스레드 B의 CPU 레지스터의 상태를 복원한다.

profile
🍤

0개의 댓글