Çalışma zamanı ortamı sonsuz bir döngü algılayabilir mi?


19

Bir çalışma zamanı ortamının sonsuz döngüleri algılaması ve daha sonra ilgili işlemi durdurması mümkün olur muydu veya böyle bir mantığın uygulanması, durdurma sorununun çözümü ile eşdeğer midir?

Bu sorunun amacı için, yürütüldüğünde, işlemi tam olarak önceki durumuna (veriler dahil) döndüren bir dizi talimat ve ilişkili başlangıç ​​yığını / yığın verisi anlamına gelen bir "sonsuz döngü" tanımlarım. sonsuz döngüyü başlatır. (Başka bir deyişle, pi'nin süresiz olarak uzun bir ondalık genişlemesi üreten bir program "sonsuz döngüde" "sıkışmaz", çünkü her yinelemede ilişkili belleğinde bir yerde daha fazla pi rakamı vardır.)

( Https://stackoverflow.com/q/16250472/1858225 adresinden taşındı )



Ben öyle düşünmüyorum; girişte herhangi bir kısıtlama yoktur.
Kyle Strand

Sorunuz gerçek bir çalışma ortamı (JVM gibi) ya da böyle bir döngüyü algılamanın programlı olarak genel bir şekli mi?
Benj

@Benj stackoverflow.com/q/16249785/1858225 Orijinal soru (benim olmayan) gerçek çalışma ortamı (ya da daha çok işletim sistemleri hakkında) idi. Yine de bu kapandı, bu yüzden onu yeniden yazdım, odağı teorik tarafa kaydırdım.
Kyle Strand

TAMAM. Bunu görmenin tek yolu bazı anahtar noktaları örneklemek ve bunlardan bir karma yapmak (bu bir günlük çıkışının son satırları veya yığın ptr gibi bazı CPU durumları olabilir) ve bir dizi probun (bir kümenin karmalarını) saklamaktır. belirli bir zamanda) bir Markov Zincirinde. Ardından, döngüsel kilitleri tespit edebileceksiniz (doğru "probları" seçerek). Ayrıca sistem kütüphanelerinin erişimlerini takma ve girişlerini prob olarak kullanma hakkında da düşünüyorum. Keyfini çıkarın;)
Benj

Yanıtlar:


11

Bir çalışma zamanı ortamının aşağıdaki prosedürü kullanarak bu tür döngüleri kontrol etmesi teorik olarak mümkün olabilir :

Herhangi bir talimat yürütüldükten sonra, çalışma zamanı ortamı çalışan bir işlemin (yani, kayıtlar, PC, yığın, yığın ve genel bilgiler dahil olmak üzere onunla ilişkili tüm bellek) tam bir görüntüsünü oluşturur, bu görüntüyü bir yere kaydeder ve ardından o işlem için önceden kaydedilmiş görüntülerinden herhangi biriyle eşleşip eşleşmediğine bakın. Bir eşleşme varsa, işlem sonsuz bir döngüde sıkışır. Aksi takdirde, bir sonraki talimat yürütülür ve işlem tekrarlanır.

Aslında, bu denetimi her talimattan sonra yapmak yerine, çalışma zamanı ortamı işlemi periyodik olarak duraklatabilir ve bir kayıt durumu oluşturabilir. İşlem n durumu içeren sonsuz bir döngüde sıkışırsa, en fazla n kontrolden sonra, yinelenen bir durum gözlenir.

Elbette, bunun durma problemine bir çözüm olmadığını unutmayın ; ayrım burada tartışılmaktadır .

