[운영체제] Context Switching(문맥 전환)

ssh00n·2023년 5월 8일
0

운영체제

목록 보기
3/3

Context Switching이란?

Context Switching(문맥 전환)은 현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 복원(restore)하는 과정을 의미한다.

Context란?

CPU가 해당 Process(or Thread)를 실행하기 위해 필요한 프로세스의 정보로서, PCB(Process Control Block)에 저장된다.

PCB(Process Control Block)의 저장 정보

  • 프로세스 상태 : 생성, 준비, 수행, 대기, 중지
  • 프로그램 카운터(PC) : 프로세스가 실행을 재개할 때 실행할 다음 instruction의 주소
  • 레지스터 : 범용 레지스터, 스택 포인터 등을 포함한 CPU의 레지스터 값 저장
  • 프로세스 ID, I/O 상태 정보, ...

Context Switching - 인터럽트(interrupt)

인터럽트는 CPU가 프로그램을 실행하고 있을 때 실행중인 프로그램 밖에서 예외 상황(Exception)이 발생하여 처리가 필요한 경우 CPU에게 알려 예외 상황을 처리할 수 있도록 하는 것을 말한다.

Context switching이 발생하는 경우

  1. I/O request
  2. time slice expired
  3. fork a child
  4. wait for an interrupt
    ...


CPU의 코어가 1개라고 가정하면, 동시에 단 하나의 프로세스만 실행 가능하다. 이 때 CPU scheduling을 통해 하나의 CPU를 여러 프로세스 or 스레드가 공유할 수 있게 CPU 시간을 나누어 작업을 수행한다.

👉 Context switching이 발생하면 프로세서가 지금까지 실행되던 프로세스(cur)를 중지하고 Context를 PCB에 저장한다. 그리고 나서 다음에 실행할 프로세스(next)의 PCB정보를 CPU에 복원한다.

Assembly code : switching thread

switch threads:
	pushl %rbx 
	pushl %rbp
	pushl %rsi
	pushl %rdi

.globl thread_stack_ofs 
	mov thread_stack_ofs, %rdx    
								  
	movl SWITCH_CUR(%rsp), %rax   
	movl %rsp, (%rax, %rdx, 1)
	
	movl SWITCH_NEXT(%rsp), %rcx
	movl (%rcx, %rds, 1), %rsp

	popl %rdi
	popl %rsi
	popl %rbp
	popl %rbx
			ret

1️⃣ pushl 인스트럭션을 사용하여 rbx, rbp, rsi, rdi 레지스터 값 스택에 push

2️⃣ thread_stack_ofs 상수 값은 mov 명령어를 사용하여 rdx 레지스터로 이동(이 값은 나중에 스택 포인터가 저장될 메모리 위치에 액세스하기 위한 오프셋으로 사용)

3️⃣ 현재 스레드의 스택 포인터를 나타내는 "SWITCH_CUR" 값은 스택 포인터(rsp)에서 movl 명령을 사용하여 SWITCH_CUR상수의 오프셋을 더한 값으로 로드됨(rax 레지스터에 저장)

4️⃣ 현재 스레드의 스택 포인터는 rax 레지스터가 가리키는 메모리 위치에 rdx 레지스터 값에 스택 포인터 크기를 곱한 값을 더한 값으로 저장(현재 스레드의 스택 포인터가 "SWITCH_CUR"에 저장되며, 나중에 이 스레도 다시 전환되는 데 사용)

5️⃣ 다음 스레드의 스택 포인터를 나타내는 "SWITCH_NEXT" 값은 스택 포인터(rsp)에서 "movl" 명령어를 사용하여 "SWITCH_NEXT" 상수의 오프셋을 더하여 로드됩니다. 로드된 값은 rcx 레지스터에 저장

6️⃣ 다음 스레드의 스택 포인터는 rcx 레지스터가 가리키는 메모리 위치에서 EDX 레지스터의 값에 스택 포인터의 크기(1*4=4)를 곱한 값을 로드(실행할 다음 스레드의 스택 포인터가 로드됨)

7️⃣"popl" 명령어를 사용하여 스택에서 해당 값을 pop하여 rbx, rbp, rsi 및 rdi 레지스터의 값을 복원

8️⃣"ret" 명령어는 함수에서 반환하는 데 사용되며, 새 스레드의 스택 포인터에서 실행을 재개

profile
Whatever I want

0개의 댓글