이하에 첨부 도면을 참조하여 본원에 따른 정보 처리 장치, 제어 방법 및 제어 프로그램에 대해서 설명한다.
[실시예 1]
이하의 실시예 1에서는, 도 1을 이용하여, 복수의 노드를 갖는 정보 처리 시스템의 일례에 대해서 설명한다. 도 1은 실시예 1에 따른 정보 처리 시스템의 일례를 설명하기 위한 도면이다. 도 1에 나타내는 예에서는, 정보 처리 시스템(1)은 XB(크로스바 스위치)(2)와 복수의 빌딩 블록(10∼10e)을 갖는다. XB(2)는 각 빌딩 블록(10∼10e)을 상호 접속하는 크로스바 스위치이다. 또한, XB(2)는 후술하는 각 빌딩 블록(10∼10e)이 갖는 각 서비스 프로세서의 마스터가 되는 도시하지 않는 서비스 프로세서를 갖는다. 또한, 소수의 노드가 접속되는 소규모 구성의 경우, XB(2)를 통하지 않고, 빌딩 블록끼리를 직접 접속하여도 좋다.
또한, 빌딩 블록(10)은 복수의 CPU(Central Processing Unit)(21∼21c)와 복수의 메모리(22∼22c)를 갖는다. 또한, 다른 빌딩 블록(10a∼10e)도 빌딩 블록(10)과 동일한 구성을 갖는 것으로 하여, 이하의 설명을 생략한다. 또한, 도 1에 나타내는 예에서는, CPU(21b, 21c) 및 메모리(22b, 22c)에 대해서는, 기재를 생략하였다. 또한, 각 빌딩 블록 내에는, 도시하지 않는 I/O(Input Output) 장치가 설치되어 있다. 여기서, 본 실시예에서는, CPU 사이의 캐시 코히런스 제어를 디렉터리 방식으로 실현하며, 데이터를 메모리 상에 갖는 후술하는 홈 CPU가 그 디렉터리를 관리하고 있다.
각 빌딩 블록(10∼10e)은 각각 독립적으로 OS를 동작시킨다. 즉, 각 CPU(21∼21c)는 각각 독립적으로 OS를 실행한다. 각 빌딩 블록(10∼10e)이 실행하는 OS는 빌딩 블록마다 다른 파티션에서 동작한다. 여기서, 파티션이란, 동일한 OS가 동작하며, 동작하고 있는 OS에서 볼 때 하나의 시스템으로서 동작하는 빌딩 블록의 군을 나타낸다.
예컨대, 빌딩 블록(10∼10a)이 파티션 #A로서 동작하고, 빌딩 블록(10b∼10d)이 파티션 #B로서 동작한다. 이러한 경우에는, 빌딩 블록(10)이 동작시키는 OS는 빌딩 블록(10, 10a)이 하나의 시스템으로서 동작하고 있다고 식별하고, 빌딩 블록(10b)이 동작시키는 OS는 빌딩 블록(10b∼10d)이 하나의 시스템으로서 동작하고 있다고 식별한다.
다음에, 도 2를 이용하여, 빌딩 블록의 구성예에 대해서 설명한다. 도 2는 실시예 1에 따른 빌딩 블록의 기능 구성을 설명하기 위한 도면이다. 도 2에 나타내는 예에서는, 빌딩 블록(10)은 노드(20), 서비스 프로세서(24), XB 접속부(27, 27a), PCIe(Peripheral Component Interconnect Express) 접속부(28)를 갖는다.
노드(20)는 복수의 CPU(21∼21c)와, 복수의 메모리(22∼22c)와, 통신부(23)를 갖는다.
서비스 프로세서(24)는 제어부(25)와, 통신부(26)를 갖는다. 또한, 도 2에 나타내는 예에서는, 각 CPU(21∼21c)는 상호 접속되며, 통신부(23)와 접속되어 있다. 또한, 각 메모리(22∼22c)는 각 CPU(21∼21c)와 접속되어 있다. 서비스 프로세서(24)는 도시하지 않는 LAN(Local Area Network) 등의 네트워크 회선을 통해 서버의 관리자 단말에 접속되고, 관리자 단말로부터의 지시를 받아 노드 또는 빌딩 블록(10) 내의 각종 설정 변경 등의 제어를 수행한다.
또한, 각 CPU(21∼21c)는 XB 접속부(27) 또는 XB 접속부(27a)와 접속되어 있다. 또한, XB 접속부(27, 27a)는 동일한 XB 접속부여도 좋다. 또한, 각 CPU(21∼21c)는 PCIe 접속부(28)와 접속되어 있다. 또한, 통신부(23)는 서비스 프로세서(24)가 갖는 통신부(26)와 접속되어 있다. 또한, 제어부(25), 통신부(26), 통신부(23), 각 CPU(21∼21c)는, 예컨대 I2C(Inter-Integrated Circuit)로 접속되어 있다.
CPU(21∼21c)는 애플리케이션을 실행하는 연산 처리 장치이다. 또한, 각 CPU(21∼21c)에는, 각각 메모리(22∼22c)가 접속되어 있다. 또한, 각 CPU(21∼21c)는 실행 중인 애플리케이션이 공유 메모리의 할당을 요구한 경우에는, 상호 통신을 행하여, 애플리케이션이 사용하는 공유 메모리를 할당한다. 또한, 각 CPU(21∼21c)는 각 메모리(22∼22c)나, 다른 빌딩 블록(10a∼10e)이 갖는 메모리의 일부를 공유 메모리로서 이용한다.
도 3은 공유 메모리 실체가 할당된 노드에, 다른 노드가 어태치하는 경우의 메모리 맵의 일례를 나타내는 도면이다. 도 3의 예에서는, 메모리 실체를 소유하는 노드(이것을 홈 노드라고 칭함)에, 공유 메모리가 할당되면, 홈 노드는 이것을 일정한 영역 사이즈로 분할한다. 이 분할 단위를 세그멘트(segment)라고 칭하지만, 세그멘트로 분할하는 일은 필수적이지 않다. 다른 노드가 그 홈 노드가 소유하는 공유 메모리의 할당을 요구하는 경우, 즉 어태치함으로써, 그 홈 노드의 공유 메모리를 사용할 수 있다. 이 리모트 노드가 사용하는 메모리 영역을 공유 메모리 이미지 영역이라고 칭한다. 이 공유 메모리 이미지 영역은 단독의 리모트 노드가 어태치하여도 좋고, 복수의 리모트 노드가 어태치하여도 좋다.
도 2로 되돌아가서, 각 CPU(21∼21c)는 물리 어드레스와, 물리 어드레스가 배정된 메모리와 접속된 CPU의 식별자인 CPUID(identification)를 대응지은 노드 맵을 갖는다. 또한, 이 CPUID는 시스템(1)에서 고유하게 결정되며, 중복되지 않는다.
각 CPU(21∼21c)는 노드 맵을 이용하여, 다른 CPU와 통신을 행한다. 예컨대, CPU(21)는 액세스 대상이 되는 물리 어드레스와 대응지어진 CPUID가 CPU(21∼21c)와는 다른 CPU를 나타내는 경우에는, XB 접속부(27), 또는 XB 접속부(27a), 및 XB(2)를 통해 다른 노드에 메모리 액세스의 리퀘스트를 송신한다. 또한, CPU(21)는 자신과 접속된 메모리에 대한 리퀘스트를 다른 노드로부터 수신한 경우에는, 리퀘스트의 대상이 되는 데이터를 자신과 접속된 메모리(22)로부터 판독하여, 리퀘스트원에 송신한다. 다른 CPU(21a∼21c)도 동일한 처리를 실행한다.
또한, 각 CPU(21∼21c)는 TLB(Translation Lookaside Buffer)를 이용하여 어드레스 변환을 행하며, TLB 미스가 발생하였을 때에, 트랩 처리를 실행하는 등, 종래의 CPU와 동일한 처리를 실행하는 기능도 갖는다.
또한, 각 CPU(21∼21c)는 노드 사이의 데이터 전송의 이상(에러)을 검출한다. 노드 사이의 데이터 전송의 이상을 검출하는 방법의 일례에 대해서 설명한다. 예컨대, 각 CPU(21∼21c)는 리퀘스트를 송신하고 나서부터의 시간을 계측한다. 계속해서, 리퀘스트(요구)를 송신하고 나서 리스폰스(응답)를 수신하기 전에, 리퀘스트를 송신하고 나서부터의 시간이 정해진 시간을 넘은 경우에는, 타임아웃이 되었기 때문에, 각 CPU(21∼21c)는 노드 사이의 데이터 전송의 이상을 검출한다. 또한, 각 CPU(21∼21c)는 리퀘스트에 대하여 다른 노드로부터 부정 응답이 반환되는 경우도 이상을 검출한다.
그리고, 이상을 검출한 경우에는, 각 CPU(21∼21c)는 여러가지 처리를 실행한다. 예컨대, 이상 발생의 원인이 된 노드(예컨대, 다운된 노드)에 의해, 각 메모리(22∼22c)의 공유 메모리에 라이트백(write-back)되는 더티(dirty) 캐시 데이터가 라이트백되지 않는 경우에는, 각 CPU(21∼21c)는 다음과 같은 처리를 실행한다. 즉, 각 CPU(21∼21c)는 캐시의 상태를 나타내는 디렉터리에, 다운된 노드에 의해, 각 메모리(22∼22c)의 공유 메모리에 라이트백되는 더티 캐시 데이터가 라이트백되지 않은 이상을 나타내는 값을 기록한다. 또한, 이상을 검출하고, 이상 발생의 원인이 된 노드에 의해, 각 메모리(22∼22c)의 공유 메모리에 라이트백되는 더티 캐시 데이터가 라이트백되지 않는 경우에는, 각 CPU(21∼21c)는 다음과 같은 처리를 행할 수도 있다. 즉, 각 CPU(21∼21c)는 다운된 노드에 의해 캐시 데이터가 라이트백되는 각 메모리(22∼22c)의 공유 메모리의 영역에, 에러 상태를 나타내는 데이터를 기록할 수도 있다. 이들 처리에 의해, 라이트백되지 않은 공유 메모리의 데이터가 정상이 아닌 것을 나타낼 수 있다.
또한, 후술하는 홈 CPU에 라이트백의 요구가 도착하지 않는 케이스에서는, 후술하는 로컬 CPU가 홈 CPU로부터의 후술하는 타임아웃을 검출함으로써, 트랜잭션 실패를 인식한다. 이 경우, 로컬 CPU는 그 데이터를 파기한다. 홈 CPU가 관리하는 디렉터리는 로컬 CPU가 데이터를 캐시에 유지하고 있는 상태이기 때문에, 홈 CPU로부터 「MoveOut」 요구가 발생한다. 이 「MoveOut」 요구는 로컬 CPU에서 캐시 미스를 발생시키지만, 이 「MoveOut」 요구에 대하여 에러 응답을 반환하고, 홈 CPU에 있는 디렉터리의 상태를 이상으로 갱신, 즉, 전술한 에러 상태를 나타내는 데이터를 기록한다.
또한, 에러 발생 어드레스 레지스터에, 다운된 노드의 공유 메모리의 물리 어드레스(Physical Address; PA)가 기록된 경우에는, 트랩(인터럽트)이 발생한다. 즉, 에러 발생 어드레스 레지스터에, 물리 어드레스가 기록된 경우에는, 각 CPU(21∼21c)는 트랩 처리를 실행한다. 이 트랩 처리에서는, 예컨대 시그널 핸들러에 시그널이 송신된다.
여기서, 시그널 핸들러는 시그널을 수신하면 기동된다. 시그널 핸들러에 의한 처리에서는, 여러가지 처리가 행해진다. 예컨대, 시그널 핸들러에 의한 처리에서는, 다운된 노드에 「공유 메모리 실체」가 존재하는 경우에, 「공유 메모리 이미지」를 디태치, 즉 다운된 노드가 갖는 공유 메모리의 할당이 해제된다. 또한, 시그널 핸들러에 의한 처리에서는, 다른 노드가 다운된 것을 검출한 노드의 메모리의 공유 메모리에 대한 리커버리 처리를 실행한다. 리커버리 처리의 일례로서는, 공유 메모리에 라이트백되는 캐시 데이터가 라이트백되지 않은 이상을 나타내는 값을, 디렉터리로부터 클리어하는 처리를 들 수 있다. 또한, 리커버리 처리의 다른 일례로서는, 에러 상태를 나타내는 데이터를, 공유 메모리로부터 클리어하는 처리를 들 수 있다.
메모리(22∼22c)는 정보 처리 시스템(1)이 갖는 모든 CPU가 공용하는 메모리이다. 또한, 정보 처리 시스템(1)에 있어서는, 모든 빌딩 블록(10∼10e)이 갖는 메모리에 대하여, 각 빌딩 블록(10∼10e)의 서비스 프로세서가, 동일한 물리 어드레스 공간에 맵핑되는 물리 어드레스를 배분한다. 즉, 정보 처리 시스템(1)이 갖는 모든 메모리 중, 적어도 공유 메모리로서 사용되는 메모리에는, 중복되지 않는 값의 물리 어드레스가 할당되어 있다.
또한, 메모리(22∼22c)는 기억 영역의 일부를, 정보 처리 시스템(1)이 갖는 모든 CPU가 공용하는 공유 영역으로 하고, 다른 부분을, 자신에게 액세스하는 CPU(21∼21c)가 커널 데이터나 사용자 데이터를 저장하는 로컬 영역으로 하고, 또 공유 메모리를 통한 타(他)노드와의 교환과 무관계한 I/O 장치가 이용하는 I/O 영역으로 한다.
제어부(25)는 빌딩 블록(10)을 제어한다. 예컨대, 제어부(25)는 빌딩 블록(10)의 전원 관리나, 빌딩 블록(10) 내의 이상의 감시나 제어 등을 실행한다. 또한, 제어부(25)는 다른 빌딩 블록(10a∼10e)이 갖는 서비스 프로세서와, 도시하지 않는 네트워크에 의해 접속되어 있고, 각 빌딩 블록(10a∼10e) 사이에서 연계된 제어를 실행한다. 또한, 제어부(25)는 각 CPU(21∼21c)가 실행하는 OS와 통신을 행할 수 있다.
또한, 제어부(25)는 통신부(26)와 통신부(23)를 통해, 각 CPU(21∼21c)에 액세스한다. 그리고, 제어부(25)는 각 빌딩 블록(10∼10e)이 갖는 노드 맵의 갱신이나 제어 등을 실행한다.
또한, 통신부(23)는 서비스 프로세서(24)가 갖는 통신부(26)를 통해, 제어부(25)에 의한 제어 신호를 각 CPU(21∼21c)에 전달한다. 또한, 통신부(26)는 제어부(25)에 의한 제어 신호를 노드(20)가 갖는 통신부(23)에 전달한다. 또한, XB 접속부(27, 27a)는 각 CPU(21∼21c)를 XB(2)와 접속시키고, 각 빌딩 블록(10∼10e)이 갖는 CPU들 사이의 통신을 중계한다. 또한, PCIe 접속부(28)는 각 CPU(21∼21c) 에 의한 I/O 장치에의 액세스를 중계한다.
다음에, 도 4를 이용하여, 각 CPU(21∼21c)가 갖는 기능 구성에 대해서 설명한다. 도 4는 실시예 1에 따른 CPU의 기능 구성을 설명하기 위한 도면이다. 또한, CPU(21a∼21c)는 CPU(21)와 동일한 기능을 갖기 때문에, 설명을 생략한다. 또한, 도 4에 나타내는 예에서는, 서비스 프로세서(24)와 CPU(21)를 접속하는 접속부(23, 26)에 대해서는, 기재를 생략하였다.
도 4에 나타내는 예에서는, CPU(21)는 연산 처리부(30), 라우터(40), 메모리 액세스부(41), PCIe 제어부(42)를 갖는다. 또한, 연산 처리부(30)는 연산부(31), L1(Level 1) 캐시(32), L2(Level 2) 캐시(33), 노드 맵(34), 어드레스 변환부(35), 캐시 디렉터리 관리부(36), 패킷 제어부(37), 에러 발생 어드레스 레지스터(96), 트랩 발생부(97)를 갖는다. 또한, 라우터(40), 메모리 액세스부(41), PCIe 제어부(42) 등의 각 부를 동일한 CPU(21)의 내부에 포함시키지 않아도 좋다.
또한, 패킷 제어부(37)는 패킷 생성부(37a), 패킷 수신부(37b), 이상 검출부(37c)를 갖는다. 또한, PCIe 제어부(42)는 리퀘스트 생성부(42a), PCIe 버스 제어부(42b), 이상 검출부(42c)를 갖는다.
우선, 연산 처리부(30)가 갖는 노드 맵(34)에 대해서 설명한다. 노드 맵(34)은 물리 어드레스와, 물리 어드레스가 나타내는 기억 영역을 갖는 메모리와 접속된 CPU의 CPUID가 대응지어 등록되는 테이블이다. 이하, 노드 맵(34)에 등록되는 정보의 예를, 도면을 이용하여 설명한다.
도 5는 실시예 1에 따른 노드 맵의 데이터 구성의 일례를 설명하기 위한 도면이다. 도 5에 나타내는 예에서는, 노드 맵(34)은 「어드레스」, 「밸리드」, 「노드 ID」, 「CPUID」의 각 항목의 등록 내용을 대응지은 엔트리를 갖는다. 여기서, 각 엔트리의 「어드레스」 항목에는, 연속하는 복수의 물리 어드레스를 포함하는 어드레스 영역을 나타내는 정보가 저장된다.
예컨대, 정보 처리 시스템(1)은 모든 메모리에 대하여 배분된 물리 어드레스 공간을 균등한 크기의 어드레스 영역으로 분할하고, 각 어드레스 영역에 #0, #1, #2 등의 식별자를 부여한다. 그리고, 정보 처리 시스템(1)은 각 어드레스 영역을 나타내는 식별자를, 노드 맵(34)이 갖는 각 엔트리의 「어드레스」에 등록한다. 도 5의 예는 1번째 엔트리의 「어드레스」 항목에 #0의 식별자가 등록된 경우를 나타낸다. 또한, 도 5의 예는 2번째 엔트리의 「어드레스」 항목에 #1의 식별자가 등록된 경우를 나타낸다. 또한, 도 5의 예는 3번째 엔트리의 「어드레스」 항목에 #2의 식별자가 등록된 경우를 나타낸다.
또한, 각 엔트리의 「밸리드」 항목에는, 물리 어드레스가 나타내는 기억 영역에 액세스할 수 있는지의 여부를 나타내는 밸리드 비트가 등록된다. 예컨대, 물리 어드레스가 나타내는 기억 영역이 각 CPU에서 공유되는 공유 영역인 경우에는, 액세스를 할 수 있다는 취지의 밸리드 비트(예컨대, 「1」)가 등록된다. 도 5의 예는 1번째 엔트리의 「밸리드」 항목에 밸리드 비트 「1」이 등록된 경우를 나타낸다. 또한, 도 5의 예는 2번째 엔트리의 「밸리드」 항목에 밸리드 비트 「1」이 등록된 경우를 나타낸다. 또한, 도 5의 예는 3번째 엔트리의 「밸리드」 항목에 물리 어드레스가 나타내는 기억 영역에 액세스할 수 없는 것을 나타내는 밸리드 비트 「0」이 등록된 경우를 나타낸다.
또한, 각 엔트리의 「노드 ID」 항목에는, 물리 어드레스가 배분된 메모리가 존재하는 노드를 나타내는 식별자가 등록된다. 도 5의 예는 1번째 엔트리의 「노드 ID」 항목에 노드를 나타내는 식별자 「1」이 등록된 경우를 나타낸다. 또한, 도 5의 예는 2번째 엔트리의 「노드 ID」 항목에 노드를 나타내는 식별자 「1」이 등록된 경우를 나타낸다.
또한, 각 엔트리의 「CPUID」 항목에는, 물리 어드레스가 배분된 메모리와 접속된 CPU를 나타내는 식별자가 등록된다. 즉, 노드 맵(34)은 액세스 대상이 되는 물리 어드레스가 어떤 CPU와 접속된 메모리의 물리 어드레스인지를 나타낸다. 도 5의 예는 1번째 엔트리의 「CPUID」 항목에 CPU를 나타내는 식별자 「4」가 등록된 경우를 나타낸다. 또한, 도 5의 예는 2번째 엔트리의 「CPUID」 항목에 CPU를 나타내는 식별자 「5」가 등록된 경우를 나타낸다.
또한, 노드 맵(34)에는, 액세스 대상이 되는 물리 어드레스가 어떤 CPU와 접속된 물리 어드레스인지를 나타낼 수 있다면, 본 실시예 이외의 임의의 형식으로 정보를 등록하여도 좋다.
도 4로 되돌아가서, 연산부(31)는 연산 처리를 실행하고, OS(Operating System)나 애플리케이션을 실행하는 연산 장치의 코어이다. 또한, 연산부(31)는 데이터의 리드(판독)나, 라이트(기록)를 행하는 경우에는, 리드 대상 또는 라이트 대상이 되는 데이터가 저장된 기억 영역의 논리 어드레스(Virtual Address; VA)를 어드레스 변환부(35)에 출력한다.
L1 캐시(32)는 연산부(31)에서 빈번하게 이용되는 데이터를 일시적으로 기억하는 캐시 메모리이다. L2 캐시(33)는 L1 캐시(32)와 마찬가지로, 빈번하게 이용되는 데이터를 일시적으로 기억하지만, L1 캐시(32)보다 기억 용량이 크고, 데이터를 기록 및 판독하는 속도가 저속인 캐시 메모리이다. 여기서, 디렉터리 정보는 캐시 디렉터리 관리부(36)에 기억되어 있고, 메모리(22)의 각 기억 영역에 기억된 데이터를 캐시한 CPU나, 캐시된 데이터의 갱신 상황을 나타내는 정보이다. 또한, 이하의 설명에서는, 「디렉터리 정보」를 단순히 「디렉터리」라고 표기하는 경우가 있다. 이 디렉터리에 의한 캐시 메모리 관리 방법은 ccNUMA(Cache Coherent Non-Uniform Memory) 시스템에서 자주 이용되는 기술이지만, ccNUMA 기술, 디렉터리 기술 양쪽 모두 공지의 기술이기 때문에, 여기서는 자세하게 설명하지 않는다. 또한, 도 4에서는 디렉터리(36a)는 캐시 디렉터리 관리부(36)에 내장되어 있지만, 메모리(22)의 기억 영역의 일부에 디렉터리 정보를 기록하는 것도 가능하다.
어드레스 변환부(35)는 TLB(35a)를 갖는다. TLB(35a)에는, 논리 어드레스와 물리 어드레스를 대응지은 엔트리가 등록된다. 어드레스 변환부(35)는 TLB(35a)를 이용하여, 연산부(31)가 출력한 논리 어드레스를 물리 어드레스로 변환한다. 예컨대, 어드레스 변환부(35)는 연산부(31)로부터 취득된 논리 어드레스에 대응하는 물리 어드레스를 TLB(35a)로부터 검색하고, 검색 결과, 물리 어드레스를 얻을 수 있었던 경우에는, 얻어진 물리 어드레스를 캐시 디렉터리 관리부(36)에 출력한다. 또한, 어드레스 변환부(35)는 TLB 미스가 발생한 경우는, 트랩 처리를 실행한다. 여기서, OS 등의 시스템 소프트웨어는 TLB 미스가 발생한 물리 어드레스와 논리 어드레스의 쌍을 TLB(35a)에 등록한다. 단, 이러한 쌍의 등록이 금지된 물리 어드레스에 대해서는, TLB 미스가 발생한 경우라도, OS 등의 시스템 소프트웨어에 의해, 물리 어드레스와 논리 어드레스의 쌍이 TLB(35a)에 등록되지 않는다.
여기서, OS나 어드레스 변환부(35) 등은 연산부(31)가 실행하는 애플리케이션으로부터 공유 메모리에의 할당을 요구받은 경우에는, 다음과 같은 처리를 실행한다. 즉, TLB 미스가 발생한 경우, OS 등의 시스템 소프트웨어 등은 엔트리를 TLB(35a)에 등록한다. 또한, TLB 미스가 발생하지 않은 경우에는, 이미 엔트리가 TLB(35a)에 등록되어 있기 때문에, 어드레스 변환부(35)는 논리 어드레스로부터 물리 어드레스로의 변환을 행한다.
또한, 어드레스 변환부(35)나 OS는 애플리케이션이나 OS로부터 로컬 영역의 할당을 요구받은 경우는 다음과 같은 처리를 실행한다. 즉, TLB 미스가 발생한 경우, OS 등의 시스템 소프트웨어는 CPU(21) 전용의 로컬 영역에 액세스하기 위한 논리 어드레스와, 로컬 영역에 할당되는 범위의 물리 어드레스를 대응지은 엔트리를 TLB(35a)에 등록한다.
또한, OS 등은 이상이 발생한 노드의 공유 메모리의 물리 어드레스를 포함하는 엔트리를 TLB(35a)로부터 삭제한다.
캐시 디렉터리 관리부(36)는 디렉터리(36a)를 갖는다. 캐시 디렉터리 관리부(36)는 캐시 데이터 및 디렉터리를 관리한다. 캐시 디렉터리 관리부(36)는 어드레스 변환부(35)로부터, 연산부(31)가 출력한 논리 어드레스를 변환한 물리 어드레스를 취득한다.
그리고, 캐시 디렉터리 관리부(36)는 어드레스 변환부(35)로부터 물리 어드레스를 취득한 경우에는, 다음과 같은 처리를 실행한다. 즉, 캐시 디렉터리 관리부(36)는 디렉터리(36a)를 이용하여, 취득된 물리 어드레스에 저장된 데이터가 L1 캐시(32) 및 L2 캐시(33)에 캐시되어 있는지의 여부를 판정한다.
그리고, 캐시 디렉터리 관리부(36)는 취득된 물리 어드레스에 저장된 데이터가 캐시되어 있다고 판정한 경우에는, 캐시되어 있는 데이터를 연산부(31)에 출력한다. 또한, 캐시 디렉터리 관리부(36)는 취득된 물리 어드레스에 저장된 데이터가 L1 캐시(32) 및 L2 캐시(33)에 캐시되어 있지 않은 경우는 다음과 같은 처리를 실행한다. 우선, 캐시 디렉터리 관리부(36)는 노드 맵(34)을 참조하여, 취득된 물리 어드레스를 포함하는 범위의 엔트리를 식별한다. 그리고, 캐시 디렉터리 관리부(36)는 식별된 엔트리의 CPUID가 CPU(21)의 CPUID인지의 여부를 판정한다. 그 후, 캐시 디렉터리 관리부(36)는 식별된 엔트리의 CPUID가 CPU(21)의 CPUID인 경우는, 메모리 액세스부(41)에, 물리 어드레스를 출력한다.
또한, 캐시 디렉터리 관리부(36)는 식별된 엔트리의 CPUID가 CPU(21)의 CPUID가 아닌 경우에는, 다음과 같은 처리를 실행한다. 즉, 캐시 디렉터리 관리부(36)는 식별된 엔트리의 CPUID와 노드 ID를 취득한다. 그리고, 캐시 디렉터리 관리부(36)는 패킷 제어부(37)에 대하여, 취득된 CPUID와 물리 어드레스를 출력한다.
또한, 캐시 디렉터리 관리부(36)는 출력된 물리 어드레스가 나타내는 기억 영역에 저장되어 있는 데이터를 메모리 액세스부(41)나 패킷 제어부(37)로부터 취득한 경우에는, 취득된 데이터를 L1 캐시(32) 및 L2 캐시(33)에 저장한다. 그리고, 캐시 디렉터리 관리부(36)는 L1 캐시(32)에 캐시시킨 데이터를 연산부(31)에 출력한다.
또한, 캐시 디렉터리 관리부(36)는 패킷 제어부(37)로부터 물리 어드레스를 취득한 경우, 즉 다른 CPU나 I/O 장치로부터의 메모리 액세스의 리퀘스트 대상이 되는 물리 어드레스를 취득한 경우에는, 다음과 같은 처리를 실행한다. 즉, 캐시 디렉터리 관리부(36)는 노드 맵(34)을 참조하여, 취득된 물리 어드레스가 로컬 영역에 배분된 물리 어드레스인지의 여부를 판정한다.
취득된 물리 어드레스가 로컬 영역에 배분된 물리 어드레스인 경우에는, 캐시 디렉터리 관리부(36)는 패킷 제어부(37)에 대하여, 리퀘스트원에 부정 응답(액세스 에러)을 송신하도록 지시한다.
또한, 취득된 물리 어드레스가 공유 영역에 배분된 물리 어드레스인 경우에는, 캐시 디렉터리 관리부(36)는 취득된 물리 어드레스가 나타내는 기억 영역에 기억된 데이터를 취득하고, 취득된 데이터를 패킷 제어부(37)에 출력하며, 리퀘스트원에 송신하도록 지시한다.
또한, 캐시 디렉터리 관리부(36)는 디렉터리 방식을 이용하여, 캐시된 데이터의 코히런시를 유지하는 처리를 아울러 실행한다. 예컨대, 캐시 디렉터리 관리부(36)는 메모리(22)에 저장된 데이터를 리퀘스트 송신원의 CPU에 송신시키는 경우에는, 그 데이터가 리퀘스트 송신원의 CPU 이외의 다른 CPU가 캐시하고 있는지의 여부를 판정한다.
그리고, 캐시 디렉터리 관리부(36)는 리퀘스트의 대상이 되는 데이터를 다른 CPU가 캐시하지 않는 경우는, L1 캐시(32), L2 캐시(33), 메모리(22)로부터 리퀘스트의 대상이 되는 데이터를 취득한다. 그 후, 캐시 디렉터리 관리부(36)는 취득된 데이터를 패킷 제어부(37)에 출력한다.
한편, 캐시 디렉터리 관리부(36)는 리퀘스트의 대상이 되는 데이터를 다른 CPU가 캐시하고 있는 경우는, 일리노이 프로토콜(Illinois protocol) 등의 방법을 이용하여, 캐시 코히런스를 유지하기 위한 처리를 실행한다. 예컨대, 캐시 디렉터리 관리부(36)는 캐시된 데이터의 상태가 MESI(Modified/Exclusive/Shared/Invalid) 중 어느 것인지를 판정한다.
그리고, 캐시 디렉터리 관리부(36)는 판정 결과에 따라, 다른 CPU가 갖는 캐시 디렉터리 관리부와 코히런시를 유지하기 위한 리퀘스트나 오더(명령)를 송수신하고, 캐시된 데이터의 상태에 따른 처리를 실행한다. 여기서, 「Modified」란, 어느 하나의 CPU가 데이터를 캐시하고 있고, 또한, 캐시된 데이터가 갱신되어 있는 상태를 나타낸다. 또한, 캐시된 데이터의 상태가 「Modified」인 경우에는 라이트백을 실행할 필요가 있다.
또한, 「Exclusive」란, 어느 하나의 CPU가 데이터를 캐시하고 있고, 또한, 캐시된 데이터가 갱신되어 있지 않은 상태를 나타낸다. 또한, 「Shared」란, 복수의 CPU가 데이터를 캐시하고 있고, 또한, 캐시된 데이터가 갱신되어 있지 않은 것을 나타낸다. 또한, 「Invalid」란, 캐시의 스테이터스가 등록되어 있지 않은 것을 나타낸다.
상세한 예를 들면, 캐시 디렉터리 관리부(36)는 스테이터스가 M(Modified)인 데이터를 캐시한 CPU에 대하여 라이트백을 지시하는 오더를 송신하도록 패킷 생성부(37a)에 지시한다. 그리고, 캐시 디렉터리 관리부(36)는 데이터의 스테이터스를 갱신하고, 갱신 후의 스테이터스에 따른 처리를 실행한다. 또한, 캐시 디렉터리 관리부(36)가 송수신하는 리퀘스트나 오더의 종별에 대해서는, 후술한다.
또한, 캐시 디렉터리 관리부(36)는 노드 사이의 데이터 전송의 이상이 검출된 경우에, 이상 발생의 원인이 된 노드에 의해, 메모리(22)의 공유 메모리에 라이트백되는 캐시 데이터가 라이트백되지 않을 때에는, 다음 처리를 실행한다. 즉, 캐시 디렉터리 관리부(36)는 다운된 노드에 의해, 메모리(22)의 공유 메모리에 라이트백되는 캐시 데이터가 라이트백되지 않은 이상을 나타내는 값을 디렉터리(36a)의 정해진 영역에 기록한다.
도 6은 디렉터리의 데이터 구성의 일례를 설명하기 위한 도면이다. 도 6에 나타내는 바와 같이, 디렉터리(36a)는 0 비트째부터 3 비트째까지의 4 비트의 「UE」 항목을 갖는다. 또한, 디렉터리(36a)는 4 비트째부터 66 비트째까지의 63 비트의 「PRC」 항목을 갖는다. 또한, 디렉터리(36a)는 67 비트째부터 68 비트째까지의 2 비트의 「CKBIT」 항목을 갖는다. 「CKBIT」 항목에는, 캐시의 상태를 코드화한 데이터가 등록된다. 「PRC」 항목에는, 캐시를 유지하고 있는 CPU의 위치를 비트 맵으로 나타낸 데이터가 등록된다. 「UE」 항목에는, 디렉터리의 이상과 이상의 원인을 나타낸 데이터가 등록된다.
여기서, 도 6의 예에 나타내는 디렉터리(36a)를 캐시 디렉터리 관리부(36)가 갖는 경우에 대해서 설명한다. 이 경우에, 이상이 검출되고, 이상 발생의 원인이 된 노드에 의해, 메모리(22)의 공유 메모리에 라이트백되는 캐시 데이터가 라이트백되지 않을 때에는, 캐시 디렉터리 관리부(36)는 다음 처리를 실행한다. 즉, 캐시 디렉터리 관리부(36)는 다운된 노드에 의해, 메모리(22)의 공유 메모리에 라이트백되는 캐시 데이터가 라이트백되지 않은 이상과, 원인을 나타내는 4 비트 이하의 값을 디렉터리(36a)의 「UE」 항목에 기록한다. 이에 의해, 라이트백되지 않은 공유 메모리의 데이터가 정상이 아닌 것을 나타낼 수 있다.
또한, 캐시 디렉터리 관리부(36)는 노드 사이의 데이터 전송의 이상이 검출되고, 이상 발생의 원인이 된 노드에 의해, 메모리(22)의 공유 메모리에 라이트백되는 캐시 데이터가 라이트백되지 않는 경우에는, 다음 처리를 행할 수도 있다. 즉, 캐시 디렉터리 관리부(36)는 다운된 노드에 의해 캐시 데이터가 라이트백되는 메모리(22)의 공유 메모리의 영역에, 에러 상태를 나타내는 데이터를 기록할 수도 있다. 여기서, 공유 메모리의 영역에 기록되는 에러 상태를 나타내는 데이터의 일례에 대해서 설명한다. 예컨대, 메모리(22)에 기억되는 데이터에, 정해진 비트수마다, ECC(Error Check and Correct) 데이터가 포함되어 있는 경우에, ECC의 생성 다항식에 따라서는, 2 비트 이상의 오류를 정정할 수 있다. 이 경우에, 다른 에러와 비교하여 발생 가능성이 낮은 n(n≥2) 비트 이상의 에러를 나타내는 특정 값의 신드롬을, 공유 메모리의 영역에 기록되는 에러 상태를 나타내는 데이터로 할 수 있다. 또한, 데이터 본체에 기록한 경우에, 신드롬이 특정 값이 되는 값을, 공유 메모리의 영역에 기록되는 에러 상태를 나타내는 데이터로 할 수 있다. 이에 의해, 라이트백되지 않은 공유 메모리의 데이터가 정상이 아닌 것을 나타낼 수 있다.
또한, 캐시 디렉터리 관리부(36)는 메모리(22)의 공유 메모리에 대한 리커버리 처리를 실행한다. 리커버리 처리의 일례로서는, 공유 메모리에 라이트백되는 캐시 데이터가 라이트백되지 않은 이상을 나타내는 값을, 디렉터리(36a)로부터 클리어하는 처리를 들 수 있다. 또한, 리커버리 처리의 다른 일례로서는, 에러 상태를 나타내는 데이터를, 공유 메모리로부터 클리어하는 처리를 들 수 있다. 이 리커버리 처리는 후술하는 대로, OS나 애플리케이션 소프트웨어의 지시에 따라 행해진다.
패킷 생성부(37a)는 캐시 디렉터리 관리부(36)로부터 물리 어드레스와, CPUID를 취득한 경우에는, 취득된 물리 어드레스와, CPUID를 저장한 패킷, 즉 메모리 액세스의 리퀘스트가 되는 패킷을 생성한다. 그리고, 패킷 생성부(37a)는 생성된 패킷을 라우터(40)에 송신한다.
도 7은 실시예 1에 따른 CPU가 송신하는 패킷을 설명하기 위한 도면이다. 도 7에 나타내는 예에서는, 패킷 생성부(37a)는 CPUID와, 물리 어드레스와, 리퀘스트의 내용을 나타내는 데이터를 포함하는 리퀘스트를 생성하고, 생성된 리퀘스트를 라우터(40)에 출력한다. 이러한 경우에는, 라우터(40)는 패킷 생성부(37a)가 생성한 리퀘스트를, XB 접속부(27)를 통해 XB(2)에 출력한다. 그렇게 하면, XB(2)는 리퀘스트에 포함되는 CPUID가 나타내는 CPU에 리퀘스트를 전송한다.
또한, 패킷 생성부(37a)는 캐시 디렉터리 관리부(36)로부터 코히런시를 유지하기 위한 리퀘스트나 오더 발행 지시를 접수한 경우에는, 지시된 리퀘스트나 오더를 생성한다. 그리고, 패킷 생성부(37a)는 생성된 리퀘스트나 오더를 라우터(40), XB 접속부(27), XB(2)를 통해, 지시된 CPU에 송신한다. 또한, 패킷 생성부(37a)는 I/O 장치로부터 데이터를 취득하는 경우는, I/O에 대한 액세스 요구를 라우터(40)에 출력한다.
또한, 패킷 생성부(37a)는 리퀘스트를 송신하면, 리퀘스트를 송신한 것을 나타내는 데이터를 이상 검출부(37c)에 출력한다. 이 데이터에는, 송신된 리퀘스트의 종류, 액세스 대상 메모리의 물리 어드레스 등 리퀘스트에 관한 정보가 포함되어 있다.
패킷 수신부(37b)는 XB(2), XB 접속부(27), 라우터(40)를 통해, 다른 CPU나 자(自)노드 이외의 다른 I/O 장치가 출력한 패킷을 수신하면, 수신된 패킷에 포함되는 물리 어드레스를 취득한다. 그리고, 패킷 수신부(37b)는 취득된 물리 어드레스를 캐시 디렉터리 관리부(36)에 출력한다. 또한, 패킷 수신부(37b)는 다른 CPU가 송신한 데이터를 수신한 경우에는, 수신된 데이터를 캐시 디렉터리 관리부(36)에 출력한다.
또한, 패킷 수신부(37b)는 코히런시를 유지하기 위한 리퀘스트나 오더를 수신한 경우에는, 수신된 리퀘스트나 오더를 캐시 디렉터리 관리부(36)에 출력한다. 또한, 패킷 수신부(37b)는 I/O 장치에 대한 액세스 요구의 응답이나 데이터를 라우터(40)로부터 수신한 경우는, 수신된 응답이나 데이터를 캐시 디렉터리 관리부(36)에 출력한다. 이러한 경우에는, 캐시 디렉터리 관리부(36)는, 예컨대 취득된 데이터를 메모리 액세스부(41)에 출력하여, 메모리(22)에 저장하는 처리를 실행한다.
또한, 패킷 수신부(37b)는 패킷 생성부(37a)에 의해 송신된 리퀘스트에 대응하는 리스폰스를 수신하면, 리스폰스를 수신한 것을 나타내는 데이터를 이상 검출부(37c)에 출력한다. 이 데이터에는, 수신된 리스폰스의 종류 등 리스폰스에 관한 정보가 포함되어 있다.
이상 검출부(37c)는 포인터(80), 타이머(81), 송신 패킷(82), PA(83), 리퀘스트(84), 검출부(85)를 갖는다.
이상 검출부(37c)는 패킷 생성부(37a)로부터 리퀘스트를 송신한 것을 나타내는 데이터를 수신할 때마다, 시간을 계측하기 위한 타이머(81)를 기동시킨다. 또한, 이상 검출부(37c)는 패킷 수신부(37b)로부터 리스폰스를 수신한 것을 나타내는 데이터를 수신할 때마다, 타이머(81)를 기동시킨다. 또한, 이상 검출부(37c)는 패킷 생성부(37a)로부터 리퀘스트를 송신한 것을 나타내는 데이터를 수신하면, 수신된 데이터로부터, 송신된 리퀘스트에 포함되는 액세스 대상 메모리의 물리 어드레스를 PA(83)에 기억시킨다. 또한, 이상 검출부(37c)는 패킷 생성부(37a)로부터 리퀘스트를 송신한 것을 나타내는 데이터를 수신하면, 수신된 데이터로부터, 송신된 리퀘스트를 리퀘스트(84)에 기억시킨다.
또한, 이상 검출부(37c)는 패킷 생성부(37a)로부터 리퀘스트를 송신한 것을 나타내는 데이터를 수신하면, 수신된 데이터로부터, 송신된 리퀘스트의 식별자를 송신 패킷(82)에 등록한다.
또한, 이상 검출부(37c)는 패킷 수신부(37b)로부터 리스폰스를 수신한 것을 나타내는 데이터를 수신하면, 수신된 데이터로부터, 수신된 리스폰스에 대응하는 리퀘스트에 포함되는 액세스 대상 메모리의 물리 어드레스를 PA(83)로부터 삭제한다. 또한, 이상 검출부(37c)는 패킷 수신부(37b)로부터 리스폰스를 수신한 것을 나타내는 데이터를 수신하면, 수신된 데이터로부터, 수신된 리스폰스에 대응하는 리퀘스트를 리퀘스트(84)로부터 삭제한다. 또한, 이상 검출부(37c)는 패킷 수신부(37b)로부터 리스폰스를 수신한 것을 나타내는 데이터를 수신하면, 수신된 데이터로부터, 수신된 리스폰스에 대응하는 리퀘스트의 식별자를 송신 패킷(82)으로부터 삭제한다. 도 8은 송신 패킷의 일례를 나타내는 도면이다. 예컨대, 리스폰스가 반환되지 않은 리퀘스트의 수가 N개인 경우에는, 도 8의 예에 나타내는 송신 패킷(82)에는, 패킷 1 관리용 엔트리로부터 패킷 N 관리용 엔트리까지의 각 엔트리에, N개의 리퀘스트의 식별자의 각각이 등록된다.
또한, 포인터(80)는 송신 패킷(82)에 등록된 각 식별자가 나타내는 각 리퀘스트 중, 송신 시각이 가장 오래된 리퀘스트를 가리킨다. 예컨대, 도 8의 예에서는, 포인터(80)는 패킷 1 관리용 엔트리에 등록된 식별자가 나타내는 리퀘스트를 가리킨다.
검출부(85)는 타이머(81)의 시간이 정해진 시간을 경과하였는지의 여부를 판정한다. 정해진 시간을 경과한 경우에는, 검출부(85)는 포인터(80)가 가리키는 리퀘스트에 대응하는 리스폰스를 정해진 시간 이내에 수신하지 못했기 때문에, 노드(20)와, 액세스 대상 메모리를 갖는 노드 사이에서 데이터 전송의 이상이 발생한 것을 검출한다. 그리고, 검출부(85)는 포인터(80)가 가리키는 리퀘스트에 포함되는 액세스 대상 메모리의 물리 어드레스를 PA(83)로부터 취득하고, 취득된 물리 어드레스를, 에러 발생 어드레스 레지스터(96)에 기록한다.
트랩 발생부(97)는 에러 발생 어드레스 레지스터(96)에 물리 어드레스가 기록되면, 트랩을 발생시킨다. 또한, 리퀘스트/오더가 「데이터의 메모리에의 스토어(저장)」, 또는 「캐시의 리플레이스에 의한 라이트백」인 경우는 트랩을 발생시키지 않고, 전술한 이상을 나타내는 데이터를 기록하고, 데이터의 CPU에의 로드 시에 이상을 검출하는 것으로 하여도 좋다. 여기서, 전술한 「이상을 나타내는 데이터의 기록」이란, 이상과, 원인을 나타내는 4 비트 이하의 값을 디렉터리(36a)의 「UE」 항목에 기록하는 것이나, 메모리(22)의 공유 메모리의 영역에, 에러 상태를 나타내는 데이터를 기록하는 것을 가리킨다.
이와 같이, 이상 검출부(37c)에서는, 하나의 타이머로 시간을 계측하기 때문에, 리퀘스트마다 타이머를 마련하는 경우와 비교하여, 리스폰스가 반환되지 않은 리퀘스트의 수가 복수인 경우에는, 적은 수의 타이머로 시간을 계측할 수 있다.
또한, 이상 검출부(37c)의 구성은 전술한 구성에 한정되지 않는다. 예컨대, 이상 검출부(37c)의 송신 패킷(82)에는, 리퀘스트의 식별자에 더하여, 리퀘스트의 송신 시각의 차(인터벌)를 등록하고, 타이머(81)가 인터벌을 가미하여 재기동을 행하도록 하여도 좋다.
도 9는 이상 검출부의 다른 구성의 일례를 나타내는 도면이다. 도 9의 예에서는, 송신 패킷(82)에, 전술한 패킷 K(K는 자연수) 관리용 엔트리에 더하여, 어떤 리퀘스트가 송신되고 나서, 다른 리퀘스트가 송신되기까지의 시간이 등록된다. 여기서, 리퀘스트 1이 송신되고 나서 100 ㎱ 후에, 리퀘스트 2가 송신되고, 리퀘스트 1이 송신되고 나서 300 ㎱ 후에, 리퀘스트 3이 송신된 경우에 대해서 설명한다. 이 경우, 리퀘스트 1∼3의 각각의 식별자가 패킷 1 관리용 엔트리∼패킷 3 관리용 엔트리에 등록된다. 이때, 리퀘스트 1을 기준으로 하면, 인터벌 1에는 0 ㎱, 인터벌 2에는 100 ㎱, 인터벌 3에는 300 ㎱가 등록된다. 여기서, 리퀘스트 1에 대응하는 리스폰스를 패킷 수신부(37b)가 수신하였기 때문에, 포인터(80)가 가리키는 리퀘스트가 리퀘스트 1로부터 리퀘스트 2로 전환되었다고 한다. 이때, 타이머(81)는 재기동되지만, 시간의 초기값이 0 ㎱가 아니라, 리퀘스트 2에 대응하는 인터벌 100 ㎱부터 시간 계측을 개시한다. 또한, 포인터(80)가 가리키는 리퀘스트가 리퀘스트 2로부터 리퀘스트 3으로 전환된 경우에는, 마찬가지로, 타이머(81)는 리퀘스트 3에 대응하는 인터벌 300 ㎱부터 시간 계측을 개시한다. 또한, 모든 송출이 끝난 리퀘스트에 대하여 리스폰스를 수신한 경우는, 다음에 송출하는 리퀘스트의 인터벌은 재차 0 ㎱가 된다.
이와 같이, 다른 예의 이상 검출부(37c)에서는, 하나의 타이머(81)로 시간을 계측하기 때문에, 보다 적은 수의 타이머로 정밀도 좋게 시간을 계측할 수 있다. 또한, 다른 예의 이상 검출부(37c)에서는, 타이머(81)가 리퀘스트마다 인터벌을 고려하여 시간을 계측하기 때문에, 보다 정밀도가 높은 시간을 계측할 수 있다.
또한, 이상 검출부(37c)에서는, 포인터(80)를 마련하지 않고, 리퀘스트마다 타이머를 마련하여, 각 타이머가 리퀘스트가 송신되고 나서부터의 시간을 계측할 수도 있다.
라우터(40)는 패킷 제어부(37)가 갖는 패킷 생성부(37a)가 출력한 패킷을 수신한 경우에는, 수신된 리퀘스트를 XB 접속부(27)에 출력한다. 또한, 라우터(40)는 XB 접속부(27)를 통해, 다른 CPU가 송신한 패킷이나 데이터를 패킷 수신부(37b)에 출력한다. 또한, 라우터(40)는 패킷 제어부(37)가 I/O 장치 등에 대하여 출력한 패킷을 PCIe 제어부(42)에 출력한다. 또한, 라우터(40)는 I/O 장치로부터의 리퀘스트 등을 PCIe 제어부(42)로부터 수신한 경우에는, 수신된 리퀘스트 등을 패킷 제어부(37)에 출력한다. 또한, 라우터(40)는 I/O 장치로부터의 리퀘스트를 PCIe 제어부(42)로부터 수신한 경우에는, 수신된 리퀘스트를 XB 접속부(27)에 출력한다. 또한, 라우터(40)는 XB 접속부(27)를 통해, I/O 장치에의 리스폰스를 수신한 경우에는, 수신된 리스폰스를 PCIe 제어부(42b)에 출력한다.
메모리 액세스부(41)는, 소위 MAC(Memory Access Controller)이며, 메모리(22)에 대한 액세스를 제어한다. 예컨대, 메모리 액세스부(41)는 캐시 디렉터리 관리부(36)로부터 물리 어드레스를 수신한 경우에는, 수신된 물리 어드레스가 나타내는 메모리(22)의 영역에 저장된 데이터를 취득하고, 취득된 데이터를 캐시 디렉터리 관리부(36)에 출력한다. 또한, 메모리 액세스부(41)는 메모리 미러 기능을 이용하여, 공유 영역을 용장화(冗長化)하여도 좋다.
리퀘스트 생성부(42a)는 라우터(40)를 통해 I/O 장치에 대한 액세스 요구를 취득한 경우에는, 액세스 요구의 대상이 되는 I/O 장치에 송신하는 리퀘스트를 생성하고, 생성된 리퀘스트를 PCIe 버스 제어부(42b)에 출력한다. 또한, 리퀘스트 생성부(42a)는 I/O 장치로부터 물리 어드레스와, CPUID를 취득한 경우에는, 취득된 물리 어드레스와, CPUID를 저장한 패킷, 즉 메모리 액세스의 리퀘스트가 되는 패킷을 생성한다. 이러한 리퀘스트의 종류로서는, I/O 장치가 다른 CPU에 접속된 메모리를 리드하기 위한 리퀘스트를 들 수 있다. 또한, 리퀘스트 생성부(42a)는 I/O 장치로부터 물리 어드레스와, CPUID와, 기록 데이터를 취득한 경우에는, 취득된 물리 어드레스와, CPUID와, 기록 데이터를 저장한 패킷, 즉 메모리 액세스의 리퀘스트가 되는 패킷을 생성한다. 이러한 리퀘스트의 종류로서는, I/O 장치가 다른 CPU에 접속된 메모리에 데이터를 라이트하기 위한 리퀘스트를 들 수 있다. 그리고, 리퀘스트 생성부(42a)는 생성된 패킷을 라우터(40)에 송신한다.
또한, 리퀘스트 생성부(42a)는 에러 발생 어드레스 레지스터(98), 트랩 발생부(99)를 갖는다.
PCIe 버스 제어부(42b)는 리퀘스트 생성부(42a)가 생성한 리퀘스트를 취득한 경우에는, PCIe 접속부(28)를 통해, I/O 장치에 리퀘스트를 송신한다. 또한, PCIe 버스 제어부(42b)는 PCIe 접속부(28)를 통해, I/O 장치로부터 물리 어드레스와, CPUID를 취득한 경우에는, 리퀘스트 생성부(42a)에, 취득된 물리 어드레스와, CPUID를 송신한다. 또한, PCIe 버스 제어부(42b)는 PCIe 접속부(28)를 통해, I/O 장치로부터 물리 어드레스와, CPUID와, 기록 데이터를 취득한 경우에는, 리퀘스트 생성부(42a)에, 취득된 물리 어드레스와, CPUID와, 기록 데이터를 송신한다.
또한, PCIe 버스 제어부(42b)는 I/O 장치가 다른 CPU에 접속된 메모리를 리드하기 위한 리퀘스트에 대응하는 리스폰스가, 리퀘스트가 송신되고 나서 정해진 시간 이내에 수신되지 않기 때문에, 이상이 검출된 경우에는, 다음과 같은 처리를 실행한다. 즉, PCIe 버스 제어부(42b)는 「poisoned TLP」 패킷을 PCIe 접속부(28)에 송신한다. 이 경우, PCIe 접속부(28)는 「poisoned TLP」 패킷을 수신하면, 수신된 「poisoned TLP」 패킷을 I/O 장치에 송신한다. 이에 의해, I/O 장치에서는, 이상이 발생되어 있는 것을 검출할 수 있다. 또한, PCIe 접속부(28)는 이상이 발생되어 있는 것을 검출하면, 디바이스 드라이버 소프트웨어에 이상이 발생한 것을 통지하기 때문에, 리커버리 처리가 행해진다. 리커버리 처리의 일례로서는, LAN에 이상이 발생한 경우에는, 처리 중인 송수신 데이터를 일단 파기하고, LAN 칩의 상태를 초기화하며, 초기화 후에는, 통상대로 데이터를 송수신하는 처리를 들 수 있다.
도 10을 참조하여, 「poisoned TLP」에 대해서 설명한다. 도 10은 「TLP header」의 데이터 구성의 일례를 나타내는 도면이다. 「poisoned TLP」란, 「PCI express」의 사양에 따라 규정되어 있는 패킷이다. 도 10의 예에 나타내는 「TLP header」의 EP 비트가 온인 경우에, 「poisoned TLP」라고 인식된다.
도 11은 「poisoned TLP」 패킷을 수신한 PCIe 제어부의 동작의 구체예를 설명하기 위한 도면이다. 도 11의 예는 PCIe 제어부(42)가 「Root Complex」에 대응하며, PCIe 접속부(28)가 「PCI express」 카드에 대응하는 경우의 디바이스 드라이버의 계층 구조를 나타낸다. 이 일례에서는, 「PCI express」 카드로서 SAS의 「PCI express」 카드가 탑재되어 있는 경우를 나타내고 있다. 「PCI express」의 버스 상의 「poisoned TLP」의 발생 등의 이벤트 검출이나 버스 상에서의 대처는 「PCI express」 카드의 종별에 상관없이 공통이다. 그 때문에, 이러한 이벤트의 검출이나 버스 상에서의 대처는 SAS 디바이스 드라이버 등의 개별 디바이스 드라이버에서는 행해지지 않고, 「Root Complex」 드라이버에서 행해진다.
한편, 버스에서 어떠한 이벤트, 예컨대 에러계의 이벤트가 발생한 경우, 에러가 발생한 버스 상에서 동작하고 있었던 SAS 디바이스 드라이버측에서, SAS 디바이스 드라이버 고유의 회복 처리가 행해지는 경우가 많다. 여기서, SAS 디바이스 드라이버 고유의 회복 처리의 일례로서는, 처리 중인 송신 처리의 종료 처리 또는 리트라이 등을 들 수 있다. 「poisoned TLP」가 발생한 경우, 「Root Complex」 드라이버는 에러 사상을 제거(상세 정보의 리드, 스테이터스 비트의 클리어 등)한 후에, 버스 상의 SAS 디바이스 드라이버에 에러 발생을 통지한다. 이 통지에 의해, SAS 디바이스 드라이버는 SAS 디바이스 드라이버 고유의 리커버리 처리를 개시한다. 또한, SAS 디바이스 드라이버에 에러 발생을 통지하지 않고, I/O 장치를 사용하고 있는 애플리케이션 프로세스에 에러 발생을 통지하여, 애플리케이션 프로세스로부터 I/O 장치의 재기동 처리를 행하도록 하여도 좋다.
또한, PCIe 버스 제어부(42b)는 I/O 장치가 다른 CPU에 접속된 메모리에 데이터를 라이트하기 위한 리퀘스트에 대응하는 리스폰스가, 리퀘스트가 송신되고 나서 정해진 시간 이내에 수신되지 않기 때문에, 이상이 검출된 경우에는, 다음과 같은 처리를 실행한다. 즉, PCIe 버스 제어부(42b)는 이상 검출 후, 이상에 따른 PCIe 접속부(28)로부터 수신하는 「메모리에 데이터를 라이트하기 위한 리퀘스트」를 폐기한다. 그리고, 후술하는 바와 같이, 에러 발생 어드레스 레지스터(98)에 에러 발생 어드레스를 설정하고, 트랩 발생부(97)를 사용하여 트랩을 발생시킨다. 이 트랩에 의해 디바이스 드라이버 소프트웨어에 이상이 발생한 것이 통지되기 때문에, 리커버리 처리가 행해진다. 리커버리 처리의 일례로서는, LAN에 이상이 발생한 경우에는, 처리 중인 송수신 데이터를 일단 파기하고, LAN 칩의 상태를 초기화하며, 초기화 후에는, 통상대로 데이터를 송수신하는 처리를 들 수 있다.
이상 검출부(42c)는 포인터(90)와, 타이머(91)와, 송신 패킷(92)과, PA(93)와, 리퀘스트(94)와, 검출부(95)를 갖는다. 포인터(90), 타이머(91), 송신 패킷(92), PA(93), 리퀘스트(94), 검출부(95)의 각각은 상기에서 설명한 포인터(80), 타이머(81), 송신 패킷(82), PA(83), 리퀘스트(84), 검출부(85)와 동일하다. 또한, 에러 발생 어드레스 레지스터(98), 트랩 발생부(99)는 상기에서 설명한 에러 발생 어드레스 레지스터(96), 트랩 발생부(97)와 동일하다. 즉, 이상 검출부(37c)는 패킷 제어부(37)에 의해 리퀘스트가 송신되고 나서 리스폰스를 수신하기 전에 정해진 시간이 경과한 경우에, 노드 사이의 데이터 전송 이상을 검출한다. 이상 검출부(42c)는 상기 이상 검출부(37c)와 마찬가지로, 리퀘스트 생성부(42a)로부터 라우터(40)를 통해, 다른 CPU에 송신되는 리드 리퀘스트, 라이트 리퀘스트에 대해서, 노드 사이의 데이터 전송 이상을 검출한다. 그리고, 이상을 검출한 경우에는, 상기 이상 검출부(37c)의 검출부(85)와 마찬가지로, 검출부(95)는 포인터(90)가 가리키는 리퀘스트에 포함되는 액세스 대상 메모리의 물리 어드레스를 PA(93)로부터 취득하고, 취득된 물리 어드레스를 에러 발생 어드레스 레지스터(98)에 기록한다.
트랩 발생부(99)는 에러 발생 어드레스 레지스터(98)에 물리 어드레스가 기록되면, 트랩을 발생시킨다.
다음에, 도 12를 이용하여, CPU(21)가 다른 CPU에 대하여 리퀘스트를 송신하는 처리의 일례에 대해서 설명한다. 도 12는 실시예 1에 따른 CPU가 리퀘스트를 송신하는 처리의 일례를 설명하기 위한 도면이다. 예컨대, 도 12 중 (A)에 나타내는 바와 같이, 서비스 프로세서(24)로부터 노드 맵(34)에 대하여, 물리 어드레스가 배분되는 메모리에 액세스하는 CPU의 CPUID와 물리 어드레스를 대응지은 엔트리의 설정이 행해진다.
또한, 연산부(31)는 연산 처리를 실행하고, 도 12 중 (B)에 나타내는 바와 같이, 액세스 대상이 되는 논리 어드레스를 어드레스 변환부(35)에 출력한다. 그렇게 하면, 어드레스 변환부(35)는 논리 어드레스를 물리 어드레스로 변환하고, 변환된 물리 어드레스를 도 12 중 (C)에 나타내는 바와 같이, 캐시 디렉터리 관리부(36)에 출력한다.
여기서, 캐시 디렉터리 관리부(36)는 어드레스 변환부(35)로부터 물리 어드레스를 취득하면, 도 12 중 (D)에 나타내는 바와 같이, 노드 맵(34)을 참조하여, 취득된 물리 어드레스와 대응지어진 CPUID를 취득한다. 그리고, 캐시 디렉터리 관리부(36)는 취득된 CPUID가 CPU(21)의 CPUID가 아닌 경우에는, 도 12 중 (E)에 나타내는 바와 같이, 취득된 CPUID와 물리 어드레스를 패킷 제어부(37)에 출력한다.
이러한 경우에는, 패킷 생성부(37a)는 캐시 디렉터리 관리부(36)로부터 취득된 물리 어드레스와 CPUID를 저장한 패킷을 생성하고, 도 12 중 (F)에 나타내는 바와 같이, 생성된 패킷을 라우터(40)에 출력한다. 또한, 패킷 생성부(37a)는 도 12 중 (G)에 나타내는 바와 같이, 리퀘스트인 패킷을 송신한 것을 나타내는 데이터를 이상 검출부(37c)에 출력한다. 계속해서, 도 12 중 (H)에 나타내는 바와 같이, 라우터(40)는 패킷 생성부(37a)로부터 취득된 패킷을 XB 접속부(27)에 출력한다. 그 후, 도 12 중 (I)에 나타내는 바와 같이, XB 접속부(27)는 취득된 패킷을 XB(2)에 출력한다. 그렇게 하면, XB(2)는 패킷에 저장된 CPUID가 나타내는 CPU에 패킷을 전달하게 된다.
다음에, 도 13을 이용하여, CPU(21)가 다른 CPU로부터 패킷을 수신하였을 때에 실행하는 처리의 일례에 대해서 설명한다. 도 13은 실시예 1에 따른 CPU가 패킷을 수신하였을 때에 실행하는 처리의 일례를 설명하기 위한 도면이다. 예컨대, 도 13 중 (J)에 나타내는 바와 같이 패킷 수신부(37b)는 다른 CPU로부터 CPU(21)의 CPUID와 메모리(22)에 배분된 물리 어드레스가 저장된 패킷이나, 리스폰스의 패킷을 수신한다.
이러한 경우에는, 패킷 수신부(37b)는 수신된 패킷이 리스폰스의 패킷인 경우에는, 도 13 중 (K)에 나타내는 바와 같이, 리스폰스인 패킷을 수신한 것을 나타내는 데이터를 이상 검출부(37c)에 출력한다. 그리고, 패킷 수신부(37b)는 수신된 패킷으로부터 물리 어드레스를 취득하고, 도 13 중 (L)에 나타내는 바와 같이, 취득된 물리 어드레스를 캐시 디렉터리 관리부(36)에 출력한다. 그렇게 하면, 캐시 디렉터리 관리부(36)는 물리 어드레스가 나타내는 기억 영역이 공유 영역인지 로컬 영역인지를 판별한다.
그리고, 공유 영역에 대한 액세스인 경우에는, 캐시 디렉터리 관리부(36)는 도 13 중 (M)에 나타내는 바와 같이, 물리 어드레스가 나타내는 기억 영역의 데이터가 L1 캐시(32) 및 L2 캐시(33)에 캐시되어 있는지를 판별한다.
또한, 캐시 디렉터리 관리부(36)는 데이터가 캐시되어 있지 않다고 판별한 경우에는, 도 13 중 (N)에 나타내는 바와 같이, 물리 어드레스를 메모리 액세스부(41)에 출력한다. 그렇게 하면, 도 13 중 (O)에 나타내는 바와 같이, 메모리 액세스부(41)는 메모리(22)로부터 물리 어드레스가 나타내는 기억 영역의 데이터를 취득하여, 캐시 디렉터리 관리부(36)에 출력한다.
그리고, 캐시 디렉터리 관리부(36)는 L1 캐시(32), L2 캐시(33), 또는 메모리 액세스부(41)로부터 데이터를 취득한 경우에는, 취득된 데이터를 패킷 제어부(37)에 출력하여, 리퀘스트원의 CPU에 송신하도록 지시한다.
다음에, 도 14를 이용하여, I/O 장치가 CPU(21) 이외의 CPU에 대하여 리드나 라이트 리퀘스트를 송신하는 처리의 일례에 대해서 설명한다. 도 14는 실시예 1에 따른 I/O 장치가 리퀘스트를 송신하는 처리의 일례를 설명하기 위한 도면이다. 예컨대, PCIe 접속부(28)는 I/O 장치로부터 물리 어드레스와, CPUID를 취득하면, 도 14 중 (P)에 나타내는 바와 같이, 취득된 물리 어드레스와, CPUID를 PCIe 버스 제어부(42b)에 출력한다. 또한, PCIe 접속부(28)는 I/O 장치로부터 물리 어드레스와, CPUID와, 기록 데이터를 취득하면, 도 14 중 (P)에 나타내는 바와 같이, 취득된 물리 어드레스와, CPUID와, 기록 데이터를 PCIe 버스 제어부(42b)에 출력한다.
그리고, PCIe 버스 제어부(42b)는 PCIe 접속부(28)로부터 물리 어드레스와, CPUID를 취득하면, 도 14 중 (Q)에 나타내는 바와 같이, 취득된 물리 어드레스와, CPUID를 리퀘스트 생성부(42a)에 출력한다. 또한, PCIe 버스 제어부(42b)는 PCIe 접속부(28)로부터 물리 어드레스와, CPUID와, 기록 데이터를 취득하면, 도 14 중 (Q)에 나타내는 바와 같이, 취득된 물리 어드레스와, CPUID와, 기록 데이터를 리퀘스트 생성부(42a)에 송신한다.
리퀘스트 생성부(42a)는 PCIe 버스 제어부(42b)로부터 물리 어드레스와, CPUID를 취득하면, 취득된 물리 어드레스와, CPUID를 포함하는 리드 리퀘스트가 되는 패킷을 생성한다. 또한, 리퀘스트 생성부(42a)는 PCIe 버스 제어부(42b)로부터 물리 어드레스와, CPUID와, 기록 데이터를 취득하면, 취득된 물리 어드레스와, CPUID와, 기록 데이터를 포함하는 라이트 리퀘스트가 되는 패킷을 생성한다. 그리고, 리퀘스트 생성부(42a)는 도 14 중 (R)에 나타내는 바와 같이, 생성된 패킷을 라우터(40)에 출력한다.
또한, 리퀘스트 생성부(42a)는 도 14 중 (S)에 나타내는 바와 같이, 리드 리퀘스트, 라이트 리퀘스트를 송신한 것을 나타내는 데이터를 이상 검출부(42c)에 출력한다. 계속해서, 도 14 중 (T)에 나타내는 바와 같이, 라우터(40)는 리퀘스트 생성부(42a)로부터 취득된 리퀘스트를 XB 접속부(27)에 출력한다. 그 후, 도 14 중 (U)에 나타내는 바와 같이, XB 접속부(27)는 취득된 리퀘스트를 XB(2)에 출력한다. 그렇게 하면, XB(2)는 리퀘스트에 저장된 CPUID가 나타내는 CPU에 패킷을 전달하게 된다.
다음에, 도 15를 이용하여, I/O 장치가 CPU(21) 이외의 CPU로부터 리스폰스를 수신하는 처리의 일례에 대해서 설명한다. 도 15는 실시예 1에 따른 I/O 장치가 리스폰스를 수신하는 처리의 일례를 설명하기 위한 도면이다. 예컨대, 도 15 중 (V)에 나타내는 바와 같이 XB 접속부(27)는 CPU(21) 이외의 CPU로부터 I/O 장치에의 리스폰스를 수신한다.
XB 접속부(27)는 리스폰스를 수신하면, 도 15 중 (W)에 나타내는 바와 같이, 수신된 리스폰스를 라우터(40)에 출력한다. 라우터(40)는 리스폰스를 수신하면, 도 15 중 (X)에 나타내는 바와 같이, 수신된 리스폰스를 리퀘스트 생성부(42a)에 출력한다. 리퀘스트 생성부(42a)는 리스폰스를 수신하면, 리스폰스를 수신한 것을 나타내는 데이터를 이상 검출부(42c)에 출력한다. 또한, 리퀘스트 생성부(42a)는 도 15 중 (Z)에 나타내는 바와 같이, 리스폰스를 PCIe 버스 제어부(42b)에 출력한다. PCIe 버스 제어부(42b)는 리스폰스를 수신하면, 도 15 중 (AA)에 나타내는 바와 같이, 수신된 리스폰스를 PCIe 접속부(28)에 출력한다. 이에 의해, PCIe 접속부(28)로부터 I/O 장치에 리스폰스가 송신된다.
다음에, 도 16, 도 17을 이용하여, 노드(20)와, 노드(20)의 액세스 대상 메모리를 갖는 노드의 사이에서 데이터 전송 이상이 발생하였을 때에 실행되는 처리의 일례에 대해서 설명한다. 도 16은 노드와, 그 노드의 액세스 대상 메모리를 갖는 노드의 사이에서 데이터 전송 이상이 발생하였을 때에 실행되는 처리의 일례를 설명하기 위한 도면이다. 예컨대, 이상 검출부(37c)는 타이머(81)의 시간이 정해진 시간을 경과하였는지의 여부를 판정한다. 정해진 시간을 경과한 경우에는, 이상 검출부(37c)는 포인터(80)가 가리키는 리퀘스트에 대응하는 리스폰스를 정해진 시간 이내에 수신하지 못했기 때문에, 노드(20)와, 액세스 대상 메모리를 갖는 노드의 사이에서 데이터 전송 이상이 발생한 것을 검출한다. 그리고, 이상 검출부(37c)는 포인터(80)가 가리키는 리퀘스트에 포함되는 액세스 대상 메모리의 물리 어드레스를 PA(83)로부터 취득하고, 도 16 중 (AB)에 나타내는 바와 같이, 취득된 물리 어드레스를, 에러 발생 어드레스 레지스터(96)에 기록한다. 에러 발생 어드레스 레지스터(96)에 물리 어드레스가 기록되면, 도 16 중 (AC)에 나타내는 바와 같이, 트랩 발생부(96)는 트랩을 발생시킨다.
도 17은 노드와, 그 노드의 액세스 대상 메모리를 갖는 노드의 사이에서 데이터 전송 이상이 발생하였을 때에 실행되는 처리의 일례를 설명하기 위한 도면이다. 예컨대, 이상 검출부(42c)는 타이머(91)의 시간이 정해진 시간을 경과하였는지의 여부를 판정한다. 정해진 시간을 경과한 경우에는, 이상 검출부(42c)는 포인터(90)가 가리키는 리퀘스트에 대응하는 리스폰스를 정해진 시간 이내에 수신하지 못했기 때문에, 노드(20)와, 액세스 대상 메모리를 갖는 노드의 사이에서 데이터 전송 이상이 발생한 것을 검출한다. 그리고, 이상 검출부(42c)는 포인터(90)가 가리키는 리퀘스트에 포함되는 액세스 대상 메모리의 물리 어드레스를 PA(93)로부터 취득하고, 도 17 중 (AD)에 나타내는 바와 같이, 취득된 물리 어드레스를, 에러 발생 어드레스 레지스터(98)에 기록한다. 에러 발생 어드레스 레지스터(98)에 물리 어드레스가 기록되면, 도 17 중 (AE)에 나타내는 바와 같이, 트랩 발생부(98)는 트랩을 발생시킨다.
통신부(23), 서비스 프로세서(24), XB 접속부(27), XB 접속부(27a), PCIe 접속부(28)는 전자 회로이다. 여기서, 전자 회로의 예로서, ASIC(Application Specific Integrated Circuit)나 FPGA(Field Programmable Gate Array) 등의 집적 회로, 또는 CPU나 MPU(Micro Processing Unit) 등을 적용할 수 있다. 또한, CPU(21∼21c) 대신에, ASIC나 FPGA 등의 집적 회로, 또는 MPU 등을 적용할 수 있다.
또한, 메모리(22∼22a)는 RAM(Random Access Memory), ROM(Read Only Memory), 플래시 메모리(flash memory) 등의 반도체 메모리 소자이다. 또한, L1 캐시(32), L2 캐시(33)는 SRAM(Static Random Access Memory) 등의 고속의 반도체 메모리 소자이다.
다음에, 각 CPU(21∼21c)가 캐시 코히런스를 유지하는 처리에 대해서 설명한다. 또한, 이하의 설명에 있어서는, 정보 처리 시스템(1)의 각 CPU는 일리노이 프로토콜을 이용하여, 캐시 코히런스를 유지하는 것으로 한다.
또한, 이하의 설명에 있어서는, 정보 처리 시스템(1)이 갖는 각 메모리는 모든 CPU로부터 캐시 가능한 공간을 갖는 메모리로서 식별되는 것으로 한다. 또한, 이하의 설명에 있어서는, 캐시 대상이 되는 데이터를 기억하는 메모리에, 그 CPU 내의 MAC를 통해 물리적으로 직접 접속되어 있는 CPU를 홈 CPU로 하고, 캐시를 요구한 CPU를 로컬 CPU라고 기재한다.
또한, 홈 CPU에 대하여 이미 리퀘스트를 송신하고, 데이터의 캐시를 끝낸 CPU를 리모트 CPU라고 기재한다. 또한, 로컬 CPU와 홈 CPU가 동일한 CPU가 되는 경우나, 로컬 CPU와 리모트 CPU가 동일한 CPU가 되는 경우도 있다.
로컬 CPU는 자신의 노드 맵을 참조하여, 액세스 대상이 되는 물리 어드레스가 홈 CPU가 액세스하는 메모리에 배분되어 있다고 판정한다. 그리고, 로컬 CPU는 물리 어드레스를 저장한 리퀘스트를 홈 CPU에 대하여 발행한다. 또한, 로컬 CPU가 발행하는 리퀘스트에는, 복수 종별의 리퀘스트가 존재한다. 이 때문에, 홈 CPU가 갖는 캐시 디렉터리 관리부는 취득된 리퀘스트의 종별에 따른 캐시 코히런스 제어를 실행하게 된다.
예컨대, 로컬 CPU가 발행하는 리퀘스트의 종별로서는, 공유형 페치 액세스, 배타형 페치 액세스, 캐시 무효화 요구, 캐시 리플레스 요구 등이 있다. 공유형 페치 액세스란, 예컨대 「MoveIn to Share」의 실행 요구이며, 홈 CPU가 액세스하는 메모리로부터 데이터를 판독할 때에 발행되는 리퀘스트이다.
또한, 배타형 페치 액세스란, 예컨대 「MoveIn Exclusively」의 실행 요구이며, 홈 CPU가 액세스하는 메모리에 데이터 스토어를 행할 경우에, 캐시에의 데이터 로드를 행할 때에 발행된다. 또한, 캐시 무효화 요구란, 예컨대 「MoveOut」의 실행 요구이며, 캐시 라인의 무효화를 홈 CPU에 대하여 요구할 때에 발행된다. 또한, 홈 CPU는 캐시 무효화 요구를 수신하면, 리모트 CPU에 대하여 캐시 무효화 요구를 발행하는 경우나, 캐시를 「Invalidation」으로 하는 오더를 발행하는 경우가 있다.
캐시 리플레스 요구란, 예컨대 「WriteBack」의 실행 요구이며, 갱신된 캐시 데이터, 즉 「Modified」 상태의 캐시 데이터를 홈 CPU가 액세스하는 메모리에 재기록할 때에 발행된다. 또한, 캐시 리플레스 요구에는, 예컨대 「FlushBack」의 실행 요구이며, 갱신되지 않은 캐시 데이터, 즉 「Shared」 또는 「Exclusive」 상태의 캐시를 파기할 때에 발행된다.
홈 CPU는 전술한 리퀘스트를 로컬 CPU나, 리모트 CPU로부터 수신한 경우에는, 리퀘스트를 처리하기 위해, 로컬 CPU나 리모트 CPU에 대하여, 오더를 발행한다. 여기서, 홈 CPU는 취득된 리퀘스트의 종별에 따른 캐시 코히런스 제어를 실행하기 위해, 복수 종별의 오더를 발행하게 된다. 예컨대, 홈 CPU는 리모트 CPU가 캐시하고 있는 데이터를 로컬 CPU에 로드시키는 「MoveOut and Bypass to Share」를 발행한다.
또한, 예컨대 홈 CPU는 로컬 CPU 이외의 모든 리모트 CPU의 캐시를 무효화하고, 그 후, 홈 CPU가 로컬 CPU에 데이터를 송신하기 위한 「MoveOut and Bypass Exclusively」를 발행한다. 또한, 홈 CPU는 리모트 CPU에 캐시의 무효화를 요구하는 「MoveOut WITH Invalidation」을 발행한다. 또한, 홈 CPU가 「MoveOut WITH Invalidation」을 발행한 경우에는, 모든 CPU의 캐시가 대상이 되는 어드레스에 대해서 「Invalidate」 상태가 된다. 또한, 트랜잭션 완료 시에는 로컬 CPU가 데이터를 캐시한다.
또한, 홈 CPU는 리모트 CPU에 캐시 라인의 무효화를 요구하는 「MoveOut for Flush」를 발행한다. 또한, 홈 CPU가 「MoveOut for Flush」를 발행한 경우에는, 대상이 되는 데이터는 홈 CPU의 메모리에만 기억된다. 또한, 홈 CPU는 대상이 되는 데이터의 상태가 「Shared」일 때에, 리모트 CPU에 캐시의 파기를 요구하는 「Buffer Invalidation」을 발행한다.
홈 CPU는 리퀘스트의 종별에 따라, 전술한 오더를 발행하고, 각 CPU가 캐시한 데이터의 스테이트를 천이시킨다. 또한, 로컬 CPU나 리모트 CPU는 오더를 수신한 경우에는, 오더가 나타내는 처리를 실행하고, 자신이 캐시한 데이터의 스테이트를 천이시킨다.
그 후, 로컬 CPU나 리모트 CPU는 오더에 대한 완료 응답이나 데이터를 갖는 완료 응답을 홈 CPU에 송신한다. 또한, 홈 CPU나 리모트 CPU는 오더 처리를 실행한 후에, 로컬 CPU에 대하여, 데이터를 갖는 리퀘스트 응답을 송신하게 된다.
[처리의 흐름]
다음에, 도 18을 이용하여, 정보 처리 시스템(1)이 공유 영역을 제어하는 처리의 흐름에 대해서 설명한다. 도 18은 공유 영역을 제어하는 처리의 흐름을 설명하기 위한 흐름도이다. 우선, 정보 처리 시스템(1)은 애플리케이션의 요구에 따라, 노드 사이의 공유 메모리의 할당 처리를 실행한다(단계 S101). 다음에, 정보 처리 시스템(1)은 노드 사이에서 공유하는 공유 메모리의 어태치 처리를 실행한다(단계 S102).
그 후, 정보 처리 시스템(1)이 갖는 각 CPU에 의해 실행되는 애플리케이션이 각 메모리를 사용한다(단계 S103). 다음에, 정보 처리 시스템(1)은 공유 메모리의 디태치 처리를 실행한다(단계 S104). 그 후, 정보 처리 시스템(1)은 공유 메모리의 해방 처리를 실행하고(단계 S105), 처리를 종료한다. 또한, 단계 S101, 및 단계 S105는 그 공유 메모리의 홈 노드 상의 애플리케이션만이 실시하는 것으로 하여도 좋고, 실제의 처리는 nop이 되지만, 그 공유 메모리의 홈 노드 이외의 노드 상의 애플리케이션도 실시하는 것으로 하여도 좋다.
다음에, 도 19를 이용하여, 도 18 중 단계 S101에서 나타낸 공유 메모리의 할당 처리를 실행하는 처리의 흐름에 대해서 설명한다. 도 19는 공유 메모리의 할당 처리를 설명하기 위한 흐름도이다. 도 19에 나타내는 예에서는, 예컨대 CPU(21)가 실행하는 애플리케이션이 OS에 대하여, 노드 사이의 공유 메모리 할당 처리의 실행을 요구한다(단계 S201).
그렇게 하면, CPU(21)가 실행하는 OS가 공유 영역용의 물리 어드레스의 영역으로부터 요구된 사이즈의 메모리 할당을 행한다(단계 S202). 다음에, OS가 할당한 공유 메모리의 관리용 ID를 애플리케이션에 전달하고(단계 S203), 공유 메모리의 할당 처리를 종료한다.
다음에, 도 20을 이용하여, 도 18 중 단계 S102에서 나타낸 노드 사이의 공유 메모리 어태치 처리의 흐름에 대해서 설명한다. 도 20은 공유 메모리 어태치 처리를 설명하기 위한 흐름도이다. 우선, 애플리케이션은 OS에 대하여 관리용 ID를 전달하고, 노드 사이의 공유 메모리의 어태치 처리를 요구한다(단계 S301). 이러한 경우에는, OS는 다른 노드에서 실행되고 있는 OS와 통신을 행하여, 관리용 ID에 대응하는 물리 어드레스를 획득한다(단계 S302).
여기서, OS가 다른 노드에서 실행되고 있는 OS와 통신을 행하는 경우에는, LAN 등에 의한 통신, 서비스 프로세서(24)를 통한 각 노드 사이의 통신 등을 이용한다. 또한, 각 노드에서 실행되는 OS는 특정한 공유 영역을, 노드 사이 통신에 이용하는 영역으로서 설정하고, 설정된 영역에 대한 정보를 저장 또는 판독함으로써, 통신을 행하는 것으로 하여도 좋다.
다음에, OS는 물리 어드레스에 대응하는 논리 어드레스를 결정하여, 할당한다(단계 S303). 예컨대, CPU(21)에서 실행되는 OS는 물리 어드레스와 논리 어드레스의 TLB(35a)를 어드레스 변환부(35)에 설정한다.
또한, 각 CPU(21∼21c)가 이용하는 논리 어드레스는 중복되는 범위여도 좋고, 또한, CPU마다 상이한 범위여도 좋다. 또한, 각 CPU(21∼21c)가 이용하는 논리 어드레스는 애플리케이션이 OS에 지정할 수 있도록 하여도 좋다. 그 후, OS는 논리 어드레스의 값을 애플리케이션에 전달하고(단계 S304), 처리를 종료한다.
다음에, 도 21을 이용하여, 도 18 중 단계 S103에서 나타낸 애플리케이션이 노드 사이의 공유 메모리를 사용하는 처리의 흐름에 대해서 설명한다. 도 21은 애플리케이션이 공유 메모리를 사용하는 처리를 설명하기 위한 흐름도이다. 예컨대, CPU(21)가 실행하는 애플리케이션은 논리 어드레스를 발행하고, 논리 어드레스가 나타내는 기억 영역에의 액세스를 행한다(단계 S401).
그렇게 하면, CPU(21)는 TLB 미스가 발생하였는지의 여부를 판별한다(단계 S402). 그리고, CPU(21)는 TLB 미스가 발생한 경우는(단계 S402 긍정), 트랩 처리를 실행하고, TLB에 논리 어드레스와 물리 어드레스의 쌍의 엔트리를 설정한다(단계 S403).
다음에, 애플리케이션은 재차 논리 어드레스를 발행하고, TLB에 의한 물리 어드레스에의 변환을 거쳐, 정상적으로 공유 메모리에 대한 액세스를 실행하고(단계 S404), 처리를 종료한다. 한편, TLB 미스가 발생하지 않은 경우는(단계 S402 부정), 정상적으로 공유 메모리에 대한 액세스가 실행되고(단계 S405), 처리를 종료한다.
다음에, 도 22를 이용하여, 도 18 중 단계 S104에서 나타낸 노드 사이의 공유 메모리 디태치 처리의 흐름에 대해서 설명한다. 도 22는 노드 사이의 공유 메모리 디태치 처리를 설명하기 위한 흐름도이다. 예컨대, CPU(21)가 실행하는 애플리케이션은 OS에 대하여, 노드간 공유 메모리의 논리 어드레스, 또는 관리용 ID를 지정하여, 디태치 처리를 요구한다(단계 S501).
그렇게 하면, CPU(21)가 실행하는 OS는 캐시를 플래시한다(단계 S502). 즉, OS는 공유 메모리의 할당 해제 후, 재차 공유 메모리로서 할당을 행한 경우에, 공유 메모리로서 할당이 행해지지 않을 때에 공유 메모리의 실제 메모리에 액세스하는 CPU가 리부트되면, 캐시와 실제 메모리의 상태가 일치하지 않을 우려가 있다. 이 때문에, OS는 캐시를 플래시하여, 캐시와 실제 메모리의 상태가 일치하지 않는 상태를 방지한다.
그리고, OS는 노드간 공유 메모리, 즉 애플리케이션이 이용한 범위의 논리 어드레스의 할당을 해제하고, 해제된 논리 어드레스에 관련된 TLB(35a)의 엔트리를 삭제한다(단계 S503). 또한, 이 후, 본 노드 상에서, 디태치가 완료된 메모리 어드레스에 대해서 TLB 미스가 발생하여도(단계 S402 긍정), OS는 디태치가 완료된 논리 어드레스에 대응하는 물리 어드레스를 TLB(35a)에 설정하지 않는다. 따라서, 단계 S404는 정상적으로 종료되지 않고, 액세스 에러가 된다. 디태치 완료 후, 단계 S302와 반대로, OS가 노드 사이에서 통신하여, 본 애플리케이션이 이 공유 메모리의 PA에 대하여 액세스를 완료한 것을 통지한다(단계 S504). 만약, 이 공유 메모리가 홈 노드 상에서 해방이 끝났으며, 또한 이 애플리케이션이 이 공유 메모리의 최후의 이용자인 경우, 홈 노드에 해방 처리를 의뢰하고(단계 S505), 처리를 종료한다.
다음에, 도 23을 이용하여, 도 18 중 단계 S105에서 나타낸 노드간 공유 메모리의 해방 처리의 흐름에 대해서 설명한다. 도 23은 노드간 공유 메모리의 해방 처리를 설명하기 위한 흐름도이다. 예컨대, CPU(21)가 실행하는 애플리케이션은 OS에 대하여 노드간 공유 메모리의 해방 처리를 요구한다(단계 S601). 그렇게 하면, OS는 지정된 공유 영역의 사용자가 전부 디태치된 경우에는, 할당을 해방하고(단계 S602), 처리를 종료한다. 만약 디태치가 완료되지 않으면, 할당 해방 처리는 행하지 않고, 처리를 완료한다(실제 할당 완료 처리는 S505에서 행해짐).
다음에, 도 24를 이용하여, CPU(21)가 다른 CPU에 대하여, 메모리 액세스의 리퀘스트를 송신하는 처리의 흐름에 대해서 설명한다. 도 24는 리퀘스트를 발행하는 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, CPU(21)의 연산부(31)는 논리 어드레스를 발행한다(단계 S701).
그렇게 하면, 어드레스 변환부(35)에 있어서, 논리 어드레스로부터 물리 어드레스에의 변환이 행해진다(단계 S702). 다음에, 캐시 디렉터리 관리부(36)가 물리 어드레스를 취득하고, 캐시 디렉터리 관리를 실행한다(단계 S703). 즉, 캐시 디렉터리 관리부(36)는 취득된 물리 어드레스가 나타내는 기억 영역에 대한 캐시 스테이트를 천이시킨다.
다음에, 캐시 디렉터리 관리부(36)는 노드 맵(34)을 참조하여, 취득된 물리 어드레스가 타노드의 메모리에 배분된 물리 어드레스인지의 여부를 판정한다(단계 S704). 그리고, 캐시 디렉터리 관리부(36)는 취득된 물리 어드레스가 타노드의 메모리에 배분된 물리 어드레스가 아니라고 판정한 경우에는(단계 S704 부정), 취득된 물리 어드레스를 이용하여 메모리 액세스를 실행한다(단계 S705). 그리고, 처리를 종료한다.
한편, 캐시 디렉터리 관리부(36)는 취득된 물리 어드레스가 타노드의 메모리에 배분된 물리 어드레스인 경우에는(단계 S704 긍정), 노드 맵(34)으로부터 물리 어드레스와 대응지어진 CPUID를 취득한다(단계 S706). 그리고, 패킷 송신부가 CPUID와 물리 어드레스를 저장한 패킷, 즉 메모리 액세스의 리퀘스트를 생성하여, XB(2)에 송출하고(단계 S707), 처리를 종료한다.
다음에, 도 25를 이용하여, CPU(21)가 다른 CPU로부터 메모리 액세스의 리퀘스트를 수신하였을 때에 실행하는 처리의 흐름에 대해서 설명한다. 도 25는 리퀘스트를 수신하였을 때에 실행하는 처리의 흐름을 설명하기 위한 흐름도이다. 또한, 도 25에 나타내는 예에서는, CPU(21)가 다른 CPU로부터 「MoveIn to Share」나 「MoveIn Exclusively」를 수신하였을 때에 실행하는 처리의 흐름에 대해서 설명한다. 예컨대, CPU(21)는 다른 CPU로부터 XB(2)를 통해 리퀘스트를 수신한다(단계 S801).
이러한 경우에는, CPU(21)는 노드 맵(34)을 이용하여, 리퀘스트의 대상이 되는 물리 어드레스가 로컬 영역인지의 여부를 판정한다(단계 S802). 그리고, CPU(21)는 리퀘스트의 대상이 되는 물리 어드레스가 로컬 영역인 경우에는(단계 S802 긍정), 리퀘스트원의 CPU에 부정 응답을 회신하고(단계 S803), 처리를 종료한다.
또한, CPU(21)는 리퀘스트의 대상이 되는 물리 어드레스가 로컬 영역이 아닌 경우에는(단계 S802 부정), 코히런스를 유지하는 캐시 디렉터리 관리를 실행한다(단계 S804). 또한, CPU(21)는 물리 어드레스가 나타내는 기억 영역의 스테이터스를 판정한다(단계 S805).
그리고, CPU(21)는 판정된 스테이터스에 따른 오더를 다른 CPU에 대하여 발행하고(단계 S806), 스테이터스를 천이시킨다(단계 S807). 그 후, CPU(21)는 물리 어드레스가 나타내는 기억 영역의 데이터를 리퀘스트원의 CPU에 송신하는 응답을 행하고(단계 S808), 처리를 종료한다.
다음에, 도 26을 이용하여, CPU(21)가 응답을 수신하였을 때에 실행하는 처리의 흐름에 대해서 설명한다. 도 26은 CPU가 응답을 수신하였을 때에 실행하는 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, CPU(21)는 응답을 수신한다(단계 S901). 이러한 경우에는, CPU(21)는 응답의 내용이 정상적인 응답인지의 여부를 판정한다(단계 S902).
그리고, CPU(21)는 응답의 내용이 정상인 경우, 즉, 리퀘스트 대상이 되는 데이터를 수신한 경우에는(단계 S902 긍정), 데이터를 이용한 정상적인 처리를 실행하고(단계 S903), 처리를 종료한다. 한편, CPU(21)는 부정 응답을 수신한 경우는(단계 S902 부정), 부정 응답의 이유가 액세스 에러인지의 여부를 판정한다(단계 S904).
그리고, CPU(21)는 부정 응답의 이유가 액세스 에러가 아닌 경우에는(단계 S904 부정), 통상의 에러 처리를 실행하고(단계 S905), 처리를 종료한다. 한편, CPU(21)는 부정 응답의 이유가 액세스 에러가 아닌 경우에는(단계 S904 긍정), 에러가 발생한 물리 어드레스를 에러 레지스터에 설정하여, 트랩 처리를 실행하고(단계 S906), 처리를 종료한다.
다음에, 도 27을 이용하여, CPU(21)가 리퀘스트를 송신할 때에 실행하는 처리의 흐름에 대해서 설명한다. 도 27은 CPU가 리퀘스트를 송신할 때에 실행하는 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, CPU(21)는 리퀘스트에 포함되는 액세스처의 물리 어드레스를 PA(83)에 저장하고, 리퀘스트의 종류를 리퀘스트(84)에 저장한다(단계 S1001). 그리고, CPU(21)는 리퀘스트를 다른 노드의 CPU에 송신한다(단계 S1002). 계속해서, CPU(21)는 타이머(81)를 기동시킨다(단계 S1003).
그 후, CPU(21)는 리퀘스트를 송신하고 나서 정해진 시간이 경과하기 전, 즉 타임아웃 전에, 리퀘스트에 대한 응답을 수신하였는지의 여부를 판정한다(단계 S1004). 타임아웃 전에, 응답을 수신한 경우(단계 S1004 긍정)에는, CPU(21)는 타이머(81)를 정지한다(단계 S1005). 그리고, CPU(21)는 응답을 처리하고(단계 S1006), 처리를 종료한다.
한편, 타임아웃 전에, 리퀘스트에 대한 응답을 수신하지 못한 경우(단계 S1004 부정)에는, CPU(21)는 다음과 같은 처리를 실행한다. 즉, CPU(21)는 그 리퀘스트에 대응하는 PA(83)에 저장된 물리 어드레스를 특정하고, 특정된 물리 어드레스를 에러 발생 어드레스 레지스터(96)에 설정하여, 트랩을 발생시킨다(단계 S1007). 다음에, CPU(21)는 특정된 물리 어드레스가 나타내는 기억 영역을 갖는 메모리에 접속된 CPU에 있어서, CPU(21)가 홈 CPU이며, 또한, 리퀘스트에, 메모리(22)에 더티 캐시 데이터를 라이트백하라는 지시가 포함되어 있는지의 여부를 판정한다(단계 S1008).
CPU(21)가 홈 CPU이며, 또한, 리퀘스트에, 메모리(22)에 더티 캐시 데이터를 라이트백하라는 지시가 포함되어 있는 경우(단계 S1008 긍정)에는, CPU(21)는 다음과 같은 처리를 실행한다. 즉, CPU(21)는 메모리(22)의 공유 메모리에 라이트백되는 캐시 데이터가 라이트백되지 않은 이상을 나타내는 값을 생성하고, 생성된 값을 디렉터리(36a)의 정해진 영역에 기록한다. 또는, CPU(21)는 다운된 노드에 의해 캐시 데이터가 라이트백되는 메모리(22)의 공유 메모리의 영역에, 에러 상태를 나타내는 데이터를 생성하고, 생성된 데이터를 기록한다(단계 S1009). 그리고, 처리를 종료한다. 또한, CPU(21)가 홈 CPU가 아니거나, 또는, 리퀘스트에, 메모리(22)에 더티 캐시 데이터를 라이트백하라는 지시가 포함되어 있지 않은 경우(단계 S1008 부정)에도, 처리를 종료한다.
다음에, 도 28을 이용하여, PCIe 제어부(42)가 리드 리퀘스트를 송신할 때에 실행하는 처리의 흐름에 대해서 설명한다. 도 28은 PCIe 제어부가 리드 리퀘스트를 송신할 때에 실행하는 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, PCIe 제어부(42)는 리퀘스트에 포함되는 액세스처의 물리 어드레스를 PA(83)에 저장하고, 리퀘스트의 종류를 리퀘스트(84)에 저장한다(단계 S1101). 그리고, PCIe 제어부(42)는 리퀘스트를 다른 노드의 CPU에 송신한다(단계 S1102). 계속해서, PCIe 제어부(42)는 타이머(91)를 기동시킨다(단계 S1103).
그 후, PCIe 제어부(42)는 타임아웃 전에, 리퀘스트에 대한 응답을 수신하였는지의 여부를 판정한다(단계 S1104). 타임아웃 전에, 응답을 수신한 경우(단계 S1104 긍정)에는, PCIe 제어부(42)는 타이머(91)를 정지한다(단계 S1105). 그리고, PCIe 제어부(42)는 응답을 처리하고(단계 S1106), 처리를 종료한다.
한편, 타임아웃 전에, 리퀘스트에 대한 응답을 수신하지 못한 경우(단계 S1104 부정)에는, PCIe 제어부(42)는 다음과 같은 처리를 실행한다. 즉, PCIe 제어부(42)는 그 리퀘스트에 대응하는 PA(83)에 저장된 물리 어드레스를 특정하고, 특정된 물리 어드레스를 에러 발생 어드레스 레지스터(98)에 설정하여, 트랩을 발생시킨다(단계 S1107). 다음에, PCIe 제어부(42)는 「poisoned TLP」 패킷을 생성하고, 생성된 「poisoned TLP」 패킷을 PCIe 접속부(28)에 송신하며(단계 S1108), 처리를 종료한다.
다음에, 도 29를 이용하여, PCIe 제어부(42)가 라이트 리퀘스트를 송신할 때에 실행하는 처리의 흐름에 대해서 설명한다. 도 29는 PCIe 제어부가 라이트 리퀘스트를 송신할 때에 실행하는 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, PCIe 제어부(42)는 리퀘스트에 포함되는 액세스처의 물리 어드레스를 PA(83)에 저장하고, 리퀘스트의 종류를 리퀘스트(84)에 저장한다(단계 S1201). 그리고, PCIe 제어부(42)는 리퀘스트를 다른 노드의 CPU에 송신한다(단계 S1202). 계속해서, PCIe 제어부(42)는 타이머(91)를 기동시킨다(단계 S1203).
그 후, PCIe 제어부(42)는 타임아웃 전에, 리퀘스트에 대한 응답을 수신하였는지의 여부를 판정한다(단계 S1204). 타임아웃 전에, 응답을 수신한 경우(단계 S1204 긍정)에는, PCIe 제어부(42)는 타이머(91)를 정지한다(단계 S1205). 그리고, PCIe 제어부(42)는 응답을 처리하고(단계 S1206), 처리를 종료한다.
한편, 타임아웃 전에, 리퀘스트에 대한 응답을 수신하지 못한 경우(단계 S1204 부정)에는, PCIe 제어부(42)는 다음과 같은 처리를 실행한다. 즉, PCIe 제어부(42)는 그 리퀘스트에 대응하는 PA(83)에 저장된 물리 어드레스를 특정하고, 특정된 물리 어드레스를 에러 발생 어드레스 레지스터(98)에 설정하여, 트랩을 발생시키고(단계 S1207), 처리를 종료한다.
다음에, 도 30을 이용하여, 트랩이 발생함으로써 OS가 실행하는 트랩 처리의 흐름에 대해서 설명한다. 도 30은 트랩이 발생함으로써 OS가 실행하는 트랩 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, 트랩이 발생함으로써, CPU(21)가 실행하는 OS는 인터럽트 핸들러를 기동시킨다(단계 S1301). 인터럽트 핸들러는 트랩의 종별을 특정한다(단계 S1302). 인터럽트 핸들러는 트랩의 종별이 CPU(21)가 검출한 타노드의 CPU와의 통신 에러로, 리드 처리 중인 것을 나타내는지의 여부를 판정한다. 트랩의 종별이 CPU(21)가 검출한 타노드의 CPU와의 통신 에러로, 리드 처리 중인 것을 나타내는 경우(S1303 긍정)에는, 인터럽트 핸들러는 다음과 같은 처리를 실행한다. 즉, 인터럽트 핸들러는 인터럽트가 발생하였을 때의 프로그램 카운터가 나타내는 프로세스의 시그널 핸들러를 시그널의 송신처로 한다(단계 S1304). 계속해서, 인터럽트 핸들러는 시그널의 송신처에 시그널을 송신하고(단계 S1305), 처리를 종료한다.
또한, 트랩의 종별이 CPU(21)가 검출한 타노드의 CPU와의 통신 에러로, 리드 처리 중인 것을 나타내지 않는 경우(단계 S1303 부정)에는, 인터럽트 핸들러는 다음과 같은 처리를 실행한다. 즉, 인터럽트 핸들러는 트랩의 종별이 CPU(21)가 검출한 타노드의 CPU와의 통신 에러로, 라이트 처리 중인 것을 나타내는지의 여부를 판정한다(단계 S1306). 트랩의 종별이 CPU(21)가 검출한 타노드의 CPU와의 통신 에러로, 라이트 처리 중인 것을 나타내는 경우(단계 S1306 긍정)에는, 인터럽트 핸들러는 에러 발생 어드레스 레지스터(96)를 판독하여, 물리 어드레스를 취득한다(단계 S1307). 그리고, 인터럽트 핸들러는 취득된 물리 어드레스에 대응하는 시그널 핸들러를 핸들러 테이블로부터 검색한다(단계 S1308).
또한, 핸들러 테이블은 다음과 같이 하여 작성된다. 우선, CPU(21)가 실행하는 애플리케이션의 요구에 따라, 공유 영역용의 물리 어드레스의 영역으로부터 요구된 사이즈의 메모리 할당이 행해졌을 때에, 시그널 핸들러를 취득하고, 취득된 시그널 핸들러의 함수의 엔트리 어드레스를 핸들러 테이블에 등록한다. 그리고, 핸들러 테이블에의 시그널 핸들러의 함수의 엔트리 어드레스의 등록 시에, OS는 다음과 같은 처리를 실행한다. 즉, CPU(21)가 실행하는 OS는 시그널 핸들러의 함수의 엔트리 어드레스에, 공유 메모리의 어드레스와, 프로세스의 식별자를 대응지어, 핸들러 테이블에 등록한다. 이와 같이 하여, 핸들러 테이블은 작성된다.
도 31은 핸들러 테이블의 데이터 구조의 일례를 나타내는 도면이다. 도 31에 나타내는 핸들러 테이블은 「공유 메모리 어드레스」 항목과, 「pid」 항목과, 「시그널 핸들러의 함수의 엔트리 어드레스」 항목을 갖는다. 「공유 메모리 어드레스」 항목에는, 「시그널 핸들러의 함수의 엔트리 어드레스」 항목에 엔트리 어드레스가 등록된 시그널 핸들러에 대응하는 공유 메모리의 어드레스가 등록된다. 또한, 「pid」 항목에는, 「시그널 핸들러의 함수의 엔트리 어드레스」 항목에 엔트리 어드레스가 등록된 시그널 핸들러에 대응하는 프로세스의 식별자가 등록된다. 「시그널 핸들러의 함수의 엔트리 어드레스」 항목에는, 시그널 핸들러의 함수의 엔트리 어드레스가 등록된다.
도 30으로 되돌아가서, 검색 결과, 인터럽트 핸들러는 시그널 핸들러를 얻을 수 있었는지의 여부를 판정한다(단계 S1309). 시그널 핸들러를 얻을 수 있었던 경우(단계 S1309 긍정)에는, 인터럽트 핸들러는 얻은 시그널 핸들러를 시그널 송신처로 하고(단계 S1310), 단계 S1305로 진행한다. 한편, 시그널 핸들러를 얻을 수 없었던 경우(단계 S1309 부정)에는, 인터럽트 핸들러는 단계 S1307에서 취득된 물리 어드레스가 나타내는 공유 영역의 공유 메모리를 사용하고 있는 전체 프로세스를 중단시키고(단계 S1311), 처리를 종료한다.
또한, 트랩의 종별이 CPU(21)가 검출한 타노드의 CPU와의 통신 에러로, 라이트 처리 중인 것을 나타내는 경우(단계 S1306 부정)에는, 인터럽트 핸들러는 다음과 같은 판정을 할 수 있다. 즉, 인터럽트 핸들러는 트랩의 종별이 PCIe 제어부(42)가 검출한 타노드의 CPU와의 통신 에러라고 판정할 수 있다. 그래서, 인터럽트 핸들러는 PCIe 제어부(42)의 인터럽트 처리 루틴을 기동한다(단계 S1312). 그리고, CPU(21)가 실행하는 인터럽트 처리에서는, PCIe 제어부(42)의 에러 발생 어드레스 레지스터(98)가 판독되어, 물리 어드레스가 취득된다(단계 S1313).
다음에, 인터럽트 핸들러는 취득된 물리 어드레스가 나타내는 기억 영역이 공유 메모리의 공유 영역인지의 여부를 판정한다(단계 S1314). 취득된 물리 어드레스가 나타내는 기억 영역이 공유 메모리의 공유 영역인 경우(단계 S1314 긍정)에는, 단계 S1308로 되돌아간다. 한편, 취득된 물리 어드레스가 나타내는 기억 영역이 공유 메모리의 공유 영역이 아닌 경우(단계 S1314 부정)에는, 정해진 대응하는 처리를 행하고(단계 S1315), 처리를 종료한다.
다음에, 도 32를 이용하여, 시그널이 통지된 시그널 핸들러가 실행하는 처리의 흐름에 대해서 설명한다. 도 32는 시그널이 통지된 시그널 핸들러가 실행하는 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, 인터럽트 핸들러는 시그널을 시그널 핸들러에 통지하여, 시그널 핸들러를 기동시킨다(단계 S1401). 기동된 시그널 핸들러는 시그널 핸들러에 통지된 물리 어드레스로부터, 이상이 발생한 공유 메모리를 특정한다(단계 S1402). 시그널 핸들러는 시그널 핸들러에 통지된 이상이 발생한 노드의 정보로부터, 이상이 발생한 노드에 존재하는 공유 메모리를 전부 디태치한다(단계 S1403).
계속해서, 시그널 핸들러는 이상이 발생한 노드와 공유하고 있는 노드(20)의 공유 메모리 전부에 대하여 리커버리 처리를 행한다(단계 S1404). 그리고, 시그널 핸들러는 애플리케이션 고유의 리커버리 처리를 행한다(단계 S1405).
애플리케이션 고유의 리커버리 처리의 일례에 대해서 설명한다. 예컨대, 일정 간격으로 디스크 등의 외부 기억 장치 상에 「checkpoint」를 작성하는 애플리케이션을 CPU(21)가 실행하는 경우에는, 「checkpoint」가 나타내는 데이터를 판독하여, 처리를 재개하는 리커버리 처리를 들 수 있다. 또한, 「checkpoint」를 작성하지 않는 애플리케이션을 CPU(21)가 실행하는 경우에는, 재초기화, 혹은 재기동 처리를 행하는 리커버리 처리를 들 수 있다.
또한, 시그널이 통지된 시그널 핸들러가 실행하는 처리에 대해서는, 전술한 처리에 한정되지 않는다. 그래서, 도 33을 이용하여, 시그널이 통지된 시그널 핸들러가 실행하는 다른 처리의 흐름에 대해서 설명한다. 도 33은 시그널이 통지된 시그널 핸들러가 실행하는 다른 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, 인터럽트 핸들러는 시그널을 시그널 핸들러에 통지하여, 시그널 핸들러를 기동시킨다(단계 S1501). 기동된 시그널 핸들러는 시그널 핸들러에 통지된 물리 어드레스로부터, 이상이 발생한 공유 메모리를 특정한다(단계 S1502). 시그널 핸들러는 시그널 핸들러를 실행하는 CPU(21)를 갖는 노드(20)(자노드)가 이상이 발생한 노드의 메모리를 공유 메모리로서 어태치하고 있었는지의 여부를 판정한다(단계 S1503). 자노드가 이상이 발생한 노드의 메모리를 공유 메모리로서 어태치하고 있지 않은 경우(단계 S1503 부정)에는, 단계 S1508로 진행한다.
한편, 자노드가 이상이 발생한 노드의 메모리를 공유 메모리로서 어태치하고 있던 경우(단계 S1503 긍정)에는, 시그널 핸들러는 다음과 같은 처리를 실행한다. 즉, 시그널 핸들러는 시그널 핸들러에 통지된 이상이 발생한 노드의 정보로부터, 이상이 발생한 노드에 존재하는 공유 메모리를 전부 디태치한다(단계 S1504).
계속해서, 시그널 핸들러는 이상이 발생한 노드에 존재하는 공유 메모리의 어드레스를 L1 캐시, L2 캐시로부터 삭제한다(단계 S1505). 그리고, 시그널 핸들러는 이상이 발생한 노드에 존재하는 공유 메모리의 어드레스를 포함하는 엔트리를 TLB(35a)로부터 삭제한다(단계 S1506). 그리고, 시그널 핸들러는 시그널 핸들러에 통지된 물리 어드레스를, TLB 미스가 발생한 경우라도, TLB(35a)에 등록을 금지하는 물리 어드레스로 한다(단계 S1507).
계속해서, 시그널 핸들러는 자노드의 메모리를, 이상이 발생한 노드가 공유 메모리로서 어태치하고 있었는지의 여부를 판정한다(단계 S1508). 자노드의 메모리를, 이상이 발생한 노드가 공유 메모리로서 어태치하고 있던 경우(단계 S1508 긍정)에는, 시그널 핸들러는 이상이 발생한 노드와 공유하고 있는 노드(20)의 공유 메모리 전부에 대하여 리커버리 처리를 행한다(단계 S1509). 그리고, 시그널 핸들러는, 애플리케이션 고유의 리커버리 처리를 행하고(단계 S1510), 처리를 종료한다. 또한, 자노드의 메모리를, 이상이 발생한 노드가 공유 메모리로서 어태치하고 있지 않은 경우(단계 S1508 부정)에도, 처리를 종료한다.
[실시예 1의 효과]
전술한 바와 같이, 정보 처리 시스템(1)은 일부를 공유 메모리 영역으로서 설정할 수 있는 메모리(22∼22c)를 각각이 구비하는 복수의 노드와, 복수의 노드 사이를 접속하는 XB(2)를 갖는다. 복수의 노드의 각각은 복수의 노드 사이의 데이터 전송 이상 또는 다른 노드의 이상을 검출하는 이상 검출부(37c, 42c)를 갖는다. 또한, 복수의 노드의 각각은 이상 검출부(37c, 42c)에 의해 검출된 이상에 기초하여, 「poisoned TLP」 패킷이나, 디렉터리(36a)의 「UE」 항목에 등록하는 이상을 나타내는 값을 생성한다. 또한, 복수의 노드의 각각은 데이터 전송의 요구 발행원의 노드 내의 프로세서에 대하여 인터럽트를 발생시킨다. 또한, 복수의 노드의 각각의 CPU가 실행하는 OS는 인터럽트를 수신하면, 리커버리 처리를 실행한다.
즉, 복수의 노드 중 적어도 하나의 노드는, 이상 검출부를 갖는다. 이 이상 검출부는 그 하나의 노드 또는 다른 노드가 구비하는 기억 장치에 포함되며, 그 하나의 노드 및 그 다른 노드에서 공유 가능한 공유 메모리 영역을 이용한 데이터 전송의 데이터 전송 경로에 있어서의 이상을 검출한다. 또한, 이상 검출부는 그 하나의 노드 또는 그 다른 노드가 구비하는 기억 장치에 포함되며, 그 하나의 노드 및 그 다른 노드에서 공유 가능한 공유 메모리 영역을 이용한 데이터 전송의 데이터 전송 경로에 포함될 수 있는 어느 하나의 노드에 있어서의 이상을 검출한다. 또한, 복수의 노드 중 적어도 하나의 노드는 이상 검출부에 의해 검출된 이상에 기초하여 에러 정보를 생성하며, 자노드 내의 프로세서에 대한 인터럽트를 발생시키는 에러 정보 생성부를 갖는다. 또한, 복수의 노드 중 적어도 하나의 노드는 인터럽트에 따라 에러 정보에 기초하여, 리커버리 처리를 실행한다.
이와 같이, 정보 처리 시스템(1)에서는, 데이터 전송 중에 통신 상대의 노드가 다운된 경우라도, 인터럽트가 통지된 CPU(21)에서 실행되는 OS에 의해, 다운된 노드에 의해 공유되는 자노드의 공유 메모리에 대하여 리커버리 처리가 행해진다. 그 때문에, 통신 상대의 노드가 다운되어 상대 노드가 공유 메모리의 데이터를 캐시하고 있던 경우라도, 자노드는 다운되지 않아도 된다. 따라서, 정보 처리 시스템(1)에 의하면, 데이터 전송 중에 노드 사이에서 통신 이상이 발생한 경우라도, 종래 기술과 같이, 전체 노드가 다운되지 않아도 된다. 따라서, 정보 처리 시스템(1)에 따르면, 노드들 사이의 데이터 전송에 관한 이상이 발생한 경우에, 에러의 영향 범위를 억제할 수 있다.
또한, 정보 처리 시스템(1)은 포인터(80, 90)에 의해, 시간을 계측하는 대상의 리퀘스트를 전환함으로써, 하나의 타이머(81, 91)만으로, 리퀘스트가 송신되고 나서부터의 타임아웃을 검출할 수 있다.
또한, 정보 처리 시스템(1)은 수신된 물리 어드레스에 기초하여, 액세스 대상이 공유 영역인지 로컬 영역인지를 판별하기 때문에, 로컬 영역에 저장하는 커널 데이터나 사용자 데이터의 시큐리티 레벨을 높게 유지할 수 있다. 또한, 정보 처리 시스템(1)은 모든 메모리를 캐시 가능하게 하기 때문에, 메모리 액세스에 있어서의 레이턴시를 용이하게 은폐할 수 있다.
또한, CPU(21)는 다른 CPU가 액세스하는 메모리의 공유 영역에 대하여, 메모리(22)에 액세스하는 경우와 동일한 방법으로 액세스한다. 즉, CPU(21)가 갖는 연산부(31)는 액세스 대상이 되는 기억 영역이 메모리(22) 상에 존재하는 경우에도, 다른 메모리 상에 존재하는 경우에도, 논리 어드레스를 출력하는 것만으로도 좋다.
이 때문에, CPU(21)는 I/O의 배타 제어 등의 처리나 프로그래밍 등을 실행하지 않아도, 용이하게 공유 영역에 액세스할 수 있기 때문에, 메모리 액세스 성능을 향상시킬 수 있다. 또한, CPU(21)는 실행하는 프로그램이나 OS를 개변하지 않아도, 공유 메모리를 적절하게 이용할 수 있는 결과, 프리페치 처리의 실행을 종래와 동일하게 할 수 있기 때문에, 메모리 액세스의 성능을 향상시킬 수 있다.
또한, CPU(21)는 다른 CPU로부터의 메모리 액세스의 대상이 로컬 영역에의 액세스라고 판정한 경우에는, 부정 응답을 반환한다. 이 때문에, 정보 처리 시스템(1)은 공유 영역 이외에의 액세스를 방지하는 결과, 에러를 막을 수 있다.
또한, 캐시 디렉터리 관리부(36)는 노드 맵(34)을 이용하여, 물리 어드레스를 노드 맵(34)에 대응지어 기억된 CPUID로 변환한다. 이 때문에, CPU(21)는 액세스 대상이 되는 물리 어드레스가 배분된 메모리에 액세스하는 CPU를 식별할 수 있다.
또한, CPU(21)는 메모리(22)에 기억된 데이터를 캐시한 CPU를 관리하는 디렉터리를 이용하여, 캐시 코히런스를 제어한다. 이 때문에, 정보 처리 시스템(1)은 정보 처리 시스템(1)이 갖는 CPU의 수가 증가한 경우에도, XB(2)의 트래픽을 증가시키는 일없이, 효율적으로 캐시 코히런스를 유지할 수 있다.
구체적으로는, 정보 처리 시스템(1)에 있어서는, 각 CPU 사이의 통신이 리모트 CPU와 홈 CPU 사이, 또는 리모트 CPU와 홈 CPU와 갱신된 데이터를 캐시하는 로컬 CPU 사이로 한정된다. 이 때문에, 정보 처리 시스템(1)은 효율적으로 캐시 코히런스를 유지할 수 있다.
[실시예 2]
지금까지 본 발명의 실시예에 대해서 설명하였지만, 실시예는 전술한 실시예 이외에도 여러가지 다른 형태로 실시될 수 있는 것이다. 그래서, 이하에서는 실시예 2로서 본 발명에 포함되는 다른 실시예를 설명한다.
(1) 노드의 이상을 검출하는 방법에 대해서
전술한 실시예 1에서는, 정보 처리 시스템(1)이 리퀘스트의 타임아웃을 검출함으로써, 노드의 이상을 검출하는 경우에 대해서 예시하였지만, 개시된 시스템은 이것에 한정되지 않는다. 예컨대, 개시된 시스템은 정해진 시간 간격으로, 상호 접속된 서비스 프로세서 사이에서 서비스 프로세서의 상황을 확인함으로써, 노드의 이상을 검출할 수도 있다. 또한, 개시된 시스템은 LAN을 통해 노드들 사이에서의 「alive check」를, 정해진 시간 간격으로 행함으로써, 노드의 이상을 검출할 수 있다. 이에 의해, 리퀘스트가 송신되는 타이밍과는 비동기로 노드의 이상을 검출할 수 있다.
도 34는 노드의 이상을 검출하는 방법의 일례를 설명하기 위한 정보 처리 시스템의 모식적인 도면이다. 도 34의 예는 빌딩 박스를 「BB」라고 표기한 경우를 나타낸다. 도 34의 예에서는, 각 BB의 CPU는 이상 검출 회로(72), 자노드 번호 정보(73), 노드 다운 통지부(61), 인터럽트 발생 회로(75), 노드 다운 수신부(62), 노드 다운 정보 레지스터(74)를 갖는다.
이상 검출 회로(72)는 자노드의 이상을 검출한다. 자노드 번호 정보(73)는 자노드의 식별 번호를 나타내는 정보이다. 노드 다운 통지부(61)는 이상 검출 회로(72)에서 자노드의 이상이 검출된 경우에는, 이상의 종류, 및 자노드 번호 정보(73)가 나타내는 자노드의 식별 번호를 노드 다운 통지 패킷에 포함시켜 XB에 송신한다. 또한, 이상의 종류의 일례로서는, 노드 다운, 행(hang), 어떤 CPU에서 이상이 발생하였는지를 나타내는 정보를 들 수 있다. 또한, 자노드 번호 정보(73)가 나타내는 정보는 노드를 식별할 수 있는 정보이면 무엇이라도 좋다. 예컨대, 노드와, 노드에 탑재되어 있는 CPU의 관계가 미리 정의되어 있는 경우에는, CPUID로부터 노드 번호를 알 수 있기 때문에, 자노드 번호 정보(73)가 나타내는 정보는 CPUID여도 좋다.
노드 다운 수신부(62)는 XB로부터 송신된 노드 다운 통지 패킷을 수신하면, 노드 다운 통지 패킷에 포함되는 이상의 종류, 및 자노드의 식별 번호를 노드 다운 정보 레지스터(74)에 설정한다. 노드 다운 정보 레지스터(74)에 이상의 종류, 및 자노드의 식별 번호가 설정되면, 이 설정된 정보를 이용하여, 소프트웨어가 이상을 대처할 수 있다. 또한, 노드 다운 수신부(62)는 노드 다운 통지 패킷을 수신하면, 인터럽트 발생 회로(75)에 인터럽트를 발생시키기 위한 제어 신호를 출력한다. 인터럽트 발생 회로(75)는 노드 다운 수신부(62)로부터 제어 신호를 수신하면, 실시예 1과 마찬가지로, 인터럽트를 발생시킨다. 그 때문에, 이 인터럽트에 의해, 인터럽트가 발생하고 나서의 처리에 대해서는, 실시예 1과 동일한 처리가 행해진다.
도 34의 예에서는, 각 BB의 ASIC는 이상 검출 회로(70), 자노드 번호 정보(71), 노드 다운 통지부(60)를 갖는다.
이상 검출 회로(70)는 자노드의 이상을 검출한다. 자노드 번호 정보(71)는 자노드의 식별 번호를 나타내는 정보이다. 노드 다운 통지부(60)는 이상 검출 회로(70)에서 자노드의 이상이 검출된 경우에는, 이상의 종류, 및, 자노드 번호 정보(71)가 나타내는 자노드의 식별 번호를 노드 다운 통지 패킷에 포함시켜 XB에 송신한다.
노드 다운 통지부(60, 61)는 복수의 노드 다운 통지 패킷을 XB에 송신하여, 복수의 CPU에 노드 다운 통지 패킷을 송신할 수 있다. 또한, 노드 다운 통지부(60, 61)는 하나의 노드 다운 통지 패킷을 XB에 송신하여, XB가 복수의 CPU에 노드 다운 통지 패킷을 송신할 수도 있다. 또한, 노드 다운 통지부(60, 61)는 노드마다 하나의 CPU에, 노드 다운 통지 패킷을 송신할 수도 있다.
도 35를 이용하여, 실시예 1의 이상 검출 방법과는 다른 방법을 이용한 경우의 처리의 흐름에 대해서 설명한다. 도 35는 실시예 1의 이상 검출 방법과는 다른 방법을 이용한 경우의 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, CPU(21)는 실시예 2에 있어서 전술한 이상 검출 방법 중 어느 하나를 이용하여, 노드의 이상이 검출되었는지의 여부를 판정한다(단계 S1601). 노드의 이상이 검출되지 않는 경우(단계 S1601 부정)에는, CPU(21)는 재차, 단계 S1601에서의 판정을 행한다. 한편, 노드의 이상이 검출된 경우(단계 S1601 긍정)에는, CPU(21)는 이상이 검출된 노드가 리모트 노드인지의 여부를 판정한다(단계 S1602).
이상이 검출된 노드가 리모트 노드인 경우(단계 S1602 긍정)에는, CPU(21)가 실행하는 OS가 다음과 같은 처리를 실행한다. 즉, OS는 자노드(20)의 디렉터리(36a)에 대해서, 이상이 발생한 노드의 정보가 남아 있는 경우에는, 디렉터리(36a)의 정합성을 취하고(단계 S1603), 처리를 종료한다. 여기서, 디렉터리의 정합성을 취하는 방법의 일례를 설명한다. 예컨대, CPU(21)는 다운된 노드가 데이터를 캐시하고 있지만, 캐시의 상태가 「clean」인 경우에는, 다음과 같은 처리를 실행한다. 즉, CPU(21)는 그 「clean」인 캐시의 디렉터리(36a)의 정보를 「다운된 노드가 캐시를 가지고 있지 않음」 상태로 변경하는 리커버리 처리를 실행한다. 또한, CPU(21)는 다운된 노드가 데이터를 캐시하고 있고, 캐시의 상태가 「dirty」인 경우에는, 다음과 같은 처리를 실행한다. 즉, CPU(21)는 「dirty」인 캐시 라인을 에러 상태로 변경하는 리커버리 처리를 실행한다.
한편, 이상이 검출된 노드가 리모트 노드가 아닌 경우, 즉 홈 노드인 경우(단계 S1602 부정)에는, CPU(21)가 실행하는 OS는 다음과 같은 처리를 실행한다. 즉, OS는 자노드의 캐시에 대해서, 이상이 발생한 노드의 정보가 남아 있는 경우에는, 캐시의 노드의 정보를 삭제한다(단계 S1604). 그리고, OS는 이상이 발생한 노드의 물리 어드레스가 자노드의 TLB(35a)에 등록되어 있는 경우에는, 이상이 발생한 노드의 물리 어드레스를 포함하는 엔트리를 전부 삭제하고(단계 S1605), 처리를 종료한다.
다음에, 정보 처리 시스템(1)에서, 클러스터 동작을 행하는 애플리케이션인 경우에는, 클러스터 소프트웨어에 있어서, 클러스터 관리 매니저가 노드 다운을 검출할 수 있다. 그래서, 클러스터 관리 매니저가 이상을 검출한 경우의 처리의 흐름에 대해서, 도 36을 이용하여 설명한다. 도 36은 클러스터 관리 매니저가 이상을 검출한 경우의 처리의 흐름을 설명하기 위한 흐름도이다. 예컨대, 클러스터 관리 매니저가 노드의 이상을 검출하였는지의 여부를 판정한다(단계 S1701). 노드의 이상을 검출하지 않은 경우(단계 S1701 부정)에는, 클러스터 관리 매니저는 재차 단계 S1701의 처리를 실행한다.
한편, 노드의 이상을 검출한 경우(단계 S1701 긍정)에는, 클러스터 관리 매니저가 자노드에서 동작 중인 애플리케이션에, 노드 다운에 의한 재구성 처리의 개시를 의뢰한다(단계 S1702). 계속해서, 애플리케이션은 이상이 발생한 노드에 존재하는 공유 메모리의 해방을 OS에 의뢰한다(단계 S1703). 그 후, OS는 해방된 공유 메모리의 데이터를 삭제하고, TLB의 엔트리를 삭제한다(단계 S1704). 애플리케이션은 고유의 리커버리 처리를 행하고(단계 S1705), 처리를 종료한다.
(2) 빌딩 블록에 대해서
전술한 정보 처리 시스템(1)은 4개의 CPU를 갖는 빌딩 블록(10∼10e)을 갖고 있었다. 그러나, 실시예는 이것에 한정되는 것이 아니며, 빌딩 블록(10∼10e)은 임의의 수의 CPU 및 각 CPU가 액세스하는 메모리를 가질 수 있다. 또한, CPU와 메모리는 1대 1로 대응할 필요는 없고, 메모리에 직접 액세스하는 CPU는 전체의 일부여도 좋다.
(3) CPU가 송신하는 패킷에 대해서
전술한 CPU(21)는 CPUID와 PA를 갖는 패킷을 메모리 액세스의 리퀘스트로서 송신하였다. 그러나, 실시예는 이것에 한정되는 것이 아니다. 즉, CPU(21)는 액세스 대상이 되는 메모리에 액세스하는 CPU를 고유하게 식별할 수 있는 것이면 임의의 정보를 저장한 패킷을 출력하여도 좋다.
또한, 예컨대 CPU(21)는 CPUID로부터 VC(Virtual Connection)ID로 변환하여, VCID를 저장하는 것으로 하여도 좋다. 또한, CPU(21)는 패킷에, 데이터 길이를 나타내는 렝스(length) 등의 정보를 저장하는 것으로 하여도 좋다.
(4) CPU가 발행하는 오더(명령)에 대해서
전술한 바와 같이, 각 CPU(21∼21c)는 리퀘스트나 오더를 발행하여, 캐시의 코히런스를 유지하였다. 그러나, 전술한 리퀘스트나 오더는 어디까지나 일례이며, 예컨대 CPU(21∼21c)는 CAS(Compare AndSwap) 명령을 발행하여도 좋다.
이와 같이, CPU(21∼21c)가 CAS 명령을 발행한 경우에는, 배타 제어의 경쟁이 복수의 CPU 사이에서 빈발하여도, 각 CPU의 캐시 상에서 처리가 행해진다. 이 결과, CPU(21∼21c)는 메모리 액세스의 발생에 의한 지연을 방지하여, 각 CPU 사이의 트랜잭션이 혼잡해지는 것을 막을 수 있다.
(5) 하이퍼바이저를 경유한 제어에 대해서
전술한 정보 처리 시스템(1)에서는, OS에 의해 하드웨어인 어드레스 변환부(35)에 액세스하는 예에 대해서 설명하였다. 그러나, 실시예는 이것에 한정되는 것이 아니며, 예컨대 가상 머신을 동작시키는 하이퍼바이저(HPV: Hypervisor)가 어드레스 변환부(35)에 액세스하여도 좋다.
즉, 하이퍼바이저가 동작하는 노드에 있어서는, OS는 캐시나 MMU 등의 CPU(21∼21c)의 하드웨어 자원에 대하여 직접 조작을 하지 않고, 조작을 하이퍼바이저에 의뢰하게 된다. 이와 같이, 각 CPU(21∼21c)는 하이퍼바이저를 통한 제어를 접수하는 경우에는, 가상 어드레스를 실제 어드레스(RA: Real Address)로 변환하고, 그 후, 실제 어드레스를 물리 어드레스로 변환하게 된다.
또한, 하이퍼바이저가 동작하는 노드에 있어서는, 인터럽트 처리는 OS에는 직접 인터럽트하지 않고, HPV에 대하여 인터럽트를 행한다. 이러한 경우에는, 하이퍼바이저가 OS의 인터럽트 처리 핸들러를 판독함으로써 인터럽트를 행한다. 또한, 전술한 하이퍼바이저가 실행하는 처리는 가상 머신을 동작시키기 위해 실행되는 공지의 처리이다.
(6) 파티션을 이용한 처리에 대해서
전술한 정보 처리 시스템(1)에서는, 각 CPU(21∼21c)는 하나의 노드 맵을 이용하여 메모리 액세스를 송신하였다. 그러나, 실시예는 이것에 한정되는 것이 아니다. 예컨대, 각 빌딩 블록(10∼10e)은 복수의 노드군으로서 동작하고, 각 노드군마다, 동일한 펌웨어(하이퍼바이저)를 동작시키는 하나의 논리 파티션을 구성하여도 좋다.
이러한 경우에는, 각 CPU(21∼21c)는 액세스처의 CPU를 나타내는 노드 맵과, 동일 논리 파티션 내의 CPU를 나타내는 노드 맵을 갖는다. 이와 같이, 각 CPU(21∼21c)는 동일 논리 파티션 내에 포함되는 CPU를 나타내는 노드 맵을 가짐으로써, 에러 발생 통지, 다운 요구, 리셋 요구 패킷 등의, 논리 파티션을 넘어 전송하면 안 되는 특수 패킷의 전송 범위를 식별할 수 있다.
이하, 동일 논리 파티션 내에 포함되는 CPU를 나타내는 노드 맵을 갖는 CPU에 대해서 설명한다. 도 37은 정보 처리 시스템의 일례를 설명하기 위한 도면이다. 도 37에 나타내는 바와 같이, 빌딩 블록(10, 10a)은 논리 파티션 #A를 동작시키고, 빌딩 블록(10b∼10d)은 논리 파티션 #B를 동작시킨다.
여기서, 논리 파티션 #A에서는, 복수의 도메인 #A∼#C와, 펌웨어 #A가 동작한다. 또한, 논리 파티션 #B에서는, 복수의 도메인 #D∼#G와, 펌웨어 #B가 동작한다. 또한, 펌웨어 #A 및 펌웨어 #B는, 예컨대 하이퍼바이저이다. 또한, 도메인 #A에서는, 애플리케이션과 OS가 동작하고 있고, 다른 도메인 #B∼#G도 도메인 #A와 마찬가지로, 애플리케이션과 OS가 동작한다.
즉, 각 도메인 #A∼#G는 각각 독립적으로 애플리케이션과 OS가 동작하는 가상 머신이다. 여기서, 빌딩 블록(10)이 갖는 각 CPU(21∼21c)는 파티션 #A에 포함되는 각 CPU에 대하여 전술한 특수 패킷을 송신하여도 좋지만, 파티션 #B에 포함되는 각 CPU에 대해서는 특수 패킷을 송신하면 안 된다.
이 때문에, 각 빌딩 블록(10∼10d)의 CPU는 동일한 논리 파티션에 포함되는 CPU의 CPUID를 나타내는 노드 맵을 갖는다. 예컨대, CPU(21)는 물리 어드레스와, 물리 어드레스가 나타내는 기억 영역을 갖는 메모리와 접속된 CPU의 CPUID를 대응지어 기억하는 노드 맵(34)을 갖는다. 또한, CPU(21)는 CPU(21)과 동일한 파티션, 즉, 파티션 #A에 포함되는 CPU의 CPUID를 기억하는 노드 맵(34a)을 갖는다. 또한, 노드 맵(34a)은 노드 맵(34)과 마찬가지로, 서비스 프로세서(24)에 의해 설정되는 것으로 한다.
이하, 도면을 이용하여, 동일한 논리 파티션에 포함되는 CPU의 CPUID를 나타내는 노드 맵의 일례에 대해서 설명한다. 도 38은 파티션의 일례를 설명하기 위한 도면이다. 예컨대, 도 38에 나타내는 예에서는, 파티션 #A는 빌딩 블록 #0을 갖는다. 또한, 빌딩 블록 #0은 CPU #0과, 어드레스 영역 「#0」이 할당된 메모리를 갖는다.
또한, 파티션 #B는 빌딩 블록 #1과 빌딩 블록 #2를 갖는다. 또한, 빌딩 블록 #1은 CPU #4, CPU #5, 어드레스 영역 「#1」이 할당된 메모리, 어드레스 영역 「#2」가 할당된 메모리를 갖는다. 또한, 어드레스 영역 「#1」이 할당된 메모리에는, CPU #4가 액세스하고, 어드레스 영역 「#2」가 할당된 메모리에는, CPU #5가 액세스한다. 또한, 빌딩 블록 #2는 CPU #8과, 어드레스 영역 「#3」이 할당된 메모리를 갖는다.
다음에, 도 39a∼도 39c를 이용하여, 도 38에 나타내는 CPU #0가 갖는 노드 맵과, CPU #4가 갖는 노드 맵에 대해서 설명한다. 우선, 도 39a 및 도 39b를 이용하여, 파티션 #A의 CPU가 기억하는 노드 맵에 대해서 설명한다. 또한, 도 39a는 파티션 #A의 CPU가 기억하는 노드 맵의 일례를 설명하기 위한 도면이다. 또한, 도 39b는 파티션 #A를 나타내는 노드 맵의 일례를 설명하기 위한 도면이다.
또한, 이하의 설명에서는, 노드 ID 「0」는 빌딩 블록 #0을 나타내고, 노드 ID 「1」은 빌딩 블록 #1을 나타낸다, 노드 ID 「2」는 빌딩 블록 #2를 나타낸다. 또한, CPUID 「0」은 CPU #0의 CPUID이고, CPUID 「4」는 CPU #4의 CPUID이며, CPUID 「5」는 CPU #5의 CPUID이고, CPUID 「8」은 CPU #8의 CPUID인 것으로 한다.
예컨대, 도 39a에 나타내는 예에서는, 노드 맵(34)은 어드레스 영역 「#0」이 빌딩 블록 #0에 존재하고, CPU #0가 액세스하는 취지를 나타낸다. 또한, 노드 맵(34)은 어드레스 영역 「#1」이 빌딩 블록 #1에 존재하고, CPU #4가 액세스하는 취지를 나타낸다. 또한, 노드 맵(34)은 어드레스 영역 「#2」이 빌딩 블록 #1에 존재하고, CPU #5가 액세스하는 취지를 나타낸다. 또한, 노드 맵(34)은 어드레스 영역 「#3」이 빌딩 블록 #2에 존재하고, CPU #8가 액세스하는 취지를 나타낸다.
또한, 도 39b에는, 파티션 #A를 나타내는 노드 맵을 나타낸다. 도 39b에 나타내는 바와 같이, 파티션 #A를 나타내는 노드 맵은 각 엔트리에, 밸리드와, 노드 ID와 CPUID를 갖는다. 예컨대, 도 39b에 나타내는 예에서는, 노드 맵은 파티션 #A에 빌딩 블록 #0의 CPU #0가 포함되는 취지를 나타낸다.
예컨대, 도 38에 나타내는 예에서는, CPU #0는 도 39a 및 도 39b에 나타내는 노드 맵을 갖는다. 그리고, CPU #0은 메모리 액세스를 하는 경우에는, 도 39a에 나타내는 노드 맵을 이용하여, 액세스처의 CPU를 식별한다. 한편, CPU #0은 동일 파티션 내의 CPU에만 특수 패킷을 송신하는 경우에는, 도 39b에 나타내는 노드 맵을 이용하여, 송신처의 CPU를 식별한다. 즉, CPU #0은 도 39b에 예시하는 노드 맵이 나타내는 파티션 #A 내의 CPU에 대하여, 특수 패킷을 송신한다.
한편, CPU #4는 메모리 액세스를 하기 위해, 도 39a에 나타내는 노드 맵과, 도 39c에 나타내는 노드 맵을 갖는다. 여기서, 도 39c는 파티션 #B를 나타내는 노드 맵의 일례를 설명하기 위한 도면이다. 도 39c에 나타내는 예에서는, 파티션 #B를 나타내는 노드 맵은 파티션 #B에, 빌딩 블록 #1의 CPU #4 및 CPU #5, 빌딩 블록 #2의 CPU(38)가 존재하는 것을 나타낸다. CPU #4는 도 39c에 예시하는 노드 맵이 나타내는 파티션 #B 내의 CPU에 대하여, 특수 패킷을 송신한다.
이와 같이, CPU #1 및 CPU #4는 어드레스 영역과 CPUID를 대응지은 노드 맵과, 파티션을 나타내는 노드 맵을 기억한다. 그리고, CPU #1 및 CPU #4는 어드레스 영역과 CPUID를 대응지은 노드 맵을 이용하여, 다른 노드가 갖는 메모리에 대하여 직접 메모리 액세스를 행한다. 또한, CPU #1은 파티션 #A를 나타내는 노드 맵을 이용하여, 특수 패킷을 송신한다. 또한, CPU #4는 파티션 #B를 나타내는 노드 맵을 이용하여, 특수 패킷을 송신한다.
이와 같이, 각 CPU는 자신을 포함하는 파티션마다, 상이한 값을 갖는 노드 맵을 가져도 좋다. 또한, 각 CPU는 자신을 포함하는 파티션마다 상이한 값을 갖는 노드 맵을 갖는 경우에, 특수 패킷을 파티션을 넘어 송신하는 것을 막을 수 있다.
또한, 각 CPU는 상기 실시예와 마찬가지로, 스타트 어드레스와 어드레스 마스크, 또는 스타트 어드레스와 렝스로 액세스 대상이 되는 어드레스 영역을 나타내어도 좋다. 즉, CPU #1과 CPU #4는 스타트 어드레스와 어드레스 마스크, 또는, 스타트 어드레스와 렝스를 이용하여, 액세스 대상이 되는 어드레스 영역을 나타내는 노드 맵을 이용하여, 액세스 대상이 되는 노드를 식별한다. 또한, CPU #1과 CPU #4는 각각 다른 파티션을 나타내는 노드 맵을 이용하여, 특수 패킷을 송신한다.
(7) 서비스 프로세서를 경유한 제어에 대해서
전술한 정보 처리 시스템(1)에서는, 서비스 프로세서(24)에 의해 하드웨어인 노드 맵(34)에 액세스하는 예에 대해서 설명하였다. 그러나, 실시예는 이것에 한정되는 것이 아니며, 서비스 프로세서(24) 이외가 노드 맵(34)에 액세스하도록 구성하여도 좋다. 예컨대, CPU(21∼21c) 상의 하나 혹은 모든 CPU에서 동작하고 있는 기본 펌웨어 BIOS(Basic Input/Output System) 혹은 HPV 등이 노드 맵(34)에 액세스할 수 있도록 구성하여도 좋다.