https://www.youtube.com/watch?v=Xh9Nt7y07FE&list=PLcXyemr8ZeoQOtSUjwaer0VMJSMfa-9G-&index=3

 

영상에서 얻고자하는것

왜 스레드 컨텍스트 스위칭이 프로세스 컨텍스트 스위칭보다 더 빠른지 이해할 수 있다.

컨텍스트 스위칭은 무엇인가?

CPU/코어에서 실행중이던 프로세스/스레드가 다른 프로세스/스레드로 교체되는 것이다.

오늘날의 컴퓨터에서는 하나의 프로세스는 기본적으로 하나의 스레드를 가진다.

이유는 이 스레드가 CPU 혹은 core에서 실행되는 기본 단위이기 때문이다.

프로세스에서 프로세스로 교체된다는 말은 엄밀히말하면 어떤 프로세스 안에서 실행되던 스레드가

다른 프로세스에서 실행중인 스레드로 바뀌는것이라는 의미이다.

 

여기서 말하는 컨텍스트(context)란 무엇인가?

프로세스와 스레드의 상태를 의미한다. CPU는 registers라는 프로그램 카운터, 스택 포인터 등등 여러가지 레지스터가 있는데, 간단하게 일단 설명한다.

컨텍스트 스위칭은 왜 필요한가?

여러 프로세스/스레드를 동시에 실행시키기 위해서이다.

컨텍스트 스위칭은 언제 발생하는가?

주어진 time slice(quantum)를 다 사용했거나

IO 작업을 해야하거나

다른 리소스를 기다려야하거나

인터럽트가 발생했다거나

등등..

멀티태스킹에서 컨텍스트 스위칭 예제 

Process A, Process B, CPU 1 이 하나 존재한다.

멀티태스킹이란 CPU 타임을 아주 작은 time slice로 쪼개서 서로 나눠가지면서 실행하는 것이다.

Process A 실행 -> Process B 실행 -> Process A 실행 -> Process B 실행 ....

아주 짧은 시간동안 번갈아가며 실행하기에 이런 프로그램이 즉각적인 응답을 보여주기 정말 동시에 실행되는것 같은 느낌을 받는다.

컨텍스트 스위칭은 누구에 의해 실행되나?

OS 커널(Kernel) (각종 리스소를 관리/감독하는 역할 ) 에 의해 실행된다.

( 컨텍스트 스위칭을 누가 Trigger하는가. 발생시카는가가 아니다. )  단순히 무엇에 의해 실행되느냐이다.

컴퓨터에 있는 여러가지 리소스(메모리.. 등등)을 관리하는 것이 OS Kernel이다.

 

두 종류의 컨텍스트 스위칭

다른 프로세스끼리의 스위칭인가 ( Process Context Switching  )

같은 프로세스의 스레드들끼리의 스위칭인가에 따라 다르다. ( Thread Context Switching )

두개의 공통점

1. 커널모드에서 실행된다. (Process A에서 만약 리소스를 요구한다면,  ProcessA가 직접 리소스에 접근하는것이 아니라 Kernel을 통해서 Kernel mode에서 실행된다. )

2. CPU의 레지스터 상태를 교체한다. ( CPU 안에는 여러 레지스터들이 종료하는데 이 레지스터는 각종 명령어들을 실행하기 위해 필요한 데이터들을 의미한다. ) Process A가 CPU에서 실행되다가 Process B로 Context Swithicng 된다면 Process B 사용과 Process A의 사용 및 변화를 위해 저장한다.

 

두개의 차이점

1. 프로세스 컨테스트 스위칭은 가상(virtual) 메모리 주소 관련 처리를 추가 수행한다.

같은 프로세스에 속하는 쓰레드들끼리의 컨텍스트 스위칭은 같은 프로세스에 속하기에 그 프로세스의 메모리 영역을 공유한다.

그렇기에 스위칭을 하더라도 메모리공유를 하기에 비교적 간단하다.

하지만, 다른 프로세스끼리의 스위칭 ( Process Context Swithcing) 일경우 추가적인 작업이 필요하다.

MMU(Memory Manage Unit)도 새로운 프로세스의 주소체계를 바라볼 수 있도록 수정해야한다.

