유휴 CPU 프로세스는 무엇을합니까?


73

소스를 살펴보면 strace클론 플래그 CLONE_IDLETASK를 사용하는 것으로 나타났습니다 .

#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */

더 자세히 살펴본 후에는 플래그가 포함되어 있지 않지만 man clone부팅 프로세스 중에 커널이 실제로 사용하여 시스템의 각 CPU에 대해 유휴 프로세스 (모두 PID 0이 있어야 함)를 생성 한다는 것을 알았습니다 . 즉, CPU가 8 개인 머신은 이러한 프로세스가 "실행 중"(따옴표로 표시) 7 이상 (아래 질문 참조)이됩니다.

이제이 "유휴"프로세스가 실제로 수행하는 작업에 대한 몇 가지 질문이 있습니다. 내 가정은 시간 프레임이 끝날 때까지 NOP 작업을 지속적으로 실행하고 커널이 실제 프로세스를 실행하거나 유휴 프로세스를 다시 한 번 할당하도록 지정합니다 (CPU가 사용되지 않는 경우). 그러나 그것은 완전한 추측입니다. 그래서:

  1. 예를 들어 8 개의 CPU가있는 머신에서 7 개의 유휴 프로세스가 생성됩니까? (그리고 사용자 공간 작업을 수행하지 않고 하나의 CPU가 커널 자체에 의해 유지됩니까?)

  2. 유휴 프로세스는 실제로 무한한 NOP 작업 스트림입니까? (또는 같은 루프).

  3. CPU 사용량 (예 : CPU uptime)은 유휴 프로세스가 CPU에 얼마나 오래 있었는지, 특정 기간 동안 얼마나 오래 있었는지에 의해 간단하게 계산됩니까?


추신 :이 질문의 많은 부분은 CPU가 어떻게 작동하는지 완전히 이해하지 못했기 때문일 수 있습니다. 즉, 어셈블리, 타임 프레임 및 인터럽트를 이해하지만, 예를 들어 CPU가 실행중인 내용에 따라 어느 정도의 에너지를 사용하는지 알 수 없습니다. 누군가 나에게도 그것을 밝힐 수 있다면 나는 감사 할 것이다.


17
제목을 보았을 때 "아무것도 없음"이라고 쓰려는 유혹에 저항해야했습니다.
Vality

4
대부분의 최신 CPU는 유휴 상태이거나 부하가 적을 때 클럭 속도와 전력 소비를 동적으로 낮 춥니 다 ( 예 : Intel CPU의 SpeedStep 과 같은 동적 주파수 스케일링 ). CPU를 오버 클로킹하면 일반적으로이 동작이 비활성화되어 유휴 상태 일 때에도 CPU가 최대 클럭 속도를 유지합니다.
Nat

2
"ACPI 전원 상태"를 참조하십시오. 프로세서가 명령 실행을 중지 할 수 있지만 깨울 수있는 다양한 방법이 있습니다.
pjc50

답변:


85

유휴 작업은 프로세스 회계 및 에너지 소비 절감에 사용됩니다. Linux에서는 모든 프로세서에 대해 하나의 유휴 작업이 생성되어 해당 프로세서에 고정됩니다. 해당 CPU에서 실행할 다른 프로세스가 없을 때마다 유휴 작업이 예약됩니다. 유휴 작업에 소비 된 시간은과 같은 도구에서 "유휴"시간으로 나타납니다 top. 가동 시간은 다르게 계산됩니다.

