입력 큐 프리페치

Prefetch input queue

프로그램 메모리에서 명령 opcode를 미리 가져오는 것을 프리페치라고 하며 프리페치 입력 큐(PIQ)를 사용하여 처리됩니다.프리페치된 명령은 데이터 구조, 즉 에 저장됩니다.opcode를 실행이 필요하기 전에 미리 가져오면 프로세서의 전반적인 효율이 향상됩니다.프로세서는 이후 명령어 opcode가 완료될 때까지 메모리 액세스 조작을 기다릴 필요가 없습니다.이 아키텍처는 인텔 8086 마이크로프로세서에서 두드러지게 사용되고 있습니다.

서론

파이프라인은 1960년대에 보다 빠르고 효율적인 컴퓨팅의 필요성 때문에 컴퓨팅 아키텍처 설계의 전면에 등장했습니다.파이프라인은 더 넓은 개념으로, 대부분의 최신 프로세서는 명령을 실행하기 전에 클럭 사이클을 로딩합니다.이것은 메모리에서 프리페치 입력 큐로 머신 코드를 프리 로드함으로써 실현됩니다.

[clarification needed] 동작은 자체 수정 코드를 실행하고 일종의 명령 파이프라이닝을 가진 von Neumann 컴퓨터(, 하버드 아키텍처 컴퓨터가 아님)에만 적용됩니다.현대의 거의 모든 고성능 컴퓨터는 이 세 [1]가지 요건을 충족합니다.

일반적으로 PIQ의 프리페치 동작은 CPU의 프로그래밍 모델에서는 보이지 않습니다.다만, PIQ의 동작이 보이는 상황도 있어 프로그래머가 고려할 필요가 있습니다.

x86 프로세서가 리얼모드에서 보호모드로 모드를 변경하면 PIQ를 플래시해야 합니다.그렇지 않으면 CPU는 마지막 모드에서 작성된 것처럼 머신 코드를 계속 변환합니다.PIQ가 플래시되지 않으면 프로세서가 코드를 잘못 변환하여 잘못된 명령 예외를 생성할 수 있습니다.

자체 수정 코드를 실행할 때 현재 실행 위치 바로 앞에 있는 프로세서 코드를 변경해도 PIQ에 이미 로드되어 있기 때문에 프로세서가 코드를 해석하는 방법은 변경되지 않을 수 있습니다.RAM 및/또는 캐시에 있는 코드의 새 버전 및 변경된 버전이 아니라 PIQ에 이미 로드된 이전 복사본을 단순히 실행합니다.

PIQ의 이 동작은 코드가 에뮬레이터 내부에서 실행되고 있는지 [citation needed]실제 CPU의 하드웨어에서 직접 실행되고 있는지를 판별하기 위해 사용할 수 있습니다.대부분의 에뮬레이터는 이 동작을 시뮬레이트하지 않습니다.PIQ 사이즈가 제로인 경우(코드의 변경은 항상 프로세서의 상태에 즉시 영향을 준다), 코드가 에뮬레이터에서 실행 중이거나 프로세서가 PIQ에 로드된 주소에 쓸 때 PIQ를 무효화한다고 추론할 수 있다.

큐잉 이론에 근거한 퍼포먼스 평가

A.K Erlang(1878-1929)은 전화 트래픽 폭주의 해결책으로 큐를 처음 고안했습니다.실시간 큐잉 시스템을 근사적으로 시뮬레이션하기 위해 다양한 큐잉 모델이 제안되어 다양한 성능 사양에 대해 수학적으로 분석할 수 있습니다.

큐잉 모델은 Kendall 표기법을 사용하여 나타낼 수 있습니다.

A1/A2/A3/A4

