Giriş kuyruğunu önceden getir - Prefetch input queue

Talimat alınıyor işlem kodları programdan hafıza önceden olarak bilinir önceden getirme ve kullanılarak servis edilir giriş kuyruğunu önceden getir (PIQ). Önceden getirilmiş talimatlar veri yapısında depolanır - yani kuyruk. İşlem kodlarının yürütülmeye ihtiyaç duyulmadan çok önceden getirilmesi, işlem kodlarının genel verimliliğini artırır. işlemci hızını artırıyor. İşlemcinin artık, sonraki komut işlem kodunun tamamlanması için bellek erişim işlemlerini beklemesi gerekmez. Bu mimari, Intel 8086 mikroişlemci.

Giriş

Ardışık düzen 1960'larda daha hızlı ve daha verimli bilgi işlem ihtiyacı nedeniyle bilgi işlem mimarisi tasarımının ön saflarına getirildi. Ardışık düzen daha geniş bir kavramdır ve çoğu modern işlemci talimatlarını biraz yükler saat döngüleri onları infaz etmeden önce. Bu, ön yükleme ile elde edilir makine kodu hafızadan bir giriş kuyruğunu önceden getir.

Bu davranış[açıklama gerekli ] sadece için geçerlidir von Neumann bilgisayarlar (Bu değil Harvard mimarisi çalıştırabilen bilgisayarlar) kendi kendini değiştiren kod ve bir çeşit var talimat ardışık düzeni. Neredeyse tüm modern yüksek performanslı bilgisayarlar bu üç gereksinimi karşılar.[1]

Genellikle, PIQ'nun önceden getirme davranışı, programlama modeli CPU'nun. Bununla birlikte, PIQ davranışının görünür olduğu ve programcı tarafından dikkate alınması gereken bazı durumlar vardır.

Ne zaman x86 -işlemci modu değiştirir bölge modu -e korumalı mod ve tam tersi, PIQ'nun temizlenmesi gerekir, aksi takdirde CPU, makine kodu Sanki son modunda yazılmış gibi. PIQ boşaltılmazsa, işlemci kodlarını yanlış çevirebilir ve geçersiz bir talimat oluşturabilir istisna.

Yürütürken kendi kendini değiştiren kod mevcut yürütme konumunun hemen önündeki işlemci kodundaki bir değişiklik, işlemcinin kodu yorumlama şeklini değiştirmeyebilir, çünkü kod zaten PIQ'suna yüklenmiştir. Kodun yeni ve değiştirilmiş sürümü yerine, PIQ'da zaten yüklü olan eski kopyasını çalıştırır. Veri deposu ve / veya önbellek.

PIQ'nun bu davranışı, kodun bir içinde çalıştırılıp çalıştırılmadığını belirlemek için kullanılabilir. öykünücü veya doğrudan gerçek bir CPU'nun donanımında.[kaynak belirtilmeli ] Çoğu emülatör, muhtemelen bu davranışı asla simüle etmeyin. PIQ-boyutu sıfır ise (koddaki değişiklikler her zaman işlemcinin durumunu hemen etkiler), ya kodun bir emülatörde yürütüldüğü ya da işlemcinin PIQ'da yüklü adreslere yazması üzerine PIQ'yu geçersiz kıldığı sonucuna varılabilir.

Kuyruk teorisine dayalı performans değerlendirmesi

Öyleydi A.K Erlang (1878-1929), bir kuyruğu telefon trafiğindeki tıkanıklığa bir çözüm olarak ilk kez düşündü. Farklı kuyruk modelleri gerçek zamanlı kuyruk sistemlerini yaklaşık olarak simüle etmek için önerilmiştir, böylece bunlar farklı performans özellikleri için matematiksel olarak analiz edilebilir.

Kuyruk modelleri kullanılarak temsil edilebilir Kendall notasyonu:

A1 / A2 / A3 / A4