유닉스는 항상 어떤 종류의 유휴 루프를 가지고있는 것처럼 보이지만 (실제로 유휴 작업은 아니지만 Gilles의 답변 참조 ) V1에서도 인터럽트가 발생할 때까지 프로세서를 중지 시키는 WAIT명령사용 했습니다 ( 일시 정지"). 일부 다른 운영 체제는 특히 사용 중 루프, DOS, OS / 2 및 초기 버전의 Windows를 사용했습니다. 꽤 오랫동안 CPU는 이러한 종류의 "대기"명령을 사용하여 에너지 소비와 열 생산을 줄였습니다. 예를 들어 arch/x86/kernel/process.cLinux 커널 에서 유휴 작업의 다양한 구현을 볼 수 있습니다 .HLT인터럽트가 발생할 때까지 프로세서를 중지하고 (C1 에너지 절약 모드를 활성화) 다른 구현에서는 다양한 버그 또는 비 효율성을 처리합니다 ( 예 : 일부 CPU MWAIT대신 사용 HLT).

이 모든 것은 이벤트 (I / O 등)를 기다리는 프로세스에서 유휴 상태와 완전히 별개입니다.


3
허, 지금은 고맙습니다. play_dead()HALT를 실행하기위한 아주 좋은 니모닉 이름입니다. 모든 CPU에 HALT를 전송하여 결과적으로 정지 될 위험이 없습니까? (즉, 그러한 상황에 도달하면 모든 CPU가 HALT가 커널의 버그 일 것입니까?)
grochmal

30
CPU는 인터럽트를 통해 HALT에서 깨어납니다.
Johan Myréen

1
@ JohanMyréen-멋지다. 이 경우 입력 장치의 IRQ 인터럽트조차도 다시 작동합니다. 감사.
grochmal

15
또는 더 안정적으로, 타이머 인터럽트 (틱 처리는 물고기의 또 다른 주전자입니다.)
스티븐 키트

3
@EJP는 실제로 아키텍처마다 이름이 다르지만 일반적인 명령입니다.
user253751

50

프로세스 스케줄러의 교과서 설계에서 스케줄러에 스케줄 할 프로세스가없는 경우 (즉, 모든 프로세스가 차단되고 입력을 기다리는 경우) 스케줄러는 프로세서 인터럽트를 기다립니다. 인터럽트는 주변 장치 (사용자 동작, 네트워크 패킷, 디스크로부터의 완료된 읽기 등)로부터의 입력을 나타내거나 프로세스에서 타이머를 트리거하는 타이머 인터럽트 일 수있다.

Linux의 스케줄러에는 할 일이없는 경우를위한 특별한 코드가 없습니다. 대신, 할 일이없는 경우를 특수 프로세스 인 유휴 프로세스로 인코딩합니다. 유휴 프로세스는 다른 프로세스를 예약 할 수없는 경우에만 예약됩니다 (유효하게 무한한 우선 순위를 가짐). 유휴 프로세스는 실제로 커널의 일부입니다. 커널 스레드입니다. 즉 프로세스의 코드가 아니라 커널의 코드를 실행하는 스레드입니다. 보다 정확하게는 각 CPU마다 하나의 스레드가 있습니다. 유휴 프로세스가 실행되면 인터럽트 대기 작업을 수행합니다.

인터럽트 대기 작동 방식은 프로세서의 기능에 따라 다릅니다. 가장 기본적인 프로세서 디자인을 사용하면 매우 바쁩니다.

nothing:
    goto nothing

프로세서는 분기 명령을 계속 실행하므로 아무것도 수행하지 않습니다. 대부분의 최신 OS는 더 좋은 것이없는 프로세서에서 실행되고 있고 대부분의 프로세서에는 더 좋은 것이없는 한이 작업을 수행하지 않습니다. 방을 난방하는 것 외에는 아무 것도하지 않고 에너지를 소비하기보다는 프로세서를 꺼야합니다. 따라서 커널은 프로세서 자체를 끄거나 최소한 대부분의 프로세서를 끄도록 지시하는 코드를 실행합니다. 전원이 켜진 상태로 유지되는 최소한 하나의 작은 부품 인 인터럽트 컨트롤러가 있어야합니다. 주변 장치가 인터럽트를 트리거하면 인터럽트 컨트롤러가 프로세서의 메인 (일부)에 웨이크 업 신호를 보냅니다.

실제로 Intel / AMD 및 ARM과 같은 최신 CPU에는 많은 복잡한 전원 관리 설정이 있습니다. OS는 프로세서가 유휴 모드로 유지되는 시간을 추정 할 수 있으며 이에 따라 다른 저전력 모드를 선택합니다. 이 모드는 유휴 상태의 전원 사용량과 유휴 모드를 시작하고 종료하는 데 걸리는 시간이 서로 다릅니다. 일부 프로세서에서 OS는 프로세스가 많은 CPU 시간을 소비하지 않는 것을 발견하면 프로세서의 클럭 속도를 낮출 수도 있습니다.


5
AVR 기반 마이크로 컨트롤러와 같은 가장 기본적인 임베디드 CPU조차도 정확한 모델에 따라 해당 명령이 NOP와 동일하더라도 WFI (Wait For Interrupt) 명령이 있습니다.
Jonas Schäfer

@JonasWielicki 나는 당신이 할 일이 없다면 보통 단단하게 돌릴 것이라고 생각했다. 또는 저전력 상태로 들어가서 인터럽트가 당신을 때릴 때까지 기다릴 수 있다고 생각했다. 금속 "인터럽트).
Nick T

1
임베디드 시스템 용으로 설계된 @JonasWielicki 아키텍처는 전원 관리를 관리하므로 WFI가 중요합니다. 많은 오래된 아키텍처에는 그러한 것이 없습니다. 원래 8086 아키텍처는 AFAIR가 아니 었습니다. 68k에 WFI가 있습니까? MIPS의 표준 기능입니까? 저수준 프로그래밍에 대한 나의 친숙 함은 대부분 ARM에 관한 것으로 저전력 소비는 물론 WFI는 전력 관리 빙산의 일각에 불과합니다.
Gilles

1
@Gilles 8086은 중단 명령을 받았습니다. 참조 ) en.m.wikipedia.org/wiki/HLT_(x86_instruction을 명령 만 80486 DX4 때문에 기능을 절약 전원을 포함. 역사를 되돌아 보면 HLT는 이미 8080에 있었고 Z80과 같은 파생물입니다.
pabouk

1
HLTDX4가 나오기 전에 @pabouk 이 386과 486의 SL 변형을 끌 수있었습니다 (Wikipedia 기사가 잘못되었습니다).
Stephen Kitt

0

유휴 작업은 CPU주기를 낭비하지 않습니다. 스케줄러는 단순히 유휴 프로세스를 선택하여 실행하지 않습니다. 유휴 프로세스가 일부 이벤트가 계속 진행될 수 있도록 대기 중입니다. 예를 들어, read()시스템 호출 에서 입력 대기 중일 수 있습니다 .

그런데 커널은 별도의 프로세스가 아닙니다. 커널 코드는 항상 프로세스 컨텍스트 (커널 스레드의 경우를 제외하고)에서 실행되므로 "사용자 공간 작업을 수행하지 않으면 서 하나의 CPU가 커널 자체에 의해 유지됩니다"라고 말하는 것은 올바르지 않습니다.


3
흠 ... CLONE_IDLETASK에 의해 생성 된 유휴 프로세스라고 생각하지 않습니다. 그럴 경우 스케줄러가 CPU에서 커널 유휴 프로세스를 무시한 경우 부팅 중에 프로세스를 만들 필요가 없었을 때 전혀 만들 필요가 없었습니다. (DW는 내 것이 아니라 :))
grochmal

약간의 인터넷 검색은 CLONE_IDLETASK가 2002 년 커널 버전 2.5.14에 도입되어 2004 년에 제거 된 커널 내부 플래그임을 나타냅니다.
Johan Myréen

"는"유휴 처리하지만 " "유휴 과정.
user253751
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.