1. 컨텍스트 스위칭(Context Switching)
컨텍스트 스위칭의 정의
지난 글에서 프로세스와 스레드를 얘기하면서 컨텍스트 스위칭(문맥 교환)에 대해서 짧게 얘기했었는데요, 오늘은 이 컨텍스트 스위칭에 대해서 자세히 알아보려 합니다.
컨텍스트 스위칭이란, 'CPU/코어에서 실행 중이던 프로세스/스레드가 다른 프로세스/스레드로 교체되는 것'입니다.그렇다면, 여기서 말하는 컨텍스트란 무엇일까요? 컨텍스트란 프로세스/스레드의 상태를 의미합니다. 또 이 상태라는 것은 CPU, 메모리에서의 상태를 의미합니다.
컨텍스트 스위칭이 필요한 이유
그렇다면 컨텍스트 스위칭이 왜 필요할까요? 여러 이유들이 있지만, 대표적으로
- 여러 프로세스와 스레드들을 동시에 실행시키기 위해(그렇게 보이기 위해)
- 여러 프로세스와 스레드들이 공정하게 CPU 시간을 나눠 갖기 위해
- 높은 우선순위의 작업이 빠르게 처리될 수 있게
와 같은 이유가 있습니다.
컨텍스트 스위칭은 언제 발생하는가?
컨텍스트 스위칭은
- 주어진 Time Slice(Time Quantum)를 다 사용함
- I/O 작업을 해야 함
- 다른 리소스를 기다려야 함
- 인터럽트(Interrupt)
위의 대표적인 트리거와 더불어 다른 여러 이유로도 발생될 수 있습니다.
위의 사진에서 Time Quantum동안 프로세스 1,2가 번갈아가면서 실행되고 있습니다. 매우 짧은 시간 동안 번갈아가면서 실행되면서 동시에 실행되는 것처럼 보이게 됩니다. 이렇게 프로세스가 바뀌는 것을 '컨텍스트 스위칭' 이라고 합니다.
컨텍스트 스위칭은 누구에 의해 실행되는가?
그렇다면 컨텍스트 스위칭은 누구에 의해서 실행될까요? OS의 커널(Kernel)에 의해서 수행이 되게 됩니다.
커널이란, 운영체제에서도 핵심적인 기능을 담당하는 존재인데요 짧게 설명하면 각종 리소스를 관리/감독하는 역할을 하는 존재라고 생각하시면 되겠습니다.
2. 컨텍스트 스위칭이 일어나는 과정
컨텍스트 스위칭이 구체적으로 일어나는 과정은, 다른 프로세스끼리의 스위칭(Process Context Switching)인지 같은 프로세스의 스레드들끼리의 스위칭(Thread Context Switching)인지에 따라 다릅니다. 이 두 가지의 공통점과 차이점을 바탕으로 설명해 보겠습니다.
둘의 공통점
1. 커널 모드에서 실행된다
두 스위칭은 모두 커널 모드에서 실행됩니다.
커널 모드라는 말은, 어느 프로세스가 실행되다가 하드웨어와 밀접한 일들 혹은 컴퓨터에 있는 여러 리소스들을 다뤄야 하는 상황이 발생하면 프로세스가 직접 컴퓨터의 리소스에 접근하는 것이 아니라 운영체제를 통해 접근하게 되는데, 특히 운영체제에서도 커널을 통해서 접근하게 됩니다. 이때, 이 프로세스에서 커널로 통제권이 넘어가서 커널에 의해서 실행되는 것을 '커널 모드'라고 합니다.
이 컨텍스트 스위칭은 커널 모드에서 실행되기 때문에 커널로 통제권이 넘어갑니다.
2. CPU의 레지스터 상태를 교체
두 스위칭은 또한 모두 CPU의 레지스터 상태를 교체합니다.
레지스터에 대해서 간단하게 설명하고 가자면, 레지스터란 CPU에서 각종 명령어들을 수행하기 위해 필요한 여러 데이터들을 저장하는 곳입니다. 많은 레지스터들이 있지만, 대표적으로 PC(Program Counter), Stack Pointer 등이 있습니다.
어떤 프로세스가 CPU에서 실행되고 있을 동안에, 레지스터에 있는 여러 값들이 계속 바뀌면서 실행되고 있었을 겁니다. 이때, 다른 프로세스가 실행되면 실행되고 있던 프로세스의 레지스터 상태들을 어딘가에 저장을 하고 다른 프로세스가 실행되는 것입니다. 그래야, 다시 다른 프로세스가 실행됐을 때 그때의 상태 정보들을 알고 있어야 이어서 실행할 수 있기 때문이겠죠?
둘의 차이점
1. 다른 프로세스끼리의 스위칭인 프로세스 컨텍스트 스위칭은 가상 메모리 주소 관련 처리를 추가로 수행함
지난 글에서 같은 프로세스에 속한 스레드들끼리는 공유하는 메모리 지역이 있다고 했었습니다. 조금 설명을 덧붙이자면, 스레드들끼리는
- 코드(Code) 영역 : 프로세스가 실행할 코드
- 데이터(Data) 영역 : 전역 변수가 정적 변수들이 저장되는 영역
- 힙(Heap) 영역 : 동적으로 할당된 메모리
의 영역을 공유합니다. 따라서, 스레드들끼리의 컨텍스트 스위칭은 같은 프로세스에 속하기 때문에 스위칭이 일어나도 메모리와 관련해서는 챙겨줘야 할 부분이 없습니다. 하지만, 프로세스간의 컨텍스트 스위칭이 발생했을 때에는 메모리 주소 체계가 다르기 때문에 이 때는 메모리 주소 관련된 처리를 추가로 수행해야 합니다.
그렇기 때문에, MMU(Memory Management Unit)와 TLB(Translation Lookaside Buffer)도 관리를 해줘야 합니다.
MMU는 가상 메모리와 물리 메모리 사이의 주소 변환을 담당합니다. 프로세스가 물리 메모리에서 할당되는 위치를 추상화하여 각 프로세스가 독립적인 주소 공간을 가지고 있는 것처럼 만듭니다.
TLB는 MMU 내에 존재하는 캐시 메모리입니다. 가상 주소를 물리 주소로 변환하는 과정을 상대적으로 느릴 수 있기 때문에, 이러한 변환의 결과를 TLB에 저장해 두고 빠르게 사용하는 데에 목적이 있습니다.
스레드 간의 스위칭에서는 실행되고 있던 스레드의 상태를 저장하고, 새로 실행될 스레드의 상태를 로딩하는 것으로 해결이 되지만 프로세스간의 스위칭에서는, 위의 작업에 더불어서 MMU가 실행 될 작업의 메모리를 보도록 해야 하고 캐시 역할을 하는 TLB를 완전히 비워줘야 합니다.
요약하자면 '다른 프로세스끼리의 스위칭은 주소 체계와 관련된 일들도 추가적으로 처리를 해야 한다'가 되겠고요, 이러한 추가적인 작업이 필요하기 때문에 프로세스 컨텍스트 스위칭보다 스레드 컨텍스트 스위칭이 더 빠릅니다.
3. 컨텍스트 스위칭이 미치는 영향
컨텍스트 스위칭이 발생하면서, 캐시 오염(Cache Pollution)이라는 간접적인 영향이 발생합니다.
캐시란 데이터나 값을 임시 저장해 두는 임시 장소입니다. CPU가 자주 사용하는 것들에 대해서 매번 메모리에 접근하는 것이 아니라, 캐시에 저장해 두고 빠르게 데이터를 가져오기 위해 사용합니다.
컨텍스트 스위칭이 일어나면, 또 사용할 것이라고 예상을 하고 캐시에 데이터나 값을 저장한 캐시가 의미가 없는 데이터가 되어버립니다. 컨텍스트 스위칭이 일어난 직후에 캐시에 가봤자, 이전에 프로세스에서 실행되었던 정보들을 저장해놓고 있을 가능성이 매우 높기 때문에, 내가 필요한 정보는 없을 가능성이 매우 높아지기 때문입니다. 이러하다는 것은 성능적으로 손해를 보는 부분이 발생한다는 거겠죠?
캐시 메모리는 메인 메모리에 비해 매우 작기 때문에 프로세스끼리 나눠서 쓰지 않고 다 같이 사용하는 공간이라고 합니다. 그래서 위와 같은 문제가 발생합니다!
어플리케이션 관점에서는, 컨텍스트 스위칭은 순수한 오버헤드(Overhead, 간접비용)입니다.
즉, 내가 실행한 이 프로그램의 동작과는 아무 상관없는 순수한 CPU 작업을 필요로 하는 간접비용입니다.
'운영체제' 카테고리의 다른 글
스핀락(Spinlock) 뮤텍스(Mutex) 세마포어(Semaphore) (1) | 2023.09.06 |
---|---|
프로세스, 스레드, 멀티태스킹, 멀티프로세싱....?? (1) | 2023.08.31 |