>운영 및 유지보수 >리눅스 운영 및 유지 관리 >Linux 운영 체제에서 CPU 인터럽트

Linux 운영 체제에서 CPU 인터럽트

巴扎黑
巴扎黑원래의
2017-07-24 11:05:252161검색

인터럽트는 실제로 하드웨어나 소프트웨어에서 보내는 IRQ(인터럽트 요청)라는 신호입니다.

인터럽트는 키보드, 직렬 카드, 병렬 포트 등과 같은 장치가 CPU가 필요함을 나타낼 수 있도록 합니다.

CPU가 인터럽트 요청을 받으면 CPU는 실행 중인 프로그램의 실행을 일시적으로 중지하고 인터럽트 핸들러 또는 인터럽트 서비스 루틴이라는 특정 프로그램을 호출합니다.

인터럽트 서비스 루틴이나 인터럽트 핸들러는 메모리의 고정 주소에 위치한 인터럽트 벡터 테이블에서 찾을 수 있습니다. CPU가 인터럽트를 처리한 후 이전에 중단된 프로그램의 실행이 재개됩니다.

사실, 기계가 시작되면 시스템은 이미 모든 장치를 식별하고 해당 인터럽트 핸들러를 인터럽트 테이블에 로드했습니다.

다음은 CPU 주의를 요청하는 두 가지 방법입니다.
1. 인터럽트 기반
2. 폴링 기반

모든 Linux 운영 체제는 인터럽트 드라이버를 기반으로 합니다.

키보드의 키를 누르면 키보드는 키가 눌렸다는 사실을 CPU에 알려줍니다. 이 경우 키보드 IRQ 라인의 전압이 한 번 변경되며, 이 전압 변경은 장치의 요청이므로 장치에 처리해야 할 요청이 있다는 것과 같습니다.

/proc/interrupts 파일
Linux 시스템에서 /proc/interrupts 파일에는 사용 중인 인터럽트와 각 프로세서가 인터럽트된 횟수에 대한 정보가 포함되어 있습니다. R# CAT /Proc /인터럽트
CPU0 CPU1 CPU2 CPU3
0: 3710374484 0 0 0 IO-APIC-EDGE 타이머
1: 20 0 0 0 IO-APIC-EDGE I8042
6: 5 0 0 0 IO-EDGEGe 플로피 7 : 0 0 0 IO-APIC-edge parport0 8: 0 0 0 IO-APIC-edge rtc 9: 0 0 0 0 IO-APIC 수준 acpi
12: 240 0 0 0 IO-APIC -edge i8042
14: 11200026 0 0 0 IO-APIC-edge ide0
51: 61281329 0 0 0 IO-APIC 수준 ioc0
59: 1 0 0 0 0 IO-APIC 수준 vmci
67: 19386473 0 0 0 IO-APIC 수준 eth0
75: 94595340 0 0 0 IO-APIC 수준 eth1
NMI: 0 0 0 0
LOC: 3737150067 3737142382 3 737145101 3737144204
ERR:         0
MIS:    0

위 파일의 출력은 다음과 같이 설명됩니다.
● 첫 번째 열은 IRQ 번호를 나타냅니다.
● 두 번째, 세 번째, 네 번째 열은 해당 CPU 코어가 중단된 횟수를 나타냅니다. 위의 예에서 타이머는 인터럽트 이름(시스템 시계)을 나타냅니다. 3710374484는 CPU0이 3710374484번 중단되었음을 의미합니다. i8042는 키보드와 마우스를 제어하는 ​​키보드 컨트롤러를 나타냅니다.

● RTC(실시간 시계)와 같은 인터럽트의 경우 CPU가 인터럽트되지 않습니다. RTC는 전자 장치에 존재하며 시간을 추적하는 데 사용되기 때문입니다.

● NMI 및 LOC는 시스템에서 사용하는 드라이버이므로 사용자가 액세스하거나 구성할 수 없습니다.

IRQ 번호는 CPU에서 처리해야 하는 우선순위를 결정합니다. IRQ 번호가 작을수록 우선순위가 높다는 의미입니다.
예를 들어 CPU가 키보드와 시스템 클럭에서 동시에 인터럽트를 받으면 IRQ 번호가 0이므로 CPU는 시스템 클럭을 먼저 서비스합니다.
● IRQ0: 시스템 시계(변경 불가)

● IRQ1: 키보드 컨트롤러(변경 불가)

● IRQ3: 직렬 포트 2의 직렬 포트 컨트롤러(직렬 포트 4가 있는 경우 이 인터럽트도 사용)
● IRQ4 : 직렬 포트 1 직렬 포트 컨트롤러(직렬 포트 3이 있는 경우 이 인터럽트도 사용함)
● IRQ5: 병렬 포트 2 및 3 또는 사운드 카드
● IRQ6: 플로피 디스크 컨트롤러
● IRQ7: 병렬 포트 1. 프린터와 함께 사용되며 프린터가 없는 경우 모든 병렬 포트와 함께 사용할 수 있습니다.

조이스틱(또는 게임패드)에 있는 CPU의 경우 장치가 인터럽트를 보낼 때까지 기다리지 않습니다. 조이스틱은 주로 게임에 사용되기 때문에 조이스틱의 움직임은 매우 빨라야 하므로 폴링을 사용하여 장치에 CPU의 주의가 필요한지 여부를 감지하는 것이 이상적입니다. 폴링 방법을 사용할 때의 단점은 CPU가 장치를 여러 번 확인하기 때문에 CPU가 바쁜 대기 상태에 있다는 것입니다. 그러나 Linux에서는 이러한 신호 처리 방식도 필수적이라는 점에 유의해야 합니다.

