برنامه نویسی موازی در php

  • خانه
  • برنامه نویسی موازی در php
Image تحقیقات

برنامه نویسی موازی در php

با سلام

امروز درباره برنامه نویسی موازی (Parallel programming) صحبت می کنیم .

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

 

مزایای برنامه نویسی موازی

وقتی یک سری دستورالعمل به صورت موازی اجرا می شوند باعث می شود زمان اجرای برنامه کاهش پیدا کند و اگر برنامه و الگوریتم ما بزرگ بود می توانیم آن را خرد کنیم و هر کدام از این مسائل را به صورت همزمان اجرا کنیم .
می توانیم درخواست هامون را بین سرورهای مختلف توزیع کنیم و از منابع غیر محلی استفاده کنیم .
و در آخر می توانیم با استفاده از پردازش موازی بر محدودیت های سخت افزاری پروژمون غلبه کنیم.

 

پیاده سازی برنامه نویسی موازی در php

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


۱- چند فرایندی (Multi Processing ) : به یک نمونه از برنامه ی در حال اجرا فرایند می گویند . این برنامه ی در حال اجرا می تواند نوت پد باشد یا فتوشاب یا php و php این قابلیت را دارد که از خودش به عنوان یک فرایند والد , فرایند فرزند بوجود بیاورد .این فرایند فرزند همزمان با فرایند والد اجرا می شود و یک سری کارها را انجام می دهد.برای استفاده از این روش راه های مختلفی وجود دارد که ۳ مورد از آن را معرفی می کنیم :‌
الف)  استفاده از تابع fork : برای استفاده از این تابع نیاز به یک extension به نام pcntl می باشد .بعد از نصب این extension می توانیم با استفاده از تابع fork فرایند جدیدی را بوجود بیاوریم و این فرایند همانند فرایندهای دیگر که داخل سیستم عامل مشغول کار هستند , کار می کند و تنها تفاوت آن این است که شماره والد دارد تا مشخص شود این فرایند یک فرایند فرزند است و یک والدی دارد .این روش معمولا در محیط command-line استفاده می شود .

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

ب) استفاده از تابع exec : تابع exec  بر اساس یک فرایند مثلا فایل hello.php را اجرا می کند , این فرایند به وجود آمده و بعد از تمام شدن  اجراش نتیجش داخل یک متغیر ریخته می شود تا فرایند والد به آن دسترسی داشته باشد .کارایی این روش نسبت به روش fork کمی بهتر است .

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

 

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

۲- چند نخی (Multi threading) :  نخ به مجموعه ای از دستور العمل ها می گن که داخل یک فرایند ایجاد شده و تحت یک فرایند به صورت همزمان اجرا می شوند. برای استفاده از نخ در php اول باید نسخه ی ZTS پی اج پی (Zend Thread Safety) رو نصب کنیم . این نسخه محدودیت اشتراک منابع را از بین می برد یعنی اگر دوتا نخ بخواهند به یک فایل مشترک دسترسی داشته باشند با استفاده از یک سری مکانیزم های کنترلی این اشتراک منابع مدیریت می شود . سپس  نیاز به extension ای به نام pthreads داریم که آن را باید نصب کنیم.

یکی از مزایایpthreads extension این است که برپایه شی گرایی نوشته شده و استفاده از آن قابل فهم تر می باشد  .

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

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

 

۳- توزیع فرایندها (Distributed processing) :‌با استفاده از توزیع فرایندها می توانید فرایندها را بین کامپیوتر ها یا سرور های مختلف پخش کنیم و از منابع آنها استفاده کنیم .یکی از راه های توزیع فرایندها , برنامه نویسی سوکت است . راه دیگه استفاده از کتابخانه های php است .این کتابخانه ها باعث می شوند پیچیدگی کم تر شده   . از جمله این کتابخانه ها zeromq و gearman می باشند.این کتابخانه ها بر اساس ساختار داخلی ای که دارن ارسال و دریافت را اتوماتیک مدیریت می کنند و فقط لازم هست برای آنها یک worker قرار دهیم . این worker ها در سرور های مختلف پخش می شوند و وظیفه پردازش فرایندهای مارا دارند  و خویبش این هست این کتابخانه خودشون تصمیمی میگیرند درخواست به کدام سرور برود و …..

نکته ایجاست که می توانید در یک سرور نیز worker های مختلفی ایجاد کنیم و پردازش موازی را اجرا کنیم .

و به نظر  من روش توزیع فرایندها جزو بهترین روش ها برای پیاده سازی پردازش موازی است .

خب مقاله امروز هم به پایان رسید.خوشحال میشم مثل همیشه نظراتتون رو اعلام کنید.