[OS] 컨텍스트 스위칭 (Context Switching)

SEH00N·2023년 8월 26일
0

프로그래밍

목록 보기
2/3
post-thumbnail

컨텍스트 스위칭 (Context Switching)

CPU는 대기중인 코어를 찾아 운영체제로부터 넘겨받은 스레드를 할당한다. 이 과정에서 기존 코어에서 실행중이던 스레드가 새로 할당받은 스레드로 변경되는 것을 말한다.

컨텍스트 스위칭에는 '프로세스 컨텍스트 스위칭'과 '스레드 컨텍스트 스위칭'이 있다.

  1. 스레드 컨텍스트 스위칭 (Thread Context Switching)

    스레드 컨텍스트 스위칭은 컨텍스트 스위칭이 서로 같은 프로세스의 스레드끼리 일어나는 것을 말한다.
    즉 코어가 전에 실행하고 있던 스레드와 새로 할당받은 스레드가 서로 같은 프로세스의 스레드라면 '스레드 컨텍스트 스위칭이 발생했다'라고 할 수 있다.
  2. 프로세스 컨텍스트 스위칭 (Process Context Switching)

    프로세스 컨텍스트 스위칭은 컨텍스트 스위칭이 서로 다른 프로세스의 스레드끼리 일어나는 것을 말한다.
    즉 코어가 전에 실행하고 있던 스레드와 새로 할당받은 스레드가 서로 다른 프로세스의 스레드이기에 코어가 작업하던 프로세스가 바뀌어 버리는 상황을 '프로세스 컨텍스트 스위칭이 발생했다'라고 할 수 있다.

따라서 프로세스 컨텍스트 스위칭, 스레드 컨텍스트 스위칭 모두 스레드의 컨텍스트가 스위칭 되는 상황에 발생한다는 것을 알 수 있다.

컨텍스트 스위칭이 이루어지는 과정에서 발생하는 비용을 컨텍스트 스위칭 오버헤드라고 한다. 이에 대해 자세히 알기 위해선 PCB와 TCB에 대해 알아야 한다.


PCB (Process Control Block)

PCB는 Process Control Block의 약자다. 이름에서 알 수 있듯이 프로세스를 제어하고 관리하기 위한 정보를 담고 있는 구조체다. PCB는 OS가 스케줄링할 때나 프로세스를 관리하고 식별하는 데에 사용된다.

PCB의 구조

  1. Process Scheduling State
    • 프로세스 스케줄링 상태
  2. Process Structuring Information
    • 프로세스 구조 정보
    • 자식 프로세스 또는 현재 프로세스와 기능적으로 관련되어있는 다른 프로세스들의 ID
  3. Interprocess Communication Information
    • 프로세스간의 통신 정보
    • 프로세스간의 통신 관련 플래그, 신호 및 메세지
  4. Process Privileges
    • 프로세스 권한
    • 시스템 리소스의 접근 권한
  5. Process State
    • 프로세스 상태
    • 신규, 준비, 실행중, 대기중, 종료 등과 같은 상태 정보
  6. Process ID (PID)
    • 프로세스 ID
    • 프로세스를 식별하기 위한 고유 번호
  7. Program Counter (PC)
    • 프로그램 계수기
    • 프로세스에 대해 실행될 다음 명령의 주소
  8. CPU Registers
    • CPU 레지스터
    • 실행 상태, 실행 정도 등을 저장하는 레지스터들
  9. CPU Scheduling Information
    • CPU 스케줄링
  10. Memory Management Information
    • 메모리 관리 정보
    • 할당된 자원에 대한 정보
  11. Accounting Information
    • 계정 정보
    • 프로세스 실행에 사용된 CPU 양 , 시간 제한, 실행 ID 등
  12. I/O Status Information
    • 입출력 상태 정보
    • 프로세스에 할당된 I/O 장치 목록

TCB (Thread Control Block)

TCB는 Thread Control Block의 약자다. PCB와 마찬가지로 스레드를 제어하고 관리하기 위한 정보를 담고 있는 구조체다. TCB 또한 OS가 스레드를 관리하고 식별하는 데에 사용된다.

