인터럽트 부하를 분산시키려면, “인터럽트 벡터별 처리 횟수”가 가장 중요하다.
인터럽트 부하 분산을 위한 자료구조
// 인터럽트 벡터의 최대 개수, ISA 버스의 인터럽트만 처리하므로 16
#define INTERRUPT_MAXVECTORCOUNT 16
typedef struct kInterruptManagerStruct
{
// 코어별 인터럽트 처리 횟수,
// 최대 코어 개수 x 최대 인터럽트 벡터 개수로 정의된 2차원 배열
QWORD vvqwCoreInterruptCount[ MAXPROCESSORCOUNT ][ INTERRUPTHANDLER_MAXVECTORCOUNT ];
// 부하 분산 기능 여부
BOOL bUseLoadBalancing;
// 대칭 I/O 모드 사용 여부
BOOL bSymmetricIOMode;
} INTERRUPTMANAGER;
최초 부팅 후, os의 상태는 PIC 모드나 가상 연결 모드이다.
초기 상태는 대칭 I/O가 아니므로, 대칭 I/O모드는 FALSE(0)이 된다.
대칭 I/O 모드가 아니면 인터럽트 부하 분산 기능을 사용할 수 없기 때문에, FALSE(0)가 된다.
코어 별 인터럽트 처리 횟수는 한 번도 인터럽트를 처리한 적이 없기 때문에, FALSE(0)가 된다.
인터럽트 자료구조 초기화 함수의 코드
void kInitializeHandler( void ){
kMemSet( &gs_stInterruptManager, 0, sizeof( gs_stInterruptManager ) );
}
대칭 I/O 모드 사용 여부를 설정하는 함수와 인터럽트 부하 분산 사용을 설정하는 함수의 코드
// 인터럽트 처리 모드를 설정
void kSetSymmetricIOMode( BOOL bSymmetricIOMode ){
// 대칭 I/O 모드 사용 여부를 나타내는 필드
gs_stInterruptManager.bSymmetricIOMode = bSymmetricIOMode;
}
// 인터럽트 부하 분산 기능을 사용할지 여부를 설정
void kSetInterruptLoadBalancing( BOOL bUseLoadBalancing ){
gs_stInterruptManager.bUseLoadBalancing = bUseLoadBalancing;
}
인터럽트 처리 횟수를 증가시키는 함수의 코드
void kIncreaseInterruptCount( int iIRQ )
{
gs_stInterruptManager.vvqwCoreInterruptCount[ kGetAPICID() ][ iIRQ ]++;
}