İşbirlikçi zamanlama bir G / Ç işlemi gerçekleştirirken süreçleri askıya alıyor mu?


19

Birçok işletim sistemi referansı, kooperatif (önleyici yerine) çoklu görevle, bir işlemin CPU'yu açıkça gönüllü olarak askıya alıncaya kadar koruduğunu söylüyor. Çalışan bir işlem, hemen karşılanamayan bir G / Ç isteği gerçekleştirirse (örneğin, henüz kullanılamayan bir tuş darbesi ister), zamanlayıcı bunu askıya alır mı veya istek hizmet verilinceye kadar gerçekten CPU'yu tutar mı?

["İ / o üzerindeki blokları" ile değiştirmek için düzenlendi, "hemen yerine getirilemeyen bir I / O isteği gerçekleştirir."]


Bu sorular burada imhoik olacak işletim sistemlerinin özelliklerini soruyor gibi görünüyor. Eğer durum böyle değilse, lütfen sorunuzu daha soyut bir soruya tekrar yazın.
Raphael

3
Unix grubuna gönderdiğimde, orada uygunsuz olduğu söylendi ve kabul ettiğim buraya aitti, çünkü belirli bir işletim sistemi ile ilgili değildi. Bunun şube tahmini hakkındaki soru ile karşılaştırılabilir olduğunu düşünüyorum. Burada neyin uygun ve neyin uygun olmadığı hakkında topluluğun neye karar verdiğini görmek ilginç olacaktır.
Ellen Spertus

Yanıtlar:


15

Gerçekten "işbirlikçi" bir ortamda ve herhangi bir donanım koruması olmasaydı, bir süreç kesinlikle G / Ç'yi engelleyebilir ve G / Ç işlemi yapılana kadar (ya da kontrolü hiç bırakmadan) kontrolü bırakamazdı. Örneğin, Windows 3.1 bu şekilde oldu: tek bir kullanıcı işlemi tüm bilgisayarı ele geçirmek ve başka bir şeyin çalışmasını önlemek istiyorsa, bunu yapabilirdi.

Ancak çoklu görev içeren bir sistemde, sistem API G / Ç komutlarının çağrıldıklarında işlemcinin denetimini bırakmasını beklersiniz. Bu nedenle, çalışan bir işlem G / Ç'yi engellediğinde, işlemin normal sistem API'lerini kullandığı varsayılarak, G / Ç tamamlanıncaya kadar diğer işlemlerin çalışmasına izin verilir ve sonunda G / Ç tamamlandıktan sonra orijinal işlem sürdürülür. . Başka bir deyişle, engelleme G / Ç işlevini çağırmak, kooperatif bir sistemdeki bir işlemin kendisini gönüllü olarak askıya alabilmesinin bir yoludur.


11

Çalışan bir işlem i / o üzerinde engelliyorsa

ES'yi engellemek, işleminizi askıya almakla eşdeğerdir. Linux çekirdeği bağlamında, gibi bir IO sistem çağrısının yürütülmesi, read()a sysenterveya interrupt işleyicisinin, bu IO'ya bakmak için tetiklemesine ve do_sys_read()sonuçta çağırmasına neden olacaktır . Burada, geçerli istek hemen yerine getirilemezse, işlev çağrılarak sched()başka bir işlem yürütebilir.

Bir kooperatif sistemi bağlamında, bir IO nedeni için bir sistem çağrısı yaptığınızda, talep karşılanamazsa, çekirdek başka bir görev alır ve bunu yürütür. Bu belge biraz arka plan sağlar - temel olarak, IO'yu beklediyseniz, o IO'yu beklerken sonsuza kadar asılabilirdiniz. İşbirliği planlaması fikri, sched()CPU-yoğun görevler yapıyorsa sık sık aradığınız veya eşit CPU'dan ayrılma yöntemidir.

Çekirdek modu ile ilgili düşünceler daha ilginç hale geliyor. Bazı gömülü platformlar gibi kullanılabilir oldukları mimarilerde , kesme işleyicileri donanım veya yazılım kesintilerine yanıt olarak hala çağrılır. Kesme işlemeyi devre dışı bırakmak genellikle uygulama açısından mümkündür , ancak bunun da dezavantajları vardır.


4

İşbirlikçi zamanlama (tercihen cooperative multitasking) modelinde, işletim sisteminin işlemin ne kadar sürdüğünü kontrol edemediği anlamında bir zamanlayıcı kavramı yoktur.

Doğru programlanmış bir uygulama G / Ç üzerindeki CPU'yu gönüllü olarak bırakacaktır. Ancak, kötü yazılmış uygulamalar G / Ç'yi beklemeye devam edebilir ve böylece diğer işlemleri engelleyebilir.

Not: Bu yaklaşım daha sonra işletim sisteminin çoğu tarafından önleyici zamanlama (harici bir zamanlayıcıya sahipti) lehine verildi ve şimdi farklı işletim sistemi tarafından kullanılan her türlü farklı zamanlama algoritmasına sahibiz.

DÜZENLEME: Cevabım, orijinal biçiminde (yıl önce: P) açıklanan zamanlamaya dayanıyordu. Gilles'in yorumladığı gibi bazı sistemler hala işbirlikçi zamanlama kullanıyor. Ve bir zamanlayıcı var. Bu sistemlerin COS'u saf ve orijinal haliyle kullanıp kullanmadığından emin değilim.


2
Birçok yerleşik işletim sistemi (RTOS dahil ancak bunlarla sınırlı olmamak üzere) birlikte planlamaya sahiptir. Bu, planlayıcı olmadığı anlamına gelmez; zamanlayıcı, daha sonra hangi iş parçacığının çalıştırılacağını belirleyen koddur. Önleme, çalışmakta olan görevin isteği yerine zamanlayıcının otomatik olarak girilmesi ile ilgilidir.
Gilles 'SO

@Gilles Güzel yorum (bir düzenlemeye koyarak). Tamamen kullanılmadığını kabul ediyorum. Cevabım sadece başlangıçta tanımlandığı gibi algoritmaya dayanıyordu. AFIK, bazı modifikasyonlarla (bazı zamanlayıcılarla) kullanılır. Bazı işletim sistemlerinde saf haliyle kullanılıp kullanılmadığından emin değilim.
Ankit

4

Kooperatif çoklu görev yürütme bağlamının kontrolü zamanlayıcıya açıkça bırakması gerektiğini ve isterse bir bağlam anahtarının oluşmasını engelleyebileceğini ima eder.

Çoğu uygulama, işlemci tahsisinin adilliğini artırmak için derhal ve çoğu zaman da olsa geri dönmeyen herhangi bir sistem çağrısı için açıkça bir bağlam anahtarı gerçekleştirir.

Genellikle başarısız işlemlerin (veya sistemin geri kalanına kasıtlı olarak hizmeti reddetmenin) sık sık görev değiştirmesini önlemek mümkündür.

Gilles tarafından açıklandığı gibi ön-değerlendirme, etkin görev ve zorunlu bağlam anahtarlarının zamanla kesintiye uğramasını önleyen sistemin mimarisinin bir sınırlamasıdı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.