TLB, 가상 메모리 주소와 실제 메모리 주소의 매핑 정보를 들고 있는 Cache 역할도 완전히 비워주야한다.(초기회해야한다.)

서로다른 프로세스 컨텍스 스위칭은 가상의 메모리 체계도 바꿔줘야하기에 부가적인 작업이 필요하다.

 

예제로 설명해보자.

같은 프로세스 속하는 스레드끼리의 컨텍스트 스위칭에 대한 설명이다. (Thread Context swtiching)

 

Process A의 Thread A-1, Thread A-2 가 CPU에서 작업을 한다. 

Thread가 작업을 하다가 자신의 time slice를 다 쓰거나 IO 작업을 하러가야해서 다른 스레드로 교체되어야하는 상황이다.

그러면 컨텍스트 스위칭이 일어난다.

Thread A-1 작업 ->      컨텍스트 스위칭 발생, OS 커널모드 진입 , A-1의 CPU 상태를 저장  , Thread A-2 의 이전 작업중이던 CPU 상태를 로딩, OS 커널모드 종료. -> Thread A-2 작업 -> ... 무한반복.

 

서로 다른 프로세스에 속하는 쓰레드들끼리의 컨텍스트 스위칭 예시이다.

Process A 의 Thread A - 1, 

Process B의 Thread B - 1 

이 CPU에서 작업한다.

서로다른 프로세스는 서로 다른 독립적인 메모리 영역이 존재하기에 컨텍스트 스위칭 중에 추가로 작업이 추가된다.

 

Thread A-1 작업 ->      컨텍스트 스위칭 발생, OS 커널모드 진입 , A-1의 CPU 상태를 저장  , Thread B-1 의 이전 작업중이던 CPU 상태를 로딩, Memory Management Unit이 Thread B-1 을 바라보게한다. TLB를 비운다.     OS 커널모드 종료. -> Thread B-1 작업 -> ... 무한반복.

 

위의 추가적인 MMU작업과 TLB 캐시를 비우는 작업을 통해 각 작업이 다른 쓰레드의 메모리로 접근하지 않고, 올바르게 현재 작업중인 쓰레드를 바라보도록 처리한다.

 

스레드 컨텍스트 스위칭이 더 빠른 이유

메모리 주소 관련 처리는 하지 않기 때문이다.

당연히 같은 메모리 공간에서 작업하기에 그렇다. CPU의 상태정보만 바꿔주면 되기에 그렇다.

컨텍스트 스위칭이 미치는 간접적인 영향

캐시(Cache) 오염(Pollution) 

CPU 안에는 기본적으로 캐시(Cache)가 존재하는데, CPU는 Memory 와 데이터를 주고받는데 자주 쓸것같은것들은 Cache에 올려놓고 메모리에 가는대신에 Cache에서 사용하는 CAche가 있는데,

문제는 Context Swithicng이 발생하면 서로 다른 데이터이기에 CAche는 이미 내가 필요로 하는 데이터가 필요하지않은 경우가 많다.

만약, 같은 프로세스끼리의 Context Switching은 그나마 확률이 높지만,

다른 프로세스끼리의 Thread Context Swithcing은 메모리 공간을 전혀 공유하지 않기에 처리속도에 성능이 끼치기에 안좋은 영향이 있다.

 

그렇기에 어떤 CPU Architecture는 Process Context Swithicng이 진행되면 아예 Cache를 날려버리는경우도 있따.

컨텍스트 스위칭은 오버헤드다

유저관점에서 컨텍스트 스위칭이란 순수한(pure) 오버헤드(overhead)이다.

내가 실행하는 프로그램의 동작과는 전혀 상관없는 순수한 CPU를 잡아먹는 오버헤드이다.

그렇기에 Context Swithcing이 많은것은 좋은것이 아니다.

마무리

Process A, Process B가 CPU를 멀티태스킹 과정에서 같이 실행되다보면, Context Switching이 발생한다.

그렇기에 너무 많은 Context Swithcing은 당연히 CPU에 에너지를 쓰이기에 최대한 줄여야한다.

+ Recent posts