wait (فراخوان سیستمی)

در سیستم‌عامل‌های مدرن رایانه، یک فرایند می‌تواند با استفاده از فراخوان سیستمی wait()‎ منتظر بماند تا اجرای یک فرایند دیگر به اتمام برسد. [۱]

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

همچنین در سیستم‌عامل‌های مدرن، فراخوان‌های سیستمی مشابهی هم برای کار با ریسه‌ها وجود دارد. به این صورت که ریسه‌ها می‌توانند ریسه‌های دیگری را ایجاد کرده و منتظر بمانند تا اجرای آن ریسه‌های ایجاد شده به اتمام برسد. در استاندارد پازیکس یک ریسه می‌تواند با استفاده از تابع pthread_join()‎ منتظر بماند تا اجرای ریسه دیگری خاتمه یابد.[۲]

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

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

وضعیت خروجی که توسط فرایند فرزند به فرایند والد برمی‌گردد، معمولاً نشان‌دهنده این است که آیا اجرای فرایند فرزند موفقیت‌آمیز بوده یا اینکه اجرای آن با شکست مواجه شده.

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

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

جستارهای وابسته ویرایش

پیوند به بیرون ویرایش

منابع ویرایش

  1. "wait" (به انگلیسی). Freebsd.org. 2010-12-21. Retrieved 2013-10-07.
  2. "pthread_join" (به انگلیسی). Freebsd.org. 2010-01-23. Retrieved 2013-10-07.