Çatal çağrılırken iplikler kopyalanıyor mu?


31

İş parçacıklarıyla çalışan bir programım varsa ve fork()unix tabanlı bir sistemden çağrı yapıyorsam iş parçacıkları kopyalanıyor mu? Mevcut işlemin sanal belleğinin 1: 1 kopyasının ortaya çıkardığı yeni işleme kopyalandığını biliyorum. Bir işlemin sanal belleğinde iş parçacığı kendi yığını olduğunu biliyorum. Bu nedenle, en azından iplik yığını da kopyalanmalıdır. Ancak, sanal bellekte bulunmayan ve bu nedenle kopyalanmıyor iş parçacığı daha bir şey olup olmadığını bilmiyorum. Yoksa, iki işlem parçacığı paylaşıyor mu yoksa bağımsız kopyalar mı?

Yanıtlar:


29

Hayır.

Konular kopyalanmıyor fork(). POSIX spesifikasyonu diyor ki (vurgulamak benimdir):

fork - yeni bir işlem oluştur

Tek bir iplik ile bir işlem oluşturulacaktır . Çok iş parçacıklı bir işlem fork () yöntemini çağırırsa, yeni işlem çağrı iş parçacığının ve tüm adres alanının bir kopyasını içerecektir, muhtemelen mutekslerin durumları ve diğer kaynaklar dahil. Sonuç olarak, hatalardan kaçınmak için, alt süreç yalnızca exec işlevlerinden biri çağrılıncaya kadar asenkron sinyal güvenli işlemler gerçekleştirebilir.

Bu sorunu aşmak pthread_atfork()için yardımcı olacak bir işlev vardır .


7

adam çatal :

Alt işlem, tek bir iş parçacığıyla (fork () olarak adlandırılan) oluşturulur. Ebeveynin tüm sanal adres alanı, mutekslerin durumu, koşul değişkenleri ve diğer pthreads nesneleri dahil olmak üzere alt öğede çoğaltılır; pthread_atfork (3) kullanımı bunun neden olabileceği sorunların çözümünde yardımcı olabilir.


Ama bu garip görünüyor: Gerçek iş parçacıkları (bilmiyorum ki sanal bellek dışında bir yerde depolama içerir) değilse, süreç çağıran iş parçacıkları için yığın kopyalamak neden?

Bunun nedeni tamamen farklı bir soru. Bu uygulamaya yol açan özgün tasarım kararlarını bilmiyorum. Eğer ilgileniyorsanız bunu ayrı bir soru olarak sormalısınız.
kaylum

@ dip ama diğer iş parçacığı yığını kopyalanmaz, kim söyledi?
Jean-Baptiste Yunès

1
@ Jean-BaptisteYunès Unix sistemlerde, bir işlem için sanal belleği temsil eden bir yapı vardır. Kopyalanan odur. Sadece yığın ve bss

6
tüm bellek alanını ve dolayısıyla tüm iş parçacıklarının yığınlarını elde edersiniz. buna ihtiyacınız vardır, çünkü yığında kalan işaretçilerin (veya statik bellek) kalan iş parçacığının erişebileceği yerlerde hiçbir sınırlama yoktur - orijinal süreçte bazı iş parçacığının yığınında yaşayan verilere işaret ediyor olabilirler
davidbak

4

Açık Grup Temel Özellikler Sayı 7, 2018 baskısının çatalından :

Tek bir iplik ile bir işlem oluşturulacaktır. Çok iş parçacıklı bir işlem fork () yöntemini çağırırsa , yeni işlem çağrı iş parçacığının ve tüm adres alanının bir kopyasını içerecektir, muhtemelen mutekslerin durumları ve diğer kaynaklar dahil. Sonuç olarak, hatalardan kaçınmak için, alt süreç yalnızca exec işlevlerinden biri çağrılıncaya kadar asenkron sinyal güvenli işlemler gerçekleştirebilir .

Uygulama çağırdığında çatal () bir sinyal işleyicisi ve tescil çatal işleyicileri herhangi birinden pthread_atfork () değil zaman uyumsuz sinyal güvenli bir işlev çağrısı, davranış tanımlanmamış.


-2

Başlangıçta, "çatal", görevin diske yazılması ve daha sonra, farklı bir iş parçacığında okumak yerine (görevi farklı bir iş parçacığı ile değiştirilirse yapılacak), hala bellekteki görüntünün görev kimliğini değiştirerek ve devam ederek elde edildi. yürütülmesi ile (yeni görev olarak). Bu, bir seferde yalnızca bir görevin RAM belleğini işgal edeceği temel görev değiştirme mekanizmasında çok basit bir değişiklikti.

Tabii ki, bellek yönetimi daha ayrıntılı hale geldikçe, bu şema yeni ortama uyacak şekilde değiştirildi.


Bunun neden aşağı oylandığını merak ediyorum. Unix böyle yaptı.
Hot Licks

Bu ilginç bir kavrayış, ama konulardan bahsediyor? Bana bir cevap gibi görünmüyor.
wastl
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.