Boş bir CPU süreci ne işe yarıyor?


73

Kaynağına bakıldığında, burada açıklanan straceklon bayrağının kullanımını buldum CLONE_IDLETASK:

#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */

Daha derinlemesine baktıktan sonra, bu bayrak içinde ele alınmamasına rağmen man clone, çekirdeğin önyükleme işlemi sırasında çekirdek (hepsi PID 0'a sahip olmalıdır) makinedeki her bir CPU için kullanılmadığını gördüm. yani 8 CPU'lu bir makine en az 7 değere sahip olacaktır (aşağıdaki soruya bakın) bu tür işlemler "çalışıyor" (fiyat teklifi).

Şimdi, bu beni bu "boş" sürecin gerçekte ne yaptığı hakkında birkaç soruya götürüyor. Benim varsayım, zaman süresi sona erene ve çekirdek boşta işlemi bir kez daha çalıştırmak veya atamak için (CPU kullanılmıyorsa) gerçek bir süreç atayana kadar sürekli olarak NOP işlemini gerçekleştiriyor. Ancak, bu tam bir tahmin. Yani:

  1. Örneğin, 8 CPU'lu bir makinede 7 böyle boşta işlem yaratılacak mı? (ve bir CPU kullanıcı alanı çalışması yapmazken çekirdeğin kendisi tarafından tutulacak mı?)

  2. Boşta kalma süreci gerçekten sadece NOP operasyonlarının sonsuz bir akışı mıdır? (veya aynısını yapan bir döngü).

  3. İşlemci kullanımı (örneğin uptime), boşta işlemin işlemcide ne kadar sürdüğü ve belirli bir süre içinde ne kadar süre bulunmadığı ile basitçe hesaplanıyor mu?


PS Bu sorunun büyük bir kısmının bir CPU'nun nasıl çalıştığını tam olarak anlamadığım gerçeğinden kaynaklanıyor olabilir. yani montajı, zaman çerçevelerini ve kesintileri anlıyorum ancak örneğin bir CPU'nun ne yaptığına bağlı olarak nasıl daha az ya da daha fazla enerji kullanabileceğini bilmiyorum. Biri beni de aydınlatırsa minnettar olurum.


17
Başlığı gördüğümde "Hiç bir şey yok" yazma cazibesine karşı koymak zorunda kaldım.
Vality

4
Modern CPU'ların çoğu rölantide veya düşük yük altındayken saat hızını ve güç tüketimini dinamik olarak düşürür ( dinamik frekans ölçekleme , örneğin Intel CPU'lar için SpeedStep ). Bir CPU'yu overclock ederseniz, bu davranışı devre dışı bırakır ve bu da CPU'nun rölantide olsa bile maksimum saat hızını korumasına neden olur.
Nat

2
Ayrıca bkz. "ACPI güç durumları": bir işlemcinin talimatları yürütmeyi durdurabildiği ancak hala uyanık olabileceği çeşitli yollar vardır.
pjc50

Yanıtlar:


85

Boşta görev, işlem muhasebesi ve ayrıca enerji tüketimini azaltmak için kullanılır. Linux'ta her işlemci için bir boşta görev oluşturulur ve bu işlemciye kilitlenir; Bu CPU üzerinde çalıştırılacak başka işlem olmadığında, boşta görev zamanlanır. Boş görevlerde harcanan zaman, gibi araçlarda “boş” zaman olarak görünür top. (Çalışma süresi farklı şekilde hesaplanır.)

