ساخت پراسس فرزند با تابع fork پایتون

امیرحسین بیگدلو 11 ماه قبل

در این مقاله، ما در مورد تابع fork پایتون صحبت خواهیم کرد که به ما امکان می دهد پردازش های فرزند را با استفاده از پراسسی که از طریق آن فراخوانی شده است ایجاد کنیم.

 

# فراخوانی سیستمی(system call) چیست؟

برای دسترسی به حالت هسته(kernel) از یک فراخوانی سیستمی استفاده می شود. system call روشی است که با آن یک برنامه می تواند با سیستم عامل تعامل داشته باشد و از خدمات آن برای انجام وظایف مشخص شده استفاده کند. تمام فراخوانی های سیستم در حالت هسته اجرا می شوند و زمانی که اجرا کامل شود، کنترل به حالت کاربر بازگردانده می شود. گاهی اوقات به یک فراخوانی سیستمی به صورت اختصاری syscall نیز گفته می شود.

در سیستم های کامپیوتری مدرن، به طور کلی دو حالت عملیات وجود دارد - حالت کاربر(user) و حالت هسته(kernel). همه برنامه ها و پراسس‌های کاربر در حالت user اجرا می شوند و نمی توانند مستقیماً به حالت kernel دسترسی داشته باشند. این کار برای محافظت از سیستم عامل در برابر تغییرات ناشی از برنامه کاربر انجام می شود. اگر یک برنامه کاربری نیاز به انجام کارهایی با دسترسی بالا داشته باشد، به پشتیبانی سیستم عامل نیاز دارد که فقط از طریق تماس های سیستمی می تواند دریافت کند.

 

ویدیو پیشنهادی: آموزش ماژول os پایتون

 

# تابع fork پایتون

چندین تماس سیستمی برای مدیریت انواع مختلف خدمات ارائه شده توسط سیستم عامل وجود دارد. همچنین، این موارد برای سیستم عامل های مختلف متفاوت است. تماس های سیستمی به طور کلی به پنج دسته اصلی طبقه بندی می شوند:

1. تماس سیستمی مربوط به فایل ها

2. تماس سیستمی مربوط به دستگاه

3. تماس سیستمی مربوط به پراسس ها

4. تماس سیستمی مربوط به اطلاعات

5. تماس سیستمی مربوط به ارتباطات

 

تابع fork پایتون نمونه‌ای از یک فراخوانی سیستمی مربوط به پراسس ها است. این تابع میتواند یک پراسس فرزند از پراسس اصلی که فراخوانی سیستمی را انجام میدهد، ایجاد کند. پراسسی که با استفاده از دستور fork یک فراخوانی سیستم را برقرار می کند، پراسس پدر نامیده می شود.

برای استفاده و پیاده سازی فراخوانی سیستم fork در پایتون، به ماژول os پایتون نیاز داریم. ماژول os در پایتون به ما اجازه می دهد تا از عملکردهای مختلف وابسته به سیستم عامل استفاده کنیم. این به برنامه کاربر اجازه می دهد تا به عملکرد سیستم عاملی که پایتون روی آن اجرا می شود دسترسی داشته باشد.

برای ایمپورت کردن ماژول os میتوانید از دستور زیر استفاده کنید:

import os

 

ویدیو پیشنهادی: مدیریت حافظه و ماژول gc در پایتون

 

# کار با تابع fork پایتون

در زمان اجرای تابع fork پایتون، سه مقدار عددی برگشت داده خواهد شد:

1. عدد صفر به پراسس فرزند برگشت داده خواهد شد، اگر پراسس فرزند با موفقیت ایجاد شود.

2. یک عدد مثبت به پراسس پدر برگشت داده خواهد شد، اگر پراسس فرزند با موفقیت ایجاد شود. این مقدار مثبت معمولاً PID پراسس فرزند تازه ایجاد شده است. شناسه پراسس که معمولاً به عنوان PID شناخته می‌شود، یک شناسه منحصر به فرد است که با هر پراسس موجود در سیستم رایانه مرتبط است.

3. یک عدد منفی به پراسس پدر برگشت داده خواهد شد، اگر ایجاد کردن پراسس فرزند با خطا مواجه شود.

 

تابع fork را میتوانید به شکل زیر استفاده کنید:

os.fork()

 

مقاله پیشنهادی: 5 روش برای حذف فایل در پایتون

 

# مثال ساخت پراسس فرزند با تابع fork پایتون

به مثال زیر دقت کنید:

import os

# Creating child processes using fork() method
os.fork()
os.fork()

# This will be executed by both parent & child processes
print('Mongard')

 

اگر کد بالا را اجرا کنید، خروجی به شکل زیر خواهد بود:

Mongard
Mongard
Mongard
Mongard

در خروجی چهار بار کلمه Mongard چاپ شده است. دقت کنید که تعداد پراسس‌های فرزند از فرمول 2 به توان n منهای یک که n تعداد دفعات فراخوانی تابع fork است، محاسبه میشود. در مثال بالا، خروجی سه بار توسط پراسس‌های فرزند و یک بار توسط پراسس پدر تولید شده است.

 

به مثال دوم دقت کنید:

import os
 
# Creating a child process using fork() method
val = os.fork()
 
# Testing the values returned by fork() method
if val == 0:
    pid = os.getpid()
    print(f"Hi I am Child Process and my PID is {pid}.")
elif val > 0:
    pid = os.getpid()
    print(f"Hi I am Parent Process and my PID is {pid} and PID {val} is my Child Process.")
else:
    print("Sorry!! Child Process creation has failed...")

اگر کد بالا را اجرا کنید، خروجی به شکل زیر خواهد بود:

Hi I am Child Process and my PID is 15563.
Hi I am Parent Process and my PID is 15559 and PID 15563 is my Child Process.

برنامه پایتون بالا خروجی درستی را تولید کرده و مقادیر بازگردانده شده توسط دستور fork را به وضوح نشان داده است.

 

دقت کنید که تابع fork فقط برای سیستم عامل لینوکس در دسترس است و اگر بخواهید از تابع fork در ویندوز استفاده کنید، با خطای زیر مواجه خواهید شد:

AttributeError: module 'os' has no attribute 'fork'

 

مطالب مشابه



مونگارد