در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

ایجاد و مدیریت فرآیندها در لینوکس - قسمت اول

مقدمه


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


1. پردازه ها


پردازه یا فرآیند موجودیتی است که از آن برای نشان دادن یک برنامه در حال اجرا استفاده می شود. به فرآیندها برنامه های در حال اجرا نیز می گویند. به هر پردازه در سیستم یک شناسه یکتا نسبت داده می شود که به آن شناسه پردازه یا PID می گوییم. PID یک پردازه ی موجود قابل تغییر دادن نیست، اما وقتی پردازه ای خاتمه یافت، سیستم عامل می تواند از شناسه ی آن برای مشخص کردن پردازه ای دیگر استفاده کند. هر پردازه با استفاده از فراخوانی سیستمی getpid می تواند به شناسه خود دسترسی پیدا کند. یک پردازه به دلایل مختلفی می تواند ایجاد شود، مثلا وقتی یک کاربر از طریق یک ترمینال وارد سیستم می شود، یک پردازه جدید برای او ایجاد می شود. همچنین سیستم عامل برای ارائه یک سرویس ممکن است یک پردازه ایجاد کند؛ در این حال ایجاد یک پردازه جدید برای ارائه سرویس باعث می شود که کاربر دیگر برای دریافت سرویس نیاز به صبر کردن نداشته باشد (مثلا یک پردازه برای کنترل عمل چاپ ایجاد می شود.). همچنین یک برنامه کاربر با ایجاد چندین پردازه می تواند از پیمانه ای شدن و فواید موازی سازی استفاده کند.

در لینوکس هر پردازه ی جدید به وسیله پردازه ی دیگری (که از قبل موجود می باشد) ایجاد می شود و همین سبب ایجاد یک رابطه والد-فرزند می شود. تنها استثنا در پردازه ای است که دارای شناسه 0 است. این پردازه هیچ والدی نداشته و به وسیله سیستم عامل در زمان boot سیستم ایجاد می شود. هر پردازه می تواند PID والد خود را با استفاده از فراخوانی سیستمی getppid بیابد. یک پردازه نمی تواند والد خود را تغییر داده و یا رابطه والد-فرزندی را بشکند. با این حال تغییر والد یک فرزند ممکن است یک بار طی اجرای یک پردازه اتفاق بیفتد و این زمانی است که پردازه والد قبل از فرزندانش خاتمه بیابد. در این گونه مواقع سیستم عامل شناسه والد تمامی پردازه های فرندی که والدشان خاتمه یافته است را به 1 مقدار دهی می کند (1 شناسه پردازه init است). نحو دو فراخوانی سیستمی که در بالا به آن اشاره شد به صورت زیر است:

#include <sys/types.h>
#include <unistd.h>
pid_t getpid();
pid_t getppid();

سیستم عامل از یک ساختمان داده ی داخلی به نام جدول فرآیند برای نگه داری trackهای پردازه ها استفاده می کند. این جدول دارای یک مدخل برای هر پردازه در حال اجرا است. لیست پردازه هایی که هم اکنون در حال اجرا می باشند را می توان با استفاده از دستور ps به دست آورد. دستور ps به طور ضمنی پردازه های کاربری که دستور را تایپ کرده و پردازه هایی که به ترمینال ضمیمه شده است را نشان می دهد. (ترمینال توسط ستون TTY در جدول نشان داده شده مشخص می شود.) اگر خواهان نشان دادن تمامی پردازه های سیستم هستیم می توانیم از گزینه a- استفاده کنیم. با استفاده از گزینه l- (این گزینه به معنی long format می باشد) می توانیم اطلاعات بیشتری راجع به پردازه ها کسب کنیم: به عنوان مثال PID والد پردازه ها، UID کاربران و غیره. در شکل زیر نحوه بکارگیری این دستور نشان داده شده است.

ایجاد و مدیریت فرآیندها در لینوکس - قسمت اول


2. برنامه ها و پردازه ها


