آویزه : %d9%85%d9%88%d8%a7%d8%b2%db%8c

پردازش موازی یا خطی در جاوا اسکریپت ، مسئله این است!(قسمت دوم)

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

در این قسمت درباره جاوا اسکریپت مطالبی را بیان خواهم کرد.

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

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

موتور V8 گوگل  برای اجرای دستورات از روش non-blocking I/O استفاده می کند ، تمامی فعالیت ها در یک نخ کنترل می شوند .

در جاوا اسکریپت هیچ نخی وجود ندارد. امکان برنامه نویسی موازی در خود زبان تعبیه نشده است.

اما درصورتی که از این زبان استفاده کرده باشید متوجه شدید که می توان به راحتی به عنوان مثال یک ساعت طراحی کرد و همزمان فرایند های دیگری را نیز کنترل کرد.

این امکان به دلیل آن است که موتور V8 خود در سطح زبان ، فرایند نخ را شبیه سازی کرده است. با این تفاوت که نام آن Event Loop  می باشد.

در این زبان صفی به نام Event Loop تعبیه شده است که دستوراتی که به I/O نیاز دارند و یا Event ها را در آن زمان بندی می نماید.

Event  ها یا رویداد ها به فرایند هایی مانند کلیک کردن ، حرک موس ، تایپ کردن و هر عملیاتی که توسط کاربر انجام شود اطلاق می شود. رویداد ها توسط پردازشگر I/O مدیریت می شوند.

دستور Ajax نیز مانند Event یک دستور I/O می باشد که در این صف قرار می گیرد. دستورات I/O همانطور که گفته شد برای اجرا به نخ دیگری ارسال می شوند که همراه خود دستور فراخوانی را حمل می کنند. هنگامی که فرایند I/O به اتمام برسد فراخوان اجرا می شود و پاسخ دستور I/O درون صف Event Loop وارد می شود تا در زمان مناسب اجرا شود.

event loop

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

به عنوان مثال در قطعه کد زیر:

در کد بالا با اینکه در تابع setTimeout گفته شده از میلی ثانیه اول در کنسول ، ۱ بنویس اما به دلیل اینکه حلقه ، زمانی را به خود اختصاص می دهد تا تمام شود ، خروجی کنسول نیز تا اتمام حلقه منتظر می ماند و بلا فاصله به خروجی نمی رود.

تابع setTimeout یک time event ایجاد می کند که به صورت مجزا درون صف Event loop وارد می شود. پس می بایست منتظر بماند تا Main Code اجرایش تمام شود که در این مورد حلقه زمانی طولانی سپری خواهد کرد.

با اینکه جاوا اسکریپت از یک نخ استفاده می کند با این حال سرعت بالای پردازش صف Event Loop باعث شده تا همان حس چند نخی را ایجاد نماید.

نوع دیگر Event  ها Timer ها هستند. توابعی مانند setTimeout  و setInterval .

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

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

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

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

در قسمت بعد درباره حل این مشکل صحبت خواهد شد.



دسته بندی: مقاله

پردازش موازی یا خطی در جاوا اسکریپت ، مسئله این است! (قسمت اول)

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

این گونه مجموعه عملیات ها را یک برنامه یا Program می نامیم.

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

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

البته باید گفت که اجرای همزمان چندین برنامه در یک لحظه در مدل واقعی همزمان نیست ، بلکه با سوئیچ های متوالی این توهم را برای کاربر ایجاد می کند که برنامه های در حال اجرا همزمان می باشند.

سوئیچ یا جابجا کردن (Context Switch) در سطح سیستم عامل به فرایندی گفته می شود که در آن از یک صف استفاده می شود و با جابجا کردن برنامه ها یا نخ ها (Threads) به سرعت و به صورت متوالی ، همزمانی پردازش را شبیه سازی می کنند.

این جابجایی در برنامه ها، تنها مشکل اجرای همزمان را برطرف می نماید. اما مشکل دیگر نیز وجود دارد.

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

در این باره راه کار های متفاوتی وجود دارد.

دو نمونه از آن ها معرفی می کنیم..

اولین مورد نخ ها هستند . نخ ها در سطح سخت افزار یا در سطح نرم افزار قابل پیاده سازی هستند.

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

به عنوان مثال فرض کنید یک برنامه وجود دارد که دو فرایند در بر دارد. یک قسمت ساعت نشان می دهد و در قسمت دیگر ماشین حساب ساده ای می باشد.

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

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

دومین مورد استفاده از روش non-blocking I/O یا async I/O می باشد.

کامپیوتر ها دارای دو حالت فعالیت می باشند. اول حالت عادی اجرای دستورات برنامه ها می باشد و حالت دوم اجرای دستورات I/O می باشد. درباره حالت دوم می توان گفت که دستوراتی مانند دسترسی به حافظه ، دسترسی به دستگاه های خارجی و … دستورات I/O هستند.

I/O به معنی ورودی/خروجی می باشد.

در حالت Blocking I/O هنگامی که سیستم به یک دستور I/O می رسد ، نخ متوقف می شود تا زمانی که وقفه (دستور اتمام فرایند) صادر شود و سپس نخ به ادامه فرایندش ادامه می دهد.

اما در حالت non-blocking I/O توقفی در نخ رخ نمی دهد. در این مورد پاسخ زیاد اهمیتی ندارد و تنها انجام عملیات مهم است.

در قسمت بعد درباره نحوه کارکرد جاوا اسکریپت توضیح خواهم داد…



دسته بندی: مقاله