Bir işlem kullanıcı modundayken, herhangi bir zamanda kesilebilir (çekirdek moduna geçme). (Örneğin, öldürme işlemi için kullanılan da dahil olmak üzere bekleyen herhangi bir sinyal olup olmadığını kullanım moduna çekirdek döner, bu denetler SIGTERM
ve SIGKILL
). Bu, bir işlemin yalnızca kullanıcı moduna döndüğünde öldürülebileceği anlamına gelir.
Bir işlemin çekirdek modunda öldürülememesinin nedeni, aynı makinedeki tüm diğer işlemler tarafından kullanılan çekirdek yapılarını potansiyel olarak bozabilmesidir (aynı iş parçacığını öldürmek, aynı işlemdeki diğer iş parçacıkları tarafından kullanılan veri yapılarını potansiyel olarak bozabilir) .
Çekirdeğin uzun zaman alabileceği bir şey yapması gerektiğinde (örneğin başka bir işlem tarafından yazılmış bir boruda beklemek veya donanımın bir şey yapmasını beklemek), kendini uyku olarak işaretleyerek ve zamanlayıcıyı diğerine geçmeye çağırarak uyur işlemi (eğer uykusuz bir işlem yoksa, cpu'ya biraz yavaşlamasını ve bir döngüde - boşta döngüde oturmasını söyleyen "kukla" bir işleme geçer).
Bir uyku işlemine bir sinyal gönderilirse, kullanıcı boşluğuna dönmeden ve dolayısıyla bekleyen sinyali işlemeden önce uyandırılması gerekir. Burada iki ana uyku tipi arasındaki fark var:
TASK_INTERRUPTIBLE
, kesilebilir uyku. Bir görev bu işaretle işaretlenmişse uyuyor, ancak sinyallerle uyandırılabilir. Bu, görevi uyku olarak işaretleyen kodun olası bir sinyal beklediğini ve uyandıktan sonra onu kontrol edip sistem çağrısından geri döneceği anlamına gelir. Sinyal işlendikten sonra sistem çağrısı potansiyel olarak otomatik olarak yeniden başlatılabilir (ve bunun nasıl çalıştığına dair ayrıntılara girmeyeceğim).
TASK_UNINTERRUPTIBLE
, kesintisiz uyku. Bir görev bu işaretle işaretlenmişse, kolayca yeniden başlatılamadığı veya programların sistem çağrısının atomik olmasını beklediği için beklediği dışında herhangi bir şey tarafından uyandırılması beklenmez. Bu aynı zamanda çok kısa olduğu bilinen uykular için de kullanılabilir.
TASK_KILLABLE
(ddaa'nın cevabı ile bağlantılı LWN makalesinde belirtilmiştir) yeni bir varyanttır.
Bu ilk sorunuza cevap verir. İkinci sorunuza gelince: kesintisiz uykulardan kaçınamazsınız, bunlar normal bir şeydir (örneğin, bir işlem diske her okuma / yazma) gerçekleşir; ancak bir saniyenin sadece bir kısmı kadar sürmelidir. Daha uzun süre dayanırlarsa, genellikle aygıt sürücüsünün donanımın asla gerçekleşmeyecek bir şey yapmasını beklediği bir donanım sorunu (veya çekirdeğe benzeyen bir aygıt sürücüsü sorunu) anlamına gelir. Ayrıca, NFS kullandığınız ve NFS sunucusunun kapalı olduğu anlamına da gelebilir (sunucunun kurtarılmasını beklemektedir; sorunu önlemek için "intr" seçeneğini de kullanabilirsiniz).
Son olarak, iyileşememenizin nedeni, çekirdeğin bir sinyal vermek veya işlemi öldürmek için kullanıcı moduna dönene kadar beklemesinin aynı nedenidir: potansiyel olarak çekirdeğin veri yapılarını bozar (kesilebilir bir uykuda bekleyen kod, bunu bildiren bir hata alabilir) işlemin öldürülebileceği kullanıcı alanına geri dönmek için; kesintisiz bir uykuda bekleyen kod herhangi bir hata beklemiyor).
TASK_UNINTERUPTIBLE
Sistem boşta olmadığında bir duruma giren bir süreci başlatmak için bir programın yazılabilmesi ve böylece süper kullanıcı çıktıktan sonra iletilmeyi bekleyen zorla veri toplanması mümkün mü? Bu, bilgisayar korsanlarının bilgi alması, zombi durumuna dönmesi ve ağ üzerinden boşta bilgi aktarması için bir altın madeni olacaktır. Bazıları bununBlackdoor
, güçler için bir yaratmanın , istediği gibi herhangi bir sisteme girip çıkmanın bir yolu olduğunu iddia edebilir . Bu boşlukun `` TASK_UNINTERUPTIB