맨위로가기

문맥 교환

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

문맥 교환은 운영 체제가 CPU 사용 프로세스를 변경할 때 발생하는 과정으로, 현재 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 복원하는 것을 포함한다. 이 과정은 오버헤드를 발생시키며, 아키텍처, 운영 체제, 공유 자원 수에 따라 시간과 비용이 달라진다. 문맥 교환은 멀티태스킹, 인터럽트 처리, 사용자 모드와 커널 모드 간 전환 등 다양한 상황에서 발생하며, 주로 소프트웨어 또는 하드웨어를 통해 구현된다.

더 읽어볼만한 페이지

  • 프로세스 - 데몬 (컴퓨팅)
    데몬은 운영 체제에서 사용자와 상호 작용 없이 백그라운드에서 실행되며 시스템의 다양한 작업을 처리하는 프로세스이다.
  • 프로세스 - 윈도우 서비스
    윈도우 서비스는 윈도우 운영체제에서 사용자 인터페이스 없이 백그라운드로 실행되어 시스템 기능을 제공하는 응용 프로그램으로, 다양한 도구를 통해 시작 유형 설정, 계정 변경, 오류 복구 옵션 구성 등 관리가 가능하다.
문맥 교환
컴퓨터 과학
종류프로세스 관리
설명실행 중인 프로세스의 상태를 저장하고 복원하여 프로세스 실행을 중단하고 재개하는 기능
다른 이름작업 전환, 프로세스 전환
세부 정보
발생 시점인터럽트
다중 작업 처리
필요한 정보프로세스 제어 블록 (PCB)
레지스터
메모리 맵
파일 설명자
영향성능 오버헤드 발생
컨텍스트 전환 빈도 감소 필요
관련 개념스레드
프로세스
스케줄링
구현
운영 체제운영 체제의 커널 기능
관련 시스템 호출switch_to (리눅스)
Swapcontext (유닉스)
성능 측정
측정 도구DTrace
SystemTap
Perf
프로그래밍
고려 사항캐시 무효화
TLB 무효화
파이프라인 플러시

2. 문맥 교환의 개념 및 비용

문맥 교환은 운영 체제가 CPU를 사용하는 프로세스를 변경할 때 발생하는 필수적인 과정이다. 이 과정에는 현재 프로세스의 상태(레지스터 값, 프로그램 카운터, 스택 포인터 등)를 저장하고, 새로운 프로세스의 상태를 복원하는 작업이 포함된다.

문맥 교환은 일반적으로 많은 연산을 필요로 하며, 문맥 교환 시간은 일종의 오버헤드라고 할 수 있다. 문맥 전환에 실제로 포함되는 내용은 아키텍처, 운영 체제 및 공유되는 리소스의 수에 따라 달라진다.

프로세스의 상태에는 해당 프로세스가 사용할 수 있는 모든 레지스터 (특히 프로그램 카운터)와 프로세스 실행에 필요한 운영 체제 고유의 정보가 포함된다. 많은 경우 이러한 데이터는 프로세스 제어 블록(PCB)이라는 하나의 데이터 구조로 저장된다. 프로세스를 전환하려면 실행 중인 프로세스의 상태를 나타내는 데이터 구조를 생성하여 저장해야 하며, 이 데이터는 커널 메모리에 있는 프로세스마다 할당되는 스택 또는 운영 체제에서 정의한 고유한 데이터 구조에 저장된다.

사용자 스레드, 특히 그린 스레드 간에는 유사한 문맥 교환이 발생하며, 종종 매우 가볍고 최소한의 컨텍스트를 저장하고 복원한다. Go의 고루틴 간 전환과 같이 극단적인 경우, 문맥 전환은 코루틴 수율과 동일하며, 서브루틴 호출보다 약간 더 비용이 많이 들 뿐이다.[4][5]

2. 1. 오버헤드

