Bosh sahifa Wiki Linear memory

Linear memory

Linear memory — dasturga noldan boshlanuvchi uzluksiz baytlar massivi sifatida ko‘rinadigan xotira modeli. WebAssembly’da load va store ko‘rsatmalari shu memory ichidagi integer offset manzillar bilan ishlaydi. U JavaScript obyekt xotirasidan alohida bo‘lib, modul va host o‘rtasida ArrayBuffer ko‘rinishida ulashilishi mumkin.

Sahifalar va o‘sish

WebAssembly linear memory 64 KiB sahifalarda o‘lchanadi. Modul initial va ixtiyoriy maximum page sonini e’lon qiladi. memory.grow qo‘shimcha sahifa so‘raydi va muvaffaqiyatsiz bo‘lishi mumkin. O‘sish eski buffer reference’ini detached qilishi ehtimoli sabab host yangi memory.buffer va typed view oladi.

Memory qisqarmaydi; allocator bo‘shatilgan bloklarni ichki free list orqali qayta ishlatadi. Uzoq ishlaydigan modulda fragmentation va peak usage nazorat qilinadi. Maximum belgilash hostga resurs rejalash va shared memory talablarini bajarishga yordam beradi.

Manzil va layout

Compiler stack, heap, global data va runtime metadata’ni linear memory ichida joylashtiradi. Pointer native address emas, memory boshidan offsetdir. 32-bit WebAssembly odatda 4 GiB address space chegarasiga ega, memory64 taklifi kattaroq offset modelini beradi; host va toolchain qo‘llashi zarur.

Multi-byte qiymatlar little-endian tartibda saqlanadi. Alignment hint performancega ta’sir qilishi mumkin, ammo unaligned access ham aniq semanticsga ega. Struct layout C ABI, padding va field offsetga bog‘liq; JavaScript bilan qo‘lda almashganda schema bir xil bo‘lishi kerak.

Chegara tekshiruvi

Har memory access effective address va o‘lcham linear memory chegarasida ekanini tekshiradi. Tashqariga chiqish trap beradi va brauzerning boshqa xotirasini o‘qishga imkon bermaydi. Bu sandboxning muhim qismi, ammo modul ichidagi ikki buffer orasidagi mantiqiy chegarani himoya qilmaydi. C/C++dagi out-of-bounds modulning o‘z linear memory’sidagi boshqa ma’lumotni buzishi mumkin.

Integer overflow address hisobini kichik offsetga aylantirishi mumkin. Allocator va parser offset + lengthni xavfsiz tekshiradi. Host modul bergan pointer va lengthni qabul qilganda ham memory chegarasini, encodingni va maksimal hajmni tekshiradi.

Host bilan almashuv

JavaScript Uint8Array, DataView yoki boshqa typed array orqali bufferga qaraydi. String almashuvda UTF-8 baytlar memoryga yozilib, pointer va length module functionga beriladi. Module natijasi uchun ownership aniq: buffer’ni kim ajratadi va kim bo‘shatadi. Aks holda memory leak yoki use-after-free yuz beradi.

Katta ma’lumotni copy qilish qimmat. Host va modul bir memory view’ni ulashishi zero-copyga yaqin ishlash beradi, ammo modul memory grow qilsa view yangilanadi. Secret ma’lumot modul ichida bo‘lsa JavaScript host odatda bufferni o‘qiy oladi; linear memory hostdan maxfiy enclave emas.

Thread va atomik amallar

Shared WebAssembly memory SharedArrayBuffer bilan bir nechta worker orasida ulashilishi mumkin. Data race oldini olish uchun atomic instruction, lock yoki lock-free algoritm kerak. Brauzer shared memory uchun cross-origin isolation headerlarini talab qiladi, chunki yuqori aniqlikdagi timing va speculative execution xavflari mavjud.

Memory model happens-before va atomic order qoidalarini belgilaydi. Oddiy load/store’ni “bir bayt bo‘lsa xavfsiz” deb taxmin qilish noto‘g‘ri. Toolchain thread runtime’i stack va allocatorni har worker uchun muvofiqlashtiradi.

Diagnostika

Memory usage faqat joriy page soni bilan emas, allocatorning ishlatilgan va bo‘sh bloklari bilan kuzatiladi. Heap profiler allocation stacklarini ko‘rsatishi mumkin. Trap stack trace source map va debug symbol orqali original funksiyaga bog‘lanadi; release’da symbol fayli alohida himoyalangan holda saqlanadi.

Bog‘liq tushunchalar

WebAssembly, ArrayBuffer, Memory page, Pointer, Heap, SharedArrayBuffer, Memory safety