nerede:

  • A1, iki varış arasındaki zaman dağılımıdır
  • A2, hizmet süresi dağılımıdır
  • A3, toplam sunucu sayısıdır
  • A4 sistemin kapasitesidir
  1. M / M / 1 Modeli (Tek Sıra Tek Sunucu / Markoviyen ): Bu modelde, sıra unsurları ilk gelen ilk alır esasına göre sunulur. Ortalama varış ve hizmet oranları göz önüne alındığında, gerçek oranlar bu ortalama değerler etrafında rastgele değişir ve bu nedenle bir kümülatif olasılık dağılımı işlevi.[2]
  2. M / M / r Modeli: Bu model, birden çok sunucunun paralel olarak çalıştığı temel M / M / 1 modelinin bir genellemesidir. Bu tür bir model, hizmet almıyorlarsa hemen kuyruktan çıkan sabırsız kullanıcıların senaryolarını da modelleyebilir. Bu aynı zamanda bir Bernoulli süreci sadece iki duruma sahip olmak, başarı ve başarısızlık. Bu modelin en iyi örneği, normal sabit telefon sistemlerimizdir.[3]
  3. M / G / 1 Modeli (Takacs'ın sonlu girdi Modeli): Bu model gelişmiş durumları analiz etmek için kullanılır. Burada hizmet süresi dağılımı artık bir Markov süreci. Bu model, birden fazla arızalı makinenin tek bir tamirci tarafından tamir edilmesi durumunu dikkate alır. Bu durumda herhangi bir kullanıcı için hizmet süresi artacaktır.[4]

Genellikle önceden getirilmiş giriş kuyruğu gibi uygulamalarda, M / M / 1 Modeli, kuyruk özelliklerinin sınırlı kullanımı nedeniyle yaygın olarak kullanılmaktadır. Mikroişlemcilere göre bu modelde, kullanıcı yürütme biriminin rolünü üstlenir ve sunucu, veri yolu arayüz birimidir.

Talimat sırası

İşlemci, talimatları bellekten alıp çalıştırarak bir programı yürütür. Genellikle işlemci yürütme hızı, bellek erişim hızından çok daha hızlıdır. Komut kuyruğu, işlemci geçerli talimatı yürütürken sonraki talimatları ayrı bir arabellekte önceden getirmek için kullanılır.

Birlikte dört aşamalı boru hattı, komutların yürütüldüğü hız, sıralı yürütmenin dört katına kadar çıkabilir.[5]

İşlemcinin genellikle talimatları almak ve talimatları yürütmek için iki ayrı birimi vardır.[6][7]

Bir uygulaması boru hattı mimari yalnızca veri yolu arabirim birimi ve yürütme birimi bağımsızsa mümkündür. Yürütme birimi, kod çözerken veya bir komutun kullanımını gerektirmeyen bir komutu yürütürken veri ve adres otobüsleri veriyolu arabirim birimi, talimat işlem kodları hafızadan.

Bu işlem, bir adres göndermekten, işlem kodunu okumaktan ve ardından kodunu çözüp yürütmekten çok daha hızlıdır. Geçerli talimatın kodu çözülürken veya yürütülürken bir sonraki talimatı getirmeye ardışık düzen denir.[8]

8086 mimarinin altı baytlık bir önceden getirme talimatı ardışık düzeni varken 8088 dört baytlık ön yüklemeye sahiptir. Yürütme Birimi mevcut talimatı yürütürken, veri yolu arabirim birimi önceden hafızadan altı (veya dört) bayta kadar işlem kodu okur. Sıra uzunlukları simülasyon çalışmalarına göre seçildi.[9]

Yürütme birimi bir şube talimat, yani bir atlama veya bir çağrı talimatı. Bu durumda, kuyruğun tamamı atılmalı ve talimat göstericisi tarafından gösterilen içerikler bellekten alınmalıdır.

Dezavantajlar

Komut kuyruğu önceden getirme algoritmasını uygulayan işlemciler teknik olarak oldukça gelişmiştir. CPU tasarımı bu tür işlemcilerin düzey karmaşıklığı, normal işlemcilerden çok daha yüksektir. Bunun başlıca nedeni, iki ayrı birimin uygulanması gerekliliğidir, BIU ve AB ayrı çalışır.

Bu yongaların karmaşıklığı arttıkça maliyet de artar. Bu işlemciler, önceden giriş kuyruğu olmayan muadillerine göre nispeten daha pahalıdır.

Bununla birlikte, bu dezavantajlar, işlemci yürütme süresindeki gelişme ile büyük ölçüde dengelenmiştir. 8086 işlemcide önceden getirme talimat kuyruğunun eklenmesinden sonra, tüm ardışık işlemciler bu özelliği dahil etti.

x86 örnek kodu

code_starts_here:  mov bx, Ahyemek  mov kelime ptr cs:[bx], 9090hileride:  jmp yakın sonuna kadar  ; Başka bir kodsonuna kadar:

Bu kendini değiştiren programın üzerine yazacak jmp to_the_end ikisiyle NOP'lar (olarak kodlanır 0x9090). Zıplama to_the_end yakınında jmp iki baytlık makine kodu olarak birleştirilir, bu nedenle iki NOP bu atlamanın üzerine yazar ve başka hiçbir şey yazmaz. (Yani, atlama, hiçbir şey yapmama koduyla değiştirilir.)

Zıplamanın makine kodu zaten PIQ'ya okunduğundan ve muhtemelen işlemci tarafından zaten yürütüldüğünden (süper skalar işlemciler aynı anda birkaç talimatı yürütür, ancak ihtiyaç duydukları için yapmadıklarını "iddia ederler". geriye dönük uyumluluk ), kod değişikliğinde yürütme akışında herhangi bir değişiklik olmayacaktır.

Boyutu algılamak için örnek program

Bu bir örnektir NASM -sözdizimi kendini değiştiren x86 -montaj dili PIQ'nun boyutunu belirleyen algoritma:

code_starts_here:  Xor bx, bx                  ; sıfır kayıt bx  Xor balta, balta                  ; sıfır kayıt baltası  mov dx, cs  mov [code_segment], dx      ; aşağıdaki uzak atlamada kodları "hesapla" (edx burada da)etrafında:  cmp balta, 1                   ; baltanın değiştirilip değiştirilmediğini kontrol edin  je found_size                              ; 0x90 = işlem kodu "nop" (İşlem yok)  mov bayt [nop_field+bx], 0x90  inc bx  db 0xEA                     ; 0xEA = "uzak atlama" işlem kodu  dw flush_queue              ; ardından ofset gelmelidir (rm = "dw", pm = "dd")code_segment:  dw 0                        ; ve sonra kod segmenti (yukarıda hesaplanmıştır)flush_queue:                              ; 0x40 = opcode "inc ax" (ekseni artır)  mov bayt [nop_field+bx], 0x40nop_field:  zamanlar 256 hayır   jmp etrafındafound_size:  ;  ; register bx artık PIQ'nun boyutunu içeriyor  ; bu kod [[gerçek mod]] ve [[16 bit korumalı mod]] içindir, ancak kolayca şu şekilde değiştirilebilir  ; [[32-bit korumalı mod]] için de çalışıyor. sadece "dw" yi değiştirin  ; uzaklık "gg". Ayrıca dx'i edx olarak değiştirmelisiniz.  ; iyi. (dw ve dx = 16 bit adresleme, dd ve edx = 32 bit adresleme)  ;

Bu kodun yaptığı şey, temelde yürütme akışını değiştirmesi ve kaba kuvvet PIQ'nun ne kadar büyük olduğu. "Beni etkilemesi için önümdeki kodu ne kadar uzakta değiştirmem gerekiyor?" Çok yakınsa (zaten PIQ içindeyse) güncellemenin herhangi bir etkisi olmayacaktır. Yeterince uzaksa, kodun değiştirilmesi programı etkileyecektir ve program işlemcinin PIQ'sunun boyutunu bulmuştur.Bu kod çok görevli işletim sistemi altında çalıştırılıyorsa, bağlam anahtarı yanlış değere yol açabilir.

Referanslar

  1. ^ "ARM Bilgi Merkezi". ARM Teknik Destek Bilgi Yazıları.
  2. ^ Hayes, John (1998). Bilgisayar Mimarisi ve Organizasyonu (İkinci baskı). McGraw-Hill.
  3. ^ Feller William (1968). Olasılık teorisine ve uygulamalarına Giriş (İkinci baskı). John Wiley and Sons.
  4. ^ Papoulis, Athanasios; S. Unnikrishna Pillai (2008). Olasılık, Rastgele Değişkenler ve Stokastik Süreçler (Dördüncü baskı). McGraw-Hill. sayfa 784 ila 800.
  5. ^ Zekâ, Safvat; V. Carl Hamacher; Zvonko G. Vranesic (1996). Bilgisayar organizasyonu (Dördüncü baskı). McGraw-Hill. pp.310–329. ISBN  0-07-114309-2.
  6. ^ "8086 CPU'nun blok şeması".
  7. ^ Hall, Douglas (2006). Mikroişlemciler ve Arabirim. Tata McGraw-Hill. s. 2.12. ISBN  0-07-060167-4.
  8. ^ Hall, Douglas (2006). Mikroişlemciler ve Arabirim. Yeni Delhi: Tata McGraw-Hill. s. 2.13–2.14. ISBN  0-07-060167-4.
  9. ^ McKevitt, James; Bayliss, John (Mart 1979). "Büyük çiplerden yeni seçenekler". IEEE Spektrumu: 28–34.

Dış bağlantılar