문맥 교환은 필연적으로 오버헤드를 수반한다. 현재 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 로드하는 데 시간이 소요되기 때문이다. 특히, CISC 구조보다 레지스터 개수가 많은 RISC 구조에서 문맥 교환 오버헤드가 더 클 수 있다.[4][5]

2. 2. 비용

문맥 교환은 많은 연산을 필요로 하며, 운영 체제 설계의 상당 부분은 문맥 교환의 사용을 최적화하는 데 중점을 둔다. 하나의 프로세스에서 다른 프로세스로 전환하려면 레지스터와 메모리 맵을 저장하고 로드하고, 다양한 테이블과 목록을 업데이트하는 등 관리 작업에 특정 시간이 필요하다.[4][5]

예를 들어, 리눅스 커널에서 문맥 교환에는 프로세스 제어 블록(PCB)을 로드하여 새 프로세스의 상태 정보를 검색하는 작업이 포함된다. 이전 프로세스와 현재 프로세스가 다른 메모리를 사용하는 경우, 잘못된 주소 변환을 방지하기 위해 TLB(변환 검색 버퍼)를 플러시해야 하며, 이는 성능 저하의 원인이 될 수 있다.[4][5]

3. 문맥 교환의 발생 시점

문맥 교환은 주로 다음 세 가지 상황에서 발생한다.


  • 멀티태스킹: 멀티태스킹 환경에서 여러 프로세스가 CPU를 번갈아 사용하면서 발생한다.
  • 인터럽트 처리: 인터럽트 발생 시 현재 실행 중인 프로세스를 중단하고 인터럽트 핸들러를 실행하기 위해 발생한다.
  • 사용자 모드와 커널 모드 간 전환: 사용자 모드 프로세스가 시스템 콜을 호출하여 커널 모드로 전환될 때 발생할 수 있다. 시스템 콜은 운영 체제의 커널 기능을 사용하기 위한 것이며, 이 과정에서 반드시 문맥 교환이 필요한 것은 아니지만 운영 체제에 따라 발생할 수 있다.[1]

3. 1. 멀티태스킹

멀티태스킹 운영 체제에서는 실행 중인 프로세스가 중간에 CPU를 다른 프로세스에 양보해야 한다. 이 프로세스의 전환 시에 문맥 교환(컨텍스트 스위칭)이 발생한다.

선점형 멀티태스킹 OS에서는 스케줄러가 각 프로세스를 "타임 슬라이스"라고 불리는 짧은 시간 동안 실행시킨다. 하지만 프로세스가 그 시간 내에 CPU를 양보하지 않은 경우(양보한다는 것은 예를 들어 I/O를 수행하고 완료를 기다리는 경우 등), 타이머 인터럽트가 발생하고 OS가 다른 프로세스를 실행하도록 스케줄링하여 문맥 교환이 발생한다. 이를 통해 CPU가 계산만 하는 애플리케이션에 독점되지 않도록 하는 것이다.

3. 2. 인터럽트 처리

인터럽트가 발생하면 현재 프로세스의 실행을 중지하고 인터럽트 핸들러를 실행해야 하므로, 문맥 교환이 발생한다.[6]

현대 아키텍처는 인터럽트 기반으로 동작한다. 예를 들어, CPU가 디스크에서 데이터를 요청할 때, 읽기 작업이 완료될 때까지 빈번한 대기를 할 필요 없이, 요청을 보내고 다른 작업을 계속할 수 있다. 읽기가 완료되면 CPU는 인터럽트되어 읽은 데이터를 받는다. 인터럽트는 인터럽트 핸들러라는 프로그램이 처리한다.[6]

