Linux çekirdeğindeki sinyal mekanizması, çalışan uygulamaların yeni bir olay meydana geldiğinde sistemi eşzamansız olarak bilgilendirmesine izin verir. Bu sinyal mekanizması doğası gereği genellikle yazılım kesintileri olarak bilinir. Tıpkı donanım kesintileri gibi, sinyaller de bir uygulamanın normal akışını keser ve bir uygulamanın ne zaman bir sinyal alacağı tahmin edilemez.

Linux'taki sinyal mekanizmasının derinliklerine inelim ve perde arkasında neler olduğunu anlayalım.

Linux'ta Temel Sinyal Kavramları

Linux'ta süreçler üç temel durumda sinyal üretir:

  • Donanım tarafında istisnai bir durum oluştuğunda. Örneğin, uygulamanın dış bir bölgeye erişmeye çalışması gibi olayları düşünebilirsiniz. izin verilen adres alanı (segmentasyon hatası) veya sıfıra bölme içeren makine kodu oluşturma operasyon.
  • Gibi tuş kombinasyonlarının kullanılması gibi durumlar Ctrl + C veya Ctrl + Z konsolda kullanıcı tarafından konsol ekranını yeniden boyutlandırma veya bir öldürme sinyali gönderme.
  • Uygulamada ayarlanan zamanlayıcının süresinin dolması, uygulamaya verilen CPU limitinin yüksek olması, verilerin açık bir dosya tanıtıcısına gelmesi vb.
    instagram viewer

Sinyal kavramı, Unix'in ilk sürümlerinden beri var. Önceden, Unix sürümleri arasında sinyal işlemeyle ilgili birkaç fark vardı. Daha sonra, POSIX standardizasyonu sinyal yönetimi için yapılmış, Linux ve diğer Unix türevleri bu standartları takip etmeye başladı. Bu nedenle bazı belgelerde karşılaşabileceğiniz Unix sinyalleri ve POSIX sinyalleri kavramları farklılıklara işaret etmektedir.

Sinyal Numaraları

Sinyaller, birden başlayarak çeşitli sayısal değerlere sahiptir. Örneğin, sinyal 1 bir HUP hemen hemen her sistemdeki sinyal veya sinyal 9, bir ÖLDÜRMEK sinyal.

Ancak, uygulamalarınızda sinyal kullandığınızda bu sayıların kullanılması kesinlikle önerilmez. POSIX sinyalleri için, sinyal.h dosyası uygulamada olmalı ve geliştirici, aşağıdaki gibi ilgili sayıların sabit tanımlarını kullanmalıdır. SIGHUP, SIGKILL, vb. yerine.

eğer incelerseniz /usr/include/signal.h Dosya sisteminizde, ek işlemleri ve içerdiği diğer dosyaları aşağıdaki gibi değerlerin tanımlarına bakarak görebilirsiniz. __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, vb. dosyanın içinde. Linux sistemlerinde mevcut sinyal numaralarını şurada bulabilirsiniz: /usr/include/asm-generic/signal.h doğrudan uygulama kodunuza eklemeniz gerekmeyen dosya.

Sinyal Oluşturma ve Gönderme

Bir olay nedeniyle sinyal üretimi gerçekleşir. Ancak sinyalin ilgili uygulamaya gönderilmesi (teslim edilmesi) sinyalin üretilmesi ile aynı anda gerçekleşmez.

Uygulamaya gönderilecek sinyal için uygulamanın halihazırda çalışıyor olması ve CPU kaynaklarına sahip olması gerekir. Bu nedenle, belirli bir uygulamaya bir sinyalin gönderilmesi, bağlam geçişinden sonra ilgili uygulama tekrar çalışmaya başladığında gerçekleşir.

Bekleyen Sinyal Konsepti

Sinyalin üretilmesinden iletilmesine kadar geçen süre boyunca, sinyaller bekleme durumundadır. Bekleyen sinyal sayısına ve bir işlem için izin verilen bekleyen sinyal sayısına şuradan erişebilirsiniz. /proc/PID/status dosya.

# PID'li bir işlem için: 2299
cat /proc/2299/durum

# Çıktı
...
SigQ: 2/31630
...

Sinyal Maskeleri ve Engelleme

Sinyallerin tam olarak ne zaman geleceği uygulama tarafından genellikle tahmin edilemez. Bu nedenle herhangi bir işlem sırasında bazı kritik kesintiler meydana gelebilir. Bu, büyük ölçekli bir uygulama için büyük sorunlara neden olabilir.

Bunun gibi bazı istenmeyen durumları önlemek için sinyal maskelerinin kullanılması gerekmektedir. Böylece kritik bir işlemden önce bazı sinyalleri engellemek mümkündür. Bu aşamada kritik kısmı tamamlamak ve tanımlanan blokları kaldırmak önemlidir. Bu süreç, uygulama geliştiricisinin dikkat etmesi gereken bir şeydir.

Uygulama bir sinyali engellediğinde, üretilen aynı tipteki diğer sinyaller, bloke kaldırılana kadar bekleme durumunda olacaktır. Uygulamada, blok kaldırılır kaldırılmaz, bekleyen sinyallerin gönderilmesi de sağlanmaktadır.