یک برنامه شامل مجموعه ای از دستور العمل ها و داده ها است که به یک فرم مشخص سازماندهی شده است و در یک فایل اجرا شدنی بر روی دیسک نگه داری می شود. یک برنامه لینوکس از چندین قطعه تشکیل شده است. code segment شامل دستور العمل به فرمت باینری است. data segment شامل داده های از پیش تعریف شده (به عنوان مثال ثوابت) و داده هایی که مقدار دهی اولیه شده اند، می باشد. این دو بخش به همراه stack segment -که شامل داده هایی است که به طور پویا به هنگام اجرای پردازه تخصیص داده می شوند قسمت های اساسی یک پردازه لینوکس هستند. برای اجرای یک برنامه یک پردازه جدید ایجاد می شود. از برنامه برای مقدار دهی اولیه دو قسمت اول استفاده می شود و بعد از آن دیگر لینکی بین پردازه و برنامه وجود نخواهد داشت. داده های سیستمی یک پردازه شامل اطلاعاتی مانند دایرکتوری جاری، توصیفگرهای فایل های باز، نوع ترمینال، میزان مدت استفاده از CPU و غیره است. یک پردازه نمی تواند به طور مستقیم به داده های سیستمی خود دسترسی پیدا کند یا آن ها را تغییر دهد، زیرا این داده ها خارج از فضای آدرس دهی پردازه قرار گرفته اند. با این حال یکسری فراخوانی های سیستمی وجود دارد که می توان به طور غیر مستقیم به این اطلاعات دسترسی پیدا کرد یا آن ها را تغییر داد.

تمامی پردازه های سیستم اولاد مستقیم یا غیر مستقیم یک پردازه خاص هستند که به هنگام شروع به کار سیستم به وسیله دستور etcinit به وجود می آید. وقتی یک کاربر وارد سیستم می شود یک پردازه به طور اوماتیک ایجاد می شود. این پردازه shell یا همان مفسر فرمان مربوط به session کاربر است. وظیفه این پردازه تفسیر و اجرای دستوراتی است که کاربر تایپ کرده است. برای ایجاد یک پردازه جدید می توان از فراخوانی سیستمی fork استفاده کرد. هر زمان که این فراخوانی اجرا شود یک پردازه جدید مستقل از پردازه ای که fork را فراخوانی کرده است ایجاد می شود و یک PID خودش را دارا خواهد بود. این دو پردازه (پردازه ای که فراخوانی سیستمی fork را صدا زده است و پردازه ای که جدیدا ایجاد شده است) همروند هستند یا به عبارتی دیگر از لحاظ اجرا شدن مستقل از همدیگر اجرا می شوند. این دو پردازه وقتی صحبت از محتوا (کد، داده ها، پشته، فایل های باز و غیره) می شود، دو پردازه ی یکسان هستند. به این طریق fork یک کپی از پردازه اولیه ایجاد می کند، پس تصویر دو پردازه در حافظه یکسان است. پردازه ای که دستور fork را فراخوانی کرده است به عنوان پردازه والد و پردازه تازه ایجاد شده به عنوان پردازه فرزند در نظر گرفته می شود. با استفاده از فراخوانی سیستمی wait، پردازه والد اجرای خود را معلق می کند و منتظر خاتمه پردازه فرزند می ماند. اجرای یک برنامه در پردازه فرزند، به وسیله فراخوانی سیستمی exit (که یا به طور صریح توسط پردازه فرزند صدا زده می شود و یا به طور ضمنی توسط سیستم عامل در پایان تابع main فراخوانی می شود) خاتمه می پذیرد. تاثیر فراخوانی سیستمی exit به این صورت می باشد: پردازه جاری را خاتمه می دهد، یک کد خاتمه را در مدخل جدول پردازه مربوطه ذخیره می کند و در نهایت پردازه والد را (که منتظر خاتمه پردازه فرزند است) از خواب بیدار می کند.

در مقاله بعد فراخوانی های سیستمی مربوط به فرآیندها معرفی می شوند. ItPro باشید!


نویسنده : رامین غلامی تقی زاده

منبع : انجمن تخصصی فناوری اطلاعات ایران

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

#تابع_getpid #فرآیندها_در_لینوکس #دستور_kill_در_command_prompt #تابع_getppid #تابع_fork #init_چیست #zombie_process_چیست #رابطه_parent_-child
عنوان
1 ایجاد و مدیریت فرآیندها در لینوکس - قسمت اول رایگان
2 ایجاد و مدیریت فرآیندها در لینوکس - قسمت دوم رایگان
3 ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

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