Geri Dön
Linux çekirdeğinde tartışma: fork() + exec() yerine spawn templates
SiTech AI Team3 წთ. საკითხავი

Linux çekirdeğinde tartışma: fork() + exec() yerine spawn templates

Li Chen, Linux çekirdeğine süreç oluşturmayı hızlandıracak "spawn templates" eklemeyi önerdi. Öneri bu haliyle kabul edilmeyecek, ancak tartışma Linux'a düzgün bir posix_spawn() kazandırabilir.

Unix'in ilk günlerinden bu yana süreç oluşturma iki sistem çağrısına dayanıyor: ebeveynin kopyası olarak bir alt süreç yaratan fork() ve mevcut sürecin yerine yeni bir program çalıştıran exec(). Linux çekirdeğinde bunlar clone() ve execve() olarak biliniyor, ancak model değişmedi. Li Chen'in çekirdeğe "spawn templates" eklemeye yönelik önerisi çekirdek e-posta listesinde tartışıldı; mevcut haliyle kabul edilmeyecek, ama yeni bir süreç oluşturma ilkeline işaret edebilir.

fork() ardından exec() ne kadar pahalı

fork() görece pahalı bir sistem çağrısıdır; çekirdek alt süreç için belleği de kapsayan tüm süreç durumunu kopyalamak zorundadır. Yıllar içinde çok sayıda iyileştirme yapıldı, ancak fork temelde maliyetli kaldı — üstelik yaygın kalıpta hemen ardından, özenle kopyalanan belleği çöpe atan bir exec() gelir. vfork() tam bu durum için erken bir iyileştirme denemesiydi, ama dizi hâlâ olması gerekenden pahalı.

Şablonlar ve önbelleğe alınan hazırlık

Chen'in yama seti, aynı çalıştırılabilir dosyayı art arda başlatan uygulamaları hedefliyor; örneğin bir depo hakkında bilgi almak için Git'i defalarca çağıran bir program. Böyle bir uygulama, yeni spawn_template_create() sistem çağrısıyla bir şablon oluşturabilir. Dosya ya tanımlayıcı (execfd) ya da mutlak yol (filename) ile belirtilir, ikisi birden olamaz. Çekirdek dosyayı açar ve dosyanın ileride daha hızlı çalıştırılmasını sağlayan bilgiyi önbelleğe alır.

Her çalıştırma bir spawn_template_spawn_args yapısıyla tanımlanır: argv argüman listesine, envp ortama, actions ise dosya tanımlayıcıları ve sinyal işleme adımlarını kapsayan spawn_template_action kayıtları dizisine işaret eder. Örneğin alt süreçte dördüncü tanımlayıcıyı kapatmak, fd değeri dört olan SPAWN_TEMPLATE_ACTION_CLOSE türünde bir eylemle ifade edilir. Ardından süreç spawn_template_spawn() ile başlatılır; çağrı içeride normal fork()/exec() yoluna yakın ilerler ve tüm olağan denetimler korunur, hızı ise önbellekteki bilgi sağlar. Kapak mektubundaki karşılaştırma sonuçları yaklaşık %2 iyileşme gösteriyor.

İnceleyenler: sorun fork() tarafında

En ayrıntılı incelemeyi Mateusz Guzik yazdı: "Tüm fork + exec kalıbı berbat ve emekliye ayrılmalı." Yama setinin sorunun fork() tarafına dokunmadığını, oysa maliyetin büyük bölümünün orada olduğunu belirtti ve "temiz bir süreç oluşturmak doğru yol" dedi. Christian Brauner hedefe olumlu baktı — "exec için bir builder API fikri o kadar da çılgınca değil" — ancak yeni arayüzün mevcut pidfd soyutlaması üzerine kurulmasını önerdi: pidfd_open() için bir seçenek boş bir süreç yaratır, yeni pidfd_config() çağrıları dizisi ise ortamını ve çalıştırılacak imajı fsconfig() mantığıyla yapılandırırdı.

Brauner için kilit hedef, posix_spawn()'ın kullanıcı alanında gerçeklenmesini desteklemek. posix_spawn(), fork()/exec() kalıbının yerini almaya çok uygun ve geliştiriciler fork() ile exec()'i kaputun altında saklamayan yerel bir gerçeklemeyi memnuniyetle karşılar. Chen, Brauner'in çizdiği API'nin daha iyi göründüğünü kabul etti ve gelecekteki çalışmanın bu yönde olacağını söyledi. Yani çekirdeğe spawn templates girmeyecek — ama Linux nihayet düzgün bir posix_spawn() uygulamasına kavuşabilir.

SSiTech

SiTech — AI destekli web geliştirme

Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.