پیش‌نویس:ایجاد پردازه جدید با گروه کنترل متفاوت از پردازه والد (هسته لینوکس)

در نسخه ۵.۷ هسته لینوکس، با استفاده از دستور ()clone3 امکان ایجاد پردازه جدید با گروه کنترل متفاوت از پردازه والد در زمان ایجاد پردازه جدید بوجود آمده است. این بدان معناست که صدا زننده های clone3 می توانند از لحظه ابتدایی ایجاد پردازه جدید، پردازه ها و ریسه ها را محدود کنند.

با این قابلیت یک سرویس منیجر میتواند به طور مستقیم سرویس های جدید را درون گروه های اختصاصی قرار دهد، و یا یک پردازه میتواند به طور مستقیم در یک گروه کنترل منجمد ساخته شود و خودش نیز منجمد خواهد شد.[۱]

انگیزه این وصله ویرایش

سازوکار گروه کنترل لینوکس برای سهولت در اختصاص پردازه ها به گروه ها یا جابجایی آنها طراحی شده است،

نوشتن آیدی پردازه در سلسله مراتب فایل های گروه کنترل راهی ساده است که برای پردازه هایی که وجود دارند کار میکند، و مستندات آن در سایت رسمی موجود است. افزودن توانایی قرار دادن پردازه فرزند در گروه کنترل از بدو ایجاد توسط دستور ()clone3 موضوع این وصله است.


ولی سوالی که ممکن است پیش بیاید این است که اصلا چرا این آپدیت لازم است؟ میتوانیم به جای قرار دادن پردازه فرزند در گروه کنترل مورد نیاز از بدو تولد آن را در حالت عادی ایجاد کنیم و سپس گروه کنترل آن را تغییر دهیم.

پاسخ این پرسش این است که احتمال کمی برای وضعیت رقابتی در مدیریت پردازه ها وجود دارد، یعنی ممکن است که یک پردازنده با دسترسی root ابتدا پردازه ای را ایجاد کند و پس از ایجاد آن را در یک گروه قرار دهد، ولی در بین این دو عمل ممکن است که یک تعویض زمینه داشته باشیم و مدت کوتاهی پردازه ساخته شده در گروه نادرست اجرا شود. این خطا در محدودیت اجرای پردازه ها اندک خواهد بود (زیرا زمان این اجرا کوتاه خواهد بود).

با این حال قرار دادن یک پردازه در گروه کنترل در نظر گرفته شده در بدو ایجاد از این نوع کثیفی ها جلوگیری میکند، همچنین انجام کارهایی مانند ساختن یک پردازه در گروه منجمد را ممکن میسازد، و در این حالت مطمئن خواهیم شد که تا زمانی که مدیر پردازه ها به آن اجازه فعالیت ندهد پردازه اجرا نخواهد شد.

نحوه استفاده ویرایش

ایجاد یک پردازه جدید و قرار دادن مستقیم آن در یک گروه کنترل فقط در نسخه ۲ گروه کنترل ها موجود است، و فقط از طریق دستور ()clone3 قابل انجام است که دارای قالب زیر است:

int clone3(struct clone_args *args, size_t size);

در این وصله تمام فیلدهای ساختار clone_args داخل ساختار جدیدی که فیلد cgroup را نیز دارد اضافه شده است:

u64 cgroup;

این فیلد جدید اندازه ساختار clone_argsرا افزایش میدهد، و هر بار که برنامه ای clone3 را صدا میزند باید اندازه این ساختار را نیز ورودی دهد تا هسته لینوکس بتواند نسخه ساختار clone_argsرا تشخیص دهد. این کار به سادگی استفاده از این توابع اضافه میکند و دیگر لازم نیست تابع دیگری مانند clone4 تعریف شود.


برای ساختن یک پردازه با گروه کنترل متفاوت از گروه کنترل پردازه والد، توصیف‌گر پرونده برای گروه کنترل مورد نظر را در فیلد cgroups قرار میدهیم، و پرچم CLONE_INTO_CGROUPرا به فیلد flags اضافه میکنیم.

و در نهایت تابع ()clone3 را با clone_args ساخته شده صدا میزنیم، دقت کنید این دستور نیازمند دسترسی root است.

منابع ویرایش

[۲][۳]