Yalnızca 4 sanal CPU'm olduğunda 1805 iş parçacığına nasıl sahip olabilirim?


10

Birisi bana Etkinlik Monitörünüzde şu anda 1805 iş parçacığım olduğunu nasıl söyleyeceğini merak ediyordum OS X Etkinlik Monitörünün ekran görüntüsü

Ama bilgisayarımda sadece 4 sanal çekirdek var (bu sadece 4 iş parçacığı olması gerektiği anlamına geliyor). İş parçacığı sayısı, hangi iş parçacığının yürütüleceğine karar verirken CPU'lar tarafından işlenen tüm iş parçacıkları anlamına mı geliyor?

EDIT: Makinemde sadece 4 iş parçacığı olabileceğini düşünüyorum nedeni bu cevap geliyor . Yanlış anlaşılmamın 'thread' kelimesinin farklı bir bağlamda kullanılmasından kaynaklandığına inanıyorum.


Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
bmike

Yanıtlar:


24

Zamanlama

1.805 iş parçacıkları aynı anda çalışmaz . Ticaret yapıyorlar. Bir çekirdek iş parçacığının bir kısmını çalıştırır, sonra başka bir iş parçacığının bir kısmını yürütmek için ayırır. Diğer çekirdekler de aynısını yapar. Yuvarlak ve yuvarlak, iplikler tek seferde değil, aynı anda biraz yürütülür.

İşletim sisteminin (Darwin ve macOS) en büyük sorumluluğu, hangi çekirdeğin hangi çekirdeğe ne kadar süreyle uygulanacağıdır.

Birçok iş parçacığının yapacak işi yoktur ve bu nedenle uykuda ve planlanmamış olarak kalır. Benzer şekilde, birçok iş parçacığı depolamadan alınacak veriler veya tamamlanacak bir ağ bağlantısı veya bir veritabanından yüklenecek veriler gibi bazı kaynaklarda bekliyor olabilir. Beklenen kaynağın durumunu kontrol etmekten başka hiçbir şey yapmadan, bu tür iş parçacıkları oldukça kısa bir süre için planlanır.

Uygulama programcısı, dış kaynak beklemesinin biraz zaman alacağını bildiğinde, iş parçacığını belirli bir süre uyuyarak bu zamanlama işlemine yardımcı olabilir. Ve harici kaynaklarda beklemek için hiçbir neden olmadan CPU-yoğun bir "sıkı" döngü çalıştırıyorsanız, programcı çekirdeği hog ve böylece diğer iş parçacıkları yürütmek için kısa bir kenara koymak için gönüllü bir çağrı ekleyebilirsiniz.

Daha fazla ayrıntı için, çoklu kullanım için Wikipedia sayfasına bakın .

Eşzamanlı Çoklu Diş Açma

Bağlantılı Sorunuza gelince , iş parçacıkları gerçekten de burada olduğu gibidir.

Bir sorun, işletim sistemi tarafından planlandığında iş parçacıkları arasında geçişin genel maliyeti vardır. Mevcut iş parçacığının talimatlarını ve verilerini çekirdekten kaldırmak ve bir sonraki programlanmış iş parçacığının talimatlarını ve verilerini yüklemek için önemli bir maliyet vardır. İşletim sisteminin işinin bir parçası, iş parçacığı maliyetini optimize etmek için iş parçacıklarını planlamakta akıllı olmaya çalışmaktır.

Bazı CPU üreticileri, bir çift iş parçacığı arasında geçişi çok daha hızlı hale getirmek için bu zamanı kesmek için teknoloji geliştirdi. Intel teknolojilerine Hyper-Threading adını verir . Genel olarak eşzamanlı çoklu iş parçacığı (SMT) olarak bilinir .

Diş çifti aslında eşzamanlı olarak yürütülmese de, anahtarlama o kadar düzgün ve hızlıdır ki, her iki diş de neredeyse aynı anda görünür. Bu, her çekirdeğin işletim sistemine bir çift sanal çekirdek olarak sunduğu kadar iyi çalışıyor. Böylece, örneğin dört fiziksel çekirdeğe sahip bir SMT etkin CPU, işletim sistemine sekiz çekirdekli bir CPU olarak sunulacaktır.

