Görev Yöneticisi sistemin binden fazla iş parçacığıyla çalıştığını söylüyor


17

Görev Yöneticisi'ni açtım ve "Sistem" alanının altına baktım:

Konular: 1337

Hiper iş parçacığı olan (dört iş parçacığı) çift ​​çekirdekli bir işlemciye sahip olduğum için, işlemcimin yalnızca dört tane olması gerekiyorsa 1000'den fazla iş parçacığına sahip olmak nasıl mümkün olur?


3
Bu yüzden hiper iş parçacığı demiyorlar değil mi? :)
CVN

9
Gee, sonunda "çoklu programlama" icat ettiler mi ??? (Bu 1967, değil mi?)
Daniel R Hicks

10
Birisi sayıyı 1337 olarak değiştirdi mi?
Erty Seidohl

11
Dört sıralı bir şirketin 1337 çalışanı nasıl olabilir? Kolay; çalışanlar sıraları kullanarak sıraları alırlar .
Eric Lippert

Yanıtlar:


50

Basit cevap, tüm evrelerin aynı anda yürütülmemesidir. Daha kapsamlı bir açıklama için okumaya devam edin.

İşletim sisteminin görev zamanlayıcısının genellikle uygulamaları zamanlaması düşünülür ve bu, bilgisayar başka bir görev üzerinde çalışırken bir görevi gerçekleştirmenizi sağlar. Eski günlerde, çoklu görevlerin turnusol testi, başka bir şey yaparken bir disketi biçimlendiriyordu. İşletim sistemini gerçekten test etmek istiyorsanız, seri bağlantı noktasına bağlı bir modem üzerinden bir dosya indirirken bir disketi biçimlendirirsiniz. Donanım gerçekten anlamlı bir şekilde yapacak kadar güçlü hale geldiğinden, video oynatma bazen bu tür testlerde de yer aldı. İşletim sisteminin görev zamanlayıcısı bu görevleri sorunsuz bir şekilde yürütmeyi başarabiliyorsa, her şeyi halledebilir.

Ancak, görev zamanlayıcı aslında uygulamaları (işlemleri) zamanlamaz, iş parçacıklarını zamanlar . Her uygulamanın en az bir iş parçacığı vardır, ancak yaptığı işi ilgili veya bağımsız parçalara ayırmak için çok sayıda iş parçacığı kullanabilir. Örneğin, bir uygulamanın kullanıcı arabirimini işleyen bir iş parçacığına sahip olması ve kullanıcı potansiyel olarak uzun süreli bir işlem başlattığında (yazdırma, elektronik tabloyu yeniden hesaplama, geliştirme ortamı yapan bir şey olabilir) başka bir iş parçacığı oluşturmak yaygındır. bir simge araması vb.). Bazı programlama ortamları, görünmez bir şekilde programcıya bir miktar iş parçacığı getirir; Örneğin Java ve .NET yapabilir çöp toplamaprogramlayıcının derhal kontrolünün dışında olan ayrı bir iş parçacığında. Bazı programlar yeni bir iş parçacığı oluşturur ve bunları birleştirir, çünkü yeni iş parçacıkları oluşturmak nispeten pahalı bir işlemdir (bu nedenle her ihtiyacınız olduğunda bir iş parçacığı oluşturmak zorunda kalmazsınız). Önizleme yapan her şey genellikle ayrı bir iş parçacığında yapılır, bu nedenle önizleme oluşturulurken kullanıcı arayüzünün geri kalanı yanıt verir. Ve bunun gibi. Birlikte ele alındığında, tüm bunlar, sistemdeki iş parçacığı sayısının herhangi bir zamanda işlem sayısının birçok katı olabileceği anlamına gelir.

Her iş parçacığı birkaç olası durumdan birinde olabilir, ancak en önemli ayrım çalışan , çalıştırılabilir ve bekleyen durumlar arasındadır; terminoloji biraz farklı olabilir, ancak genel fikir budur. Herhangi bir anda, sanal başına yalnızca bir iş parçacığı (hiper iş parçacığı ve benzer teknolojiler nedeniyle) CPU çekirdeği çalışıyor olabilir (yani, makine kodu talimatlarını yürütebilir), ancak herhangi bir sayıda iş parçacığı çalıştırılabilir (yani, almak için bir aday olduğu anlamına gelir) CPU'nun bir sonraki seferde programlayıcının hangi iş parçacığının çalışmasına izin verilmesi gerektiğine karar vermesi gerekir). Bekleme (bloke olarak da bilinir) iş parçacıkları sadece bir şey beklemektedir - en yaygın durumlar muhtemelen kullanıcı, disk veya ağ G / Ç'sini beklemesidir (özellikle kullanıcı girişi son derece yavaştır).

