İş parçacıkları iki açıdan karşımıza çıkıyor: işletim sistemleri ve programlama dilleri. Her iki durumda da, bir iş parçacığının sahip olduğu özelliklerde bazı farklılıklar vardır.
Bir iş parçacığının minimal bir tanımı, sırayla gerçekleşen şeylerdir, birbiri ardına.
Tipik bir makine yürütme modelinde, her iş parçacığının kendi genel amaçlı kayıt kümesi ve kendi program sayacı vardır. Makine belirli bir kaydı yığın işaretçisi olarak ayarlarsa, iş parçacığı başına bir kopya vardır.
Bir işletim sistemi perspektifinden bakıldığında, bir işletim sisteminin iş parçacıklarını desteklemek için yapması gereken minimum değer, aralarında geçiş yapmak için bir yol sağlamaktır. Bu otomatik olarak gerçekleşebilir ( öncelikli çoklu görev veya yalnızca iş parçacığı açık bir istekte bulunduğunda (kooperatif çoklu görev; bu durumda ipliklere bazen lif denir ) Hibrit modeller de vardır. Aynı grup / görevdeki iş parçacıkları arasında açık verim sağlar. İş parçacıkları arasında geçiş, en azından eski iş parçacığının kayıt değerlerinin kaydedilmesini ve yeni iş parçacığının kayıt değerlerinin geri yüklenmesini içerir.
Görevler (veya işlemler arasında yalıtım sağlayan çok görevli bir işletim sisteminde, bu terimleri bir işletim sistemi bağlamında eşanlamlılar olarak değerlendirebilirsiniz), her görevin kendi kaynakları, özellikle adres alanı vardır, ancak açık dosyaları, ayrıcalıkları vb. Vardır. işlemlerin üzerinde bir varlık olan işletim sistemi çekirdeği tarafından sağlanacaktır . Her görevin normalde en az bir iş parçacığı vardır - kod çalıştırmayan bir görev çok işe yaramaz. İşletim sistemi aynı görevde birden çok iş parçacığını destekleyebilir veya desteklemeyebilir; örneğin orijinal Unix yoktu. Bir görev, aralarında geçiş yapmayı ayarlayarak yine de birden fazla iş parçacığı çalıştırabilir - bu herhangi bir özel ayrıcalık gerektirmez. Buna “ kullanıcı konuları ” denir”, Özellikle Unix bağlamında. Günümüzde çoğu Unix sistemi özellikle farklı işlemcilerde aynı işlemin birden fazla iş parçacığının çalışmasının tek yolu olduğu için çekirdek iş parçacıkları sağlar.
Hesaplama süresi dışındaki çoğu işletim sistemi kaynağı iş parçacıklarına değil görevlere eklenir. Bazı işletim sistemleri (örneğin, Linux) yığınları açıkça sınırlar, bu durumda her bir iş parçacığının kendine ait olması gerekir; ancak çekirdeğin yığınlar hakkında hiçbir şey bilmediği işletim sistemleri vardır, bunlar söz konusu olduğunda öbekten sadece bir parçasıdır. Çekirdek ayrıca tipik olarak her bir evre için bir evre bağlamını yönetir, ki bu evre ne yaptığına dair bilgi içeren bir veri yapısıdır; bu, çekirdeğin aynı anda bir sistem çağrısında engellenen birden çok iş parçacığını işleyebilmesini sağlar.
İşletim sistemi ile ilgili olarak, bir görevin iş parçacıkları aynı kodu çalıştırır, ancak bu kodda farklı konumlardadır (farklı program sayaç değerleri). Bir programın kodunun belirli bölümlerinin her zaman belirli bir iş parçacığında yürütülmesi olabilir veya olmayabilir, ancak genellikle herhangi bir iş parçacığından çağrılabilen ortak kod (örneğin, yardımcı işlevler) vardır. Tüm iş parçacıkları aynı verileri görür, aksi takdirde farklı görevler olarak kabul edilirler; bazı verilere yalnızca belirli bir iş parçacığı tarafından erişilebiliyorsa, bu genellikle işletim sisteminin değil, yalnızca programlama dilinin amacıdır.
Çoğu programlama dilinde, depolama aynı programın iş parçacıkları arasında paylaşılır. Bu, eşzamanlı programlamanın paylaşılan bir bellek modelidir; çok popüler, ama aynı zamanda hataya da yatkındır, çünkü programlayıcıya aynı koşullara birden fazla iş parçacığı tarafından erişilebildiğinde dikkatli olunmalıdır . Yerel değişkenlerin bile iş parçacıkları arasında paylaşılabileceğini unutmayın: “yerel değişken” (genellikle), adı yalnızca bir işlevin yürütülmesi sırasında geçerli olan, ancak başka bir iş parçacığı bu değişken için bir işaretçi elde edebilir ve ona erişebilir.
Ayrıca her bir iş parçacığının kendi depolama alanına sahip olduğu programlama dilleri vardır ve bunlar arasındaki iletişim iletişim kanalları üzerinden mesaj göndererek gerçekleşir. Bu, eşzamanlı programlamanın mesaj geçirme modelidir. Erlangmesaj geçişine odaklanan ana programlama dilidir; yürütme ortamı çok hafif bir iş parçacığı işlemine sahiptir ve bir iş parçacığı oluşturmanın nispeten pahalı bir işlem olduğu ve çalışma zamanı ortamının çok büyük bir desteği destekleyemediği diğer birçok programlama dilinin aksine, birçok kısa ömürlü iş parçacığıyla yazılmış programları teşvik eder aynı anda iş parçacığı sayısı. Erlang'ın ardışık altkümesi (dilin bir iş parçacığında, özellikle veri manipülasyonunda gerçekleşen kısmı) (çoğunlukla) tamamen işlevseldir; böylece bir evre, bazı veriler içeren başka bir evreye mesaj gönderebilir ve hiçbir evre, onu kullanırken diğer evre tarafından değiştirilen veriler hakkında endişelenmeye gerek duymaz.
Bazı diller, yerel-yerel depolama konumunu global olanlardan ayırmak için bir tip sistemli veya sistemsiz yerel-yerel depolama sunarak iki modeli birleştirir. Yerel iş parçacığı depolaması, genellikle değişken adın farklı iş parçacıklarındaki farklı depolama konumlarını belirlemesine olanak tanıyan kullanışlı bir özelliktir.
İş parçacıklarının ne olduğunu anlamak için ilgi çekici olabilecek bazı (zor) takipler:
- Bir çekirdeğin birden çok iş parçacığını desteklemek için yapması gereken minimum değer nedir?
- Çok işlemcili bir ortamda, bir iş parçacığını bir işlemciden diğerine geçirmek için ne gerekir?
- İşletim sisteminden destek almadan ve varsa yerleşik desteğini kullanmadan en sevdiğiniz programlama dilinde kooperatif çok iş parçacıklı ( coroutines ) uygulamak için ne gerekir ? (Çoğu programlama dilinin, tek bir iş parçacığına ortak program uygulamak için gerekli temel ilkelere sahip olmadığına dikkat edin.)
- Bir programlama dili, eşzamanlı olmasına rağmen (açık) bir iş parçacığı kavramına sahip değilse nasıl görünebilir? (Ana örnek: pi-matematik .)