Kernealphaerne Indhold af G1 3 små opgaver: 1. Oversæt en kerne og afvikl den på en kernealpha 2. Håndoversæt en C/C++ funktion til alpha assembler 3. Implementer procedurer til dynamisk lagerallokering og anvend dem (inkl. aflusning) i en eksisterende kerne DIKU s net udviklings nettet udviklings udviklings kerne Ethernet HUB Linux PC sniffer Konsolboks kerne kerne Ethernet HUB 1 2 3 4 5 6 erne Udviklingsalpha erne: vile ve bure borr Prøv: ng2h del1-alpha Kernealpha erne archimedes diophant eudoxos euklid hypatia ptolemaios pythagoras thales zenon 1
7 Opgave 1 Opgave 2 Hent d-kernen, oversæt den og kør den på en kerne-alpha: d-kernen findes i ~dat1f/kb4/kerner Kursusbog bind 5: Afsnit 3.5 beskriver hvordan man generelt oversætter, overfører og udfører et program på en kerne-alpha Afsnit 3.6 beskriver hvordan man oversætter, overfører og udfører en af kursusbog-kernerne på en kerne-alpha 8 Håndoversættelse af en C/C++ funktion til alphaassembler Funktionen finder den mindste værdi blandt et antal poster i et søgetræ 3 9 værdi nøgle 31 11 134 89 241 27 890 56 314 10 Gennemsøgningsfunktion Knuderne i træet keynode* findmin(keynode *root) { keynode *childmin; keynode *tempmin; Hver knude har formen: typedef struct node { int key; int value; struct node *left; struct node *right; keynode; tempmin = root; if(root->left!= NULL) { childmin = findmin(root->left); if(childmin->value < tempmin->value) tempmin = childmin; if(root->right!= NULL) { childmin = findmin(root->right); if(childmin->value < tempmin->value) tempmin = childmin; return tempmin; left og right posterne er NULL hvis der ikke er et barn til den side 11 12 2
Testeksempler - assembler I ~dat1f/g1/trees.h er der angivet en række testtræer: // Tree 0: result 42 keynode t0_n1_1 = {4, 42, NULL, NULL; keynode *t0_root = &t0_n1_1; Beskrives i kursusbog bind 5: Kapitel 4: Programmering i assembler samt definitionen af keynode 13 14 findmin: Funktionsdefinition i assembler.ent findmin.globl findmin ldgp gp, (pv) <gem udvalg af registre på stakken> <programkode for findmin> <reetabler registre fra stakken> ret (ra).end findmin Funktionskald i alpha-assembler <gem udvalgte registre på stak> <initialiser argumentregistre> lda pv, findmin jsr ra, (pv) ldgp gp, (ra) <processering af returværdi (v0)> <retabler udvalgte registre fra stak> 15 16 Register $0 $1-$8 $9-$15 $16-$21 $22-$25 $26 $27 $28 $29 $30 $31 Registrene på en Navn v0 t0-t7 s0-s6 a0-a5 t8-t11 ra pv at gp sp zero Funktion Returværdi Temp. registre Mellemregn. overlever funktionsk. Funktionsargumenter Mellemregninger Returadresse Addr. på kaldte procedure Reserveret assembler Global peger Stak peger Er altid nul Hvem gemmer kaldte kaldte Kaldte 17 Opgave 3 Bibliotek til dynamisk lagerallokering To funktioner: void *malloc(size_t size): allokerer en klods lager af størrelsen size på hoben void free(void *p): frigiver den klods lager, som p peger på 18 3
Diverse G1 skal afleveres fredag 20. februar klokken 14:00 i DIKUs førstedelsadministration Tidligere på ugen har I fra Kernighan & Ritchie: The C Programming Language (2nd edition) fået udleveret: Kapitel 5: Pointers and Arrays Kapitel 6: Structures Appendiks B: Standard Library 19 Lagerallokering: malloc/free eksempel int main (void) { keynode *knode; knode = (keynode *) malloc(sizeof(keynode)); knode->key = 4; knode->value = 54; knode->left = NULL; knode->right = NULL; printf( %d\n, findmin(knode)->value); free(knode); 20 Lagerallokering: new/delete eksempel int main (void) { keynode *knode; knode = new keynode; // ingen typecast/size_of knode->key = 4; knode->value = 54; knode->left = NULL; knode->right = NULL; printf( %d\n, findmin(knode)->value); Allokering af hukommelse Funktioners lokale variable allokeres typisk på stakken Dynamisk allokerede variable allokeres på hoben HOB KODE delete knode; 21 STAK 22 Allokering af objekter på hoben: simpel algoritme Hoben består af en samling klodser af data, der enten: er allokerede (dvs. optaget) er frie (ikke optaget) Ved et kald til malloc skal der findes en fri blok, der har mindst samme størrelse som den forespurgte (og helst samme størrelse). Ved et kald til free markeres blokken som værende fri. 23 Dynamisk lagerallokering First-fit: en proces tildeles det første hul, der er stort nok Best-fit: en proces tildeles det hul, der passer bedst (efterlader det mindste nye hul). Kræver en gennemsøgning af alle frie blokke medmindre blokke er sorteret efter størrelse. Worst-fit: en proces tildeles det hul, der passer dårligst (efterlader det største nye hul). Kræver også gennemsøgning af alle frie blokke 24 4
Fragmentering Ekstern fragmentering: opdelingen af arbejdslageret efterlader huller mellem allokerede blokke: Måske ikke er store nok til at tilfredsstille forespørgsler efter yderligere lager Intern fragmentering: pga. effektivitetshensyn uddeles arbejdslageret kun i blokke af en vis størrelse S. I værste fald spildes S-1 bytes hver gang der allokeres lager Ekstern fragmentering kan afhjælpes: omorganisering af lager på køretidspunkt: sammenlægning af frie blokke til en stor blok kræver at lagerafbildning kan ændres på køretidspunkt lagerområder kan være bundet af I/O aktivitet (I/O enheder arbejder typisk med fysiske adresser) 25 Algoritme anvendt i G1 Prøv at allokere en klods(klodsstørrelse) { Register at der ikke er fundet en mindste blok af passende størrelse For hver klods i hoben Hvis klodsen er større end klodsstørrelse, klodsen ikke allerede er i brug og klodsen er mindre end den nuværende mindste klods Så Register klodsen som værende den aktuelt mindste brugbare klods. Hvis klodsstørrelse er lig størrelsen på den fundne klods Hop ud af for-løkken. Hvis ingen klods blev fundet Returner NULL. Ellers Marker den fundne blok som værende i brug Hvis klodsstørrelse er mindre end størrelsen af den fundne klods Så Den fundne klods klippes over i to dele og en ny tom klods oprettes. Returner den fundne klods. 26 Eksempel på administration af hob p = malloc(0x007.fff0); p2 = malloc(0x007.fff0); free(p); free(p2); 0x040.0000 0x038.0000 0x036.0000 0x038.0000 0x000.0000 Ledig: Nej Ja 0x000.0000 0x036.0000 Ledig: Nej Ja 0x000.0000 Ledig: Ja Kommentarer til implementation I kan antage at argumentet til free altid har en korrekt værdi Algoritmen lider af fragmentering: I er velkomne til f.eks. at sammenlægge blokke, men det er ikke et krav I kan IKKE flytte rundt på allokerede blokke! 27 28 Udførsel på kernealphaerne Programmer på kernealphaerne har kun de funktioner til rådighed, der er implementeret i den benyttede kerne: intet standardbibliotek eller køretidsbibliotek er tilgængeligt for jeres kode der er f.eks. ikke indbyggede standard funktioner for new og delete destruktøren for en klasse kalder en funktion builtin_delete, der ikke er defineret konstruktører og destruktører kaldes ikke automatisk for statisk allokerede klasser 29 Aflusning Til aflusning af kode på udviklingsalphaerne: gdb Til aflusning af kode på kernealpha erne: ladebug (fjerndebugger med kildetekstsupport der styres fra en udviklingsalpha) debug monitor på alphaerne Lav først en version, der virker på udviklingsalpha erne (se evt. testprogram.cc for at se hvordan det kan gøres) 30 5
Brug nyhedsgruppen diku.dat1f hvis I har problemer eller spørgsmål Vi ses næste gang den 23. februar!! 31 6