Geri qayıt
Linux nüvəsində müzakirə: fork() + exec() yerinə spawn templates
SiTech AI Team3 წთ. საკითხავი

Linux nüvəsində müzakirə: fork() + exec() yerinə spawn templates

Li Chen Linux nüvəsinə proses yaratmanı sürətləndirən "spawn templates" əlavə etməyi təklif edib. Təklif indiki formada qəbul edilməyəcək, amma müzakirə Linux-a layiqli posix_spawn() qazandıra bilər.

Unix-in ilk günlərindən proses yaratma iki sistem çağırışına əsaslanır: valideynin surətini yaradan fork() və cari prosesin yerində yeni proqram işə salan exec(). Linux nüvəsində onlar clone() və execve() kimi tanınır, amma model dəyişməyib. Li Chen-in nüvəyə "spawn templates" əlavə etməklə bağlı təklifi nüvə poçt siyahısında müzakirə olunub; indiki formada qəbul edilməyəcək, lakin proses yaratma üçün yeni primitivə yol aça bilər.

fork() və ardınca exec() nə qədər baha başa gəlir

fork() nisbətən bahalı sistem çağırışıdır: nüvə övlad proses üçün yaddaş da daxil olmaqla bütün proses vəziyyətini kopyalamalıdır. İllər boyu çoxsaylı optimizasiyalar edilib, amma fork yenə də fundamental olaraq bahalı əməliyyatdır — üstəlik adi nümunədə dərhal arxasınca diqqətlə kopyalanmış yaddaşı atan exec() gəlir. vfork() məhz bu hal üçün erkən optimizasiya cəhdi idi, lakin ardıcıllıq hələ də ola biləcəyindən bahadır.

Şablonlar və keşlənmiş hazırlıq

Chen-in yamaq dəsti eyni icra olunan faylı təkrar-təkrar başladan tətbiqlərə yönəlib; məsələn, repozitoriya barədə məlumat almaq üçün Git-i dönə-dönə çağıran proqram. Belə tətbiq yeni spawn_template_create() sistem çağırışı ilə şablon yarada bilər; çağırış icra olunan fayl üçün fayl deskriptoru qaytarır. Fayl ya deskriptorla (execfd), ya da mütləq yolla (filename) göstərilir, ikisi birlikdə yox. Nüvə faylı açır və onun gələcəkdə daha sürətli işə salınmasını təmin edən məlumatı keşləyir.

Hər işə salma spawn_template_spawn_args strukturu ilə təsvir olunur: argv arqument siyahısına, envp mühitə, actions isə fayl deskriptorları və siqnal emalını əhatə edən spawn_template_action yazıları massivinə işarə edir. Məsələn, övlad prosesdə dördüncü deskriptoru bağlamaq fd dəyəri dörd olan SPAWN_TEMPLATE_ACTION_CLOSE tipli hərəkətlə ifadə edilir. Sonra proses spawn_template_spawn() ilə başladılır; çağırış daxildə adi fork()/exec() yoluna yaxın gedir və bütün yoxlamalar qüvvədə qalır, sürəti isə keşlənmiş məlumat verir. Müşayiət məktubundakı benchmark nəticələri təxminən 2% yaxşılaşma göstərir.

Rəyçilər: problem fork() tərəfindədir

Ən ətraflı rəyi Mateusz Guzik yazıb: "Bütün fork + exec idiomu dəhşətlidir və istifadədən çıxarılmalıdır". Onun fikrincə, yamaq dəsti problemin fork() hissəsinə toxunmur, halbuki xərcin əsas hissəsi elə oradadır və "təmiz proses yaratmaq doğru yoldur". Christian Brauner məqsədə müsbət yanaşıb — "exec üçün builder API ideyası o qədər də dəli deyil" — lakin yeni interfeysin mövcud pidfd abstraksiyası üzərində qurulmasını təklif edib: pidfd_open() üçün bir seçim boş proses yaradar, yeni pidfd_config() çağırışları silsiləsi isə onun mühitini və icra olunacaq obrazı fsconfig() məntiqi ilə konfiqurasiya edərdi.

Brauner üçün əsas hədəf posix_spawn()-ın istifadəçi məkanında reallaşdırılmasını dəstəkləməkdir. posix_spawn() fork()/exec() nümunəsini əvəzləmək üçün yaxşı uyğundur və tərtibatçılar, cari tətbiqdən fərqli olaraq fork() və exec()-i pərdə altında gizlətməyən yerli reallaşdırmanı alqışlayardılar. Chen Brauner-in cizdiyi API-nin daha yaxşı göründüyünü təsdiqləyib və gələcək işin bu istiqamətdə olacağını deyib. Yəni spawn templates nüvəyə düşməyəcək — amma Linux nəhayət layiqli posix_spawn() tətbiqi əldə edə bilər.

SSiTech

SiTech — AI ilə gücləndirilmiş veb hazırlanması

Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.