CPU-të janë kafshë tepër komplekse. Ka një numër të madh pjesësh ndërlidhëse që të gjitha duhet të punojnë në unison të përsosur për të arritur nivelet e performancës që shohim. Performanca e memories është një faktor kyç në performancën e CPU-ve moderne, veçanërisht si një faktor kufizues.
Pse është kaq e rëndësishme shpejtësia e kujtesës?
CPU-të janë tepër të shpejtë, me gjeneratat e fundit që funksionojnë në 5,7 GHz kur ftohen në mënyrë adekuate. Kjo u lejon atyre të kryejnë 5.7 miliardë operacione çdo sekondë. Shumë nga këto operacione kryejnë një veprim në disa lloj të dhënash që duhet të ruhen në memorie.
Kujtesa kryesore e sistemit, e njohur si RAM, është gjithashtu shumë e shpejtë. Fatkeqësisht, është shumë i shpejtë kur krahasohet me çdo gjë tjetër përveç CPU-së. Vonesa absolute në RAM-in modern të nivelit të lartë është rreth 60 nanosekonda. Fatkeqësisht, kjo përkthehet në afërsisht 342 cikle CPU. Për të shpejtuar aksesin në memorie, përdoret një memorie CPU që ruan në mënyrë dinamike të dhënat. Ky cache ndodhet në vetë CPU die dhe përdor qelizat SRAM në vend të qelizave DRAM duke e bërë atë shumë më të shpejtë. Fatkeqësisht, cache e CPU-së është gjithashtu shumë më e vogël se RAM-i i sistemit, në përgjithësi nuk arrin as 100 MB. Prapëseprapë, pavarësisht nga madhësia e tij e vogël, sistemi i cache-it me nivele të CPU-së rrit masivisht performancën e sistemit.
Këtu vjen memoria virtuale për të ngatërruar gjithçka
Kompjuterët modernë përdorin një sistem të quajtur memorie virtuale. Në vend që të alokohen adresat e memories fizike për proceset, përdoren adresat e memories virtuale. Çdo proces ka hapësirën e vet të adresës së memories virtuale. Kjo ka dy përfitime. Së pari, ai siguron ndarje të lehtë midis memories që i përket një procesi dhe kujtesës që i përket një tjetri. Kjo ndihmon në parandalimin e sulmeve ku softueri me qëllim të keq lexon të dhëna nga memoria e softuerit të tjerë, duke aksesuar potencialisht informacione të ndjeshme. Ai gjithashtu fsheh strukturën e kujtesës fizike nga procesi. Kjo i lejon CPU-së të lëvizë pjesë të memories të përdorura rrallë në një skedar paging në ruajtje, pa e çmontuar domosdoshmërisht atë nga RAM-i virtual. Kjo i lejon kompjuterit të menaxhojë butësisht skenarët ku kërkohet më shumë RAM sesa është fizikisht i pranishëm. Pa memorie virtuale,
Fatkeqësisht, nëse përdorni adresa të memories virtuale, kompjuteri duhet t'i përkthejë ato adresa të memories virtuale në adresat e memories fizike për të lexuar të dhënat. Kjo kërkon një tabelë për të ruajtur të gjitha përkthimet e adresave të memories virtuale në adresat e memories fizike. Madhësia e kësaj varet drejtpërdrejt nga sasia e RAM-it në përdorim. Në përgjithësi është mjaft i vogël, të paktën kur krahasohet me kapacitetin e RAM-it të sistemit. Fatkeqësisht, nëse ruani përkthimin midis adresave virtuale dhe adresave fizike në RAM, duhet të bëni dy kërkesa në RAM për çdo kërkesë në RAM. Një për të gjetur adresën fizike për të kërkuar dhe më pas një tjetër për të hyrë në atë vendndodhje.
Futni buffer-in e përkthimit
Zgjidhja për këtë problem është ruajtja e tabelës së përkthimit diku më shpejt. Memoria e CPU-së do t'i përshtatej mirë faturës, të paktën nga këndvështrimi i shpejtësisë. Problemi me këtë, megjithatë, është se cache e CPU-së është e vogël dhe tashmë e përdorur shumë. Jo vetëm që tabela nuk futet në cache, por nëse e bësh këtë do të prishte përdorimin e saj tashmë që përcakton performancën.
Sigurisht, nëse parimi i cache-it tashmë funksionon për aksesin në kujtesë, pse të mos e përsërisni atë për tabelën e përkthimit? Dhe kjo është pikërisht ajo që është Translation Lookaside Buffer, ose TLB. Është një cache me shpejtësi të lartë për përkthimet e fundit të adresave. Nuk është mjaft i madh për të ruajtur të gjithë tabelën, por madhësia e tij e vogël do të thotë se mund të përgjigjet shumë shpejt, brenda një cikli të vetëm orësh.
Çdo kërkesë memorie kalon përmes TLB. Nëse ka një goditje TLB, ai mund të sigurojë adresën e memories fizike për kërkesën aktuale, duke shtuar zakonisht një cikël të vetëm vonesë. Nëse ka një gabim TLB, kërkimi duhet të kryhet nga memoria kryesore. Ka një dënim të vogël të performancës për një humbje të TLB prej rreth 5 ciklesh, një humbje më shumë se e eklipsuar nga vonesa e aksesit në kujtesë. Pasi të merret përkthimi i adresës nga RAM-i i sistemit, ai shtyhet në TLB dhe më pas kërkesa përsëritet me një goditje të menjëhershme TLB.
Shënim: Ekzistojnë skema të ndryshme për dëbimin e TLB. Disa mund të përdorin një skemë First In, First Out ose FIFO. Të tjerët mund të përdorin një skemë më pak të përdorur ose LFU.
Në rastin e rrallë që nuk ka asnjë hyrje në tabelën e përkthimit të adresave, shkaktohet një gabim faqeje, pasi të dhënat e kërkuara nuk janë në RAM. Më pas, OS duhet të trajtojë defektin dhe të transferojë të dhënat nga ruajtja në RAM përpara se kërkesa të vazhdojë.
konkluzioni
Translation Lookaside Buffer, ose TLB, është një cache e CPU-së me shpejtësi të lartë, e dedikuar për ruajtjen e përkthimeve të fundit të adresave nga skedari i faqeve në RAM-in e sistemit. Kjo është e nevojshme pasi sistemet e memories virtuale, siç zbatohen në të gjithë kompjuterët modernë, do të kërkonin dy kërkesa për RAM për çdo kërkesë për RAM. Një për të përkthyer adresën e kujtesës virtuale në një adresë memorie fizike dhe një tjetër për të hyrë në të vërtetë adresën fizike. Duke ruajtur në memorie të fshehtë, vonesa e kujtesës së përkthimeve të fundit mund të reduktohet shumë për hitet TLB.
Duhet pasur kujdes për të siguruar që përkthimet e ruajtura në memorie janë të rëndësishme për procesin aktual aktiv. Meqenëse çdo proces ka një hapësirë të ndryshme adresash virtuale, ato nuk mund të ripërdoren. Mos kufizimi i rreptë i kësaj ishte shkaku i cenueshmërisë së Meltdown.