내 운영 체제 교과서에는 다음과 같이 나와 있습니다.
인터럽트로 인해 운영 체제는 CPU 코어를 현재 작업에서 커널 루틴 실행으로 변경합니다. CPU 코어를 다른 프로세스로 전환하려면 현재 프로세스의 상태 저장과 다른 프로세스의 상태 복원을 수행해야 합니다. 이 작업을 컨텍스트 전환이라고 합니다.
이러한 관점에서 보면 중단으로 인해 컨텍스트 전환이 발생한다는 것을 쉽게 이해할 수 있습니다. 인터럽트가 컨텍스트 전환을 위한 유일한 방법입니까? 아니면 중단 없이 상황을 전환할 수 있나요? 컨텍스트 전환은 스레드와 프로세스의 컨텍스트에서만 작동합니까?
답변1
커널 코드가 권한 있는 프로세서 모드에서 실행 중인 경우 운영 체제는 도달 방법에 관계없이 컨텍스트 전환을 수행할 수 있습니다.
책을 쓰면서 인터럽트가 CPU 코어에 도달하면 이런 일이 발생할 수 있습니다. 그러면 커널은 특권 모드로 변경되고 커널이 설치한 적절한 인터럽트 핸들러를 실행합니다. 그런 다음 커널은 다른 프로세스/스레드의 컨텍스트로 전환하거나 중단된 작업으로 제어권을 반환하기로 결정할 수 있습니다. 방해만이 유일한 방법이다무의식적으로실행 중인 작업을 교환합니다.
컨텍스트 전환이 발생할 수 있는 또 다른 방법은 작업이 시스템 호출을 수행할 때입니다(예:sched_yield
recv
등) 은 sched_yield
CPU를 다른 작업에 양보하도록 커널에 직접 요청하지만, recv
예를 들어 시스템이 여전히 데이터 수신을 기다려야 하는 경우 컨텍스트 전환이 발생할 수도 있습니다.
컨텍스트 전환은 스레드와 프로세스의 컨텍스트에서만 작동합니까?
컨텍스트 스위치는 한 작업의 상태를 저장하고 다른 작업의 상태를 복원하며, 작업은 종종 "스레드"라고 불리고 일부 공통 상태를 가진 스레드 그룹은 종종 "프로세스"라고 부르기 때문에 컨텍스트 스위치라고 말하는 것이 타당합니다.운영 체제 수준에서항상 스레드 및/또는 프로세스 간에 수행됩니다. 그러나 이 용어는 때때로 반복적으로 사용됩니다.녹색 선사용자 공간에서.
답변2
전환 프로세스로 인해 CPU 컨텍스트(regs, 일부 테이블)가 변경됩니다. 사용자 모드에서 커널 모드로 전환하는 것은 완전한 컨텍스트 전환이 아닙니다. 몇 가지 레지스터만 변경되기 때문입니다. 동일한 프로세스가 여전히 실행 중이지만 i/o 또는 페이지 업데이트 등과 같은 일부 커널 구현 코드가 있습니다. 이제 인터럽트(타이머, 오류, 하드웨어)로 인해 전체 컨텍스트가 변경되거나 I/O 요청 후 프로세스가 차단될 수 있습니다.
답변3
컨텍스트 전환은...컨텍스트(CPU 레지스터의 값뿐만 아니라 페이지 테이블, 열린 파일 핸들러, 권한 등을 고려)가...전환(변경을 위해 변경)해야 하는 경우에만 발생합니다. 다른 사람).
이미 알고 있는 인터럽트 처리 외에도 이 개념은 다중 처리의 컨텍스트에서만 알려져 있습니다. 왜냐하면 단일 처리의 경우... 항상 고유한 컨텍스트가 있기 때문입니다.
시스템 호출 자체는 컨텍스트 전환을 트리거하지 않습니다. 프로시저를 실행할 때 커널은 호출 프로세스의 컨텍스트에서 실행되어야 하고, 일단 완료되면 호출 프로세스의 다음 명령어에서 실행이 재개될 수 있기 때문입니다. 서브루틴이 전송되었습니다.
그러나 일부 경우(예: 열려 있는 설명자에서 읽기를 차단하는 경우) 커널은 호출 프로세스에서 실행을 재개해서는 안 된다는 것을 알고 있습니다. (일부 이벤트가 발생할 때까지 기다려야 하기 때문에)
대신 스케줄러에는 프로세스를 예약하고 다른 프로세스를 예약할 수 있는 기회가 주어져야 합니다. 컨텍스트가 변경되어야 합니다(예약된 프로세스 프로세스 컨텍스트에 맞게) => 컨텍스트 전환이 발생해야 합니다.
요약하자면, 컨텍스트 전환은 일부 IRQ가 실행된 직후 체계적으로 발생하는 반면(IRQ 핸들러는 프로세스를 대신하여 실행되지 않으므로) 컨텍스트 전환은 가능한 상황에 따라 일부 시스템 호출이 실행되는 동안 특정 시점에 발생할 수 있습니다. 기회.