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

و

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

کار با threadها در لینوکس - قسمت اول

مقدمه


به فرآیند ایجاد و مدیریت واحدهای اجرایی چندگانه درون یک پردازه threading گفته می شود. وقتی که صحبت از threading می شود، باید مفاهیم دیگری مانند شرایط مسابقه بین داده ها و بن بست نیز مطرح شود. سر فصل threading آنقدر گسترده است که به راحتی می تواند کل یک کتاب را پوشش دهد. در اینجا سعی می کنیم موارد پایه ای مربوط Linux threading API را توضیح دهیم. مطالب پیشرو از شش بخش تشکیل شده است. در بخش اول نگاهی بسیار اجمالی به استاندارد POSIX می اندازیم. در بخش دوم مفهوم نخ را بیان کرده و مزایا و معایب آن بررسی می شود. در بخش سوم توابع پایه ای مورد نیاز برای کنترل و مدیریت نخ ها آورده شده است. بخش چهارم مخصوص مسائل همگام سازی نخ ها است و در آن جا دو ابزار همزمانی پردازش یعنی سمافورها و قفل های mutex توضیح داده شده است. در پایان، در بخش های پنجم و ششم دو مسئله کلاسیک همگام سازی پیاده سازی شده است.


1. مختصری درباره استاندارد POSIX


در اواسط دهه 1980، انستیتوی مهندسین برق و الکترونیک (IEEE) تصمیم به استاندارد سازی system-level interfaceها برای سیستم های یونیکس گرفت. ریچارد استالمن، موسس Free Software movement پیشنهاد کرد که نام این استاندارد POSIX باشد. این نام مخفف Portable Operating System Interface است.

اولین نتیجه این تلاش که در سال 1988 منتشر شد، IEEE Std 1003.1-1988 بود (که به اختصار از آن به عنوان POSIX 1988 یاد می شود). در سال 1990، IEEE استاندارد POSIX را مورد تجدید نظر قرار داد و نتیجه آن IEEE Std 1003.1-1990 (یا همان POSIX 1990) شد. پشتیبانی اختیاری از threading و real-time به ترتیب در استانداردهای IEEE Std 1003.1b-1993 (که به آن POSIX 1993 یا POSIX.1b نیز گفته می شود) و IEEE Std 1003.1c-1995 (که به آن POSIX 1995 یا POSIX.1c نیز میگویند) مستند سازی شد. در سال 2001، استاندارهای اختیاری با محوریت POSIX 1990 با هم دیگر ادغام و یک استاندارد واحد به نام IEEE Std 1003.1-2001 (یا POSIX 2001) به وجود آمد. آخرین تجدید نظر IEEE Std 1003.1-2008 (به آن POSIX 2008 نیز می گویند) بود که در دسامبر سال 2008 بیرون داده شد.


2. نخ چیست؟


نخ یا ریسمان کوچک ترین واحد کاری است که می توان وقت پردازنده را به آن اختصاص داد. در سیستم عامل های امروزی یک پردازه می تواند دارای چندین نخ باشد که هر کدام کار خاصی را انجام می دهند. به این نخ ها «پردازه های سبک وزن» می گویند. این پردازه های سبک وزن دارای ویژگی های زیر هستند:

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

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

مفهوم نخ ها برای مدتی مطرح بود، اما قبل از اینکه کمیته IEEE POSIX استانداردهایی را در این زمینه منتشر بکند، این مفاهیم به طور گشترده در سیستم عامل های UNIX-like عرضه نشده بودند. هم چنین فروشنده های مختلف پیاده سازی های متفاوتی از تخ ها را ارائه کرده بودند. با ظهور استاندارد POSIX 1003.1c همه چیز فرق کرد. استانداردسازی نخ ها بهتر شد و این مفهوم در بسیاری از توزیع های لینوکس عرضه شد. هم اکنون بسیاری از کامپیوترها دارای پردازنده های چند هسته ای و سخت افزارهایی هستند که به نخ ها این اجازه را می دهد که به طور فیزکی، همزمان اجرا شوند.قبل از ظهور پردازنده های چند هسته ای، پردازنده های تک هسته ای، اجرای همزمان نخ ها را با سویچ کردن های پی در پی پیاده سازی می کردند.

لینوکس برای اولین بار در سال 1996، با کتابخانه ای که از آن با نام «LinuxThreads» یاد می شود، پشتیبانی از نخ را آغاز کرد. این کتابخانه بسیار نزدیک به استاندارد POSIX بود و برای اولین بار برنامه نویسان لینوکس را قادر می کرد که از نخ ها در برنامه های خود استفاده کنند. با این وجود، یکسری اختلافات جزیی بین پیاده سازی لینوکس و استاندارد POSIX وجود داشت. این اختلافات بیشتر مربوط به اداره کردن سیگنال ها (signal handling) بود.

پروژه های مختلفی درباره ی چگونگی بهبود پشتیبانی از نخ در لینوکس انجام شده است. این پروژه ها نه تنها به دنبال رفع اختلافات جزیی میان استاندارد POSIX و نحوه پیاده سازی در لینوکس بودند، بلکه به دنبال این بودند که چگونه می توان کارایی را افزایش داد و محدودیت های غیر ضروری را نیز رفع کرد. بیشتر تمرکز بر روی این بود که چگونه نخ های سطح کاربر باید به نخ های سطح کرنل نگاشت شود. دو پروژه اصلی در این زمینه New Generation POSIX Threads (به اختصار NGPT) و Native POSIX Thread Library (به اختصار NPTL) نام داشت. هر دوی این پروژه ها تغییراتی را در کرنل لینوکس ایجاد کردند، به گونه ای که از کتابخانه های جدید پشتیبانی کند.

در سال 2002، تیم NGPT اعلام کرد که اضافه کردن ویژگی های جدید به NGPT را متوقف می کنند اما همچنان به تحقیق برای پشتیبانی از نخ در لینوکس ادامه می دهند. در نهایت NPTL با عرضه خود در توزیع Red Hat Linux 9، تبدیل به یک استاندارد جدید برای نخ ها در لینوکس شد.

مزایا و معایب نخ ها

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

در ادامه به بعضی از مزیت های استفاده از نخ ها اشاره شده است:

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

نخ ها همچنین دارای اشکالاتی نیز هستند:

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

در مقاله بعد به چگونگی استفاده از نخ ها در لینوکس می پردازیم. ItPro باشید!


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

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

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

#قفل_های_mutex #مسائل_کلاسیک_همگام_سازی #سمافورها
عنوان
1 کار با threadها در لینوکس - قسمت اول رایگان
2 کار با threadها در لینوکس - قسمت دوم رایگان
3 کار با threadها در لینوکس - قسمت سوم رایگان
4 کار با threadها در لینوکس - قسمت چهارم رایگان
زمان و قیمت کل 0″ 0
0 نظر

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

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

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