TCB의 구조

  1. Thread ID (TID)
    • 스레드 ID
    • 스레드를 식별하기 위한 고유 번호
  2. Stack Pointer
    • 고유 스택 메모리 주소
    • 스레드는 같은 프로세스의 Code, Data, Heap 메모리 영역을 공유하지만 Stack 메모리 영역은 고유한 영역을 보유하고 있다
  3. Program Counter
    • 프로그램 계수기
    • 현재 실행될 명령어 주소
  4. Thread State
    • 스레드 상태
    • 실행중, 준비, 대기, 시작, 종료 등과 같은 상태 정보
  5. Register Information
    • 레지스터 정보
    • 실행 상태, 실행 정도 등을 저장하는 레지스터들
  6. PCB Pointer
    • 현재 스레드가 작동중인 프로세스 정보(PCB) 주소

컨텍스트 스위칭 오버헤드 (Context Switching Overhead)

운영체제는 프로세스와 스레드를 각각 PCB과 TCB를 통해 관리한다.

따라서 스레드 컨텍스트 스위칭이 일어날 때는 TCB, 프로세스 컨텍스트 스위칭이 일어날 때는 PCB와 TCB의 컨텍스트 저장과 복원(Context Save and Restore)과정이 발생한다.

컨텍스트 저장은 CPU의 코어가 기존에 작업중이던 내용을 TCB 또는 PCB 에 저장하는 과정을 말한다.
컨텍스트 복원은 새로 할당받은 TCB 또는 PCB의 정보를 바탕으로 CPU의 코어가 작업 환경을 재구성하는 것을 말한다.

이러한 과정을 진행하는 데에 드는 비용을 Context Switching Overhead 즉 컨텍스트 스위칭 오버헤드라고 한다.

프로세스 컨텍스트 스위칭 과정에선 PCB와 TCB가 모두 변경되고 스레드 컨텍스트 과정에선 TCB만을 변경하기 때문에 당연히 스레드 컨텍스트 스위칭 오버헤드가 비교적 작게 발생한다.
그렇다고 해서 스레드 컨텍스트 스위칭 오버헤드를 무시하고 남발해도 된다는 뜻은 아니다.

멀티스레딩 주의점

멀티스레딩 환경을 구축하다 보면 당연스레 스레드 컨텍스트 스위칭이 일어나게 된다. 스레드 컨텍스트 스위칭 오버헤드가 비교적 작다고 해도 무시해선 안 되기에 컨텍스트 스위칭을 고려해서 프로그래밍을 해야한다.

만약 나의 CPU가 쿼드코어를 사용한다고 해보자.

어느 멀티스레딩 광신도 개발자가 400개의 스레드를 사용하는 프로그램을 만들었다. 여러가지 변수가 존재하겠지만 우리가 알고있는대로 실행된다면 하나의 스레드가 1초가 걸리는 작업씩을 담당하여 총 400초가 걸리는 작업을 1초(총 작업 시간 / 스레드 개수)만에 끝낼 수 있을 것이다.

하지만 쿼드 코어를 사용하는 나의 컴퓨터는 한번에 4개의 스레드밖에 실행하지 못한다. 따라서 400개의 스레드를 한번에 4개씩 100번에 걸쳐서 실행하는 수 밖엔 없다. 이에 따라 100초라는 실행 시간이 걸릴 것이다.

게다가 각 코어가 100번씩 걸쳐서 스레드를 실행한다는 소리는 컨텍스트 스위칭이 각 100번 일어난다는 소리다. 즉 100번의 스레드 컨텍스트 스위칭 오버헤드가 발생한다는 소리다. 그렇다면 100초라는 시간조차 기대하기 힘들 수 있다.

즉 아무리 멀티스레딩 환경을 구축한다 할지라도 컨텍스트 스위칭 오버헤드를 고려하지 않으면 싱글스레드 환경보다 못한 퍼포먼스를 내는 상황은 얼마든지 생길 수 있다.

멀티스레딩 환경을 구축할 땐 꼭 알아두도록 하자.

profile
노력할 수 있는 재능을 가진 개발자입니다.

0개의 댓글