مفهوم اشتراک گذاری حافظه در جاوا اسکریپت

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

 

مزایا و معایب حافظه مشترک

ما از WebWorker برای ایجاد  یک threads در جاوا اسکریپت استفاده می کنیم. API Web Workers به ما اجازه می دهد تا thread هایWorker ایجاد کنیم که می تواند برای اجرای کد در پس زمینه استفاده شود و رشته اصلی آزاد باشد تا اجرای آن را ادامه دهد، احتمالا پردازش رویدادهای UI را تضمین می کند و هیچ UI را مسدود نمی کند.

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

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

اما به اشتراک‌گذاری محافظت می کند، و همچنین ممکن است چندین رشته در یک زمان به همان داده ها نگاه کنند و آنها را تغییر دهند.این جایی است که شی “SharedArrayBuffer” به تصویر می آید. “SharedArrayBuffer” اجازه خواهد داد که ما داده‌های باینری را بین thread مختلف به اشتراک بگذاریم.

مطالب مرتبط:نکات مهم جی کوئری برای شروع قدرتمند

شی SharedArrayBuffer

به جای منتقل‌کردن از کپی داده‌ها بین threadها، ما کپی هایی از شی “SharedArrayBuffer” را منتقل می کنیم. یک شی “SharedArrayBuffer” به حافظه‌ای که داده‌ها ذخیره می‌شود اشاره می‌کند.

بنابراین، حتی زمانی که نسخه های “SharedArrayBuffer” بین threadها قرار می‌گیرند، همه آنها همچنان به همان حافظه ای داده های اصلی ذخیره می شوند. بنابراین، threadها میتوانند داده‌ها را در همان حافظه مشاهده و بروز‌رسانی کنند.

WebWorker ها بدون حافظه مشترک

برای دیدن اینکه چگونه یک WebWorker بدون استفاده از حافظه مشترک کار ‌می‌کند، یک thread worker ایجاد می کنیم و برخی از داده‌‌‌‌‌‌‌ها را به آن منتقل می کنیم. فایل index.html اسکریپت اصلی را داخل تگ <script> </ script> نگه می دارد، همانطور که در زیر مشاهده می‌کنید:

فایل worker.js اسکریپت WebWorker را اجرا می کند:

با استفاده از کد بالا، خروجی زیر را در کنسول دریافت می کنیم:

در حال حاضر، در نظر داشته باشید که داده ها بین thread ها با استفاده از روش postMessage() به عقب و جلو ارسال می شود. داده‌ها توسط رویداد پیام، به عنوان مقدار داده رویداد،در طرف دیگر دریافت می شود.

حالا، اگر ما داده ها را تغییر دهیم، به نظر می‌‌‌رسد در پایان دریافت بروزرسانی می شود.

مشاهده کنید :

همانطور که انتظار می رود، داده ها به روز نشده اند:

چرا اینطور شد؟ این فقط یک کلون است که به WebWorker از اسکریپت اصلی ارسال شده است.

WebWorker ها با حافظه مشترک

حالا ما از شی “SharedArrayBuffer” در همان مثال استفاده خواهیم کرد. ما می توانیم یک نمونه جدید “SharedArrayBuffer” با  keyword جدید ایجاد کنیم. سازنده یک پارامتر را می گیرد.مقدار طول در بایت ها، مشخص‌کننده اندازه Buffer است.

توجه داشته باشید که یک شی” SharedArrayBuffer” تنها یک قسمت حافظه مشترک را نشان می دهد. برای مشاهده و تغییر داده های باینری،باید از یک ساختار داده مناسب استفاده کنیم.

در فایل index.html بالا، یک “SharedArrayBuffer” جدید با تنها یک بایت طول ایجاد می شود. سپس Int8Array جدید، که یک نوع از اشیاء TypedArray است، برای تنظیم داده ها به “9” در فضای بایت ارائه شده استفاده می شود.

Int8Array همچنین در Worker برای مشاهده داده‌ها در Buffer مورد استفاده قرار می گیرد. مقداری که انتظار می‌رود در کنسول از رشته Worker ظاهر می‌شود، دقیقا همان چیزی است که ما میخواستیم:

حالا، اجازه دهید داده‌ها را در موضوع اصلی به روز کنیم تا ببینیم آیا تغییر در Worker منعکس شده است یا خیر.

و همانطور که در زیر مشاهده میکنید،بروزرسانی در داخل Worker منعکس می‌شود.

اما، کد همچنان نیاز به کار دیگری دارد،زمانی که مقدار در Worker در ابتدا تغییر می‌کند،همچنین باید زمانی که از thread  اصلی چاپ می‌شود،به روز شود. در این مورد، کد ما به صورت زیر است:

داده‌ها در Worker تغییر می کنند و یک پیام خالی به thread اصلی ارسال میشود که نشان می دهد که داده ها در Buffer تغییر کرده است و برای thread اصلی آماده است.

و این هم کار می کند! داده ها در بافر مشابه داده ها در داخل Worker است.

مقدار هر دو مورد بروز می‌شود. هر دو thread اصلی و Workerها در حال مشاهده و تغییر داده های مشابه هستند.

سخن پایانی

همانطور که قبلا ذکر شد، استفاده از حافظه مشترک در جاوا اسکریپت بدون مزاحمت نیست. اگر بیشتر به حافظه مشترک علاقمند هستید، به مستند سازی شیء Atomics نگاه کنید. شیء Atomics با کاهش ماهیت غیر قابل پیش بینی خواندن / نوشتن از حافظه به اشتراک گذاشته شده می تواند به شما در دستیابی به برخی از سختیها کمک کند.

منبع : *

تاکنون هیچ نظری ثبت نشده است