Minnet från processorns sida Digitala System: Datorteknik • Processorn ger kommandon/instruktioner med en adress och förväntar sig data. – Exempel: READ(ADR) -> DATA ERIK LARSSON Logisk adress Fysisk adress READ 00001000 READ (00001000) Primärminne Address 00001000 00001001 00001010 00001011 Design av minnesystem CPU – Ett minne som får plats med stora program och som fungerar i hastighet som processorn » Fetch – execute (MHz/GHz/Multi-core race) CPU • Grundproblem: – Processorer arbetar i hög hastighet och behöver stora minnen – Minnen är mycket långsammare än processorer • Fakta: – Större minnen är långsammare än mindre minnen – Snabbare minnen kostar med per bit Kontrollenhet 0000101110001011 Register Minne CPU Minne-processor hastighet • Vad vill vi ha? Primärminne Instruction 0000101110001011 0001101110000011 0010100000011011 0001001110010011 Aritmetisk Logisk Enhet (ALU) Minneshierarki Minneshierarki • Processor registers: 8-32 registers (32 bitar -> 32-128 bytes) accesstid: få ns, 0-1 klockcykler • On-chip cache memory (L1): 32 till 128 Kbytes accesstid = ~10 ns, 3 klockcykler • Off-chip cache memory (L2): 128 Kbytes till 12 Mbytes accesstid = 10-tal ns, 10 klockcykler • Main memory: 256 Mbytes till 4Gbytes accesstid = ~100 ns, 100 klockcykler • Hard disk: 1Gbyte tid 1Tbyte accesstid = 10-tal milliseconds, 10 000 000 klockcykler Cacheminne Cacheminne • Ett cacheminne är mindre och snabbare än primärminnet – Hela program får inte plats Primärminne Instruktioner och data Instruktioner och data Adress Cacheminne Kopior av instruktioner och data Instruktioner och data Adress Central processing unit (CPU) Register – Men, data och instruktioner ska vara tillgängliga när de behövs • Om man inte har cacheminne: – Accesstid för att hämta en instruktion=100ns • Om man har cacheminne: – Accesstid för att hämta en instruktion=100+10=110 ns » Först ska instruktionen hämtas till cacheminne och sedan hämtas instruktionen från cacheminnet till CPU Accesstid: 100ns Accesstid: 10ns Cache – exempel 1 Cache – exempel 2 • Antag: • Program: x=x+1; y=x+5; z=y+x; Assemblyinstruktioner Instruktion1: x=x+1; Instruktion2: y=x+5; Instruktion3: z=y+x; • Om man inte har cacheminne: – 1 maskininstruktion per rad – 100 ns för minnesaccess till primärminnet – 10 ns för minnesaccess till cacheminnet • Programmet och dess maskininstruktioner. – Accesstid för att hämta en instruktion=100ns » Tid för att hämta instruktioner: 3*100=300ns • Om man har cacheminne: – Accesstid för att hämta en instruktion=100+10=110ns » Tid för hämta instruktioner: 3*110=330ns Utan cache – exempel 2 Exempel program: while (x<1000){ Instruktion1: while1000 x=x+1; Instruktion2: x=x+1 printf(“x=%i”,x); Instruktion3: print x} while (y<500){ Instruktion4: while500 y=y+1; Instruktion5: y=y+1 printf(“y=%i”,y); Instruktion6: print y } Med cache – exempel 2 • Antal instruktioner Instruktioner som exekveras: Minnesaccess för 1 instruktion: 100 ns Totalt 4500 instruktioner. Tid för minnesaccesser: 4500*100= 450000ns 1 2 3 Instruktion1:while1000 Instruktion2:x=x+1 Instruktion3:printx 2998 2999 3000 3001 3002 3003 Instruktion1:while1000 Instruktion2:x=x+1 Instruktion3:printx} Instruktion4:while500 Instruktion5:y=y+1 Instruktion6:printy 4498 4499 4500 Instruktion4:while500 Instruktion5:y=y+1 Instruktion6:printy Assembly • Antal instruktioner Instruktioner som exekveras: Minne+cache (100+10 ns) Cache (10 ns) Minne+cache (100+10 ns) Cache (10 ns) Total tid för minnesaccesser: 6*100 + 4500*10= 45600ns (~10% jmf med “utan cache”) 1 2 3 Instruktion1:while1000 Instruktion2:x=x+1 Instruktion3:printx 2998 2999 3000 3001 3002 3003 Instruktion1:while1000 Instruktion2:x=x+1 Instruktion3:printx} Instruktion4:while500 Instruktion5:y=y+1 Instruktion6:printy 4498 4499 4500 Instruktion4:while500 Instruktion5:y=y+1 Instruktion6:printy Cacheminne Utnyttja lokalitet • Minnesreferenser tenderar att gruppera sig under exekvering – både instruktioner (t ex loopar) och data (datastrukturer) • Lokalitet av referenser (locality of references): – Temporal lokalitet – lokalitet i tid – » om en instruktion/data blivit refererat nu, så är sannolikheten stor att samma referens görs inom kort – Rumslokalitet – » om instruktion/data blivit refererat nu, så är sannolikheten stor att instruktioner/data vid adresser i närheten kommer användas inom kort Minneshierarki - nivåer • Block (line): enhet som kopieras – Kan vara flera ”words” • Om ”accessed data” finns i högsta nivån (upper level) – Hit: access ges av högsta nivå » Hit ratio: hits/accesses • Om ”accessed data” inte finns på aktuell nivå – Miss: block kopieras från lägre nivå – Tid: miss penalty, Miss ratio: antal missar/accesses = 1 – hit ratio – Sedan kan data nås från högre nivå • Minneshierarki – Lagra allt på hårddisk – Kopiera ”recently accessed (and nearby) items” från disk till mindre primärminne – Kopiera mer ”recently accessed (and nearby) items” från primärminne till cacheminne » Cacheminne kopplat till CPU Skrivstrategier • Problem: håll minnet konsistent • Exempel: x=0; while (x<1000) x=x+1; • Variablen x kommer “finnas” i primärminnet och i cacheminnet • I primärminnet är x=0 medan i cacheminnet är x=0,1,2… och till sist 1000 Skrivstrategier Skrivstrategier • Write-through • Skilj på write-hit och write-miss – skrivningar i cache görs också direkt i primärminnet • Write-through with buffers – Write-hit: se ovan – Write-miss: Vill skriva på plats som inte finns i cacheminne – skrivningar buffras och görs periodiskt » Alternativ: • Write (Copy)-back – Allokera vid miss: hämta block från primärminne – primärminnet uppdateras först när en cacherad byts ut (ofta används en bit som markerar om en cacherad blivit modifierad (dirty)). – Write around: hämta inte in block från primärminne, skriv direkt i primärminne » (För write-back: vanligen fetch block) • (Omodifierade cacherader behöver inte skrivas i primärminnet) Antal cachenivåer (levels) Separat instruktion/data cache Cacheminne Primärminne Cache minne Instruktioner och data Cache minne Central processing unit (CPU) Register L1 L2 Primärminne Kopior av instruktioner Instruktioner och data Central processing unit (CPU) Register Cacheminne Kopior av data Prestanda AMD Athlon 64 CPU • När CPU prestanda ökar, så blir miss penalty viktig att minimera • För att undersöka prestanda måste man ta hänsyn till cacheminne • Cachemissar beror på algoritm(implementation) och kompilatorns optimering Minnets innehåll över tiden Paging Program A byte 0 byte 1 …. SIDA A0 SIDA A1 SIDA A2 byte n TID SIDA A3 (lagring på hårddisk ej sammanhängande – se tidigare) Filsystem - Inode Paging Logisk adress Fysisk adress ABBA: Dancing Queen Demand paging Sammanfattning • Ladda endast de pages som behövs till primärminnet • Snabba minnen är små, stora minnen är långsamma – Vi vill ha snabba och stora minnen – Cacheminnen och virtuellt minne ger oss den illusionen CPU utnyttjande OS tar alltmer tid för att hantera sidfel • Lokalitet viktigt för att cacheminnen och virtuellt minne ska fungera – Program använder vid varje tidpunkt en liten del av sitt minne ofta Grad av multiprogrammering (hur många program som är aktiva) • Minneshierarki – L1 cache <->L2 cache …. Primärminne - Sekundärminne Programmerad I/O Digitala System: Datorteknik • Processorn kontrollerar om I/O har skett. • Exempel: 1. Läs av om tangent är tryckt. ERIK LARSSON 2. Om tangent tryckt, hantera, annars vänta lite och gå till 1 • Nackdel: Processorn är låst och gör meningslösa saker Avbrottstyrd I/O Avbrottsstyrd I/O 1 I/O 1 0.1 s 3 3 4 Primärminne Data/instruktioner Kontroll “Main” OS Fetch instruction Central processing unit (CPU) 4 Primärminne Data/instruktioner Kontroll “Main” 5 Central processing unit (CPU) 5 Execute instruction 2 Kontrollera och hantera avbrott (ändra PC) Fetch instruction Execute instruction 2 Kontrollera och hantera avbrott Laboration 3 Laboration 3 • Periodiskt avbrott Så här kan programmet från förra laborationen beskrivas: – Använda en klocka som genererar ett avbrott periodiskt. 1. Vänta tills knappen är nedtryckt. – När avbrott uppkommer, kontrollera om tangent är tryckt. 3. Utför uppgiften (öka n med ett; om n blir 10 sätt n till noll; anropa utskriftsfunktionen med n som inparameter.) – Fördel, slipper låta processor exekvera en ”tom”-loop 2. Vänta med hjälp av vänteloop så studsarna slutat. 4. Vänta tills knappen är släppt. 5. Vänta med hjälp av vänteloop så studsarna slutat. 6. Gå till punkt 1. Laboration 3 Laboration 3 Med hjälp av periodiskt avbrott ska vi skapa en lösning som med jämna intervall gör följande: • Timer_Counter_1 – TIMSK 1. Läs av knappen. – TCCR1A 2. Om den är nere nu, men var uppe förra gången: Utför uppgiften (som är: ”öka n med ett; om n blir 10 sätt n till noll; anropa utskriftsfunktionen med n som inparameter.”) – TCCR1B – OCR1A Laboration 3 #include <avr/io.h> #include <avr/interrupt.h> unsigned const char segment_table [] = { 0b11111101, 0b11001000, Digitala System: Datorteknik //"0” //"1”}; void display (unsigned char number) { // din kod här } unsigned char n; void initOC1(){ // din kod här } ERIK LARSSON Avbrottsrutin ISR (SIG_OUTPUT_COMPARE1A){ static unsigned char //dina variabler; din kod } int main(void){ DDRA = 0b01111111; // Utgångar till display PORTA = 0b10000000; // Aktivera pull-up initOC1(); SREG = SREG | //din kod; while (1){ } } Laboration 4 - Tillståndsmaskin Förberedelser • Syfte: • Titta på: – förbättra knappavläsningen – Key_down – få förståelse om tillståndsmaskiner – Count_and_display • Komplettera knappavläsningen med en ”timeout”-funktion • Abstrahera bort hårdvarunära detaljer • Sista uppgiften är frivillig för de som laborerar ensamma och i par om två. Om laborationsgruppen består av fler än två personer, är uppgiften obligatorisk. Tillståndsmaskin Tillståndsmaskin • I ord: – Tillståndsmaskinen har två tillstånd, Knappen uppe och Knappen nere. – Om tillståndsmaskinen är i tillstånd ”Knappen uppe” så byter den tillstånd om knappen trycks ner. – I tillståndet ”Knappen nere” väntar man på att knappen ska släppas. • Observera att eventuella tillståndsändringar bara kan inträffa med vissa jämna tidsintervall (jämför med synkrona sekvensnät i digitaltekniken). I laborationen använder vi tidsintervallet 10 ms. Tillståndsmaskin • Implementationer: 1. Privat variabel som skapas en gång, dvs variabeln finns kvar nästa gång funktionen körs. Funktioner för högre abstraktionsnivå • I exemplet är: if((PINA&0b10000000)==0) • ersatt av if(Key_down()==1) • Skriv en funktion, Key_down, som läser av tryckknappen och returnerar 1 om den är nere och värdet 0 ifall den är uppe. • Tidigare: void display (unsigned char number){ PORTA = segment_table [number];} 2. Läsbarhet? Funktioner för högre abstraktionsnivå • Funktion med returvärde: Tillståndsmaskin • Vid val används: char my_function (void){ static unsigned char a; a=a+10; Returnerar return (a); } if (villkor) { kod som utförs om villkoret är sant }else{ kod som utförs om villkoret är falskt } • Bra för 2-vägs alternativ, men om man har flera alternativ? – Kombinera flera IF? Eller…. Uppgift 3 Skapa egna typer Uppgift 3 Switch/case sats som styrs av f • Switch sats för enkla flerval: • Switch sats för enkla flerval: enum fel {hog_t, lag_t, hog_vatten, lag_vatten}; static unsigned char next_state; enum fel f; switch(next_state){ case 0: if(Key_down() == 1){ next_state = 1; Count_and_display();} break; case 1: if(Key_down() == 0)next_state = 0; break;} Om f = hog_t så börja gör detta: switch(f){ case hog_t: printf(“Hög temp”); Avsluta switch-sats här (om break; inget break fortsätter man testa på case lag_t: nästa (dvs lag_t) printf(“Hög temp”); break; default: printf(“Kontrollera vatten”); break;} Uppgift 5 • Om man trycker ned en tangent på ett tangentbord länge så kommer flera teckan. • Konstruera detta! När knappen varit nedtryckt i 0.5 sekunder, skriv ut flera tecken. Uppgift 6 • Frivillig uppgift för de som laborerar ensamma eller i par (två) • Modifiera föregående uppgift genom att ersätta autorepetitionen med ett sätt att göra manuell nollställning. När man tryckt länge så ska det nollställas. Uppgift 5
© Copyright 2024