İş Hırsızlığı Nedir?

Modern bilgisayarlarda birden fazla işlem çekirdeği bulunur. Her bir çekirdeğin sürekli meşgul kalabilmesi için yeterli işlem olduğunu varsayarsak. onlara hesaplamalı iş öğelerinin bir sırası atanacaktır. Veya zamanlayıcı tarafından tamamlanacak iş parçacıkları.

Bu iş parçacıkları yürütülürken, yeni iş parçacıkları veya iş öğeleri oluşturmak mümkündür. Bunlar, aynı anda işlenebilen ayrı iş parçacıklarıdır. Sonuçları yumurtlama programlarına geri beslemeleri veya süresiz olarak tamamen ayrı kalmaları gerekebilir. Tipik olarak, bu alt iş parçacıkları, üst öğe ile aynı işlem çekirdeğine atanır.

Bütün bunlar, tüm çekirdeklerin meşgul tutulduğunu varsayar. Bu, hiçbir iş parçacığı bitmezse veya yeni iş parçacığı, mevcut iş parçacıklarının sonundan aynı oranda veya daha hızlı üretilmezse gerçekleşir. Ancak gerçek dünyada, özellikle son kullanıcı bilgi işlem cihazlarında, uzun vadeli iş yükü nadiren bu kadar basittir. Sonunda, bir işlem çekirdeği muhtemelen atanan tüm görevleri tamamlayacaktır. Bu olduğunda, boşta oturmak ve potansiyel performansı boşa harcamak yerine, diğer işlem çekirdeklerinin iş kuyruklarını kontrol eder ve onlardan bir iş öğesi çalar.

Faydaları ve Dezavantajları

İş hırsızlığı, boşta kalan bir işlem çekirdeğinin, tamamlanması için aktif olarak iş araması anlamına gelir. Bu, genel işlemcinin potansiyel olarak büyük bir bölümünün boşta oturmasını önler, bu da yararlıdır. Yine de iş hırsızlığı bazı maliyetlerle gelebilir. Örneğin, yeni işlem çekirdeği muhtemelen ilgili tüm verileri önbelleğine yüklemek zorunda kalacaktır.

Bu, özellikle paylaşılan bir önbellek katmanı tarafından sunulmak yerine sistem RAM'inden talep edilmesi gerekiyorsa, zaman alabilir. Orijinal işlemcinin o iş öğesini o zaman diliminde devam ettirebilmesi ve genel olarak daha hızlı yürütmeye yol açması mümkündür. Bu, iş öğesinin çalındığı işlem çekirdeğinin onu işlemeye hiç başlamamış olması durumunda bile söz konusu olabilir. Bazı önbelleğe alınmış değerler, üst ve alt iş parçacıkları arasında aynı olabilir.

Uygulamalar

Birkaç programlama dilinde, çalışmayı doğrudan özel işlemciler üzerinde planlayabilen çalışma zamanları vardır. Örneğin, Cilk programlama dili, Rust Tokio çalışma zamanı ve .Net Task Parallel Library bunu yapabilir. Alternatif olarak, işletim sistemi gerçek işlemci zamanını programlamaktan sorumlu olabilir. Programla, kendileri işletim sistemi tarafından zamanlanan bir "işçi iş parçacığı" havuzuna görevler eklemek yeterlidir.

Bu, programın işlem çekirdeklerine doğrudan erişime sahip olmadığı ancak erişimi diğer işlemlerle paylaşması gereken sistemlerde olur. Bir iş parçacığının boşta kaldığı için tekrar tekrar çalınmamasını sağlamak için bu senaryoda ekstra özen gösterilmelidir.

İş öğelerinin çalınmak üzere nasıl seçildiğine dair çeşitli yaklaşımlar vardır. Orijinal konseptte, yaklaşım başka bir rastgele çekirdek seçmekti. Kuyruğunda bir veya daha fazla iş öğesi varsa, sonuncusunu alın. Bir alt işlemin kaynak işlemci tarafından hemen yürütülüp yürütülmediğine ilişkin tercihe bağlı olarak. Veya işlemcinin kuyruğuna itilirse ve üst süreç yürütülmeye devam ederse, üst veya alt iş parçacığı çalınır.

Tüm bunlar, kelime yükünün mevcut işlemciler arasında eşit olarak yayılmasını sağlayan bir yük dengeleme tekniği olan Work Stealing olarak özetlenebilir. Bu şekilde, tüm işlemciler yardımcı olmak için bir şeyler yapıyor.

Çözüm

İş çalma, çok çekirdekli CPU'larda otomatik olarak gerçekleşen bir işlemdir. Her çekirdeğin gerçekleştirilmesi gereken bir görev sırası vardır. Bir işlemci görevlerini tamamladığında, başka bir işlem çekirdeğinin kuyruğundan başka bir görevi çalar. Bu, işlemcinin bazı çekirdeklerin boşta kalmasını, diğerlerinin ise hala gerçekleştirmesi gereken bir görev kuyruğuna sahip olmasını önlemeye yardımcı olur.