Bu optimizasyona rağmen, bu tür sanal çekirdekler arasında geçiş yapmak için hala bazı ek yükler var. Çok fazla CPU-yoğun iş parçacığı, bir çekirdek üzerinde programlanacak yürütme süresi için tüm yayılma sistemi, verimsiz hale getirebilir, hiç bir iş parçacığı fazla iş yapmaz. Dokuz çocuk arasında paylaşılan bir oyun alanındaki üç top gibi, hiç kimsenin bir topla gerçekten ciddi bir oyun zamanı almadığı dokuz yüz çocuk arasında paylaşım .

Bu nedenle, CPU ürün yazılımında, bir sysadmin'in SMT'yi devre dışı bırakmak için makineye bir anahtar atabileceği bir seçenek vardır, eğer kullanıcılarına olağandışı bir şekilde CPU'ya bağlı bir uygulamayı çalıştırmada çok az duraklama fırsatına sahip olacağına karar verir.

Böyle bir durumda orijinal Sorunuza geri dönüyoruz: Bu özel durumda, gerçekten bu hiper-aktif ipliklerden daha fazlasına sahip olmak için işlemleri fiziksel çekirdeklerden daha fazla kısıtlamak istersiniz. Ama tekrar edeyim: bu, özel bir bilimsel veri çatışması projesi gibi bir şeyde meydana gelebilecek, ancak neredeyse hiçbir zaman ortak iş / kurumsal / kurumsal senaryolar için geçerli olmayacak son derece sıra dışı bir durumdur.


Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
bmike

