컨텍스트 스위칭(context switching)

김운채·2023년 5월 9일
0

TIL

목록 보기
5/22
post-thumbnail

컨텍스트 스위칭(context switching)이란?

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

기본적으로 1개의 프로세스는 1개의 스레드를 가진다. 왜냐면 스레드가 CPU/코어에서 실행되는 기본 단위이기 때문이다.
프로세스가 다른 프로세스로 교체 된다는 것은, 프로세스 안에 실행되는 스레드가 다른 프로세스 안의 스레드로 바뀐다는 말이다.

컨텍스트?
프로세스/스레드의 상태를 말한다. CPU, 메모리등등

🤷‍♂️ 컨텍스트 스위칭은 왜 필요한가?

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

필요하다고 졸라 많이 하면 되나?

🙅‍♀️🙅‍♀️ 컨텍스트 스위칭은 ms의 짧은 시간 단위로 일어나지만 과도하게 많이 일어날 경우, cpu에 비해 쓰레드가 많이 생성 됐다는 뜻이고 이런 현상은 결국 오버헤드가 발생 한다.
=> 어플리케이션 성능에 악영향을 미침

🤷‍♀️ 언제 발생하는가?

  • 주어진 time slice 를 다 사용했거나
  • I/O 작업을 해야하거나
  • 다른 리소스(다른 프로세스나 스레드에서 사용하고 있는)를 기다려야 하거나 등등

에) 멀티테스킹 시스템에서 컨텍스트 스위칭

멀티테스킹 시스템 => CPU time 을 아주 짧은 time slice(quantum) 로 쪼개서 서로 나눠가지면서 실행함

여러 프로세스가 순차적으로 아주 짧은 주기로 실행이 되고있지만, 우리가 느끼기에는 동시에 실행되는 것 같은 느낌을 준다.

그럼 이 컨텍스트 스위칭을 누가 해주는 걸까?
👉 OS커널 이다. => 각종 리소스(CPU, 메모리, 디스크 등등)를 관리/감독하는 역할

컨텍스트 스위칭 과정

두가지의 상황이 있다.

  1. 다른 프로세스끼리의 스위칭 => process context switching
  2. 같은 프로세스의 스레드들끼리의 스위칭 => thread context switching

이 둘의 공통점

커널 모드에서 실행

🤷‍♀️ 커널모드??

프로세스가 실행이 되다가 하드웨어랑 밀접한 일들, 혹은 여러 리소스들을 다뤄야하는 상황이 있다.
이럴때는 프로세스가 직접 리소스에 접근하는 것이 아니라 운영체제를 통해 접근하게 되는데, 특이 커널을 통해서 접근하게 된다.

이떄 통제권이 프로세스->커널로 넘어간다.
이때 커널에 의해서 실행되는 것을 커널모드라고 한다.

CPU레지스터 상태를 교체

레지스터: 각종 명령어들을 수행하기 위한 데이터들을 저장하는 존재

cpu는 여러 레지스터를 갖고 있다고 했다.
프로세스가 cpu에서 실행되는 동안 레지스터에 여러가지 값들이 계속 바뀌면서 실행되고 있었을 것이다.
그러다가 다른 프로세스2가 실행을 하게 되면, 이 cpu에 실행되고 있던 프로세스1의 레지스터 상태들을 어딘가에 저장하고, 프로세스2를 실행한다.

🤷‍♀️ 왜 저장하는디?
저장을 해놔야 나중에 프2이후에 프1 실행이 됐을때 어디까지 실행이 되었는지, 상태를 알고있어야 다시 이어서 실행을 할 수 있기 때문이다


이 둘의 차이점

process context switching 은 가상 메모리 주소 관련 처리를 추가로 수행한다.

같은 프로세스의 스레드들끼리의 스위칭은 같은 프로세스에 속하기 때문에 해당 프로세스에 메모리 영역을 공유한다.
그래서 스위칭이 일어나도 메모리 관련해서 신경써줄게 없다.

문제는 다른 프로세스끼리의 스위칭이 일어났을때이다.

프로세스 간의 메모리 구조체계가 다르기 때문에
MMU (Memory Management Unit) 도 새로운 프로세스의 구조체계를 바라볼 수 있게 해야하고,
✔ 가상메모리 주소와 실제 물리적 주소의 매핑정보를 가지고 있는 캐시 역할을 하는 TLB (Translation Lookaside Buffer)도 완전히 비워줘야한다.

context switching 실행순서

  1. thread context switching


출처

Process 안에 t1, t2 가 CPU에서 실행된다.

(1) t1실행
(2) 컨텍스트 스위칭, 커널모드에 들어감(통제권을 커널에 넘겨줌)
(3) t1 CPU 상태 저장
(4) t2의 CPU상태 로딩
(5) 커널모드 종료(통제권을 유저모드, t2에게 줌)
(6) t2 실행
(7) 컨텍스트 스위칭, 커널모드에 들어감(통제권을 커널에 넘겨줌)
(8) t2 CPU상태 저장
(9) t1의 CPU상태 로딩
(10) 커널모드 종료
(11) t1 실행

  1. process context switching

프로세스 P1 안에 t1, 프로세스 P2 안에 t2 가 있다고 해보자.

(1) t1실행
(2) 컨텍스트 스위칭, 커널모드에 들어감
(3) t1 CPU 상태 저장
(4) t2의 CPU상태 로딩
(5) MMU가 P2의 메모리 공간을 바라보게 함, TLB비움 (비워줘야 P2 가 로딩 됐을때에 자신의 메모리 영역에 접근할 수 있게 된다. 잘못대면 p1의 메모리 영역접근할 수도 있음)
(6) 커널모드 종료
(7) t2 실행 컨텍스트 스위칭
(8) 커널모드에 들어감
(9) t2 CPU 상태 저장
(10) t1의 CPU상태 로딩
(11) MMU가 P1의 메모리 공간을 바라보게 함, TLB비움
(12) 커널모드 종료
(13) t1 실행

딱봐도 스레드 컨텍스트 스위칭이 더 빠르다. 메모리 관련 처리를 안함


컨텍스트 스위칭이 미치는 간접적인 영향이 있다.
캐시 오염이 발생할 수 있다.

내가 자주 쓸만한 정보를 캐시에 넣어두는데, process context switching 의 경우, 캐시에 내가 찾는 정보가 없을 수 있다. 그럼 다시 메모리까지 가야 해서 처리속도도 느려짐

👩 유저 관점에서 컨텍스트 스위칭은?
순수한 오버헤드 이다.

0개의 댓글