در جاوااسکریپت ما دو نوع بافر داریم: ArrayBuffer و SharedArrayBuffer. هر دوی اینها در واقع نمایشدهندهی لایه پایینی (Low-level) از یک محدوده یا فضای حافظه هستند. با اینکه کلمه «آرایه» در نام آنها وجود دارد، اما ربط چندانی به آرایههای معمولی ندارند؛ یعنی شما نمیتوانید مستقیماً چیزی درون آنها بنویسید یا از آنها بخوانید. در عوض، بافرها اشیایی کلی و عمومی هستند که فقط و فقط شامل دادههای خام هستند. برای اینکه بتوانید به حافظهای که یک بافر نشان میدهد دسترسی داشته باشید، حتماً باید از یک نما (View) استفاده کنید.
بافرها از چهار عملیات اصلی زیر پشتیبانی میکنند:
تخصیص دادن (Allocate): به محض اینکه یک بافر جدید ساخته میشود، یک فضای حافظه جدید به آن اختصاص داده شده و مقدار اولیه تمام خانههای آن 0 میشود.
کپی کردن (Copy): شما با استفاده از متد slice() میتوانید خیلی سریع و با کارایی بالا، یک بخش از حافظه را کپی کنید؛ بدون اینکه نیاز باشد یک نمای جدید بسازید و تکتک بایتها را دستی کپی کنید.
انتقال دادن (Transfer): با استفاده از متدهای transfer() و transferToFixedLength()، میتوانید مالکیت یک فضای حافظه را به یک شیء بافر جدید واگذار کنید. این قابلیت برای زمانی که میخواهید دادهها را بین محیطهای اجرای مختلف (Execution Contexts) جابهجا کنید بسیار مفید است، چون دیگر نیازی به کپی کردن دادهها نیست. اما حواستان باشد که بعد از انتقال، بافر اصلی دیگر قابل استفاده نخواهد بود. همچنین یک SharedArrayBuffer را نمیتوان انتقال داد (چون این بافر از قبل بین همه محیطهای اجرا مشترک است).
تغییر سایز (Resize): با استفاده از متد resize() میتوانید اندازه فضای حافظه را تغییر دهید (یعنی تا زمانی که از محدودیت تعیینشدهی maxByteLength فراتر نرفتهاید حافظه بیشتری بگیرید، یا بخشی از حافظه را آزاد کنید). البته SharedArrayBuffer فقط میتواند بزرگتر شود و امکان کوچکتر شدن ندارد.
ArrayBuffer و SharedArrayBufferتفاوت اصلی این دو در مالکیت آنهاست: یک ArrayBuffer در هر لحظه فقط و فقط متعلق به یک محیط اجرای واحد است. اگر شما یک ArrayBuffer را به یک محیط اجرای دیگر بفرستید، مالکیت آن منتقل (Transfer) میشود و بافر اصلی و اولیه دیگر غیرقابل استفاده خواهد شد. این ویژگی تضمین میکند که در هر لحظه فقط یک محیط اجرا میتواند به این حافظه دسترسی داشته باشد.
در طرف مقابل، یک SharedArrayBuffer وقتی به یک محیط اجرای دیگر فرستاده میشود، انتقال مالکیت پیدا نمیکند؛ بلکه چندین محیط اجرا میتوانند به صورت همزمان به یک فضای حافظه مشترک دسترسی داشته باشند. البته این کار ممکن است باعث ایجاد «شرایط مسابقه» (Race Conditions) شود (زمانی که چند رشته یا تردِ مختلف همزمان بخواهند یک بخش از حافظه را تغییر دهند)؛ به همین خاطر است که در این مواقع، ابزارهایی مثل متدهای Atomics برای مدیریت و هماهنگی بسیار کاربردی و مفید میشوند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript