Belirli bir bilgisayar sistemi göz önüne alındığında, bir Meclis kodunun fiili kesin çalışma süresini tahmin etmek mümkün olur


23

bu bir montaj kodu parçası

section .text
    global _start       ;must be declared for using gcc
_start:                     ;tell linker entry point
    mov edx, len    ;message length
    mov ecx, msg    ;message to write
    mov ebx, 1      ;file descriptor (stdout)
    mov eax, 4      ;system call number (sys_write)
    int 0x80        ;call kernel
    mov eax, 1      ;system call number (sys_exit)
    int 0x80        ;call kernel

section .data

msg db  'Hello, world!',0xa ;our dear string
len equ $ - msg         ;length of our dear string

Belirli bir bilgisayar sistemi göz önüne alındığında, bir Meclis kodunun fiili çalışma zamanını kesin olarak tahmin etmek mümkündür.


30
"Bu bilgisayarda kodu çalıştır ve bir kronometre kullan" geçerli bir cevap mı?
Draconis

4
Bu kod parçasını yürütmek için harcanan zamanın çoğunun G / Ç için beklediğinden şüpheleniyorum. Bireysel talimatları uygulamak için harcadığınız zaman, kodun hafızasının yerini ve işlemciyle ilgili tüm ayrıntıları (günümüzde oldukça karmaşık olan) biliyorsanız, ancak hız da hafıza ve diskten etkilenir, Onlar hakkında da çok fazla ayrıntı bilmek zorundasınız. Bu yüzden (aynı zamanda zamanı etkileyen) fiziksel olayları düşünmüyorsanız, bunun öngörülebilir olduğunu, ancak bunu yapmak için düşünülemez derecede zor olduğunu söyleyebilirsiniz.
IllidanS4, Monica'yı

4
tahmin etmek her zaman mümkündür ...
sudo rm -rf slash

3
Durma probleminden dolayı bu da imkansız değil mi? Bazı kodlar için durup durmayacağını ispatlayabiliriz, ancak bunu tüm olası kodlar için belirleyen bir algoritmaya sahip olamayız.
kutschkem

2
@ Foco Verilen sistemin bir özelliği olurdu. Bazı bağımsız C uygulamalarında işletim sistemi yoktur; çalışan tüm giriş için donanım adreslerinden okuyabilir veya olmayabilir bir ana döngü (veya bir döngü ;-) bile değil).
Peter - Monica

Yanıtlar:


47

Sadece ilkel bir CPU el kitabından, 1986'dan beri 68020 işlemciden alıntı yapıyorum: "İşlemci uygulamasının kesin bilgisine sahip olsanız bile, bir talimat dizisinin tam çalışma zamanını hesaplamak zordur". Ki bizde olmayan. Modern bir işlemciyle karşılaştırıldığında, bu CPU ilkeldi .

Bu kodun çalışma zamanını tahmin edemiyorum ve siz de öyle. Ancak bir işlemcinin büyük önbellekleri ve büyük sıra dışı yetenekleri olduğunda, bir kod parçasının "çalışma zamanının" ne olduğunu bile tanımlayamazsınız . Tipik bir modern işlemcinin çeşitli uygulama aşamalarında olan "uçuş sırasında" 200 komutu olabilir. Bu nedenle, ilk komut baytını okumaya çalışmaktan, son komuttan emekli olmaya kadar geçen süre oldukça uzun olabilir. Ancak, işlemcinin yapması gereken diğer tüm işlerdeki gerçek gecikme daha az olabilir (ve genellikle de).

Elbette işletim sistemine iki çağrı yapmak, bunu tamamen tahmin edilemez kılıyor. "Stdout'a yazma" nın gerçekte ne yaptığını bilmiyorsunuz, bu yüzden zamanı tahmin edemezsiniz.

Bilgisayarın saat hızını, kodu çalıştırdığınız anda tam olarak bilemezsiniz. Bazı güç tasarrufu modunda olabilir, bilgisayar ısındığından dolayı saat hızını düşürmüş olabilir, bu nedenle aynı saat döngüleri bile farklı zaman alabilir.