Görev yöneticisinde gördüğünüz iş parçacığı sayısı , bu durumların herhangi birindeki toplam iş parçacığı sayısıdır . Örneğin, bunu yazdığım Windows 7 sisteminde şu anda yaklaşık 70 işlem başlatıldı, ancak neredeyse 900 iş parçacığı var. Çeşitli görevleri yerine getirmek için tüm arka plan süreçleri ve bunların her birinin çok sayıda iş parçacığına nasıl alt gruplara ayrıldığını, bu çok çirkin bir sayı değildir.

Önceden çok görevli bir işletim sisteminin görev zamanlayıcısının özünde, teknik uygulamanın derinliklerine biraz daha fazla gitmek genellikle bir tür donanım kesme kancasıdır. Bunu gerçekleştirmek için hiçbir yararlı işler olduğunda çekirdek CPU durdurmak anlamına Bu araçlar (değilse bu, neredeyse kesinlikle nedenlerinden biridir nedeni, neden Linux denetler talimat üzerine Açılışta IA-32HLTuyumlu CPU'lar ve muhtemelen diğer mimariler üzerinde benzer kontroller yapar), gelecekteki zamanı makul bir şekilde belirlediğinde, bir kesintinin tetikleneceğini ve görev zamanlayıcısının çağrılacağını bilerek güvenlidir. Kesme, CPU'nun hangi işi gerçekleştirdiğine bakılmaksızın (kesme işlemlerinin arkasındaki fikir) gerçekleştiği için, zamanlayıcı düzenli olarak yürütülür ve bir sonraki zaman diliminde hangi iş parçacığının yürütülmesi gerektiğini belirleme şansı elde eder. Bağlam anahtarları nispeten pahalı olduğundan, zamanlayıcının iş parçacıkları arasında ne kadar agresif bir şekilde geçiş yaptığını ayarlamak genellikle (en azından kaynak kodu aracılığıyla) mümkündür; iş parçacıklarını daha sık değiştirmek sistemin daha duyarlı olmasına neden olur, ancak anahtarlama yükü belirli bir görev kümesini bitirmek için geçen toplam sürenin daha uzun olduğu anlamına gelir. En hızlısistem, yalnızca iş parçacığı çalıştırmak artık mümkün olmadığında (bir şey üzerinde beklemek engellenir veya işini bitirir) iş parçacıkları arasında geçiş yapan sistem olacaktır , çünkü bu, ek yükü en aza indirirken, en duyarlı sistem iş parçacıkları arasında geçiş yapar zamanlayıcı her çağrıldığında belirli bir iş parçacığının CPU zamanını almadan önce ortalama bekleme süresini en aza indirir. İdeal ayar genellikle bu ikisi arasında bir yerdedir ve bu seçenekler arasındaki dengesizlik, Linux'un çekirdek yapılandırması aracılığıyla bazı ayar parametreleri ve seçim için birden fazla zamanlayıcı sunmasının büyük bir nedenidir.

Öte yandan, birlikte çalışan çok görevli işletim sistemleri ve ortamlar ( Windows 3.x bir örnektir), zamanlayıcıya düzenli olarak denetim sağlamak için her bir uygulamaya güvenir. Genellikle bunu yapmak için tasarlanmış bir API işlevi vardır ve çoğu zaman API işlevleri dahili yürütme akışlarının bir parçası olarak yapar, çünkü kullanıcı deneyimini daha pürüzsüz hale getirmeye yardımcı olur. Bu tasarım yaklaşımı, tüm uygulamalar iyi davrandığı ve herhangi bir uzun süreli işlem sırasında kısa aralıklarla kontrolünü sürdürdüğü sürece iyi çalışır (uzun süreli çalışma, saniyenin küçük bir kısmından daha fazla anlamına gelir), ancak tıkanamayan bir uygulama tüm sistem. Bu Windows 3.x ben yukarıda belirtilen çoklu görev testinde çok kötü niye bunda büyük rol oynar iken OS / 2aynı donanım üzerinde aynı görevleri gerçekleştirirken nezaketle gezindi: bir uygulama, disket sürücüsüne belirli bir sektörü yazmasını söyleyebilir ve geri gelen çağrı gerçekten ölçülebilir olabilir (yüzlerce milisaniye veya Daha); önleyici bir çoklu görev sistemi, zamanlayıcısının bir sonraki zamanlanmış çağrısında devreye girmesini sağlar, şu anda "çalışmakta olan" iş parçacığının aslında yazma çağrısı tarafından engellendiğini ve yalnızca çalıştırılabilir başka bir iş parçacığına geçtiğini fark eder. (Pratikte biraz daha kapsayıcı, ancak genel fikir bu.)

Hem preemptif olarak çok görevli hem de kooperatif ortamlarında, farklı ipliklerin farklı önceliklere sahip olma olasılığı da vardır. Örneğin, bir iletişim bağlantısı üzerinden veri alan iş parçacığının zamanında yürütülmesi, sistem zaman ekranını güncelleyen olandan daha büyüktür, bu nedenle alıcı iş parçacığı yüksek önceliğe sahiptir ve zaman görüntüleme güncelleyici iş parçacığının önceliği düşüktür. . İş parçacığı öncelikleri, zamanlayıcının hangi iş parçacığının yürütülmesine izin vereceği kararında rol oynar (örneğin, çok basitleştirilmiş, yüksek öncelikli iş parçacıkları her zaman düşük öncelikli iş parçacıklarından önce yürütülmelidir, bu nedenle düşük öncelikli iş parçacığının yapacak işi kalsa bile, yüksek öncelikli iş parçacığı çalıştırılabilir hale gelirse öncelik taşır), ancak bu tür özel zamanlama kararları altta yatan mekanizma tasarımını etkilemez.


11
"Özellikle kullanıcı girişi son derece yavaş" seviyorum
John Dvorak

CPU'nun sahip olduğu "evreler" herhangi bir anda aynı anda çalıştırabileceği numarayı belirtir. Mümkün olduğunda, her biri bir dönüş veya CPU paylaşımı için aktif dişler arasında geçiş yapar. G / Ç'de (disk, klavye / fare girişi vb.) Veya başka bir şeyde (muteksler gibi senkronizasyon ilkelleri vb.) Beklenen işlemler / iş parçacıkları "engellenir" veya bekleme bekler.
LawrenceC

1
Yorumlar açıklamak istemektedir, ancak uzun tartışmalar için uygun değildir ve bir noktada okumak zorlaşır. Bunu bunun yerine Süper Kullanıcı Sohbeti'ne götürebilir misiniz ? Teşekkür ederim.
slhck

1
@slhck Bir oda oluşturdum, ancak bu yorumlarda tartışmayı taşımak için herhangi bir yol bulamadım, ki bu iyi olurdu. Manuel olarak moderatör olarak yapabileceğiniz bir şey mi? chat.stackexchange.com/rooms/9547/…
bir CVn

1
Ne yazık ki hayır. Manuel olarak tetiklenemeyen otomatik bir taşıma işlemi var, ancak yorumları bir sohbet odasına taşıyamıyoruz. Buradaki yorumların şimdilik kalmasına izin vereceğiz, ancak başkalarını oluşturduğunuz sohbet odasındaki tartışmayı takip etmeye teşvik ediyorum.
slhck

18

1037 araçlık dört şeritli bir otoyol düşünün.

İşletim sisteminizin birçok hizmette çalışması için çok sayıda çalışan işleme ihtiyacı vardır. En basit grafik programlar bile çok iş parçacıklı programlama gerektirir. Çok sayıda programın açıldığını düşündüğünüzde, bilgi işlem güç kaynaklarının paylaşılmasına ihtiyaç olduğunu görürsünüz.

Görev yöneticinizin gösterdiği mevcut sistem yüküdür. Comp özelliklerinizin gösterdiği şey, paralel yürütme için kaç iş parçacığının (ön uçta) kabul edildiğidir. Hiper iş parçacığı ve çok çekirdekli özellikler arasındaki farka fazla girmeden, daha mantıklı ön uç iş parçacığı kabulü ile, bir sistem genellikle daha iyi performans gösterir.


8
"En basit grafik programlar bile çok iş parçacıklı programlama gerektirir." Yanlış. Tek iş parçacıklı GUI uygulamaları yazmak mükemmel bir şekilde mümkündür; Windows 95'e kadar, tüm niyet ve amaçlar için herkes bunu böyle yaptı. Bazı görevleri daha karmaşık hale getirir (örneğin, arka plan baskısı birden çok iş parçacığı ile önemsizdir, ancak tek bir iş parçacıklı uygulamada kesinlikle önemsiz değildir, özellikle de o zamanki gibi bellek kısıtlıysanız), ancak arasında büyük bir fark vardır. X, Y "ve" X, Y gerektirir "ile kolaylaştırılmıştır.
CVn

8
@ MichaelKjörling: "Windows 95'e kadar, tüm niyet ve amaçlar için herkes bu şekilde yaptı" * - gerçekten mi? 80'lerde Motif çalıştıran * nix sistemlerde bile?
LarsH

@LarsH İyi bir nokta ve bir yorumda düzenlemek için çok geç düşündüm. Ancak bu, noktayı reddetmez: yani, tek iş parçacıklı GUI uygulamaları yazmak tamamen mümkündür. Bunun için çoklu iş parçacığına ihtiyacınız yoktur, ancak programcıda bazı görevleri (oldukça) kolaylaştırır.
CVn

@ MichaelKjörling: Katılıyorum, bu geçerli bir konu olan noktanızı reddetmiyor. (Uprego'nun yanlış ifadesinin de onun görüşünü reddettiğini sanmıyorum.)
LarsH

@ MichaelKjörling'in söylediklerine örnek olarak, programlama dili olarak Visual Basic'in (.NET'ten önce) çoklu iş parçacığı desteği yoktu . Her şey tek bir iş parçacığında çalıştırıldı. Uzun süren bir işlemin ortasında kullanıcı girişini DoEventsişlemek istiyorsanız, ileti sırasını işleyecek şekilde aradınız - ancak bu aynı iş parçacığında yapılır ve tüm iletiler işlenene kadar bu uzun süren işlemi engeller . (Elbette, Win32 API işlevlerini çağırabilir ve / veya ek işlemler oluşturabilirsiniz, ancak bu noktada alt düzey dillerden birini de kullanabilirsiniz.)
Bob

5

Geri çekilmeli ve kendimize şu soruyu sormalıyız: Tek CPU'lu bir bilgisayarın iki iş parçacığı nasıl olabilir?

İş parçacıkları donanım değil, yazılım varlıklardır. Başka bir iş parçacığına sahip olmak için, iş parçacığı oluşturan nesneler için tanımlayıcı yapı ve yığın gibi belleğe ihtiyacınız vardır.

İşletim sistemi, belirli kesmeler (zamanlayıcı kesmesi gibi) veya iş parçacığı işletim sistemine çağrı yaptığında olduğu gibi çeşitli zamanlarda iş parçacıkları arasında geçiş yapar.

Sistemde bulunan tüm evrelerden sadece bir alt-grup genellikle "runnable" olarak adlandırılan bir durumdadır. Çalıştırılabilir iş parçacıkları çalıştırmak için istekli: Çalıştırıyorlar veya zamanlayıcı tarafından gönderilmeyi bekleyen bir "çalıştırma kuyruğunda" oturuyorlar. Çalıştırılamayan iş parçacıkları "engellenir", bir miktar kaynak almayı veya girdi almayı bekler veya "giriş" in zaman geçişi olduğu girişte engellenmeye benzer "uyku" şeklindedir. İşletim sistemindeki zamanlayıcı işlevi bir işlemcinin çalışma kuyruğuna baktığında ve yürütmek için farklı bir iş parçacığı seçtiğinde bir "bağlam anahtarı" gerçekleşir.

Intel'in belirli bir donanım özelliği için adı olan "hyperthreading" ile karıştırmayın .

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.