Linux에서는 컨텍스트를 CPU 컨텍스트라고도 합니다. CPU 레지스터 및 프로그램 카운터를 포함하여 모든 작업을 실행하기 전에 CPU가 의존해야 하는 환경입니다. 컨텍스트 전환은 먼저 이전 작업의 CPU 컨텍스트를 변경하는 것입니다. , CPU 레지스터 및 프로그램 카운터), 새 작업의 컨텍스트를 이러한 레지스터와 프로그램 카운터에 로드하고 마지막으로 프로그램 카운터가 가리키는 새 위치로 점프하여 새 작업을 실행합니다.
이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.
Linux는 동시에 실행되는 CPU 수보다 훨씬 많은 작업을 지원하는 멀티 태스킹 운영 체제입니다. 물론 이러한 작업이 실제로 동시에 실행되는 것은 아니지만 시스템이 CPU가 차례로 할당되어 사용자에게 많은 작업이 동시에 실행되는 듯한 착각을 줍니다.
각 작업이 실행되기 전에 CPU는 작업이 로드되는 위치와 실행이 시작되는 위치를 알아야 합니다. 즉, 시스템은 미리 CPU 레지스터와 프로그램 카운터(Program Counter, PC)를 설정해야 합니다. CPU 레지스터: CPU에 내장된 작지만 매우 빠른 메모리입니다. CPU에 의해 실행되는 명령의 위치 또는 실행될 다음 명령의 위치를 저장합니다
요약하면 답이 있습니다
우리가 사용하는 컨텍스트는 일반적으로 CPU 컨텍스트라고도 합니다. CPU 레지스터 및 프로그램 카운터를 포함하여 모든 작업을 실행하기 전에 CPU가 의존해야 하는 환경입니다.
컨텍스트 전환:
먼저 CPU 컨텍스트를 변경합니다. 이전 작업(즉, CPU 레지스터 및 프로그램 카운터)을 수행한 다음 새 작업의 컨텍스트를 이러한 레지스터 및 프로그램 카운터에 로드하고 마지막으로 프로그램 카운터가 가리키는 새 위치로 점프하여 새 작업을 실행합니다.2. 컨텍스트 전환에 대한 자세한 소개
다양한 CPU 전환 작업에 따라 프로세스 컨텍스트 전환
, 스레드 컨텍스트 전환으로 나눌 수 있습니다. code> <span class="md-plain">, <code>인터럽트 컨텍스트 전환
进程上下文切换
、线程上下文切换
、中断上下文切换
我们先了解下面2个上下文切换涉及的知识点系统调用、进程运行态
进程的运行态:
Linux 按照特权等级,把进程的运行空间分为内核空间
和用户空间
。在这两种空间中运行的进程状态分别称为内核态
和用户态
。
内核空间(Ring 0):具有最高权限,可以直接访问所有资源(读取文件,)
分配内存、IO操作、创建子进程……都是内核操作。这也表明,当IO操作频繁时,System参数会很高。
用户空间(Ring 3):只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用进入到内核中,才能访问这些特权资源
典型的用户态空间程序有:Shells、数据库、web服务器、PHP程序、Java程序……
在linux系统使用top命令查看cpu时,能看到user和system两项,对应的就是用户态和内核态占用的cpu资源
如上,我们的web服务是运行在用户态
프로세스의 실행 상태 : Linux에서는 권한 수준에 따라 프로세스의 실행 공간을 커널 공간
과 사용자 공간
으로 나눕니다. 이 두 공간에서 실행되는 프로세스 상태를 각각 커널 상태
사용자 상태
라고 합니다.
🎜🎜🎜🎜🎜🎜🎜커널 공간(링 0): 가장 높은 권한을 가지며 모든 리소스에 직접 액세스할 수 있습니다(파일 읽기). 🎜🎜🎜🎜🎜🎜메모리 할당, IO 작업, 하위 프로세스 생성... 모두 커널 작업입니다. 이는 또한 IO 작업이 빈번할 때 시스템 매개변수가 매우 높음을 보여줍니다. 🎜🎜🎜🎜🎜🎜🎜🎜사용자 공간(링 3): 제한된 리소스에만 액세스할 수 있고, 메모리와 같은 하드웨어 장치에 직접 액세스할 수 없으며, 이러한 권한 있는 리소스에 액세스하려면 시스템 호출을 통해 커널에 들어가야 합니다.🎜🎜🎜🎜🎜🎜 일반적인 사용자 공간 프로그램에는 다음이 포함됩니다: 쉘, 데이터베이스, 웹 서버, PHP 프로그램, Java 프로그램... 🎜🎜🎜🎜🎜🎜🎜🎜 Linux 시스템에서 CPU를 보기 위해 top 명령을 사용하면 사용자와 시스템을 볼 수 있습니다. 에 해당하는 항목입니다. 사용자 모드와 커널 모드가 차지하는 CPU 리소스입니다🎜🎜🎜🎜위와 같이 저희 웹 서비스는사용자 모드
🎜로 실행 중이며, io에 대한 권한이 없습니다. 파일을 읽어야 하는 경우 🎜시스템 호출🎜🎜🎜🎜🎜🎜🎜🎜시스템 호출: 🎜🎜사용자 모드에서 커널 모드로의 전환은 시스템 호출을 통해 완료되어야 합니다. 예를 들어, 파일을 볼 때 열기, 읽기, 쓰기, 닫기 등 여러 시스템 호출을 실행해야 합니다. 시스템 호출 프로세스는 다음과 같습니다.
원래 사용자 모드 명령 위치를 CPU 레지스터에 저장합니다.
커널 코드를 실행하려면 CPU 레지스터를 업데이트해야 합니다. 커널 모드 명령의 새 위치로 이동하고 마지막으로 커널 작업을 실행하려면 커널 모드로 이동하세요.
시스템 호출이 끝나면 CPU 레지스터를 원래 저장된 사용자 모드로 복원해야 합니다. 그런 다음 사용자 공간으로 전환하여 프로세스를 계속 실행합니다.
따라서 시스템 호출 프로세스에는 실제로 두 개의 CPU 컨텍스트 전환이 포함됩니다.
프로세스 실행이 종료되면 이전에 사용했던 CPU가 해제되고 타임 슬라이스를 기다리는 다음 프로세스가 준비 대기열에서 제거됩니다. 타임 슬라이스가 소진되면 시스템에 의해 일시 중지되고 CPU 실행을 기다리는 다른 프로세스로 전환됩니다.
특정 프로세스는 상대적으로 큰 시스템 리소스가 필요하므로(예: 메모리 부족) 일시 중지됩니다. ) 일시 중지하면 시스템이 다른 프로세스를 실행하도록 예약합니다.
우선 순위가 더 높은 프로세스(시스템 작동 프로세스)에 타임 슬라이스가 필요한 경우 우선 순위가 더 높은 프로세스를 실행할 수 있습니다. , 현재 프로세스가 일시 중지됩니다.
현재 프로세스에 절전 기능이 있으면 해당 프로세스도 일시 중지됩니다.
스레드의 컨텍스트 전환?
프로세스에 스레드가 하나만 있으면 프로세스는 스레드와 동일하다고 간주할 수 있습니다.
프로세스에 여러 스레드가 있는 경우 이러한 스레드는 상위 프로세스의 리소스를 공유합니다(즉, 가상 메모리 및 전역 변수와 같은 동일한 리소스를 공유합니다). 이러한 리소스는 컨텍스트 전환 중에 수정할 필요가 없습니다.
또한 스레드에는 컨텍스트 전환 중에 저장해야 하는 스택 및 레지스터와 같은 자체 개인 데이터도 있습니다.
요약하자면 스레드 컨텍스트 전환에는 두 가지 상황이 있습니다.
전후의 두 스레드는 서로 다른 프로세스에 속하므로 리소스가 공유되지 않으므로 전환 프로세스는 프로세스와 동일합니다.
가상 메모리가 공유되기 때문에 앞과 뒤의 두 스레드는 동일한 프로세스에 속하므로 전환 시 가상 메모리 리소스는 변경되지 않고 스레드의 개인 데이터, 레지스터 및 기타 비 - 공유 데이터를 전환해야 합니다.
컨텍스트 전환을 중단하시겠습니까?
요약 Tsuna의 테스트 보고서에 따르면 각 컨텍스트 전환에는 수십 나노초에서 수 마이크로초의 CPU 시간이 필요하며 이는 상당히 상당한 수준입니다. 어떤 시나리오에서 컨텍스트 전환이 발생하더라도 다음 사항을 알아야 합니다. CPU 컨텍스트 전환은 Linux 시스템의 정상적인 작동을 보장하는 핵심 기능 중 하나입니다. 일반적으로 특별한 비용을 지불할 필요가 없습니다. 그것에주의를 기울이십시오. 그러나 과도한 컨텍스트 전환은 레지스터, 커널 스택, 가상 메모리 등의 데이터를 저장하고 복원하는 데 CPU 시간을 소비하여 프로세스의 실제 실행 시간을 단축시키고 전반적인 성능을 크게 저하시킵니다. 시스템. 관련 추천: "Linux 비디오 튜토리얼"
위 내용은 리눅스에서 컨텍스트란 무엇인가의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!