Bir iş parçacığını uyku nasıl çalışır?


15

Bir iplik uyuduğunuzda , aslında neler oluyor?

Bir iş parçacığının uyutulmasının "geçerli iş parçacığını belirli bir süre duraklatır" olduğunu görüyorum . Ama nasıl çalışır?

Göre içten) (Nasıl Thread.sleep işleri ve Thread.sleep gerçekten nasıl çalışır? :

  • uyku süresi sisteme özgü bir ayrıntı düzeyine tabi olacaktır
  • uyku engelliyor
  • iş parçacığı CPU'dan ayrılır ve yürütülmesini durdurur
  • iplik uyku sırasında CPU zamanını tüketmiyor

Tüm bunların ne anlama geldiğinin iç ve temel mekaniğini tam olarak anlayamıyorum.

İş parçacıkları arasında geçiş yapmaktan sorumlu zamanlayıcı adı verilen bir şey olduğunu anlıyorum .

Kaynaklar, bunun işletim sistemine (veya donanıma?) Göre değiştiğini ve CPU'ya başka bir iş parçacığına geçmeden önce bazı eylemleri gerçekleştirmek için çoğu iş parçacığına 1ms - 60ms kadar verildiğini gösteriyor.

Ancak bir iş parçacığı uyuduğunda (örneğin, birkaç saniye), nasıl devam eder? Sanırım bir zamanlayıcı bir şekilde dahil, anakartın saati mi? İşlemci saat hızı ile mi ilgili?

Ve bir zamanlayıcı dahil olsa bile, CPU iş parçacığına tekrar dikkat etmenin zamanı geldiğini nasıl bilebilir? Hazır olup olmadığını görmek için iş parçacığını sürekli kontrol etmesi gerekmez mi? Etkin bir şekilde değil mi yoklama ve dolayısıyla tür bir CPU zaman alıcı?

Uyumak bir iş parçacığı diline özgü mü yoksa işletim sisteminden sorumlu mu yoksa CPU'ya özgü bir şey mi?

Birisi bunu bana zamanlayıcı gibi şeylerin temel açıklamaları ve tüm bunlar sırasında CPU'nun ne yaptığını açıklar mı?


2
Bir uyku ipliğini yeniden uyandırmak, tipik olarak bir kesme saati tarafından üretilen, CPU'nun çekirdek işleminden talimatları yöneten ayrı bir donanım bileşeni olan zamanlanmış kesintilerle çalışır. Bu, yoklama ihtiyacını ortadan kaldırır. Belki de Quora hakkındaki
Doc Brown

1
JVM'lerin çoğu aslında çoklu iş parçacığı uygulamaz : Tek yaptıkları temel işletim sisteminin çoklu iş parçacığı özelliklerini kullanmaktır. Gerçekten nasıl çalıştığını bilmek istiyorsanız, işletim sistemi tasarımı konusunda çok sayıda kitap var.
Solomon Slow

Yanıtlar:


11

Bir programı çalıştırmak, o programın içindeki koddan çok daha fazlasıdır.

Çok işlemli bir işletim sisteminde çalışan herhangi bir program, işletim sisteminin zamanlayıcısının kontrolü altındadır ve zamanlayıcı , hangi işlemin çalıştığını, hangilerinin CPU döngüleri kullanılabilir olduğunda çalışmayı beklediğini ve hatta olmayanları belirten açık bir tablo tutmaktadır. koşmaya çalışıyor (uyuyor). Programlayıcı , önceliklerine ve yürütme geçmişlerine bağlı olarak işlemlere genellikle çift boyutlu zaman dilimleri atar . Sonuçta, bu döngü genellikle ana karttaki bir osilatör tarafından üretilen donanım kesintileri tarafından tahrik edilir.

Uyku, her zaman bir programlama dilinin destekleyebileceği bir özelliktir, çünkü yalnızca çalıştırılacağı çalışma zamanı ortamı onu destekler. Normal bir programı askıya alamaz kendisini sadece o nasıl zamanlayıcı söyleyebilir, ister ve zamanlayıcı bu dileğini tatmin yeteneğine bile daima hayır yükümlü yollarla ya gereğidir - tedavi edilecek. Bir dizüstü bilgisayarın kapalı ve hazırda bekletme moduna geçtiğini düşünün; ana kartın osilatörü titreşmeye devam eder, ancak zamanlayıcı çalışmadığından, önceliği ne kadar yüksek olursa olsun hiçbir işlem yürütülemez.


Bu (genellikle) süreçler için doğrudur, ancak bazen dile bağlı olan iş parçacıkları için her zaman doğru değildir. İplikler işletim sisteminden bağımsız olarak uygulanabilir ve işbirlikçi veya önleyici olabilir. Örneğin, Ruby "liflere" sahiptir (ipliklere ek olarak). Yakut lifler işbirliği ile programlanır.
david25272

Doğru, sadece yerel iş parçacıkları bu şekilde çalışır. Yeşil iş parçacıkları, bayt derlemeli bir dilde bir program yürüten VM tarafından zamanlanır. Genellikle yerel iş parçacıkları kullanılabilir olmadığında veya düzgün iş parçacığı için güvenli olmayan bir kod çalıştırıldığında kullanılırlar (VM bazen çok iş parçacıklı bir programın anlambiliminin işletim sistemi zamanlayıcısının yapamayacağı şekilde doğru kalmasını sağlayabilir).
Kilian Foth

7

As Doc Brown Bir yorumda, kesmeler anahtar ve sadece uyumak içindir.

Kesme işlemi, işlemcinin yaptıklarını durdurması ve bir kod parçası çalıştırması gereken bir donanım sinyalidir. Harici cihazlar işlemcinin dikkatini çekmesi gerektiğinde kesintileri tetikler: örneğin, bir disk veri okumayı bitirdiğinde veya bir tuşa basıldığında veya anakarttaki geri sayım zamanlayıcısı sıfıra ulaştığında.

Kesme işleme kodu genellikle çok küçük ve çok hızlıdır. Örneğin, disk bir bloğun belleğe kopyalandığını gösterdiğinde, işletim sistemi bu gerçeği bir yerde "hazır bloklar" listesine kaydedebilir ve daha sonra başka bir şeye geri dönebilir. CPU'nun tüm zamanlarını kesme işleme kodunda geçirmesini ve kullanıcı kodunu çalıştırmasını istemezsiniz.

Kesinlikle küçük olmayan kesmeye bağlı kodlardan biri zamanlayıcıdır. Geri sayım zamanlayıcısından gelen bir sinyal tarafından tetiklenir ve her çalıştırıldığında sistemin durumunu inceler. Bu, genellikle çalışmaya hazır olan tanımlama işlemlerini (örneğin, bekledikleri blok belleğe ulaştığı için) ve zaman dilimlerini tüketenleri içerecektir.

Yani, bir iplik uykusu yürüttüğünüzde, yaptığınız şey OS'ye (1) zaman diliminizden vazgeçtiğinizi ve (2) belirli bir süre geçene kadar tekrar uyanmamanız gerektiğini söyler.

Zamanlayıcı her çalıştığında, iş parçacığınıza bakar ve yalnızca bu süre geçtiyse "çalışmaya hazır" olarak işaretler. Bu bir tür sorgulamadır, ancak bir kesinti tarafından tetiklendiği için "meşgul döngü" yoklaması değildir. Ayrıca o kadar pahalı değil: tipik olarak bir seferde sadece bin kadar iplik çalışıyor.

Bu aynı zamanda uyku zamanlarının neden kesin olmadığına dair bir fikir vermelidir: iş parçacığınız çalışmaya hazır hale geldiğinde, hala çalışan ve zaman dilimlerini tüketmemiş başka iş parçacıkları da olabilir. Veya çalışmaya hazır yüksek öncelikli iş parçacıkları olabilir.


"Modern" işletim sistemlerinin çalışma şekli budur. OS X'ten önceki Windows 3 veya Mac OS gibi eski işletim sistemlerinde, bir işlem işletim sistemine () denetim vermek zorunda kaldı. Ne yazık ki bir program bir döngüye sıkışırsa veya bir şekilde kilitlenirse, asla kontrol sağlayamaz ve tüm sistem askıda kalır.
david25272

@ david25272 - 1960'lı yıllarda önleyici çoklu görev yapan sistemler olduğu için "daha eski" yerine "daha basit" kelimesini kullanacağımı düşünüyorum. Kooperatif çoklu görevlerin etkin iş parçacığının işlemci kontrolünü serbest bırakmak için bir şeyler yapmasını gerektirdiği doğru olsa da (tipik olarak açık bir verim yerine bir engelleme sistemi çağrısı yaparak), birçok genel amaçlı programcı olduğuna inanmıyorum Bugün işbirlikçi bir iş parçacığı modeli ile bir işletim sistemi kullanan.
kdgregory
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.