Sinyal alırsa çok iş parçacıklı bir Linux işlemine ne olur?


20

Unix (Posix) işlemi bir sinyal alırsa, bir sinyal işleyici çalışır.

Çok iş parçacıklı bir süreçte ne olacak? Hangi iplik sinyali alır?

Kanımca, sinyal API'sinin (yani sinyal işleyicinin iş parçacığının belirlenebilmesi gerekir) genişletilmesi için genişletilmesi gerekir, ancak net bilgi için avlanmak sadece linux çekirdek posta listesinde ve üzerinde yıllarca alev buldum farklı forumlar. Anladığım kadarıyla, Linus'un konsepti Posix standardından farklıydı ve önce bazı uyumlu katmanlar inşa edildi, ancak şimdi Linux posix modelini takip ediyor.

Mevcut durum nedir?


3
Kopyası stackoverflow.com/questions/11679568/... "pthreads (7) POSIX.1 sinyal tasarrufta içeren bir süreç payı özelliklerinde tüm konuları, gerektirdiğini açıklar"
steve

@steve Teşekkürler, ancak 1) başka bir SE sitesinde 2) bu özellik açıkça belirtilmiyor, tam olarak ne olacak. Ne anlama gelirse, sinyal işleyicileri tüm iş parçacıklarında çağrılır , ancak benim için biraz gerçeküstü görünüyor. 3) Bu cevap Linus'un modelinin ne olduğunu ve şu anda neden / nasıl kullanıldığını belirtmiyor.
peterh - Monica'yı geri yükle

Yanıtlar:


9

POSIX'te "Gerekçe: Sistem Arayüzleri Genel Bilgileri" bölümündeki " Sinyal Üretimi ve Dağıtımı " başlıklı yazı şöyle diyor

Bir işlem için oluşturulan sinyaller yalnızca bir iş parçacığına iletilir. Dolayısıyla, birden fazla evre bir sinyal almaya uygunsa, bir tane seçilmelidir. İplik seçimi, hem mümkün olan en geniş uyumlu uygulama aralığına izin vermek hem de uygulamalara, farklı dişler arasında teslimat kolaylığı açısından farklılıklar olması halinde, sinyali "mümkün olan en kolay" iş parçacığına verme özgürlüğü vermek için tamamen uygulamaya bırakılmıştır.

Gönderen signal(7)Linux sistemi üzerinde manuel:

Bir bütün olarak bir süreç (örneğin kullanılarak gönderildiğinde kill(2)) veya belirli bir iplik (örneğin, belirli bir makinenin çalıştırılmasının bir sonucu olarak üretilen SIGSEGV ve SIGFPE gibi belirli sinyaller için) bir sinyal üretilebilir (ve dolayısıyla beklemede). dil talimatı, belirli bir iş parçacığını hedef alan sinyaller gibi iş parçacığı yönelimlidir pthread_kill(3)). İşleme yönelik bir sinyal, halihazırda sinyali bloke edilmemiş olan ipliklerden herhangi birine iletilebilir. Birden fazla iş parçacığının sinyali engellenmemişse, çekirdek sinyali iletmek için isteğe bağlı bir iş parçacığı seçer.

Ve içinde pthreads(7):

İş parçacıklarının farklı alternatif sinyal yığını ayarları vardır. Ancak, yeni bir iş parçacığının alternatif sinyal yığını ayarları, onu oluşturan iş parçacığından kopyalanır, böylece iş parçacıkları başlangıçta alternatif bir sinyal yığınını paylaşır (çekirdek 2.6.16'da sabitlenir).

Gönderen pthreads(3) OpenBSD sistemine kılavuzu (alternatif bir yaklaşım, bir örnek olarak):

Sinyal işleyicileri normal olarak yürürlükte olan iş parçacığının yığınında çalıştırılır.

(Şu anda çoklu işlemcili bir makinede aynı anda birden fazla iş parçacığı yürütüldüğünde bunun nasıl ele alındığının farkında değilim)

POSIX iş parçacıklarının eski LinuxThread uygulaması, yalnızca belirli tek iş parçacıklarının sinyaller tarafından hedeflenmesine izin verdi. Gönderen pthreads(7)Linux sisteminde:

LinuxThreads, sürece yönelik sinyaller kavramını desteklemez: sinyaller yalnızca belirli evrelere gönderilebilir.

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.