Sonuçta: Tamamen tahmin edilemez.


11
Bence sonuçların çok güçlü. Gecikme ve verim, bir programın "çalışma zamanını" ölçmek için kullanılan ortak ölçümlerdir. Ayrıca, uygun bir "çalışma zamanı" tanımına kolayca karar verebilirsiniz. Ayrıca, sistem durumu, hw ve sw'nin tam bir anlık görüntüsüne ve CPU içindekilerinin mükemmel bir bilgisine sahipseniz, çalışma zamanını tahmin edebilirsiniz. Intel'de muhtemelen çalışma zamanını tahmin edebiliyorlar, burada SO'da bile gecikmeleri ve girişleri çevrim doğruluğu ile tahmin edebiliyoruz. Bu durumda, sistemlerin yanı sıra, o kadar da zor değil.
Margaret Bloom

9
@MargaretBloom o zaman bile değil. Telefonumu fırına çok yakına yerleştiriyorum, CPU sıcaklığı yönetmek için altını çiziyor, çalışma zamanı tahmininiz aniden çok düşük. Ve döngüleri saysanız ve sistem çağrısı yapmasanız bile, diğer iş parçacıkları ve CPU'lar RAM içeriği ile iyi bir şekilde oynayabilir veya siz beklenmedik durumlara bağlı olarak, güçten farklı olarak tahmin edilemeyen koşullara bağlı olarak, sabit disk sürücünüze boşaltabilirler. Sabit sürücüyü sadece yavaşlatan rakipler, rakip bir dişlinin sizinkini mahvetmek için yeterli hafızayı alabilmesi için yeterli hafızayı alacaktır, yuvarlanacak zarların ne kadarını boşa harcayacağını görmek için.
John Dvorak

6
Bunun yanı sıra, "sistem durumu, hw ve sw'nin tam bilgisi" oldukça uzun bir düzendir, diye düşünüyorum. Önceden "10 msn" ekleyin, zaten imkansız olanı istiyorsunuz. Eğer CPU'nuzun donanımsal rasgele sayı üretme uygulaması kuantum olaylarını kullanıyorsa (muhtemelen öyledir) ve CPU'daki bazı konular onu çağırırsa, o zaman bilgisayarın etrafındaki 3000 km'lik evrenin tam durumunu bile bilmeyeceksiniz. Ve MWI'da, doğru tahmin bile edemezsiniz.
John Dvorak

8
@Nat: Hatta kriptolojide, "sabit zaman" değil gerçekten kesinlikle sabit demek - çalışma süresi gizli verilere bağlıdır ve istatistiksel onunla ilişkili olabilecek sistematik varyasyonlar olduğunu sadece anlamına gelir. Ve pratikte, sık sık, sadece alınan kod yolu ve yürütülen hafızaya giriş şekli gizli verilere dayanmadığı ve değişken bir süre aldığı bilinen belirli talimatlardan kaçınılması halinde (veya bunların girişlerinin maskelenmiş olduğu) varsayılır. umarım korelasyonu ortadan kaldırır), muhtemelen yeterince iyidir. Bunun ötesinde, gerçekten ölçmeniz gerekiyor.
Ilmari Karonen

2
68020 karmaşık bir canavardır ... MCS51'i deneyin ....
rackandboneman

29

Bunu genel olarak yapamazsınız, ancak bazı açılardan, çok fazla şey yapabilirsiniz ve gerçekten yapmak zorunda olduğunuz birkaç tarihsel durum olmuştur .