여기서:

  • A1은 두 도착 간의 시간 분포입니다.
  • A2는 서비스 시간 분포입니다.
  • A3는 서버의 총수입니다.
  • A4는 시스템 용량입니다.
  1. M/M/1 모델(싱글 큐 단일 서버/마르코프):이 모델에서는 큐의 요소가 선착순으로 제공됩니다.평균 도착률과 서비스 속도를 고려할 때, 실제 요율은 이러한 평균값 주변에서 랜덤하게 변동하므로 누적 확률 [2]분포 함수를 사용하여 결정해야 한다.
  2. M/M/r 모델:이 모델은 여러 서버가 병렬로 동작하는 기본 M/M/1 모델을 일반화한 것입니다.이러한 종류의 모델은 서비스를 받지 못할 경우 즉시 큐에서 탈퇴하는 성급한 사용자를 대상으로 시나리오를 모델링할 수도 있습니다.이는 성공과 실패의 두 가지 상태만을 가진 베르누이 프로세스를 사용하여 모델링할 수도 있습니다.이 모델의 가장 좋은 예는 일반 유선 전화 [3]시스템입니다.
  3. M/G/1 Model (Takacs의 유한입력모델) : 고급 사례를 분석하기 위해 사용합니다.여기서 서비스 시간 분포는 더 이상 마르코프 프로세스가 아닙니다.이 모델에서는 한 명의 수리공이 둘 이상의 고장 기계를 수리하는 경우를 고려합니다.[4]경우 사용자의 서비스 시간이 길어집니다.

일반적으로 프리페치 입력 큐와 같은 애플리케이션에서 M/M/1 모델은 큐 기능을 제한적으로 사용하기 때문에 널리 사용됩니다.이 모델에서는 마이크로프로세서에 따라 사용자가 실행 유닛의 역할을 하고 서버가 버스 인터페이스 유닛이다.

명령 큐

프로세서는 메모리에서 명령을 가져와 실행함으로써 프로그램을 실행합니다.일반적으로 프로세서의 실행 속도는 메모리 액세스 속도보다 훨씬 빠릅니다.명령 큐는 프로세서가 현재 명령을 실행하는 동안 별도의 버퍼에서 다음 명령을 프리페치하기 위해 사용됩니다.

4단계 파이프라인에서는 명령이 실행되는 속도가 순차 [5]실행의 최대 4배가 될 수 있습니다.

프로세서에는 보통 명령을 가져오는 장치와 [6][7]명령을 실행하는 장치가 두 개 있습니다.

파이프라인 아키텍처의 실장은 버스 인터페이스 유닛과 실행 유닛이 독립된 경우에만 가능합니다.실행부가 데이터주소 버스를 사용할 필요가 없는 명령을 복호화 또는 실행하는 동안 버스 인터페이스 유닛은 메모리로부터 명령 연산 코드를 취득한다.

이 프로세스는 주소를 전송하고 opcode를 읽고 디코딩하여 실행하는 것보다 훨씬 빠릅니다.현재 명령이 디코딩되거나 실행되는 동안 다음 명령을 가져오는 것을 [8]파이프라인이라고 합니다.

8086 아키텍처는 6바이트 프리페치 명령어 파이프라인이 있으며 8088은 4바이트 프리페치입니다.실행 유닛이 현재의 명령을 실행할 때 버스 인터페이스 유닛은 메모리로부터 최대 6바이트(또는 4바이트)의 opcode를 미리 읽어낸다.큐 길이는 시뮬레이션 [9]연구에 기초하여 선택되었습니다.

실행 유닛이 분기 명령, 즉 점프 명령 또는 호출 명령을 만났을 때 예외가 발생합니다.이 경우 큐 전체를 덤프하고 명령 포인터가 가리키는 내용을 메모리에서 가져와야 합니다.

결점

명령 큐 프리페치알고리즘을 구현하는 프로세서는 기술적으로 상당히 진보되어 있습니다.이러한 프로세서의 CPU 설계 수준의 복잡도는 일반 프로세서보다 훨씬 높습니다.이는 주로 BIUEU라는 두 개의 독립된 단위를 개별적으로 운용할 필요가 있기 때문이다.

이들 칩의 복잡성이 높아지면 비용도 높아진다.이러한 프로세서는 프리페치 입력 큐가 없는 프로세서에 비해 상대적으로 비용이 많이 듭니다.

그러나 이러한 단점은 프로세서 실행 시간이 향상됨에 따라 크게 상쇄됩니다.8086 프로세서에 프리페치 명령 큐가 도입된 이후 모든 후속 프로세서에 이 기능이 포함되어 있습니다.

x86 예시 코드

code_module_여기는 다음과 같이 입력합니다.   움직이다 bx, 아.엣지   움직이다 단어 ptr cs:[bx], 9090h 전방:   jmp 근처에 종료   ; 기타 코드 To_the_end: 

