Cache (från franska cacher, "gömma") är en term inom datorteknik som beskriver en kopia av senast använda data, eller ofta använda data, som temporärt mellanlagras i ett snabbt minne för att kunna återanvändas i framtiden. Syftet är att snabba upp exekveringstiden genom att undvika att man måste hämta samma data på nytt via ett långsamt nätverk eller från ett långsammare minne, eller att man måste utföra tidskrävande beräkningar av samma värden igen. Syftet kan också vara att avlasta en hårt belastad resurs, exempelvis en server eller annan central enhet. Ett cacheminne är en hårdvarubaserad cache i form av ett snabbt datorminne (vanligen statiskt minne, SRAM) som bland annat finns i mikroprocessorer för att mellanlagra programkod eller data som nyligen hämtats från eller lagrats i det större men långsammare arbetsminnet (vanligen dynamiskt minne, DRAM). Cacheminnen har visat sig vara extremt effektiva i många data- och datortekniska områden eftersom program ofta hämtar data på typiska sätt. Dataåtkomster tenderar ofta att göras "nära" varandra, och samma data används ofta om och om igen. En cache består av ett antal datavärden, som vart och ett är en kopia av originalvärden från ett annat långsammare lagringsmedium. Cachedata organiseras i form av inlägg i ett register med någon form av unik adress eller tag (Svenska: "etikett") som för varje cachat datavärde identifierar originalvärdet det kopierats från. När en cacheanvändare vill komma åt datavärden med en viss tag från lagringsmediet söker den först i cachen. Om ett inlägg i cacheregistret existerar med samma tag används motsvarande datavärde. Denna situation kallas för en cacheträff. Om cacheregistret däremot inte innehåller den sökta tagen inträffar en cachemiss. Det sökta datavärdet måste nu hämtas eller beräknas, varpå det lagras i cacheminnet redo för nästa åtkomst. Om cache har begränsad lagringskapacitet fylls det så småningom upp med cachade datavärden. Cacheminnet måste radera andra datavärden för att få plats för nya värden. Varje cacheminne har en speciell heuristik för att bestämma vilka datavärden som raderas. En vanlig sådan, least recently used eller LRU raderar de äldsta posterna i cacheminnet, eftersom gamla poster inte använts på länge är det mindre troligt att de kommer att användas snart i framtiden. Cache-teknik används på många olika nivåer i systembyggen, en CPU har exempelvis ofta två (L1-cache och L2-cache eller ibland ännu fler) nivåer av cacheminnen, varav det minsta är det snabbaste (och dyraste). Ibland kan processorer använda separata cacheminnen för instruktioner och data, vilka då kallas instruktionscache respektive datacache. Webbservrar använder ofta en cache av sidor genererade i förväg så att dynamiskt genererade sidor inte behöver beräknas varje gång de efterfrågas. Detta kan vara till fördel för dynamiska sidor som belastas hårt eller är kostsamma att beräkna. Ytterligare en cachefunktion finns i webbläsare, som sparar de webbsidor användaren besöker så att de inte behöver hämtas igen vid nästa besök på sidan. De redan hämtade sidorna lagras som ordinarie filer i ett särskilt webbcache på användarens dator. Operativsystem eller tilläggsprogram använder sig ibland av diskcache för att öka hastigheten på hårddisk- och CD-läsning och -skrivning. Hårddiskföretaget Maxor var först med 16MB Cache. Teknisk förklaring av 'cache' av Svenska datatermgruppen.
Ett processorregister är inom processorarkitektur en liten mängd mycket snabbt datorminne som används för att ge snabb tillgång till frekvent åtkommen data. Att lagra ofta använd data i register är kritiskt för programprestanda, vilket gör registerallokering, att tilldela registren på ett effektivt sätt, till en viktig uppgift för en kompilator. De flesta, men inte alla, moderna processorarkitekturer fungerar enligt principen att hämta data från primärminnet (eventuellt via cache) till processorregistren, utföra beräkningar på dem, och sedan lagra resultaten i primärminnet igen. Processorregister ligger högst i minneshierarkin: det är det snabbaste sättet att lagra data. Termen 'processorregister' används oftast bara för de register som går att påverka eller avläsa från instruktioner, dessa kallas också "arkitekturregister". Exempelvis har x86-arkitekturen åtta stycken 32-bitarsregister, men en CPU som tillämpar x86-arkitekturen har betydligt fler interna register än bara dessa åtta, till exempel instruktionsregister. Processorregister klassificeras normal baserat på hur många bitar de består av, exempelvis säger man "8-bitarsregister" eller "32-bitarsregister". Det finns olika kategorier av register, beroende på typen av data som lagras i dem. Dataregister används för att lagra heltal. I några äldre eller enklare processorer finns det ett särskilt dataregister, ackumulatorn, som används underförstått i många instruktioner. Exempel: D0-D7 i 68000-arkitekturen och A-registret i 6502-arkitekturen. Adressregister används för att lagra minnesadresser (eller delar av minnesadresser) och används bland annat för att läsa från och skriva till primärminnet. Exempel: segmentregistren CS, DS, ES, FS, GS och SS i x86-arkitekturen och A0-A7 i 68000-arkitekturen. Allmänna register (general purpose registers eller GPR) används för både data och adresser. Flyttalsregister används för att lagra flyttal. Exempel: ST(0)-ST(7) hos 8087-matematikprocessorn. Konstanta register innehåller vanligt förekommande värden som bara kan läsas (till exempel noll, ett och pi). Vektorregister håller flera datavärden i en vektor och används för att utföra flera operationer parallellt (se vidare: SIMD). Specialregister håller reda på programmets tillstånd. Exempel: instruktionspekare, stackpekare och statusregister. I några processorarkitekturer finns modellspecifika register som lagrar data och inställningar som är specifika för processorn själv. Eftersom deras innebörd är knuten till en specifik processor, går det inte att förlita sig på att deras funktion är densamma i senare processorgenerationer.
Ali Ghodsi, född 1984 i Iran, är en iransk-svensk datalog och entreprenör specialiserad på distribuerade system och storskalig datanalys. Han är medgrundare till och VD för Databricks, och en adjungerad professor vid UC Berkeley. Idéer från hans akademiska forskning inom området för resurshantering och schemaläggning och cache har tillämpats i populära öppen källkods-projekt som Apache Mesos, Apache Spark och Apache Hadoop. Ghodsi disputerade vid Kungliga Tekniska Högskolan (KTH) i Sverige, med Seif Haridi som handledare. Han var medgrundare till Peerialism AB, ett Stockholm-baserat företag som utvecklar peer-to-peer-system för att transportera och lagra data på Internet. Han var också forskarassistent vid KTH 2008–2009. 2009 blev Ghodsi gästforskare vid UC Berkeley och arbetade med Scott Shenker, Ion Stoica, Michael Franklin och Matei Zaharia i ett forskningsprojekt om distribuerade system, databassystem och nätverk. Under denna period hjälpte han till att starta Apache Mesos och Apache Spark-projekt. Han publicerade också "Dominant Resource Fairness", en artikel som starkt påverkat resurshantering- och schemaläggningsdesign i distribuerade system som Hadoop. År 2013 grundade han Databricks, ett företag som kommersialiserar Spark, och blev verkställande direktör 2016. Den amerikanska ekonomitidskriften Forbes rankade Ghodsi till att vara världens 1 846:e rikaste med en förmögenhet på 1,8 miljarder amerikanska dollar för den 22 maj 2021.
Maskinkod (även kallat maskinspråk eller binärkod) är det "språk" en processor direkt förstår och klarar att exekvera. Varje processortyp har sin särskilda maskinkod som är ett uttryck för dess instruktionsuppsättning. Ett datorprogram i något programspråk (den s.k. källkoden) kan antingen direkt tolkas och utföras via en interpretator eller översättas med en kompilator till maskinkod som i sin tur direkt kan köras, något som normalt ger bättre prestanda. Maskinkod består av relativt enkla kommandon såsom "addera register B till register A", "jämför register A med innehållet i minnescell 123456", "hoppa till adress 234567 om det var lika" och dylikt. Varje sådan instruktion representeras av ett eller flera binära ord (binära tal med fix längd) vars längd (typiskt 8, 16, 32 eller 64 bitar) och precisa användning varierar med CPU-typ. En enkel operation, som att exempelvis omvandla en sträng av bokstäver till stora bokstäver, kan innebära många individuella maskinkodsinstruktioner. Varje instruktion består av ett eller flera ord som kodar för en viss operation, följd av eventuella argument i form av konstanter eller adresser, offset, etc. till platser där data lagras. Argument kan lagras i samma ord som operationskoden eller i separata ord beroende på ordlängd, arkitektur, och/eller instruktionstyp (då ordlängden vida överstiger vad som behövs för att representera alla operationer så används ofta resten av ordet för argument på något sätt, se instruktionsuppsättning). Bitarna i en instruktion kan var och en direkt styra en funktion i processorn, till exempel så att en bit anger att ett visst register skall användas, en annan att det är frågan om addition, en tredje att en operand skall hämtas med en viss typs minnesadressering o.s.v. men normalt används rätt mycket avkodning för att begränsa antalet bitar och därmed spara minne, ursprungligen för att arbetsminnet var begränsat, men numera för att mer skall rymmas i cache-minnet och därmed ge bättre prestanda. Maskinkod är ganska svårtolkad för människor, ett maskinkodsprogram består av sekvenser av binära ord utan någon uppenbar struktur. Utan att veta hur en specifik maskin indelar och tolkar dessa ord, kan man inte ens avgöra vilka av orden som är instruktioner eller data. Maskinen vet dock hur lång varje typ av instruktion (inklusive argument) är och när den har tolkat en instruktion så vet den därför var nästa instruktion ligger. För att underlätta manuell maskinspråksprogrammering använder man en "symbolisk maskinkod", assembler, där maskinkodens instruktioner representeras av korta "minnesord" (engelska: mnemonics) och symboliska (namngivna) minnesadresser och konstanter. Denna kod översätts sedan till maskinkod av en assemblator (omvänt av en disassembler). Om man arbetar med en enklare instruktionsuppsättning kan man göra assembleringen för hand, så kallad handassemblering. Också om nästan alla datorprogram idag skrivs på något högnivåspråk (se programspråk), är förståelse för maskinkod väsentlig i speciella fall, till exempel då man skriver en kompilator eller en drivrutin för en hårdvaruenhet, då man optimerar kod som väsentligt påverkar ett datorprograms effektivitet eller då man söker efter vissa typer av fel. Här är ett exempel på hur en instruktion kan se ut i assembler, det är ett SET-kommando som sätter innehållet vid minnesadressen '0x1040' (hexadecimal notation för 4160) till värdet 0x0001 (hex för 1). SET-instruktionen innebär alltså att man lagrar ett tal på ett speciellt ställe i minnet. Denna instruktion består av ett ord som kodar för en viss operation, i det här fallet SET, följd av argumenten i form av adress och värde. Exemplet ovan är taget från en virtuell processor, DCPU-16, där blir kodraden ovan på maskinkod: 0x85E1 0x1040.
Primärminne eller arbetsminne (ibland, av historiska skäl, internminne) är minne som en dators centralprocessor kan använda (mer eller mindre) direkt, i motsats till sekundärminne, vars innehåll först måste laddas in i primärminnet. Primärminnet används för att lagra datorprogram och olika former av data när programmen används. Beskrivningen ovan gäller strängt taget inte hur vanliga moderna datorer fungerar, men nog hur minnesanvändningen ser ut ur maskinspråkssynvinkel. Moderna centralprocessorer har cache i flera nivåer, där data och instruktioner ur primärminnet lagras för att snabbt kunna användas på nytt, utan att detta explicit styrs i programkoden. Beskrivningen tar inte heller hänsyn till registren i centralprocessorn. I praktiken är primärminnet vanligen flyktigt: dess innehåll försvinner då datorn stängs av. Den andra huvudsakliga typen av skrivbart datorminne är mer permanent och kallas därför lagringsminne (historiskt sekundärminne eller ibland externminne), efter sin användning. Minneskapacitet mäts normalt i bytes tillsammans med binärprefix med basen 2 (kibibyte, mibibyte, gibibyte), trots att man historiskt använt namnet på motsvarande SI-prefix (kilobyte, megabyte, gigabyte). Minnestekniken har genomgått flera stora teknikskiften sedan datorns barndom under tidigt 1940-tal. De tekniker som används idag (integrerade dynamiska och/eller statiska minnen) har dock i sina grundprinciper förblivit oförändrade sedan mikrodatorn (och persondatorn) introducerades under 1970-talet. Däremot har successiva generationer av minneskretsar förfinats rörande intern implementeringsteknik och/eller elektriskt gränssnitt. Själva minneskapaciteten har också ökat enormt sedan 1970-talet, tack vare att transistor- och linjedimensioner i kretsarna kunnat reduceras ett flertal gånger per decennium. Hemdatorer i början på 1980-talet hade vanligtvis ett primärminne på ett fåtal kilobyte, upp till 64 KB, medan den ursprungliga IBM PC hade mellan 16 och 256 KB. År 2012 är nytillverkade persondatorer vanligtvis utrustade med mellan 1024 och 8192 MB. De har alltså tusentals gånger så stort primärminne som IBM PC (även PC-XT, PC-AT) och en miljon gånger så stort primärminne som merparten tidiga hemdatorer (bara grafikkortet i en persondator kan idag vara utrustat med mellan 128 och 4096 MB). Idag har de flesta datorer inbyggda hårddiskar. Tidigare var lagringsmedia ofta inte inbyggt i själva datorn, och därför använder man ibland av historiska skäl begreppet internminne om primärminne. Primärminne är vanligtvis flyktigt läs - och skrivbart minne (RWM) av RAM-typ. Att minnet är flyktigt innebär att data som lagrats i minnet försvinner när strömmen slås av. Vissa typer av RAM, såsom MRAM är icke-flyktigt (jämför ROM, EEPROM och hårddisk). "RAM" står för Random Access Memory och Random access syftar på att man direkt kan adressera enskilda minnespositioner (i regel med ungefär samma åtkomsttid oavsett vilken del av minnet som adresseras). Detta ska jämföras med till exempel magnetband, som måste genomsökas sekventiellt, och hårddiskar och andra skivminnen, vars sektorer kan nås direkt men måste läsas i sin helhet för att nå en enskild adress inom den. En minnesposition kan vara olika stor. I många arkitekturer kan man adressera minnet byte för byte, men det förekommer också att man måste adressera minnet ordvis. Det finns också RAM-minnen som inte går att använda som primärminne, oftast för att det är för långsamt eller inte är skrivbart (minne för programkod behöver dock inte vara skrivbart, annat än till den del programmet innehåller självmodifierande kod eller tabeller över variabla minnespositioner). DRAM (dynamiskt RAM) VRAM (video-RAM). SDRAM (Synchronous Dynamic RAM) DDR SDRAM (Double Data Rate SDRAM). People of red personROM, EEPROM (programmerbart minne). WORM (write once, read many). Svenska datatermgruppen: datorminnen—teknisk förklaring.