Atari 2600 (veya Atari Video Bilgisayar Sistemi), Atari işlemci zorunda anlamı cihaza bir çerçeve tampon vermek yetmeyeceğini en erken ev video oyun sistemleri biriydi ve ilk dönemin daha sonraki sistemlerin aksine 1978'de serbest bırakıldı ne üretileceğini belirlemek için her tarama satırında kod çalıştırmak - bu kodun çalışması 17.08 mikrosaniyeyi geçerse (HBlank aralığı), grafikler tarama çizgisi çizilmeye başlamadan önce uygun şekilde ayarlanmayacaktır. Daha kötüsü, programcı Atari'nin normalde izin verdiğinden daha karmaşık bir içerik çizmek istiyorsa, talimatlar için tam süreleri ölçmek ve ışın çizilirken grafik kayıtlarını değiştirmek için tüm tarama çizgisi için 57.29 mikrosaniye aralıklarla değiştirmek zorunda kaldılar.

Bununla birlikte, Atari 2600, 6502 tabanlı birçok diğer sistemde olduğu gibi, bu senaryo için gereken dikkatli zaman yönetimini sağlayan çok önemli bir özelliğe sahipti: CPU, RAM ve TV sinyali hepsi aynı ustaya dayanarak saatlerce tükendi saat. TV sinyali, 3.98 MHz'lik bir saat kullanarak, yukarıdaki zamanları, TV sinyalini yöneten bir tam sayıdaki "renkli saat" e bölüştürdü ve CPU ve RAM saatlerinin bir çevrimi, CPU saatinin tam olmasını sağlayan tam üç renkli saatti. Geçerli ilerleme TV sinyaline göre doğru bir zaman ölçüsü. (Bununla ilgili daha fazla bilgi için, Stella Atari 2600 öykünücüsü için yazılmış Stella Programcı Kılavuzu'na bakın ).

Bu işletim ortamı, ayrıca, her CPU komutunun her durumda alacağı belli bir devir sayısına sahip olduğu anlamına geliyordu ve çoğu 6502 geliştirici bu bilgiyi referans tablolarında yayınladı. Örneğin CMP, bu tablodan alınan (Akü ile Belleği Karşılaştır) talimatı için bu girişi göz önünde bulundurun :

CMP  Compare Memory with Accumulator

     A - M                            N Z C I D V
                                    + + + - - -

     addressing    assembler    opc  bytes  cycles
     --------------------------------------------
     immediate     CMP #oper     C9    2     2
     zeropage      CMP oper      C5    2     3
     zeropage,X    CMP oper,X    D5    2     4
     absolute      CMP oper      CD    3     4
     absolute,X    CMP oper,X    DD    3     4*
     absolute,Y    CMP oper,Y    D9    3     4*
     (indirect,X)  CMP (oper,X)  C1    2     6
     (indirect),Y  CMP (oper),Y  D1    2     5*

*  add 1 to cycles if page boundary is crossed

Tüm bu bilgileri kullanarak, Atari 2600 (ve diğer 6502 geliştiricileri), kodlarının ne kadar sürdüğünü tam olarak belirleyebildi ve Atari'nin TV sinyali zamanlama gereksinimlerine uymak için ihtiyaç duyduklarını ve rutinlerini oluşturdular. Ve bu zamanlama çok kesin olduğu için (özellikle NOP gibi zaman harcayan talimatlar için), grafikleri çizilirken değiştirmek için bile kullanabildiler.