하드 인터럽트
위에서 설명한 시나리오는 모두 하드 인터럽트의 예입니다. 하드 인터럽트는 주로 두 가지 범주로 나뉩니다.
1. NMI(Non-Maskable Interrupt): 이 인터럽트 유형의 문자 그대로의 의미와 마찬가지로 이 인터럽트는 CPU에 의해 무시되거나 취소될 수 없습니다. NMI는 별도의 인터럽트 라인을 통해 전송되며 일반적으로 메모리 오류, 팬 오류, 온도 센서 오류 등과 같은 중요한 하드웨어 오류에 사용됩니다.
2. 마스크 가능한 인터럽트: 이러한 인터럽트는 CPU에 의해 무시되거나 지연될 수 있습니다. 이러한 유형의 인터럽트는 캐시 컨트롤러의 외부 핀이 트리거될 때 생성되며, 인터럽트 마스크 레지스터는 이러한 인터럽트를 마스크합니다. 이 핀에서 트리거된 인터럽트를 비활성화하려면 비트를 0으로 설정할 수 있습니다.

소프트 인터럽트
이러한 인터럽트는 CPU가 명령어를 실행할 때(즉, 프로세스가 실행 중일 때) 생성됩니다. 명령어를 실행할 때 CPU(정확히 말하면 CPU의 산술 장치) 자체가 예외를 생성하기 때문입니다( 여기서의 예외는 소프트 인터럽트로도 이해될 수 있습니다.

예를 들어 숫자를 0으로 나누면(물론 불가능합니다) 0으로 나누기 예외가 발생하여 컴퓨터가 계산을 취소하거나 오류 메시지를 표시하게 됩니다.

/proc/stat 파일에는 시스템 커널에 대한 일부 통계 정보와 일부 인터럽트 정보가 포함되어 있습니다.
# 고양이 /proc/stat
cpu 17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 403368354 39 406374 90006 284864 0
cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0
cpu2 3791544 1471013 1211868 443988514 56981 0 64764 0
cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0
intr 417756956 --- Output Truncated

intr 라인에는 시스템 시작 이후 생성된 인터럽트 수를 표시합니다. 첫 번째 열은 서비스되는 모든 인터럽트 수를 나타냅니다. 각 후속 열은 특정 인터럽트에 대한 총 인터럽트 수를 나타냅니다.

SMP_AFFINITY
SMP는 대칭형 다중 프로세서를 나타냅니다. smp_affinity 파일은 주로 특정 IRQ가 바인딩된 CPU 코어를 결정하는 데 사용됩니다. /proc/irq/IRQ_NUMBER/ 디렉터리에 smp_affinity 파일이 있습니다. 이 파일에는 표시된 CPU 코어가 16진수로 표시됩니다. 예를 들어, 네트워크 카드의 인터럽트 번호는 다음과 같습니다.

grep eth0 /proc/interrupts
67: 23834931 0 0 0 IO-APIC-level eth0
                               ​
cat /proc/irq/67/smp_affin 리티
00000000,00000000, 00000000,00000000,00000000 ,00000000,00000000,00000001

위 16진수에 해당하는 십진수는 1로, 네트워크 카드 드라이버와 관련된 모든 인터럽트는 CPU0에서 처리된다는 의미입니다.

smp_affinity 파일의 값을 수동으로 변경하여 IRQ를 지정된 CPU 코어에 바인딩하거나 irqbalance 서비스를 활성화하여 IRQ를 CPU 코어에 자동으로 바인딩할 수 있습니다.


IRQ Balance
Irqbalance는 Linux 유틸리티로 주로 CPU 코어에 인터럽트 요청을 분배하여 성능을 향상시키는 데 사용됩니다. 그 목적은 절전과 성능 최적화 사이의 균형을 찾는 것입니다. yum을 사용하여 설치할 수 있습니다:
# rpm -qa | grep irqbalance
irqbalance-0.55-15.el5
# yum search irqbalance
# yum install irqbalance.x86_64

irqbalance 서비스를 시작한 후 CPU의 인터럽트 분포는 다음과 같습니다.
# cat /proc/interrupts
​ ​ ​ CPU1 ​ ​ ​ CPU2 ​ ​ CPU3
0: 950901695 ​ 0 ​ 0 ​ ​ 0 IO -API C-edge 타이머
1: 13 0 0 IO-APIC-edge i8042
6: 96 10989 470 IO-APIC-edge 플로피 7: 0 0 0 IO-APIC-edge parport0
8: 1 1 0 0 IO- APIC-edge rtc 9: 0 0 0 IO- APIC 수준 acpi
12: 109 1787 0 0 IO-APIC-edge i8042 15: 99 84813914 IO-API C-edge ide1
51: 17371 0 46689970 IO-APIC 수준 ioc0 67: 1741 0 0 225409160 PCI-MSI eth0
83: 0 0 0 PCI-MSI vmci
NMI: 0 0 LOC 0
: 950902917 950903742 950901202 950901400
ERR: 0
MIS: 0

Irqbalance는 여러 개를 포함하는 시스템용입니다. 코어 매우 유용합니다. 일반적으로 인터럽트는 첫 번째 CPU 코어에서만 서비스되기 때문입니다.

위 내용은 Linux 운영 체제에서 CPU 인터럽트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.