인터럽트가 발생하면 하드웨어는 자동으로 컨텍스트 일부를 전환한다. 인터럽트 처리에 소요되는 시간을 최소화하기 위해 최소한의 컨텍스트만 변경되는 경우가 많다. 커널은 인터럽트 처리를 위해 특별한 프로세스를 생성하거나 스케줄링하지 않고, 핸들러는 인터럽트 처리 시작 시 설정된 (종종 부분적인) 컨텍스트에서 실행된다. 인터럽트 서비스가 완료되면 인터럽트 발생 전의 컨텍스트가 복원되어 인터럽트된 프로세스가 실행을 재개할 수 있다.[6]

프로세스 A가 실행 중 타이머 인터럽트가 발생하면, 프로세스 A의 사용자 레지스터(프로그램 카운터, 스택 포인터, 상태 레지스터)는 CPU에 의해 A의 커널 스택에 자동으로 저장된다. 하드웨어는 커널 모드로 전환하고 운영 체제가 인터럽트 핸들러로 점프한다. 운영 체제는 `switch()` 루틴을 호출하여 A의 범용 사용자 레지스터를 A의 커널 스택에 저장하고, A의 현재 커널 레지스터 값을 A의 PCB(프로세스 제어 블록)에 저장한 다음, 프로세스 B의 PCB에서 커널 레지스터를 복원하고, 컨텍스트를 전환한다. 즉, 커널 스택 포인터를 프로세스 B의 커널 스택을 가리키도록 변경한다. 그런 다음 운영 체제는 인터럽트에서 돌아온다. 하드웨어는 B의 커널 스택에서 사용자 레지스터를 로드하고, 사용자 모드로 전환하고, B의 프로그램 카운터에서 프로세스 B를 실행하기 시작한다.[6]

실시간 운영 체제에서 선점형 태스크 실행 중 인터럽트가 발생하면, 인터럽트 처리 종료 후 중지된 태스크로 실행 권한이 돌아온다는 보장은 없다. 인터럽트 처리 종료 시 중지된 태스크보다 우선순위가 높은 태스크가 실행 가능한 상태라면 디스패치가 이루어져 우선순위가 높은 태스크를 우선 처리하는 것이 일반적이다.[6]

3. 3. 사용자 모드와 커널 모드 간 전환

사용자 모드에서 실행 중인 프로세스가 시스템 콜을 호출하면 커널 모드로 전환된다. 시스템 콜은 운영 체제의 커널 기능을 사용하기 위한 것으로, 이 과정에서 문맥 교환이 필요할 수 있다.[1] 시스템이 사용자 모드와 커널 모드 간에 전환될 때, 문맥 교환은 필수가 아니며, 모드 전환 자체는 문맥 교환이 아니다.[1] 그러나 운영 체제에 따라 문맥 교환이 발생할 수도 있다.[1] 시스템 콜은 커널 모드에서 실행되므로, 이러한 함수가 호출될 때는 먼저 커널의 문맥을 읽어들이고, 시스템 콜을 실행한 후, 원래의 사용자 모드 문맥을 복원해야 한다.[1]

4. 문맥 교환의 절차

문맥 교환은 다음과 같은 단계를 거친다.

1. 현재 실행 중인 프로세스의 상태를 저장한다. 이 상태는 나중에 프로세스가 실행을 재개할 때 복원되어야 한다.[1]

2. 프로세스 상태에는 프로세스가 사용할 수 있는 모든 레지스터, 특히 프로그램 카운터와 기타 운영 체제 관련 데이터가 포함된다. 이 데이터는 일반적으로 '''프로세스 제어 블록(PCB)''' 또는 '''스위치프레임'''이라는 데이터 구조에 저장된다.[1]

3. PCB는 커널 메모리의 프로세스별 스택(사용자 모드 호출 스택과는 대조적으로)에 저장되거나, 운영 체제에서 정의한 특정 데이터 구조에 저장될 수 있다. PCB에 대한 핸들은 실행 준비가 된 프로세스의 큐(''준비 큐''라고 함)에 추가된다.[1]