Elbette, Atari'nin 6502'si çok özel bir durumdur ve bunların tümü, yalnızca sistemin aşağıdakilerin hepsine sahip olması nedeniyle mümkündür:

  • RAM dahil her şeyi koşturan ana saat. Modern sistemler CPU ve RAM için bağımsız saatlere sahiptir, RAM saati genellikle daha yavaş, ikisi de senkronize olmamakla birlikte.
  • Hiçbir önbelleğe alma yok - 6502 her zaman doğrudan DRAM'a erişiyordu. Modern sistemler, durumu tahmin etmeyi zorlaştıran SRAM önbelleklerine sahiptir - bir sistemin önbellekle davranışını tahmin etmek hala mümkün olsa da, kesinlikle daha zordur.
  • Aynı anda çalışan başka program yok - kartuştaki programın sistemi tamamen kontrol altına aldı. Modern sistemler, deterministik olmayan programlama algoritmaları kullanarak bir kerede birden fazla program yürütmektedir.
  • Bir saat hızı, sinyallerin zaman içinde sistemde dolaşabileceği kadar yavaş. Saat hızı 4 GHz olan modern bir sistemde (örneğin) yarım metrelik bir anakartın uzunluğunu hareket ettirmek için 6.67 saat devri ışık fotonu alır - modern bir işlemcinin tahtadaki başka bir şeyle etkileşime girmesini asla bekleyemezsiniz. sadece bir çevrimde, çünkü panodaki bir sinyalin cihaza ulaşması birden fazla döngü gerektiriyor.
  • Nadiren değişen iyi tanımlanmış bir saat hızı (Atari durumunda 1.19 MHz) - modern sistemlerin CPU hızları her zaman değişirken, Atari TV sinyalini etkilemeden bunu yapamadı.
  • Yayınlanmış döngü zamanlamaları - x86, talimatlarından herhangi birinin ne kadar süreceğini tanımlamaz.

Bunların hepsi bir araya gelerek, bir miktar zaman alan bir dizi talimatın işlenmesinin mümkün olduğu bir sistem oluşturmak için bir araya geldi - ve bu uygulama için, tam olarak talep edildi. Çoğu sistemde bu derece bir hassasiyet yoktur, çünkü buna gerek yoktur - hesaplamalar bittiğinde yapılır veya kesin bir zaman gerektiğinde, bağımsız bir saat sorgulanabilir. Ancak ihtiyaç doğru ise (bazı gömülü sistemlerde olduğu gibi), yine de görünebilir ve kodunuzun bu ortamlarda ne kadar süreyle çalışacağını doğru bir şekilde belirleyebilirsiniz.


Ayrıca, tüm bunların yalnızca kesin bir zaman alabilecek bir dizi montaj talimatı oluşturmak için geçerli olduğuna dair büyük büyük sorumluluk reddini de eklemeliyim . Bu ortamlarda bile istediğiniz bazı montaj parçalarını almak ve "Bu işlem ne kadar sürer?" Diye sormak, kategorik olarak bunu yapamazsınız - bu çözülemeyen kanıtlanmış Halting Sorunu .


DÜZENLEME 1: Bu cevabın önceki bir versiyonunda, Atari 2600'ün işlemcisini TV sinyalinin neresinde olduğunu bildirmenin hiçbir yolu olmadığını, bu sayede tüm programı en baştan saymaya ve senkronize etmeye zorladı. Yorumlarda da belirtildiği gibi, bu, ZX Spectrum gibi bazı sistemler için doğrudur, ancak Atari 2600 için doğru değildir, çünkü bir sonraki yatay boşluk aralığı gerçekleşene kadar CPU'yu durduran bir donanım kaydı içerir. isteğe bağlı olarak dikey boşluk aralığına başlamak için bir işlev. Bu nedenle, döngüleri sayma sorunu her bir tarama çizgisiyle sınırlıdır ve yalnızca geliştirici, tarama çizgisi çizilirken içeriği değiştirmek isterse kesinleşir.


3
Ayrıca, oyunların çoğunun mükemmel çalışmadığı da belirtilmelidir - video sinyalinin uyumsuz zamanlaması nedeniyle, video programında hata olması nedeniyle (programcı hatası (CPU zamanlamasının yanlış tahmin edilmesi) veya sadece çok fazla olması nedeniyle) video çıktısında birçok eser görülebilir. yapılacak iş. Aynı zamanda çok kırılgandı - bir hatayı düzeltmek ya da yeni özellikler eklemek gerekirse, zaman zaman kaçınılmaz olarak zamanlamayı bozacaktınız. Eğlenceliydi, ama aynı zamanda bir kabus :) Saat hızının her zaman tam olarak doğru olup olmadığından bile emin değilim - örneğin aşırı ısınma, girişim vb.
Luaan