Ayrıca, hiç kimse yield()CPU yoğun iş parçacıklarına sistem çağrıları koymaz (Klasik MacOS'ta kooperatif çoklu görevden eski kod olmadıkça). Bir iş parçacığı zaman dilimini kullandıktan sonra önleyici çoklu görev yeniden planlama.
Peter Cordes

Hiper iş parçacığı tanımınız yanlış. Donanım iş parçacıkları! = Yazılım iş parçacıkları, yürütme bağlamları / mantıksal çekirdeklerdir. Fiziksel bir çekirdek üzerindeki her iki mantıksal çekirdek de talimatlarını aynı anda çalıştırıyor. Ön uç iş parçacıkları (her döngü) arasında değişir, ancak sıra dışı yürütme çekirdeği aynı döngüdeki her iki iş parçacığından da komut / uop yürütebilir. Bu, yürütme birimlerinin iş ile beslenmesini daha iyi tutmak için iki iş parçacığından OoO yürütmesine komut düzeyinde paralelliği ortaya çıkarır (bu temelde SMT'nin noktasıdır). Sadece "optimize edilmiş bağlam değiştirme" değil.
Peter Cordes


7

Eski günlerde - bellek sanallaştırılmadı veya korunmadı ve herhangi bir kod herhangi bir yere yazabiliyordu. O günlerde tek bir CPU tasarımına tek bir iplik mantıklı geldi. O zamandan beri on yıllar içinde, bellek önce korundu ve sonra sanallaştırıldı. İş parçacıklarını sanal çekirdekler olarak düşünün - verilerinizin ve kodunuzun hazır olduğu bir zamanda, bu iş parçacığının gerçek bir CPU'ya aktarıldığı ( veya programlama algoritmaları üzerinde araştırma yapan PHD mühendisleri ve matematikçiler olarak planlandığı ) gerçek iş yapmak.

resim açıklamasını buraya girin

Şimdi - zamanlamadaki farkın büyüklüğü nedeniyle - CPU ve önbellek, depolama veya ağdan veri almaya kıyasla çok hızlı çalışır - bir iş parçacığı www.google.com'un paket veya iki veri, böylece gerçek CPU'dan çok daha fazla iş parçacığı görmenizin nedeni budur.

Siyah / mavi zaman ölçeğinde gerçekleşen iplik işlemlerini bir saniyeye = 1 ns'ye dönüştürürseniz, önemsediğimiz şeyler daha çok disk IO alır, 100 mikrosaniye alır 4 gün gibidir ve 200 ms'lik bir internet yolculuğu bir CPU zaman ölçeğinde saniye sayıyorsanız, 20 yıllık gecikme. On egzersizin birçok gücü gibi , neredeyse her durumda - CPU çok, çok yavaş bir dış dünyadan anlamlı işler beklerken "aylar" için boş durur.

Gönderdiğiniz görüntüde hiçbir şey yanlış görünmüyor, bu yüzden belki de konuları merak ederek ne elde ettiğinizi yanlış anlıyoruz.

Üstteki üstbilgi satırındaki kelime dizilerini sağ tıklarsanız (kontrol tıklaması), uygulamanın durumunu ekleyin ve çoğu iş parçacığının büyük olasılıkla boşta, uykuda, herhangi bir anda çalışmadığını görürsünüz.


Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
bmike

1

Tartışmasız daha temel bir soru sormuyorsunuz: "CPU'mda sadece dört çekirdek olduğunda nasıl 290 işlem yapabilirim?" Bu cevap, belirli bir soru zaten cevaplanmış olsa bile, büyük resmi anlamanıza yardımcı olabilecek biraz tarihtir. Bu yüzden TL; DR versiyonu vermeyeceğim.

Bir zamanlar (düşünün, 1950'ler - 60'lar), bilgisayarlar bir seferde sadece bir şey yapabilirdi. Onlar çok pahalı, tüm odaları dolu ve biz onları birden çok kişi arasında paylaşarak verimli bir şekilde kullanmak için bir yol gerekli. Bunu yapmanın ilk yolu, kullanıcıların bilgisayara görev göndereceği ve sıraya alınacakları, birbiri ardına yürütülen ve sonuçların kullanıcıya geri gönderileceği toplu işlemdi. Bu iyiydi, ancak birkaç gün sürecek bir hesaplama yapmak isterseniz, o zaman boyunca başka hiç kimse bilgisayarı kullanamazdı.

Bir sonraki yenilik (1960'lı-70'li yıllar) zaman paylaşımı idi . Şimdi, bir görevin tamamını, sonra bir sonraki görevi yerine getirmek yerine, bilgisayar bir görevi bir parça yürütür, sonra duraklatır ve bir sonraki görevi biraz yürütür ve bu böyle devam eder. Böylece bilgisayar, aynı anda birden çok işlem yürüttüğü izlenimini verir. Bunun en büyük avantajı, şimdi birkaç gün sürecek bir hesaplama yapabilmeniz ve şimdi daha da uzun sürmesine rağmen, kesintiye uğramaya devam ettiği için, diğer insanlar bu süre zarfında makineyi hala kullanabilir.

Tüm bunlar büyük ana bilgisayar tarzı bilgisayarlar içindi. Kişisel bilgisayarlar popüler olmaya başladığında, başlangıçta çok güçlü değildiler ve hey, kişisel oldukları için sadece bir şey yapabilmeleri tamam görünüyordu & nbdp; - bir uygulamayı çalıştırın - bir kerede (düşünüyorum, 1980'ler). Ancak, daha güçlü hale geldiklerinde (düşünmek, 1990'ları sunmak için), insanlar kişisel bilgisayarlarının da zaman paylaşmasını istediler.

Bu nedenle, kısa süreler için birer birer çalıştırarak ve sonra duraklatarak birden çok işlemi aynı anda yürütme yanılsamasını veren kişisel bilgisayarlarla sonuçlandık. Konular esasen aynı şeydir: sonunda insanlar bireysel süreçlerin bile aynı anda birden fazla şey yapma yanılsamasını vermesini istediler. İlk başta, uygulama yazarı kendisinin üstesinden gelmek zorunda kaldı: grafikleri güncellerken biraz harcayın, duraklatın, hesaplarken biraz harcayın, duraklatın, başka bir şey yaparken biraz harcayın, ...

Bununla birlikte, işletim sistemi zaten birden çok işlemi yönetmekte iyiydi, iş parçacıkları adı verilen bu alt süreçleri yönetmek için genişletmek mantıklıydı. Şimdi, her işlemin (veya uygulamanın) en az bir iş parçacığı içerdiği, ancak bazılarının birkaç veya daha fazla içerdiği bir modelimiz var. Bu iş parçacıklarının her biri bir şekilde bağımsız bir alt göreve karşılık gelir.

Ancak, en üst düzeyde, CPU hala sadece bu iş parçacıklarının aynı anda çalıştığı yanılsamasını veriyor. Gerçekte, biraz koşuyor, duraklatıyor, biraz koşmak için başka birini seçiyor vb. Modern CPU'lar aynı anda birden fazla iş parçacığı çalıştırabilir. Yani, içinde gerçek gerçeklik, işletim sistemi aynı anda tüm çekirdek üzerine "biraz başka çalıştırın biraz duraklama aday şey, duraklama" bu oyun oynuyor. Böylece, (ve uygulama tasarımcılarınızın) istediğiniz sayıda iş parçacığına sahip olabilirsiniz, ancak herhangi bir zamanda, bunlardan birkaçı hariç tümü duraklatılı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.