فرایند فرزند

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

در رایانش، فرایند فرزند به فرایندی گفته می‌شود که توسط یک فرایند دیگر بوجود آمده باشد.

یک فرایند فرزند، بسیاری از خصوصیاتش را از فرایند والد به ارث می‌برد. از جمله این خصوصیات که از فرایند والد به فرایند فرزند به ارث می‌رسند می‌توان به توصیف‌گرهای پرونده اشاره کرد. در سیستم‌عامل یونیکس و سیستم‌عامل‌های سازگار با استاندارد پازیکس، یک فرایند فرزند معمولا به صورت یک کپی از فرایند والد و با استفاده از یک فراخوان سیستمی به نام fork()‎ ایجاد می‌شود. در مرحله بعد، فرایند فرزند می‌تواند خودش را با یک برنامه دلخواه جایگزین کند. این کار با استفاده از فراخوان سیستمی exec صورت می‌گیرد.

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

وقتی که اجرای یک فرایند فرزند خاتمه می‌یابد، دچار وقفه شود یا اینکه پس از وقفه اجرای آن ادامه یابد، یک سیگنال SIGCHLD به والدش ارسال خواهد شد. اگر فرایند والد این سیگنال را اداره نکند، به شکل پیشفرض سیگنال نادیده گرفته خواهد شد. [۱]

وقتی که فرایند فرزندی، قبل از اینکه والدش wait را اجرا کند، خاتمه یابد، هسته برخی از اطلاعات مربوط به فرایند فرزند را حفظ می‌کند، از جمله وضعیت خروج فرایند فرزند خاتمه یافته را. این کار به این منظور صورت می‌گیرد که والد بعدا بتواند wait()‎ را اجرا کند[۲] و آن اطلاعات حفظ شده را بدست آورد و بر طبق آنها واکنش مناسبی نشان دهد. به خاطر اینکه فرایند فرزند (که خاتمه یافته) هنوز هم از منابع سیستم استفاده می‌کند، اما دیگر در حال اجرا نیست، تبدیل به یک فرایند زامبی می‌شود. فراخوان سیستمی wait معمولا در روال وقفه‌گیر SIGCHLD اجرا می‌شود.

منابع[ویرایش]

  1. signal(7): overview of signals – لینوکس متفرقه صفحه راهنما
  2. wait(2): wait for process to change state – لینوکس فراخوان‌های سیستمی صفحه راهنما