Ancak böyle bir özellik muazzam bir kaynak israfı olacaktır ; bununla ilişkili tüm belleği kaydetmek için bir işlemi sürekli olarak duraklatmak , onu muazzam bir şekilde yavaşlatacak ve çok büyük miktarda belleği çok hızlı tüketecektir. (Eski görüntüler bir süre sonra silinebilse de, kaydedilebilecek toplam görüntü sayısını sınırlamak riskli olacaktır, çünkü çok büyük bir sonsuz döngü, yani çok sayıda duruma sahip bir tane - çok az varsa yakalanamayabilir Ayrıca, hata yakalama yeteneği son derece sınırlı olacağından ve diğer hata ayıklama yöntemleriyle sonsuz döngüler bulmak nispeten basit olduğu için, bu özellik aslında çok fazla fayda sağlamaz. ve mantık hatasını tanıma).

Bu nedenle, birisi sadece tekmeler için programlamadığı sürece, böyle bir çalışma zamanı ortamının var olduğundan veya var olacağından şüpheliyim. (Bu da şimdi biraz cazip geliyorum.)


8
Bir programın bir durumu tekrar etmeden sonsuz bir döngüye girmesi (en azından Turing Machines ve benzeri dünyalarda) . C döngüsü gibi bir şey düşününfor(i = 0; ; i++) ;
vonbrand

Fikrinizle ilgili sorun, ne olduğunu veya böyle bir olup olmadığını . adımdan sonra tekrarlanan durum olmaması, 1'inci adım hakkında hiçbir şey söylemez . Durma problemini, durumun tekrarlanıp tekrarlanmayacağına karar verme problemine kolayca azaltabilirsiniz. nn<nn+1
Ağustos'ta Huck Bennett

@vonbrand, söz konusu döngü, bu özel sorunun amacı için "döngü" tanımımla uyuşmuyor (bu yüzden tanımımı sorunun kendisinde açıkça belirtmiştim).
Kyle Strand

@Huck, tabii ki böyle bir var olup olmadığını bilemezsiniz ; durdurma sorununun özü budur. Bu sadece bu tür ilmeklerin çalışma zamanında tespit edilebildiğinin bir kanıtıdır. n
Kyle Strand

Belki sorunuzu anlamadım. Herhangi bir programın durumu tekrar edip etmediğine karar vermenin mümkün olup olmadığını bilmek istediğinizi düşündüm . Sadece bazı programların durumu tekrarlayıp tekrarlamadığına karar vermenin mümkün olup olmadığını mı soruyordunuz ?
Huck Bennett

6

Programın dış dünyayla etkileşime girmediğini varsayalım, bu yüzden programın tüm durumunu kapsüllemek gerçekten mümkün. (Bu, en azından herhangi bir girdi yapmadığı anlamına gelir.) Ayrıca, programın belirli bir belirleyici ortamda çalıştığını varsayalım, böylece her durumun benzersiz bir halefi vardır, bu da çalışma zamanının iş parçacığı olmadığına veya iş parçacığının deterministik olarak bir sekansa indirgenebilir.

Oldukça imkansız ama teorik olarak sınırlayıcı olmayan varsayımlar altında, programı çoğaltabilir ve iki ayrı çalışma zamanında çalıştırabiliriz; her biri tam olarak aynı hesaplamayı yapacak.

Öyleyse yapalım. Tortoise çalışma zamanında bir kez çalıştıracağız ve aynı zamanda Hare çalışma zamanında da çalıştıracağız. Ancak, Hare çalışma zamanının tam olarak iki kat daha hızlı çalışmasını ayarlayacağız; Tortoise çalışma zamanı her adımda, Hare çalışma zamanı iki adım gerçekleştirir.

Şimdi Tortoise çalışma zamanının her adımından sonra (teorik olarak) durumları karşılaştırabiliriz. Program , adımlarının bazı döngüsüz öneklerinden sonra sonsuz bir adım döngüsüne ulaşırsa , Hare ve Tortoise durumları, bulunduğu herhangi bir tamsayı için her Kaplumbağa adımı aynı olacaktır .npknkknp

Testin toplam maliyeti, adım başına bir ekstra durum ve bir durum karşılaştırmasıdır ve programın ilk döngüsünü tamamlaması için gereken adım sayısının üç katından fazla sona ermez. (Kaplumbağa'da bir kez ve Tavşan'da iki kez, toplam üç kez.)