Unix, her zaman bir tür boşta döngüye sahip gibi görünüyor (ancak gerçek bir boşta çalışma değil, Gilles'nin cevabını görün ) ve V1'de bile, bir kesinti oluşana kadar işlemciyi durduran bir WAITtalimat kullandı (durdu. kesmek"). Diğer bazı işletim sistemlerinde yoğun döngüler, DOS, OS / 2 ve özellikle Windows'un önceki sürümleri kullanılıyordu. Şimdilik oldukça uzun bir süredir CPU'lar bu tür “bekleme” talimatlarını enerji tüketimini ve ısı üretimini azaltmak için kullandılar. Boşta görevlerin çeşitli uygulamalarını örneğin arch/x86/kernel/process.cLinux çekirdeğinde görebilirsiniz: basit olanHLTbir kesinti oluşana kadar işlemciyi durduran (ve C1 enerji tasarrufu modunu etkinleştiren), diğer uygulamalar çeşitli hataları veya verimsizlikleri ele alır ( örneğin , bazı CPU'larda kullanmak MWAITyerine HLT).

Tüm bunlar, bir olayı beklerken (I / O vb.) İşlemlerde boşta durumlardan tamamen ayrıdır.


3
Heh, şimdi anlıyorum, teşekkürler. play_dead()HALT'ı çalıştırmak için çok hoş bir anımsatıcı isim. Her işlemciye HALT gönderme ve sonuç olarak askıya alma riski olmaz mıydı? (yani, bu duruma ulaşmak, her CPU HALT, çekirdek doğru bir hata olurdu?)
grochmal

30
CPU, bir kesintiyle HALT'den uyanır.
Johan Myréen

1
@ JohanMyréen - Harika, bu mantıklı. Böyle bir durumda bir giriş cihazından bir IRQ kesilmesi bile onu tekrar uyandırabilir. Teşekkürler.
grochmal

15
Ya da daha güvenilir bir şekilde, zamanlayıcı durur ... (Tickless kullanımı başka bir balık ısıtıcısıdır.)
Stephen Kitt

3
@EJP gerçekten, farklı mimarilerde farklı isimler olsa da, oldukça yaygın bir talimat.
user253751

50

Bir işlem zamanlayıcısının ders kitabı tasarımında, programlayıcı programlanacak herhangi bir sürece sahip değilse (yani tüm işlemler engelleniyorsa, giriş bekliyor), zamanlayıcı bir işlemcinin kesilmesini bekler. Kesme, bir çevre birimden girişi (kullanıcı eylemi, ağ paketi, bir diskten okuma tamamlandı vb.) Gösterebilir veya bir işlemde bir zamanlayıcıyı tetikleyen bir zamanlayıcı kesintisi olabilir.

Linux'un zamanlayıcısında yapılacak hiçbir şey için özel bir kod yoktur. Bunun yerine, yapılacak hiçbir şey vakasını özel bir işlem, boşta işlem olarak kodlar. Boşta işlem yalnızca başka hiçbir işlem karıştırılabilir olmadığında zamanlanır (etkin bir şekilde düşük bir önceliğe sahiptir). Boşta işlem aslında çekirdeğin bir parçasıdır: bu bir çekirdek ipliği, yani bir işlemdeki kod yerine çekirdeğin kodunu çalıştıran bir ipliktir. (Daha doğrusu, her bir CPU için böyle bir iş parçacığı vardır.) Boşta işlem çalıştığında, kesme için bekle işlemini gerçekleştirir.

Kesinti beklemenin nasıl çalıştığı, işlemcinin yeteneklerine bağlıdır. En temel işlemci tasarımına sahip, bu sadece yoğun bir döngü -

nothing:
    goto nothing

İşlemci sonsuza dek bir dal talimatı çalıştırmaya devam ediyor ve bu hiçbir şeyi gerçekleştirmiyor. Çoğu modern işletim sistemi daha iyi hiçbir şeyin olmadığı bir işlemcide çalışmadıkça ve çoğu işlemcide daha iyi bir şey olmadıkça bunu yapmaz. Enerjiyi odayı ısıtmaktan başka hiçbir şey yapmamakla harcamak yerine, ideal olarak işlemci kapatılmalıdır. Böylece çekirdek, işlemciye kendisini kapatmasını veya en azından işlemcinin çoğunu kapatmasını söyleyen bir kod çalıştırır. Kesinti kontrolörü, açık kalan en az bir küçük parça olmalıdır. Bir çevre birimi bir kesmeyi tetiklediğinde, kesme denetleyicisi işlemcinin ana bölümüne (bir kısmına) bir uyandırma sinyali gönderir.

Uygulamada, Intel / AMD ve ARM gibi modern CPU'lar birçok karmaşık güç yönetimi ayarına sahiptir. İşletim sistemi, işlemcinin boş modda ne kadar kalacağını tahmin edebilir ve buna bağlı olarak farklı düşük güç modları seçer. Modlar, boşta iken güç kullanımı ile boşta moduna girip çıkmak için geçen süre arasında farklı tavizler sunar. Bazı işlemcilerde işletim sistemi işlemcilerin çok fazla CPU zamanı almadığını tespit ettiğinde işlemcinin saat hızını düşürebilir.


5
AVR tabanlı mikrodenetleyiciler gibi en temel yerleşik işlemcilerin bile, WFI (Kesinmeyi Bekle) talimatının olmasına rağmen, bu talimat tam modele bağlı olarak NOP'a eşdeğer olsa bile.
Jonas Schäfer

@JonasWielicki Yapacak bir şeyin yoksa, sadece sıkı bir döngüye gireceğini düşünürdüm, ya da düşük güç durumuna girebilir ve kesmenin seni ondan vurmasını bekleyebilirsin (düşük güç durumları genellikle daha fazlasını gerektirir). metal "keser).
Nick T,

1
@JonasWielicki Gömülü sistemler için tasarlanan mimariler güç yönetimine önem veriyor, bu nedenle WFI orada önemli. Birçok eski mimaride böyle bir şey yoktur. Orijinal 8086 mimarisi AFAIR değildi. 68k'de WFI var mı? MIPS'de standart bir özellik midir? Düşük seviyeli programlamaya aşinam, çoğunlukla düşük güç tüketiminin önemli olduğu ve WFI'nın güç yönetimi buzdağının sadece görünen yüzü olduğu ARM'ta.
Gilles,

1
@ Gilles 8086 durdu. Bakınız en.m.wikipedia.org/wiki/HLT_(x86_instruction) Bu talimat sadece 80486 DX4'ten beri güç tasarrufu işlevi içeriyordu. Tarihe geri dönüp baktığımızda HLT 8080'deydi ve türevleri yaptı (Z80 gibi).
pabouk

1
@pabouk HLTDX4 çıkmadan önce 386 ve 486'nın SL değişkenlerini güçlendirebilirdi (Wikipedia makalesi yanlış).
Stephen Kitt

0

Hayır, boşta bir görev CPU döngülerini boşa harcamaz. Zamanlayıcı, yürütme için yalnızca boşta bir işlem seçmez. Boşta bir süreç, devam edebilmesi için bir olayın gerçekleşmesini bekliyor. Örneğin, bir read()sistem çağrısında giriş için bekliyor olabilir .

Bu arada, çekirdek ayrı bir işlem değildir. Çekirdek kodu her zaman bir işlem bağlamında yürütülür (peki, özel bir çekirdek iş parçacığı durumu hariç), bu nedenle "ve bir kullanıcı alanı çalışması yapılmazken çekirdeğin kendisi tarafından bir CPU tutulacak" demek doğru olmaz.


3
Hmmm ... Bunun CLONE_IDLETASK tarafından yaratılan boşta bir işlem olduğunu sanmıyorum. O zaman olsaydı, yaratılmasına gerek kalmayacaktı, yani programlayıcı, CPU'lardaki çekirdek boşta işlemlerini görmezden gelseydi, önyükleme sırasında onlar için herhangi bir işlem yaratması gerekmezdi. (DW olsa benim değil :))
grochmal

Biraz googling CLONE_IDLETASK 2002 yılında çekirdek sürümü 2.5.14 etrafında tanıtıldı ve daha sonra 2004 yılında kaldırılan bir çekirdek iç bayrak olduğunu ortaya koymaktadır
Johan Myréen

"bir" boşta işlem değil , "" boşta işlem.
user253751
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.