Digitala System: Datorteknik Minnets komponenter ERIK LARSSON Enhet för indata CPU Enhet för utdata Sekundärminne Programexekvering Program i högnivåspråk.. Z:=(Y+X)*3. Kompilator Exekverbart program i maskinspråk: Adress Instruktioner 00001000 0000101110001011 00001001 0001101110000011 00001010 0010100000011011 00001011 0001001110010011 Programexekvering (1) Hämta instruktion på 00001000 (där PC pekar) (2) Flytta instruktionen 0000101110001011 till CPU (3) Avkoda instruktionen: 00001 MOVE, 01110001 Adress, 011 Register 3 (4) Hämta data på adress: 01110001 Fetch Execute (5) Lagra datan i register 3 Adress Instruktion 00001000 0000101110001011 00001001 0001101110000011 00001010 0010100000011011 00001011 0001001110010011 Data Instruktioner Register CPU Kontrollenhet Aritmetisk Logisk Enhet (ALU) Address Instruktion 00001000 0000101110001011 00001001 0001101110000011 00001010 0010100000011011 00001011 0001001110010011 Data Instruktioner Register CPU Kontrollenhet Aritmetisk Logisk Enhet (ALU)
Minnet från processorns sida Minneshantering Processorn ger kommandon/instruktioner med en adress och förväntar sig data. Exempel: READ(ADR) -> DATA Fysisk adress Logisk adress Vid multiprogrammering kommer flera olika program finnas i primärminnet. Kostar för mycket tid att flytta program till hårddisk vid kontext byte. T ex, två program ska exekveras samtidigt : READ Address Instruction 00001000 0000101110001011 00001001 0001101110000011 00001010 0010100000011011 00001011 0001001110010011 00001000 0000101110001011 Minne CPU Register READ (00001000) CPU Kontrollenhet Aritmetisk Logisk Enhet (ALU) 0101 0101 0011 0101 0101 0011 Filsystem - Inode Minnet Minnet kan delas upp i primärminne och sekundärminne t förlorar sitt innehåll när strömmen stängs av. Minnet är flyktigt (volatile) Random-Access Memory (RAM)» Dynamiska RAM (DRAM) och statiska RAM (SRAM) Sekundärminnet behåller sitt innehåll när strömmen slås av. Minnet är icke-flyktigt (non-volitile) Hårddisk, flashminne, magnetband ABBA: Dancing Queen Andra: CD, DVD
Ett ord (word) Sekundärminne 1 READ(ADR) Buffert för minnesadress Adressavkodare Minnesarea 2 Adress 2 Adress 1 Adress 0 A track, (B geometrisk sektor) C sektor, D cluster En sektor kan vara 512-4096 bytes och består av sektor header, data area, error korrektion kod (ECC) Header DATA Sektor ECC En bit 3 Databuffert DATA Minneskontroll Sekundärminne Vill lagra en fil som är 1500 bytes Hårddisk Antag sektor = 512, cluster = 2*512 Lösning: Ta 2 stycken cluster (2048 bytes) Fil byte 0 byte 2 byte 1499 1500 bytes byte 0 byte 2 byte 1023 2*512 bytes Filsystem - Inode Sektor Halvfull sektor 1 2 3 Tom sektor ABBA: Dancing Queen
Sekundärminne Sekundärminne Problem 1 Intern fragmentering Problem 2 Vilka cluster på hårddisk ska användas? Unix (inode): Snabb access för många block Kan hantera stora filer 1 3 2 Sekundärminne Sekundärminne Små cluster (blocks) ger liten intern fragmentering Antag sector = 512, cluster = 2*512 Vill lagra en fil som är 1500 bytes Ta 2 stycken cluster (~2000 bytes) Men, kräver mer hantering (fler kluster på hårddisken) Vad innebär det att ta bort en fil? Kan man återskapa information från en hårddisk? Flashminne Utvecklat av Dr. Fujio Masuoka (Toshiba) kring 1980 Mobiltelefoner, kameror, MP3-spelare och i datorer Non-volatile och random access Kapacitet: mindre än en hårddisk Begränsat antal skrivningar Block 0: bad blocks Block 1: bootable block
Sekundärminne Lågnivåformatering Dela in hårddisk i tracks och sectors Partitioning» En sector är 512-4098 bytes Dela in en fysisk hårddisk i en eller flera logiska hårddiskar, t ex C:, D:, E: Högnivåformatering Bestäm för vilket operativ system hårddisken ska användas Design av minnesystem Vad vill vi ha? Ett minne som får plats med stora program och som fungerar i hastighet som processorn» Fetch execute (MHz/GHz/Multi-core race) Grundproblem: Processorer arbetar i hög hastighet och behöver stora minnen Minnen är mycket långsammare än processorer Fakta: CPU Större minnen är långsammare än mindre minnen Snabbare minnen kostar med per bit Minne-processor hastighet Minneshierarki
Minneshierarki Processor registers: 8-32 registers (32 bitar -> 32-128 bytes) accesstid: få ns, 0-1 klockcykler Cacheminne 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 Instruktioner och data Instruktioner och data Adress Cacheminne Kopior av instruktioner och data Instruktioner och data Adress Central processing unit (CPU) Register Main memory: 256 Mbytes till 4Gbytes accesstid = ~100 ns, 100 klockcykler Hard disk: 1Gbyte tid 1Tbyte accesstid = 10-tal milliseconds, 10 000 000 klockcykler Accesstid: 100ns Accesstid: 10ns Cacheminne Cache exempel 1 Ett cacheminne är mindre och snabbare än primärminnet Hela program får inte plats 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 Program: Assemblyinstruktioner x=x+1; Instruktion1: x=x+1; y=x+5; Instruktion2: y=x+5; z=y+x; Instruktion3: z=y+x; Om man inte har cacheminne: 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
Cache exempel 2 Antag: 1 maskininstruktion per rad 100 ns för minnesaccess till primärminnet 10 ns för minnesaccess till cacheminnet Programmet och dess maskininstruktioner. Exempel program: Assembly 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 } Utan cache exempel 2 Minnesaccess för 1 instruktion: 100 ns Totalt 4500 instruktioner. Tid för minnesaccesser: 4500*100= 450000ns Antal instruktioner Instruktioner som exekveras: 1 Instruktion1:while1000 2 Instruktion2:x=x+1 3 Instruktion3:printx 2998 Instruktion1:while1000 2999 Instruktion2:x=x+1 3000 Instruktion3:printx} 3001 Instruktion4:while500 3002 Instruktion5:y=y+1 3003 Instruktion6:printy 4498 Instruktion4:while500 4499 Instruktion5:y=y+1 4500 Instruktion6:printy Med cache exempel 2 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 ) Antal instruktioner Instruktioner som exekveras: 1 Instruktion1:while1000 2 Instruktion2:x=x+1 3 Instruktion3:printx 2998 Instruktion1:while1000 2999 Instruktion2:x=x+1 3000 Instruktion3:printx} 3001 Instruktion4:while500 3002 Instruktion5:y=y+1 3003 Instruktion6:printy 4498 Instruktion4:while500 4499 Instruktion5:y=y+1 4500 Instruktion6:printy Cacheminne 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
Utnyttja lokalitet 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 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å Skrivstrategier 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 Write-through skrivningar i cache görs också direkt i primärminnet Write-through with buffers skrivningar buffras och görs periodiskt Write (Copy)-back primärminnet uppdateras först när en cacherad byts ut (ofta används en bit som markerar om en cacherad blivit modifierad (dirty)). (Omodifierade cacherader behöver inte skrivas i primärminnet)
Skrivstrategier Antal cachenivåer (levels) Skilj på write-hit och write-miss Write-hit: se ovan Write-miss: Vill skriva på plats som inte finns i cacheminne» Alternativ: Allokera vid miss: hämta block från primärminne Write around: hämta inte in block från primärminne, skriv direkt i primärminne Instruktioner och data Cache minne L2 Cache minne L1 Central processing unit (CPU) Register» (För write-back: vanligen fetch block) Separat instruktion/data cache Prestanda Instruktioner och data Cacheminne Kopior av instruktioner Cacheminne Central processing unit (CPU) Register 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 Kopior av data
AMD Athlon 64 CPU Minnets innehåll över tiden TID Paging Filsystem - Inode Program A byte 0 byte 1. SIDA A0 SIDA A1 SIDA A2 byte n SIDA A3 (lagring på hårddisk ej sammanhängande se tidigare) ABBA: Dancing Queen
Paging Demand paging Logisk adress Fysisk adress Ladda endast de pages som behövs till primärminnet CPU utnyttjande OS tar alltmer tid för att hantera sidfel Grad av multiprogrammering (hur många program som är aktiva) Sammanfattning Snabba minnen är små, stora minnen är långsamma Vi vill ha snabba och stora minnen Cacheminnen och virtuellt minne ger oss den illusionen Lokalitet viktigt för att cacheminnen och virtuellt minne ska fungera Program använder vid varje tidpunkt en liten del av sitt minne ofta Minneshierarki L1 cache <->L2 cache. - Sekundärminne Digitala System: Datorteknik ERIK LARSSON
Adress Data Datatyper (fortsättning från lab 1) Tabell för de olika siffrorna: const unsigned char segment_table [] = { 0b11111101, //"0 0b11001000, //"1 0b1, 0b1, 0b1, 0b1, Fyll i! 0b1, 0b1, 0b1, 0b1, }; Datatyper #include <avr/io.h> const unsigned char segment_table [] = { 0b11111101, //"0 0b11001000, //"1 //...resten av tabellen }; unsigned char n; int main(void) { DDRA = 0b01111111; // Utgångar till display PORTA = 0b10000000; // Aktivera pull-up while (1){ n=(n+1); // Öka n med ett PORTA = segment_table[n]; // Skriv ut med tabellen }} 0 segment_table [0] 1 segment_table [1] 2 segment_table [2]. 9 segment_table [9] 10 n 11 1111 0000 12 1010 1010 Drivrutin Uppgift 5-7 Skriv en drivrutin där programmeraren anropar: display(5) om 5 ska skrivas ut. // Funktion display: // skriver ut en decimal siffra på displayen. void display (unsigned char number) { PORTA = segment_table [number]; } Avkänn enskilda knapptryckningar. Räkna upp displayens värde med 1 vid varje knapptryck Tangentstudsar blir ett problem. Lägg in en fördröjning: for (k=0; k<10; k++); volatile unsigned int k;
Lagringstyp: Volatile Register och primärminne Om man opererar på I/O-register, hanterar kommunikation med yttre enheter. De yttre enheterna är bara delvis under kontroll av processorn. En I/O-variabel kan ändras av processorn och I/O-enheten. Det är därför inte bra om dessa variabler lagras i processorns register. Exempel: volatile int tangentbord_reg Högnivåspråk: a=b+c; Assemblyspråk: ADD a, b, c Kompilatorn hittar en maskininstruktion som passar 3 minnesaccesser: Hämta b Hämta c Skriv a Register och primärminne Register och primärminne Högnivåspråk: a=b+c+d; Alternativ 1: ADD a, b, c //adderar b och c, resultat i a ADD a, a, d //adderar a (som är b+c) med d, resultat i a Antal minnesaccesser: 6=3+3 Tid för en minnesaccess: 100 ns gör att minnesläsning/ skrivning tar 600 ns Högnivåspråk: a=b+c+d; Alternativ 2: ADD r1, b, c //adderar b och c, resultat i register 1 ADD a, r1, d //adderar a (som är i r1) med d, resultat i a Antal minnesaccesser: 4=2+2 Tid för en: minnesaccess: 100 ns Registeraccess: 1 ns: Minnesläsning/skrivning tar 400 + 2 ns = 402 ns 30% sparad tid (600-402)/600
Uppgift 8 Varje grupp får en egen uppgift. Gemensamt, PORT B. Digitala System: Datorteknik ERIK LARSSON Port A Port B Programmerad I/O Avbrottstyrd I/O Processorn kontrollerar om I/O har skett. 1 0.1 s Exempel: 1. Läs av om tangent är tryckt. 2. Om tangent tryckt, hantera, annars vänta lite och gå till 1 4 Main Data/instruktioner Kontroll 3 Central processing unit (CPU) Nackdel: Processorn är låst och gör meningslösa saker OS 5 Fetch instruction Execute instruction 2 Kontrollera och hantera avbrott (ändra PC)
Avbrottsstyrd I/O Laboration 3 1 I/O Periodiskt avbrott 4 Main 3 Data/instruktioner Kontroll 5 Central processing unit (CPU) Använda en klocka som genererar ett avbrott periodiskt. När avbrott uppkommer, kontrollera om tangent är tryckt. Fördel, slipper låta processor exekvera en tom -loop Fetch instruction Execute instruction 2 Kontrollera och hantera avbrott Laboration 3 Laboration 3 Så här kan programmet från förra laborationen beskrivas: 1. Vänta tills knappen är nedtryckt. 2. Vänta med hjälp av vänteloop så studsarna slutat. 3. Utför uppgiften (öka n med ett; om n blir 10 sätt n till noll; anropa utskriftsfunktionen med n som inparameter.) 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. Med hjälp av periodiskt avbrott ska vi skapa en lösning som med jämna intervall gör följande: 1. Läs av knappen. 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. )
Laboration 3 Timer_Counter_1 TIMSK TCCR1A TCCR1B OCR1A Laboration 3 #include <avr/io.h> #include <avr/interrupt.h> unsigned const char segment_table [] = { 0b11111101, //"0 0b11001000, //"1 }; void display (unsigned char number) { // din kod här } unsigned char n; void initoc1(){ // din kod här } 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){ } } Avbrottsrutin