이 자체 수정 프로그램은 jmp to_the_end를 2개의 NOP(0x9090으로 인코딩됨)로 덮어씁니다._the_end에 가까운 jump jmp는 2바이트의 머신코드로 조립되어 있기 때문에 2개의 NOP는 이 점프를 덮어쓰기만 하면 됩니다.(즉, 점프는 do-nothing 코드로 대체됩니다).

점프의 머신코드는 이미 PIQ에 읽혀져 있고 아마도 프로세서에 의해 이미 실행되었을 것이기 때문에(슈퍼바이저 프로세서는 여러 명령을 동시에 실행하지만 하위 호환성이 필요하기 때문에 "없는 척"), 코드 변경으로 실행 플로우가 변경되지 않습니다.

크기 감지 예제 프로그램

다음 예제에서는 PIQ 크기를 결정하는 NASM-syntax 자기 수정 x86-assembly 언어 알고리즘을 보여 줍니다.

code_module_여기는 다음과 같이 입력합니다.   xor bx, bx                  ; 제로 레지스터 bx   xor 도끼, 도끼                  ; 제로 레지스터 도끼    움직이다 dx, cs   움직이다 [코드_세그먼트], dx      ; 아래 멀리 점프에서 코드세그(edx도 여기에 있음) (edx도 여기에 있음)  주변:   cmp 도끼, 1                   ; 도끼가 변경되었는지 확인합니다.    found_size(크기)                               ; 0x90 = opcode "nop" (NO oPeration)   움직이다 바이트 [nop_field+bx], 0x90   주식회사 bx    db 0xEA                     ; 0xEA = opcode "멀리뛰기"   dw flush_flush(플래시              ; 뒤에 오프셋이 와야 합니다(rm = "dd", pm = "dd"). code_segment:   dw 0                        다음으로 코드 세그먼트(상기 참조) flash_flash:                               ; 0x40 = opcode "inc ax"(INCrease ax)   움직이다 바이트 [nop_field+bx], 0x40 nop_field:   시대 256 하지 않다    jmp 주위에 found_size:   ;   ; register bx에 PIQ 사이즈가 포함되어 있습니다.   ; 이 코드는 [real mode]및 [16-bit protected mode]용이지만 쉽게 변경할 수 있습니다.   ; [32-bit protected mode]에서도 실행됩니다.에 대한 '의식'을 바꾼다   ; 오프셋을 "dd"로 설정합니다.dx를 edx로 변경해야 합니다.   ; 글쎄요.(16비트 및 dx = 16비트 주소 지정, dd 및 edx = 32비트 주소 지정)   ; 

이 코드는 기본적으로 실행 흐름을 변경하고 PIQ의 크기를 무차별적으로 결정하는 것입니다. "앞에 있는 코드를 변경해야 영향을 받을 수 있습니까?"너무 가까운 경우(이미 PIQ에 있음) 업데이트는 아무런 영향을 미치지 않습니다.충분히 멀면 코드의 변경은 프로그램에 영향을 주고 프로그램은 프로세서의 PIQ 크기를 찾아냅니다.멀티태스킹 OS에서 이 코드가 실행되고 있는 경우 컨텍스트스위치에 의해 잘못된 값이 표시될 수 있습니다.

레퍼런스

  1. ^ "ARM Information Center". ARM Technical Support Knowledge Articles.
  2. ^ Hayes, John (1998). Computer Architecture and Organization (Second ed.). McGraw-Hill.
  3. ^ Feller, William (1968). An Introduction to Probability theory and its applications (Second ed.). John Wiley and Sons.
  4. ^ Papoulis, Athanasios; S.Unnikrishna Pillai (2008). Probability, Random Variables and Stochastic Processes (Fourth ed.). McGraw-Hill. pp. 784 to 800.
  5. ^ Zaky, Safwat; V. Carl Hamacher; Zvonko G. Vranesic (1996). Computer Organization (Fourth ed.). McGraw-Hill. pp. 310–329. ISBN 0-07-114309-2.
  6. ^ "Block diagram of 8086 CPU".
  7. ^ Hall, Douglas (2006). Microprocessors and Interfacing. Tata McGraw-Hill. p. 2.12. ISBN 0-07-060167-4.
  8. ^ Hall, Douglas (2006). Microprocessors and Interfacing. New Delhi: Tata McGraw-Hill. pp. 2.13–2.14. ISBN 0-07-060167-4.
  9. ^ McKevitt, James; Bayliss, John (March 1979). "New options from big chips". IEEE Spectrum: 28–34.

외부 링크