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-32HLT
uyumlu 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.