4. 운영 체제가 하나의 프로세스 실행을 중단했으므로, 준비 큐에서 프로세스를 선택하고 해당 PCB를 복원하여 문맥을 전환할 수 있다. PCB의 프로그램 카운터가 로드되면 선택된 프로세스에서 실행을 계속할 수 있다. 프로세스 및 스레드 우선 순위는 준비 큐에서 어떤 프로세스를 선택할지에 영향을 줄 수 있다(즉, 우선 순위 큐일 수 있다).[1]

5. 문맥 교환의 구현 및 성능

문맥 교환은 소프트웨어나 하드웨어로 구현될 수 있다. 인텔(Intel)의 80386 및 후속 CPU는 하드웨어 문맥 교환을 위한 특수 데이터 세그먼트(태스크 상태 세그먼트, TSS)를 갖추고 있다. 그러나 윈도우를 포함한 주요 운영 체제는 성능 문제 등의 이유로 이 기능을 사용하지 않는다.[10][11]

아키텍처에 따라 여러 문맥을 동시에 유지하는 하드웨어도 존재한다. 이 경우 문맥을 메모리에 저장하거나 메모리에서 복원하는 작업이 필요 없다. 극단적인 경우 배럴 프로세서 아키텍처에서는 머신 사이클마다 스레드 간에 전환하며 동작한다.

5. 1. 하드웨어 vs. 소프트웨어

인텔 80386 및 후속 프로세서[10]와 같은 일부 프로세서는 태스크 상태 세그먼트(TSS)라는 특수 데이터 세그먼트를 사용하여 하드웨어를 통한 문맥 교환을 지원한다. 태스크 전환은 전역 기술자 테이블(GDT)의 TSS 기술자를 대상으로 하는 CALL 또는 JMP 명령어를 사용하여 명시적으로 트리거될 수 있다. 인터럽트 기술자 테이블(IDT)에 태스크 게이트가 있는 경우 인터럽트나 예외가 발생하면 암시적으로 발생할 수 있다. 태스크 전환이 발생하면 CPU는 TSS에서 새 상태를 자동으로 로드할 수 있다.

그러나 윈도우리눅스[11]를 포함한 주류 운영 체제에서는 이러한 하드웨어 문맥 교환 기능을 사용하지 않는다. 그 이유는 다음과 같다.

  • 하드웨어 문맥 전환은 모든 레지스터를 저장하지 않는다. 범용 레지스터만 저장하고 부동 소수점 레지스터는 저장하지 않는다. (비록 `CR0` 제어 레지스터에서 `TS` 비트가 자동으로 켜지지만, 부동 소수점 명령어를 실행할 때 오류가 발생하여 운영 체제가 필요에 따라 부동 소수점 상태를 저장하고 복원할 수 있다.)
  • 성능 문제가 있다. 소프트웨어 문맥 교환은 저장해야 할 레지스터를 선택적으로 저장할 수 있지만, 하드웨어 문맥 전환은 거의 모든 레지스터를 저장한다.

참조

[1] 서적 Operating System Design Prentice Hall
[2] 문서 Or sequentially so rapidly that they appear to be simultaneous.
[3] 서적 Modern Operating Systems Pearson 2014-03-20
[4] 웹사이트 IA-64 Linux Kernel: Design and Implementation http://www.informit.[...]
[5] 웹사이트 Operating Systems https://books.google[...]
[6] 서적 Operating Systems: Three Easy Pieces http://pages.cs.wisc[...] 2016-07-25
[7] 학회자료 Quantifying The Cost of Context Switch https://www.usenix.o[...]
[8] 뉴스 Memory part 3: Virtual Memory https://lwn.net/Arti[...] LWN.net 2014-10-09
[9] 논문 Multiple and single address spaces: towards a middle ground
[10] 웹사이트 Context Switch definition https://web.archive.[...] Linfo.org 2013-09-08
[11] 서적 Understanding the Linux Kernel, Third Edition https://books.google[...] O'Reilly Media 2009-11-23



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com