Bu sayede blok anında beklemeye alınan aynı tip sinyaller, normal kullanımda blok kaldırıldıktan sonra uygulamaya sadece bir kez gönderilir. Gerçek zamanlı sinyaller için durum farklıdır.

Linux Sinyal Türleri

Varsayılan eylemler sinyal türlerine göre değişiklik gösterebilir. Karşılık gelen sinyali alan uygulamanın bir sinyal işleyici işlevi yoksa, varsayılan eylem gerçekleşir. Bazen bu, uygulamayı sonlandırmak ve bazen de sinyali yok saymak anlamına gelir.

Bazı sinyaller uygulama katmanında yakalanamaz, bu sinyaller her zaman varsayılan eylemi gerçekleştirir (KILL sinyali gibi).

Bir uygulamanın sonlandırılmasına neden olan bazı eylemlere ek olarak, bir çekirdek döküm dosyası da üretilir. İlgili işlemin sanal bellek tablosunun diske yazılmasıyla oluşturulan çekirdek döküm dosyaları, Kullanıcı, sonraki aşamalarda hata ayıklama araçları ile süreç bitmeden durum bilgilerini incelemelidir.

Aşağıdaki değerler bir örnek MIPS mimarisi:

sinyal Sayı Varsayılan aksiyon Yakalanabilir mi?
SIGHUP 1 Uygulamayı sonlandır Evet
İŞARET 2 Uygulamayı sonlandır Evet
SIGQUIT 3 Uygulamayı sonlandır (çekirdek dökümü) Evet
SİGİL 4 Uygulamayı sonlandır (çekirdek dökümü) Evet
SIGTRAP 5 Uygulamayı sonlandır (çekirdek dökümü) Evet
SİGABRT 6 Uygulamayı sonlandır (çekirdek dökümü) Evet
SIGFPE 8 Uygulamayı sonlandır (çekirdek dökümü) Evet
SIGKILL 9 Uygulamayı sonlandır Numara
SIGBUS 10 Uygulamayı sonlandır (çekirdek dökümü) Evet
SIGSEGV 11 Uygulamayı sonlandır (çekirdek dökümü) Evet
SIGSYS 12 Uygulamayı sonlandır (çekirdek dökümü) Evet
SIGPIPE 13 Uygulamayı sonlandır Evet
SİGALRM 14 Uygulamayı sonlandır Evet
SIGTERM 15 Uygulamayı sonlandır Evet
SIGUSR1 16 Uygulamayı sonlandır Evet
SIGUSR2 17 Uygulamayı sonlandır Evet
SIGCHLD 18 Aldırmamak Evet
SIGTSTP 20 Durmak Evet
SIGURG 21 Aldırmamak Evet
SİGPOLL 22 Uygulamayı sonlandır Evet
DURDUR 23 Durmak Numara
SIGCONT 25 Durmuşsa devam et Evet
SİGTTİN 26 Durmak Evet
SIGTTOU 27 Durmak Evet
SIGVTALRM 28 Uygulamayı sonlandır Evet
SIGPROF 29 Uygulamayı sonlandır Evet
SIGXCPU 30 Uygulamayı sonlandır (çekirdek dökümü) Evet
SIGXFSZ 31 Uygulamayı sonlandır (çekirdek dökümü) Evet

Linux'ta Sinyallerin Yaşam Döngüsü

Sinyaller üç aşamadan geçer. Temel olarak üretim aşamasında, çekirdek veya herhangi bir işlem tarafından üretilirler ve bir sayı ile temsil edilirler. Üzerlerinde ekstra yük olmadığı için hafif ve hızlı çalışırlar. Ancak POSIX tarafına bakarsanız, gerçek zamanlı sinyallerin ekstra veri iletebildiğini görürsünüz.

Sinyallerin teslim aşaması, üretim aşamasından sonra gelir. Normalde sinyaller uygulamaya mümkün olan en kısa sürede çekirdekten ulaşır. Ancak bazen uygulamalar kritik işlemleri yaparken sinyalleri engelleyebilir. Bu gibi durumlarda, işlem gerçekleşene kadar sinyal beklemede kalır.

Sinyaller gibi süreçler de Linux ekosisteminin ayrılmaz bir parçasıdır. Bir Linux sistem yöneticisi olmayı planlıyorsanız, süreçlerin ne olduğunu ve nasıl çalıştığını anlamak çok önemlidir.

Linux'ta Süreç Nedir?

Sonrakini Oku

PaylaşmakCıvıldamakPaylaşmakE-posta

İlgili konular

  • Linux
  • Linux çekirdeği
  • Sistem Yönetimi

Yazar hakkında

Fatih Küçükkarakurt (9 Makale Yayınlandı)

Matematik ve teknolojinin hayranı olan bir mühendis ve yazılım geliştiricisi. Bilgisayarları, matematiği ve fiziği her zaman sevmiştir. Oyun motoru projelerinin yanı sıra makine öğrenimi, yapay sinir ağları ve lineer cebir kütüphaneleri geliştirmiştir. Ayrıca makine öğrenmesi ve lineer matrisler üzerinde çalışmalarını sürdürmektedir.

Fatih Küçükkarakurt'dan Daha Fazla

Haber bültenimize abone ol

Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!

Abone olmak için buraya tıklayın