1
İyi cevap, Atari 2600'deki her bir komut için döngü sayısını saymanız gerekmediğini nitelemek istememize rağmen. Bunu yapmak zorunda kalmamanıza yardımcı olacak iki özelliği vardır: Başlattığınız bir geri sayım sayacı ve sonra 0'a ulaşıp ulaşmadığını görmek için yoklayın ve bir sonraki yatay boşluk başlayana kadar CPU'yu durduran bir kayıt defteri. ZX Spektrumu gibi diğer birçok cihaz da böyle bir şeye sahip değildir ve gerçekte ekranın nerede olduğunu bilmek için dikey boşluk kesmeden sonra harcanan her bir döngüyü saymanız gerekir.
Martin Vilcans

1
Halting sorununun kesinlikle Atari için geçerli olmadığını savunuyorum. Atari'nin G / Ç özelliklerini hariç tutar ve onu tipik bir kartuş ROM ile sınırlandırırsanız, Sonlu miktarda depolama alanı vardır. Bu noktada sonlu bir durum makineniz var, bu yüzden üzerinde herhangi bir programın durması ya da daha önce girmiş olduğu bir duruma girmesi gerekir;
user1937198

1
@ user1937198 128 baytlık durum (artı kayıtlardakiler) MORE i daha sonra Turing makinesinin teorik sonsuz bandı ile bu arasındaki farkı yalnızca teoride önemli olan bir ayrım yapmak için yeterli durum alanıdır. Cehennem, pratik olarak bir AES anahtarı gibi 128 BITS'i arayamıyoruz ... Devlet alanı siz bit ekledikçe hızla büyüyor. Unutmayın ki 'Devre Dışı Bırakma eşdeğeri; Durma neredeyse kesinlikle mümkün olurdu.
Dan Mills, 22

1
“bu çözülemez olduğu kanıtlanan Halting Problemidir. Buna rastlarsanız, kronometreyi kırmanız ve gerçekten kodunuzu çalıştırmanız gerekir.” - bu anlamlı değil. Turing'in ispatını kodu simüle etmek yerine “gerçekten” çalıştırarak kaçamazsınız. Eğer durursa, ne kadar süre durması gerektiğini zamanlayabilirsiniz. Durmazsa, gelecekte genel olarak durup durmayacağından veya sonsuza kadar koşacağından asla emin olamazsınız. Gerçek veya benzetilmiş bir kronometre ile aynı sorun. En azından bir simülasyonda, içsel durumu döngü belirtileri açısından daha kolay inceleyebilirsiniz.
benrg

15

Burada oyunun iki yönü var.

@ Gnasher729'un işaret ettiği gibi, uygulanacak talimatları tam olarak biliyorsak, önbellekleme, dal tahmini, ölçeklendirme vb.

Ancak, durum daha da kötüdür. Bir montaj grubu göz önüne alındığında, hangi talimatların çalışacağını bilmek, hatta kaç talimatın çalışacağını bilmek imkansızdır. Bunun nedeni Rice'ın teoremidir: Bunu kesin olarak tespit edersek, bu bilgiyi Halting Problemini çözmek için kullanabiliriz ki bu mümkün değildir.

Montaj kodu, bir programın tam izini muhtemelen sonsuz yapmak için yeterli atlamalar ve dallar içerebilir. Maliyet anlambilimi veya açıklamalı tip sistemler gibi şeylerle yürütmede üst sınırlar sağlayan yürütme zamanının muhafazakar yaklaşımları üzerinde çalışmalar yapılmıştır . Özel olarak montaj için hiçbir şey bilmiyorum ama böyle bir şey varsa şaşırmam.


4
Yani, Durma Sorunu doğrudan burada geçerlidir, çünkü çalışma zamanını bilseydik durduğunu bilirdik. Ayrıca, hiçbir koşullu olmama durumu, burada bile yardımcı olmuyor, çünkü mov
x86'da

