Önleyici ve işbirlikçi olmak üzere iki ana çok görevli işletim sistemi türü vardır. Her ikisi de birden fazla görevin sistemde tanımlanmasına izin verir, fark görev değiştirmenin nasıl çalıştığıdır. Tabii ki tek çekirdekli işlemci ile bir seferde sadece bir görev yürütülüyor.
Her iki çoklu görevli işletim sistemi türü, her görev için ayrı bir yığın gerektirir. Yani bu iki şeyi ifade eder: birincisi, işlemcinin yığınların RAM içinde herhangi bir yere yerleştirilmesine izin vermesi ve bu nedenle yığın işaretçisini (SP) hareket ettirmek için talimatlara sahip olması - yani düşük uçta olduğu gibi özel amaçlı bir donanım yığını yoktur. PIC en. Bu PIC10, 12 ve 16 serilerini terk eder.
Neredeyse tamamen C'ye bir işletim sistemi yazabilirsiniz, ancak SP'nin hareket ettiği görev değiştirici montajda olmalıdır. Çeşitli zamanlarda PIC24, PIC32, 8051 ve 80x86 için görev değiştiriciler yazdım. Bağırsaklar, işlemcinin mimarisine bağlı olarak oldukça farklıdır.
İkinci gereklilik, birden fazla yığın sağlamak için yeterli RAM olmasıdır. Genellikle bir yığın için en az birkaç yüz bayt gerekir; ancak görev başına yalnızca 128 bayt olsa bile, sekiz yığın 1K bayt RAM gerektirir - yine de her görev için aynı boyut yığınını ayırmanız gerekmez. Geçerli görevi yerine getirmek için yeterli yığına ve iç içe geçmiş alt yordamlarına yapılan tüm çağrılara ihtiyaç duyduğunuzu, ancak ne zaman gerçekleşeceğini asla bilemeyeceğiniz için bir kesinti çağrısı için alan yığınının gerektiğini unutmayın.
Her görev için ne kadar yığın kullandığınızı belirlemek için oldukça basit yöntemler vardır; örneğin, tüm yığınları belirli bir değere (örneğin 0x55) başlatabilir ve sistemi bir süre çalıştırabilir ve sonra belleği durdurabilir ve inceleyebilirsiniz.
Ne tür PIC'ler kullanmak istediğinizi söylemiyorsunuz. PIC24'lerin ve PIC32'lerin çoğunun çok görevli bir işletim sistemi çalıştırmak için bolca yeri olacaktır; PIC18'in (RAM'de yığınları olan tek 8 bit PIC) maksimum RAM boyutu 4K'dır. Yani bu oldukça havalı.
İşbirlikli çoklu görevle (ikisinin daha basit), görev değiştirme yalnızca görev kontrolünü işletim sistemine "bıraktığında" yapılır. Bu, görevin, bir G / Ç isteği veya zamanlayıcı çağrısı gibi bekleyeceği bazı işlevleri gerçekleştirmek için bir işletim sistemi yordamı çağırması gerektiğinde gerçekleşir. Bu, işletim sisteminin yığınları değiştirmesini kolaylaştırır, çünkü tüm kayıtların ve durum bilgilerinin kaydedilmesi gerekli değildir, SP sadece başka bir göreve geçirilebilir (çalışmaya hazır başka görev yoksa, boş bir yığın verilen kontrol). Geçerli görevin bir işletim sistemi çağrısı yapması gerekmiyor, ancak bir süredir çalışıyorsa, sistemin yanıt vermesini sağlamak için kontrolü gönüllü olarak bırakması gerekir.
İşbirlikçi çoklu görev ile ilgili sorun, görev asla kontrolü bırakmazsa, sistemi domuz tutabilir. Yalnızca o ve denetim verilen kesinti yordamları çalışabilir, böylece işletim sistemi kilitli görünecektir. Bu, bu sistemlerin "işbirlikçi" boyutudur. Yalnızca bir görev anahtarı gerçekleştirildiğinde sıfırlanan bir bekçi köpeği zamanlayıcısı uygulanırsa, bu hatalı görevleri yakalamak mümkündür.
Windows 3.1 ve öncesi kooperatif işletim sistemleriydi, bu yüzden performansları bu kadar büyük değildi.
Önleyici çoklu görevlerin uygulanması daha zordur. Burada, görevleri manuel olarak kontrolünden vazgeçmek gerekmez, bunun yerine her göreve maksimum çalışma süresi verilebilir (10 ms diyelim) ve sonra varsa bir sonraki çalıştırılabilir göreve bir görev anahtarı gerçekleştirilir. Bunun için bir görevin keyfi olarak durdurulması, tüm durum bilgilerinin kaydedilmesi ve ardından SP'nin başka bir göreve geçirilmesi ve başlatılması gerekir. Bu, görev değiştiriciyi daha karmaşık hale getirir, daha fazla yığın gerektirir ve sistemi biraz yavaşlatır.
Hem işbirlikçi hem de önleyici çoklu görev için, çalışan görevi geçici olarak önleyecek herhangi bir zamanda kesintiler meydana gelebilir.
Supercat'in bir yorumda belirttiği gibi, kooperatif çoklu görevinin avantajlarından biri, kaynakların paylaşılmasının daha kolay olmasıdır (örn. Çok kanallı bir ADC gibi donanım veya bağlantılı bir listeyi değiştirmek gibi bir yazılım). Bazen iki görev aynı kaynağa aynı anda erişmek isteyebilir. Önleyici zamanlama ile, işletim sisteminin bir görevi kullanarak bir görevin ortasında görevleri değiştirmesi mümkün olacaktır. Bu nedenle , başka bir görevin gelmesini ve aynı kaynağa erişmesini önlemek için kilitler gereklidir. İşbirlikçi çoklu görev ile bu gerekli değildir, çünkü görev kendisini ne zaman işletim sistemine geri bırakacağını kontrol eder.