Genel olarak hangi konular paylaşılıyor?


20

Bu genel bir soru. Ve eğer herkes uygulamayı özel yapmak istiyorsa, o zaman Unix ile ilgili şeyleri tercih edeceğim. Ama önce genel olarak aşağıdaki sorunları bilmeniz gerekir:

Tek işlem birden çok iş parçacığı olabilir okumak. Aynı işlemin birden fazla iş parçacığı aralarında bir şeyler paylaşır. Neleri paylaştıklarını ve nelerin paylaşmadıklarını bilmek istiyorum. İşlem, adres alanı, yığın, yığın, genel değişkenler, kod, veri, işletim sistemi kaynaklarından oluşur, aralarında neler iş parçacıkları tarafından paylaşılır? Aşağıdaki tahminlerim var:

  1. Global değişkenler - Ben global değişken değişken iş parçacığı paylaşımları var. Ayrıca Java ve C # programlaması yaparken, sınıf düzeyi değişkenlerini paylaşmak için iş parçacıkları yaptım. Bu yüzden iş parçacıklarının küresel değişkenleri paylaştığına inanıyorum (yüksek düzey programlama dillerindeki kavramların düşük işletim sistemi düzeyindeki gerçeklere tercüme edilip edilmediğinden emin olmasa da).

  2. Yığın - Genel değişken yığında saklandığından, yığın iş parçacıkları arasında paylaşılır.

  3. Yığın - Her iş parçacığının kendi yürütme sırası / kodu olabileceğinden, program sayacı içeriğini itebileceği / açabileceği kendi yığını olmalıdır (işlev çağrıları ve iadeler gerçekleştiğinde). Bu nedenle, aynı işlemin iş parçacığı yığını paylaşmaz.

Şimdi aşağıdaki şeyleri paylaşmaktan emin değilim

  1. Adres alanı - Adres alanı altında tam olarak nelerin sayıldığından emin değilim. Ama sanırım adres alanı genellikle süreçler bağlamında kullanılıyor, iş parçacıkları değil. Ve aynı işlemin tüm iş parçacıkları üst işlemle aynı adres alanında bulunduğundan, iş parçacıklarının adres alanını paylaştığı söylenir. (Ama sonra aynı adres alanı içinde farklı bir yığın tutarlar mı?)

  2. İşletim sistemi kaynakları - Sanırım bu uygulamaya çok özel olabilir. Örneğin, üst işlem aynı dosyanın tümünü iş parçacıklarına değil, iş parçacıklarına da seçebilir. Yoksa yanlış yapıyorum ve işletim sistemi kaynakları dosyalardan başka bir şey ifade ediyor mu?

  3. Kod - İş parçacıklarının farklı kodları olabilir, bu nedenle paylaşım kodu her zaman böyle değildir.

  4. Veri - Veri altında neleri dikkate alacağınızdan emin değilsiniz. Ancak global değişkenlerin evreler arasında paylaşıldığından emin olun. Ve yerel değişkenlerin benzer şekilde paylaşılmadığından emin olun.

Genel olarak, belirsiz terimler, İşletim Sistemleri kitaplarında yapılan süper genellemeler ve çevrimiçi sağlanan ekstra uygulamaya özgü ayrıntılar nedeniyle oldukça kafam karıştı. Bu yüzden beni tatmin edebilecek bir cevap bulmaya çalışıyorum.

Yanıtlar:


13

Genel olarak her iş parçacığının kendi kayıtları (kendi program sayacı dahil), kendi yığın işaretçisi ve kendi yığını vardır. Diğer her şey bir işlemi paylaşan evreler arasında paylaşılır.

Özellikle bir işlem genellikle bir adres alanı, yığın, statik veri ve kod bölümleri ve dosya tanımlayıcıları * paylaşan bir dizi iş parçacığından oluşur .

Bir adres alanı , mantıksal adreslerin belirli fiziksel bellek parçalarına eşlenmesidir. Dolayısıyla, bir işlemdeki tüm evrelerin aynı adres alanını paylaştığını söylediğimizde foo, global kapsamdaki bir değişkene erişirken tüm evrelerin aynı değişkeni göreceğini kastediyoruz . Benzer şekilde, iş parçacıklarının tümü belirli bir zamanda kodda farklı bir nokta çalıştırıyor olabilir, ancak bunların bar()işlemdeki her iş parçacığı için aynı işleve karşılık gelen genel işlevi çağırmasına izin verilir .

Modern işletim sistemlerinin çoğu , küresel kapsamın paylaşılmayan değişkenleri olan yerel iş parçacığı depolama kavramını ekledi . Bunun kullanımının olağan örneği değişken içindir errno. Bu küresel kapsamın tek bir değişkeni, ancak çoğu modern işletim sisteminde her iş parçacığına kendi yerel kopyası verilir, böylece bir iş parçacığındaki kütüphane çağrısındaki bir hata diğer iş parçacıklarının davranışını etkilemez.

* Bir işlemdeki tüm iş parçacıkları tarafından paylaşılan bazı ek işlem durumu, işlem kimliği, sinyal işleme ve dosya kilitleri gibi şeyler vardır. İş parçacıkları tarafından paylaşılan işlem durumunun tam bir listesi için, özel iş parçacığı uygulamasıyla ilgili belgelere bakmanız gerekir. Örneğin, pthreads kılavuz sayfası .


4

İş 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 .)

Bu aylar içinde okuduğum en ilginç şey.
JSON

2

Bu bağlıdır. İş parçacıklarını örneğin POSIX (ve Unix sistemleri tarafından sunulan) veya Windows (daha sonraya aşina değilseniz, özellikle sormanız gerekir) olarak tanımlanmış olarak değerlendirirseniz, bu yanıtınızı verir (esasen @WanderingLogic yanıtının açıkladığı gibi). Linux'un standart olmayan clone(2)sistem çağrısını kullanarak kendi iş parçacığı fikri vardır . Ebeveynin ve çocuğun paylaştığı pay üzerinde oldukça hassas bir kontrol sunar. İçine saran fork(2)ve vfork(2)esas olarak sarmalayıcılara kadar uzanır clone(2), belirli bayraklarla çağırır, yani, üst öğeyle hiçbir şeyin yanında olmayan "iş parçacıkları" oluşturabilirsiniz. Ayrıntılar için kılavuz sayfasına bakınız, çevrimiçi olarak örneğin burada bulabilirsiniz . Evet, Linux POSIX tarzı iş parçacıkları sunuyor, ama çok daha fazlası.


0

Konu paylaşımı:

  • Adres alanı
  • Yığın
  • Statik veri
  • Kod bölümleri
  • Dosya tanımlayıcıları
  • Global değişkenler
  • Alt süreçler
  • Bekleyen alarmlar
  • Sinyaller ve sinyal işleyicileri
  • Muhasebe bilgileri

Konuların kendi özellikleri:

  • Program sayıcı
  • Defterleri
  • yığın
  • Durum
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.