7
Rice ve Halting Problemi isteğe bağlı (herhangi bir) program hakkında ifadelerdir - ancak buradaki OP soruda belirli bir kod parçasını belirlemiştir. Bireysel veya sınırlı program kategorileri hakkında semantik ve durma özellikleri belirleyebilirsiniz. Sadece tüm programları kapsayan genel bir prosedür yok.
Daniel R. Collins

2
Bundan sonra hangi komutun çalışacağını kesin olarak bilebiliriz, ne söyleyemeyeceğimiz, eğer bir kez vurursak sys_exitve böylece kronometreyi durdururuz. Böyle pratik bir soru için makul olan programları sonlandırmakla sınırlandırırsak, o zaman cevap aslında evet (programa başlamadan hemen önce sistemin durumunu, hızını ve anahtarını gösteren mükemmel bir görüntüye sahip olduğunuz).
Margaret Bloom

1
@ BlueRaja-DannyPflughoeft Mov dönüyor, ancak OP burada bulunan kod parçasında değil. Ama bu yine de int
meselenin

2

"Bilgisayar sistemi" seçimi mikrodenetleyicileri içeriyor mu? Bazı mikrodenetleyiciler çok öngörülebilir yürütme sürelerine sahiptir, örneğin, 8 bit PIC serisi, talimatlar farklı bir adrese dallanmadıkça, flaştan okumadıkça veya özel iki kelimelik bir talimat olmadıkça, komut başına dört saat döngüsüne sahiptir.

Kesintiler bu tür bir zaman aşımını engeller.

Montaj ve özel bir kodlama stili kullanarak her zaman aynı zamanda çalışacak kod yazmak mümkündür. Şimdi çoğu PIC varyantının birden fazla zamanlayıcısı olduğu kadar yaygın değildir, ancak mümkündür.


2

8-bit bilgisayarların çağında, bazı oyunlar böyle bir şey yaptı. Programcılar, video ve ses donanımının tam zamanlamaları ile senkronize etmek için harcadıkları süreye ve CPU'nun bilinen saat hızına bağlı olarak talimatları uygulamak için harcadıkları zamanı kullanırlar. O günlerde ekran, her bir ekran çizgisi boyunca sabit bir hızda dolaşan ve fosforları etkinleştirmek veya devre dışı bırakmak için katod ışını açıp kapatarak bu piksel sırasını boyayacak bir katod ışını tüpü monitörü idi. Programcılar, video donanımına, ışın ekranın o kısmına ulaşmadan hemen önce ne göstereceklerini söylemeleri ve kodun geri kalan kısmını kalan zamana uydurmaları gerektiğinden, “ışın yarışına” diyorlardı.

Kesinlikle herhangi bir modern bilgisayarda ya da örneğiniz gibi bir kod için işe yaramayacaktı.

Neden olmasın? İşte basit, tahmin edilebilir zamanlamayı bozacak şeyler:

İşlemci hızı ve bellek alımı, yürütme süresindeki darboğazlardır. Bir CPU'yu yürütmek için talimatlar alabileceğinden daha hızlı çalıştırmak ya da CPU'ların kabul edebileceğinden daha hızlı bayt teslim edebilen bir bellek yüklemek çok zahmetlidir. Bu nedenle, eski bilgisayarlar aynı saatte kaçtı. Modern CPU'lar ana bellekten çok daha hızlı çalışır. Bunu talimat ve veri önbellekleriyle yönetiyorlar. Önbellekte bulunmayan baytları beklemesi gerekirse CPU hala durur. Bu nedenle aynı talimatlar, önbellekte zaten bulunmadıklarından çok daha hızlı çalışırlar.

