WASM's hukommelsesmodel og -håndtering
Forstå WebAssemblys lineære hukommelsesmodel, og hvordan hukommelse allokeres, tilgås og håndteres i WASM-moduler.
WASM's hukommelsesmodel og -håndtering er en gratis WebAssembly (WASM) til applikationer med høj ydeevne-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i WebAssembly (WASM) til applikationer med høj ydeevne, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. WebAssembly (WASM) til applikationer med høj ydeevne-kurset indeholder 4 lektioner i alt.
Lineær WASM-hukommelse: Det grundlæggende
WebAssembly bruger en lineær hukommelsesmodel. Forestil dig den som ét stort, sammenhængende array af bytes, der minder om den måde, traditionelle programmer håndterer hukommelse på.
- Denne hukommelse er adskilt fra JavaScripts hukommelse.
- WASM-moduler tilgår den som et fladt adresseområde, der begynder ved adresse 0.
- Alle data (heltal, decimaltal, strenge, arrays) ligger i denne ene hukommelsesblok.
Objektet `WebAssembly.Memory`
I JavaScript repræsenteres WASM-hukommelse af objektet WebAssembly.Memory. Dette objekt indeholder den faktiske hukommelsesbuffer.
Du kan oprette den:
- Når du instansierer et WASM-modul, kan modulet erklære og oprette sin egen hukommelse.
- Du kan også videregive en eksisterende
WebAssembly.Memory-instans fra JavaScript til modulet.
const memory = new WebAssembly.Memory({
initial: 1, // Start with 1 page (64KB)
maximum: 10 // Max allowed 10 pages
});
// This 'memory' object is then passed to the
// WASM module during instantiation.Hukommelsessider: Størrelsesenheden
WASM-hukommelse er organiseret i enheder med fast størrelse, der kaldes sider. Hver side er præcis 64 KiB (65.536 bytes) stor.
- Egenskaberne
initialogmaximumforWebAssembly.Memoryer altid angivet i sider. - Et WASM-modul starter måske med kun 1 side og udvider hukommelsen efter behov for at være effektivt.
- Dette sidebaserede system muliggør effektiv hukommelseshåndtering og -beskyttelse.
JavaScripts visning af hukommelsen
JavaScript kan ikke tilgå WASM's lineære hukommelse direkte ved hjælp af rå pointere. I stedet får det en ArrayBuffer-visning af hukommelsen.
Derefter bruger du TypedArrays (som Uint8Array, Int32Array, Float64Array) eller en DataView til at læse og skrive bestemte datatyper ved bestemte forskydninger i denne ArrayBuffer.
const memoryBuffer = instance.exports.memory.buffer;
const uint8Array = new Uint8Array(memoryBuffer); // Byte-level view
const int32Array = new Int32Array(memoryBuffer); // 4-byte integer viewAllokering af hukommelse i C/WASM
Når du kompilerer C/C++ til WASM, allokerer funktioner som malloc hukommelse fra WASM's lineære hukommelse. Dette eksempel viser en C-funktion, der allokerer plads til et heltalsarray.
Den returnerer en hukommelses-forskydning (et heltal) i stedet for en direkte pointer, som JavaScript derefter bruger.
#include <stdlib.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#else
#define EMSCRIPTEN_KEEPALIVE
#endif
EMSCRIPTEN_KEEPALIVE
int* allocate_int_array(int size) {
int* arr = (int*) malloc(size * sizeof(int));
if (arr) {
for (int i = 0; i < size; ++i) {
arr[i] = i * 10; // Initialize with some data
}
}
return arr; // Returns memory offset
}
int main() {
// Main function is often a placeholder for WASM modules
return 0;
}Adgang til C-allokeret hukommelse fra JS
Efter at WASM har allokeret hukommelse (f.eks. ved hjælp af allocate_int_array), kan JavaScript tilgå den ved hjælp af den returnerede forskydning og et TypedArray.
Forskydningen fortæller JS præcis, hvor de allokerede data begynder i den underliggende ArrayBuffer, så du kan udføre præcise læse- og skrivehandlinger.
// Assuming 'instance' is your WASM module instance
const offset = instance.exports.allocate_int_array(5);
const memoryBuffer = instance.exports.memory.buffer;
// Create an Int32Array view starting at the offset
const intArray = new Int32Array(memoryBuffer, offset, 5);
console.log(intArray[0]); // Expected: 0
console.log(intArray[1]); // Expected: 10
// ... and so onFrigivelse af hukommelse med `free`
Ligesom i C er det afgørende at frigive hukommelse, du har allokeret med malloc, for at forhindre hukommelseslækager. Funktionen free i WASM fungerer på samme måde og frigiver hukommelsen tilbage til WASM-runtime-miljøet.
Denne C-funktion frigiver en tidligere allokeret hukommelsesblok ved hjælp af dens forskydning.
#include <stdlib.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#else
#define EMSCRIPTEN_KEEPALIVE
#endif
EMSCRIPTEN_KEEPALIVE
void free_wasm_memory(int* ptr) {
if (ptr) {
free(ptr); // Release the memory block
}
}
int main() {
return 0;
}Dynamisk udvidelse af hukommelsen
WASM-hukommelse er ikke fast; den kan udvides! Metoden memory.grow(numPages), som findes på objektet WebAssembly.Memory, gør det muligt at øge hukommelsesstørrelsen med et angivet antal sider.
- Metoden returnerer det tidligere antal sider.
- Hvis
growmislykkes (f.eks. fordimaximumoverskrides), returnerer den -1. - Vigtigt: Eksisterende TypedArray-visninger bliver ugyldige efter en udvidelse; du skal oprette nye ud fra den opdaterede
memory.buffer.
const currentPages = instance.exports.memory.grow(1); // Add 1 page
console.log(`Memory grew from ${currentPages} pages.`);
// After growing, always recreate TypedArray views!
const newMemoryBuffer = instance.exports.memory.buffer;
const newUint8Array = new Uint8Array(newMemoryBuffer);Kontrol af hukommelseshåndtering
Hvilke af følgende udsagn om WebAssemblys lineære hukommelsesmodel er SANDE?
Opsummering: WASM-hukommelseshåndtering
Vi har undersøgt WebAssemblys lineære hukommelsesmodel, som er et grundlæggende koncept i programmer med høj ydeevne.
- WASM-hukommelse er et sammenhængende byte-array, der er adskilt fra JS-hukommelsen.
- Den håndteres af objektet
WebAssembly.Memoryog er organiseret i sider på 64 KiB. - JavaScript interagerer med denne hukommelse ved hjælp af
ArrayBufferogTypedArraysfor at læse og skrive data. - C-funktioner som
mallocogfreefungerer inden for dette WASM-hukommelsesområde, hvor `malloc` returnerer en forskydning. - Hukommelsen kan øges dynamisk ved hjælp af
memory.grow(), men det kræver, at JS-visningerne oprettes igen.
Det er afgørende at forstå disse begreber for at kunne udveksle data og håndtere hukommelse effektivt i WASM-applikationer.
Lær WebAssembly (WASM) til applikationer med høj ydeevne med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 12
- Lektioner
- 48
Ofte stillede spørgsmål
Er lektionen “WASM's hukommelsesmodel og -håndtering” gratis?
Ja — hele teksten til “WASM's hukommelsesmodel og -håndtering” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af WebAssembly (WASM) til applikationer med høj ydeevne-kurset, skal du opgradere til CoddyKit PRO. WebAssembly (WASM) til applikationer med høj ydeevne-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “WASM's hukommelsesmodel og -håndtering”?
Forstå WebAssemblys lineære hukommelsesmodel, og hvordan hukommelse allokeres, tilgås og håndteres i WASM-moduler. Du øver dig i WebAssembly (WASM) til applikationer med høj ydeevne med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på WebAssembly (WASM) til applikationer med høj ydeevne?
Der kræves ingen tidligere erfaring. WebAssembly (WASM) til applikationer med høj ydeevne på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “WASM's hukommelsesmodel og -håndtering”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne WebAssembly (WASM) til applikationer med høj ydeevne-lektion?
Ja. Alle WebAssembly (WASM) til applikationer med høj ydeevne-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Overførsel af komplekse datastrukturer
- WASM's hukommelsesmodel og -håndtering
- Delt hukommelse og atomics
- Udvidelse og håndtering af lineær hukommelse