Kullandığım terimlerin ima ettiği gibi, bu sadece Robert Floyd'un ünlü Kaplumbağa ve Hare döngü algılama algoritması.


3

Tam Floyd'un döngü algılama algoritmasını önereceğim gibi, rici'nin gönderisi beni bunun için dövdü. Bununla birlikte, her şey tam durumların karşılaştırmasını hızlandırarak daha pratik hale getirilebilir.

Önerilen algoritmanın darboğazı tam durumun karşılaştırılması olacaktır. Bu karşılaştırmalar genellikle bitmez, ancak erken durur - ilk farkta. Bir optimizasyon, geçmiş farklılıkların nerede meydana geldiğini hatırlamak ve önce devletin bu kısımlarını kontrol etmektir. Örneğin, konumların bir listesini bulundurun ve tam bir karşılaştırma yapmadan önce bu listeyi gözden geçirin. Bu listedeki bir konum fark gösterdiğinde, karşılaştırmayı (başarısızlıkla) durdurun ve konumu listenin önüne taşıyın.

Farklı (ve potansiyel olarak daha ölçeklenebilir) bir yaklaşım, artımlı karma kullanmaktır. Durumun bir kısmı değiştiğinde karma değerlerin O (1) içinde ayarlanması kolay olacak şekilde tam durumun bir fonksiyonunu seçin. Örneğin, bazı büyük asal mod mod kelimelerinin ağırlıklı toplamını alın ve diğer bazı büyük asal modlarla ağırlıksız toplam modunu birleştirin (farklı ağırlık ve modülle birlikte modüler ağırlıklı kelimelerin kareler toplamına da atılabilir). Bu şekilde, karma güncellemeler her yürütme adımında O (1) zaman alır ve karşılaştırmalar bir isabet elde edene kadar O (1) zaman alır. Yanlış pozitif olma olasılığı (devletler farklılık gösterirken karmalar eşleşir) çok düşüktür ve bu gerçekleşse bile, çok sayıda gerçek negatif üzerinde itfa edecektir (yanlış negatifler imkansızdır).

Tabii ki, pratikte, pi sayısının rakamlarını üretmek gibi durumlara girme olasılığı daha yüksektir --- işler değişmeye devam ediyor, ancak asla bitmiyor. Bir diğer sık ​​rastlanan olasılık ise sonsuz döngünün belleği tahsis etmesidir, bu durumda kullanılabilir tüm belleği hızla tüketir.

Algoritmalar ve veri yapıları dersimde, otomatik not vericimiz bazen sonsuz döngülere giren öğrenci sunumlarıyla uğraşmak zorundadır. Bu, 30 saniyelik bir zaman aşımı ve belirli bir bellek sınırı ile halledilir. Her ikisi de derecelendirmenin bir parçası olarak dayattığımız çalışma süresinden ve bellek bütçelerinden çok daha gevşek. Gerçek sonsuz sonsuz algılamanın uygulanmasının bu bağlamda çok mantıklı olup olmadığından emin değilim, çünkü bu tür programlar biraz daha yavaş çalışacaktır (bu, devlet karma için donanım desteğinin yardımcı olabileceği yerdir, ancak yine de ek kullanımlara ihtiyacınız olacaktır. bunu haklı çıkar). Öğrenciler programlarının zaman aşımına uğradığını bildiğinde, genellikle sonsuz döngüyü bulabilirler.


2

Aprove sonlandırma aracı yapar olabilir (Haskell programlarının bir alt sınıfında da dahil olmak üzere), yeniden yazma sistemlerinde Statik analiz ispat olmayan sonlandırma programın gerçek örnek vererek olmayan sonlandırma. Teknik oldukça güçlüdür ve daralma adı verilen bir tekniğin bir çeşidini kullanarak çalışır .

Yine de bildiğim kadarıyla, genel diller için fiili feshin tespit edilmesinde çok fazla çalışma yapılmamıştır.

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.