Ayrıca, modern işlemciler uzun boru hatlarına sahiptir. Çipin başka bir kısmının boru hattındaki sonraki birkaç talimat üzerinde ön çalışmalar yapmasını sağlayarak yüksek verimlerini sürdürüyorlar. Eğer CPU bir sonraki komutun ne olacağını bilmiyorsa, bu bir dal olduğunda gerçekleşebilecek başarısız olur. Bu nedenle, CPU'lar koşullu sıçramaları tahmin etmeye çalışır. (Bu kod parçacığı içinde hiç yok, ama belki de boru hattını tıkanmış olduğunu buna bir mispredicted koşullu atlama yoktu. Ayrıca, efsanevi cevap bu bağlantıya iyi bir bahane.) Benzer şekilde, sistem çağrı o int 80çekirdek moduna aslında içine tuzak Tahmin edilemez bir gecikmeye neden olan bir kesme kapısı olan karmaşık bir CPU özelliği kullanıyorlar.

İşletim sisteminiz önleyici çoklu görev kullanıyorsa, bu kodu çalıştıran iş parçacığı her an zaman dilimini kaybedebilir.

Işınla yarışmak da işe yaradı çünkü program çıplak metal üzerinde çalışıyordu ve doğrudan donanıma çarpıyordu. Burada, int 80sistem çağrısı yapmak için arıyorsun . Bu, kontrolü size işletim sistemine geçirir ve bu size zamanlama garantisi vermez. Daha sonra herhangi bir cihaza yönlendirilmiş olabilecek isteğe bağlı bir akışta G / Ç yapmasını söylersiniz. G / Ç’nin ne kadar zaman alacağını söylemek sizin için çok soyut, ancak talimatları yürütmek için harcanan süreye kesinlikle hakim olacak.

Modern bir sistemde tam zamanlama istiyorsanız, bir gecikme döngüsü başlatmanız gerekir. Hızlı yinelemelerin en yavaş hızda çalışmasını sağlamalısınız, tersi mümkün değil. İnsanların gerçek dünyada bunu yapmasının bir nedeni, kriptografik bilgilerin bir saldırgana sızmasını önlemek ve talepleri diğerlerinden daha uzun sürebilir.


1

Bu biraz teğet ancak uzay mekiği, doğru bir şekilde senkronize edilmesine bağlı, yani çalışma sürelerinin tam olarak eşleşmesine bağlı 4 gereksiz bilgisayara sahipti.

Uzay mekiğinin ilk lansman girişimi, Yedek Uçuş Yazılımı (BFS) bilgisayarı dört Birincil Aviyonik Yazılım Sistemi (PASS) bilgisayarı ile senkronize edilmeyi reddettiği zaman temizlendi. "Bug Heard Yuvarlak Dünya" in Detaylar burada . Büyüleyici, yazılımın döngü için döngüyle eşleşecek şekilde nasıl geliştirildiğini ve size ilginç bir geçmiş vermesini okuyun.


0

Sanırım burada iki farklı konuyu karıştırıyoruz. (Ve evet, bunun başkaları tarafından söylendiğini biliyorum, ama umarım daha net ifade edebilirim.)

Öncelikle, kaynak kodundan gerçekten yürütülen komutların sırasına (kodun yanı sıra giriş verilerinin bilgisine ihtiyaç duyan - bir döngüde kaç kez dolaşıyorsunuz? ). Durma problemi nedeniyle, talimatların sırası sonsuz olabilir (sonlandırılmayan) ve girdi verisi bilgisiyle bile her zaman bunu statik olarak belirleyemezsiniz.

Yürütülecek talimat sırasını belirledikten sonra, yürütme süresini belirlemek istersiniz. Bu kesinlikle sistem mimarisinin bir bilgisi ile tahmin edilebilir. Ancak sorun şu ki, birçok modern makinede yürütme süresi, büyük ölçüde bellek getirme önbelleğe alınmasına bağlıdır; bu, çalıştırılan talimatlardaki gibi girdi verilerine bağlı olduğu anlamına gelir. Ayrıca, yine verilere bağımlı olan koşullu şube varış yerlerinin doğru tahminine de bağlıdır. Yani bu sadece bir tahmin olacak, kesin olmayacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.