210 likes | 339 Views
Algoritmi i strukture podataka. Prof. dr. sc. Damir Kalpić Prof. dr. sc. Vedran Mornar Prof. dr. sc. Krešimir Fertalj Doc. dr. sc. Gordan Gledec Dr. sc. Zvonimir Vanjak Mr. sc. Boris Milašinović Ivica Botički, dipl. ing.
E N D
Algoritmi i strukture podataka Prof. dr. sc. Damir Kalpić Prof. dr. sc. Vedran Mornar Prof. dr. sc. Krešimir Fertalj Doc. dr. sc. Gordan Gledec Dr. sc. Zvonimir Vanjak Mr. sc. Boris Milašinović Ivica Botički, dipl. ing. Zaštićeno licencom http://creativecommons.org/licenses/by-nc-sa/2.5/hr/
Creative Commons • slobodno smijete: • dijeliti — umnožavati, distribuirati i javnosti priopćavati djelo • remiksirati — prerađivati djelo • pod sljedećim uvjetima: • imenovanje. Morate priznati i označiti autorstvo djela na način kako je specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše korištenje njegova djela imate njegovu izravnu podršku). • nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe. • dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate koristeći ga, preradu možete distribuirati samo pod licencom koja je ista ili slična ovoj. U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji način da to učinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta moguće je odstupiti, ako dobijete dopuštenje nositelja autorskog prava. Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava. Tekst licencije preuzet je s http://creativecommons.org/. Algoritmi i strukture podataka, FER, 2007/08.
Poziv funkcije Dodjela memorije Mehanizam poziva funkcija Sistemski stog
Virtualna memorija • proces: pokrenuta instanca programa • kad se pokrene proces, pridijeli mu se dio fizičke memorije • to je virtualna memorija – proces ima dojam da mu je dodijeljena sva računalna memorija • proces ne zna kako se ta virtualna memorija preslikava u fizičku – zna samo veličinu i početnu adresu – 0x00000000 za 32-bitnu arhitekturu • proces ne zna za virtualne memorije ostalih procesa • čak i kad bi znao za njih, fizički im ne može pristupiti (ne da mu OS) • kod svakog pristupa memoriji (čitanje, pisanje), dolazi do preslikavanja između virtualne i fizičke adrese • postupak mora biti brz, jer se događa vrlo često Algoritmi i strukture podataka, FER, 2007/08.
Segmenti niže adrese • ovisi o operacijskom sustavu • TEXT • pohranjen program • DATA • inicijalizirane globalne i statičke lokalne varijable • BSS • neinicijalizirane globalne i statičke lokalne varijable • gomila (heap) • dinamički alocirana memorija (malloc) • stog (stack) • lokalne varijable funkcija • nalazi se na dnu (najviše adrese) TEXT DATA BSS HEAP STACK više adrese Algoritmi i strukture podataka, FER, 2007/08.
Memorijski segmenti - TEXT • za pohranu izvršnog koda i konstanti TEXT DATA BSS char *rijec = "Zdravo"; int iSize; char *func() { char *p; iSize = 8; p = malloc(iSize); return p; } HEAP STACK Algoritmi i strukture podataka, FER, 2007/08.
Memorijski segmenti – DATA i BSS • globalne varijable, statičke lokalne varijable • DATA: inicijalizirano u kodu • BSS: neinicijalizirano u kodu TEXT DATA BSS char *rijec = "Zdravo"; intiSize; char *func() { char *p; iSize = 8; p = malloc(iSize); return p; } HEAP STACK Algoritmi i strukture podataka, FER, 2007/08.
Memorijski segmenti - gomila (heap) • dinamička memorija • malloc, realloc TEXT DATA BSS char *rijec = "Zdravo"; int iSize; char *func() { char *p; iSize = 8; p = malloc(iSize); return p; } HEAP STACK Algoritmi i strukture podataka, FER, 2007/08.
Memorijski segmenti - stog (stack) • privremena memorija dok traje izvođenje funkcije TEXT DATA BSS char *rijec = "Zdravo"; int iSize; char *func() { char *p; iSize = 8; p = malloc(iSize); return p; } HEAP STACK Algoritmi i strukture podataka, FER, 2007/08.
Programski slijed pri pozivu funkcije Kako se prenosi x? int main () { ... y1 = f(x1); ... y2 = f(x2); ... y3 = f(x3); ... } float f (float x) { ... return y; } Kojim se putem vratiti? Algoritmi i strukture podataka, FER, 2007/08.
Sistemski stog • služi za privremeni smještaj varijabli i povratnih adresa • struktura podataka tipa LIFO (Last In First Out) • noviji elementi pohranjuju se na niže memorijske lokacije • stavljanje na stog: push • skidanje sa stoga: pop C B B B A A A A A Algoritmi i strukture podataka, FER, 2007/08.
Okvir stoga • cjelina koja se stavlja na stog naziva se okvir stoga (stack frame) • okvir stoga sadrži: • povratnu adresu na koju se treba vratiti nakon izvršenja pozvane funkcije • lokalne varijable funkcije • argumente (parametre) funkcije • registre procesora (ovisno o prevodiocu i njegovim opcijama) • na stog također dolazi i pokazivač na bazu (engl. base pointer) • predstavlja adresu početka alokacije argumenata i lokalnih varijabli kojom se olakšava njihovo rukovanje • na slikama, adresa iznad koje se pri povratku smije počistiti sve što je zauzeo potprogram koji završava • radi općenitosti, okvir stoga i pokazivač na bazuneće se razmatrati Algoritmi i strukture podataka, FER, 2007/08.
Okvir stoga funkcije main • kad se pokrene program, na stogu se nalazi samo jedan okvir stoga – onaj koji pripada funkciji main • u primjerima koji će biti dalje prikazivani, taj okvir stoga će biti izostavljen • radi jednostavnosti, u stogu ćemo prikazivati: • argumente funkcije • povratnu adresu • lokalne varijable main Algoritmi i strukture podataka, FER, 2007/08.
Programski slijed i stog pri pozivu funkcije a) int main () { ... y1 = f(x1); a) ... y2 = f(x2); b) ... y3 = f(x3); c) ... } x1 float f (float x) { ... return y; } b) x2 c) x3 Algoritmi i strukture podataka, FER, 2007/08.
Programski slijed i stog pri pozivu funkcije – složeniji primjer float f (float x) { ... g(x); c) return z*z; } int main () { ... y1 = f(x1); a) ... y2 = g(x2); b) ... } c) x void g (float x) { ... return; } a) b) x1 x2 Algoritmi i strukture podataka, FER, 2007/08.
Programski slijed i stog pri pozivu funkcije – još složeniji primjer float f (float x) { float z; ... z = g(x); return z*z; } float g (float w) { float y; ... return y; } float f (float x) { float z; ... z = g(x); return z*z; } int main () { ... y1 = f(x1); ... y2 = g(x2); ... } y pov.adr. w z z z pov.adr. pov.adr. pov.adr. x x x Algoritmi i strukture podataka, FER, 2007/08.
Programski slijed i stog pri pozivu funkcije – složeniji primjer float f (float x) { float z; ... z = g(x); return z*z; } int main () { ... y1 = f(x1); ... y2 = g(x2); ... } float g (float w) { float y; ... return y; } int main () { ... y1 = f(x1); ... y2 = g(x2); ... } y z pov.adr. pov.adr. x w Algoritmi i strukture podataka, FER, 2007/08.
Poziv funkcije predavanjem argumenata po vrijednosti #include <stdio.h> int x; void f (int y) { y = 2; } int main () { x = 1; f(x); ... return 0; } Glavni program Stog poziv funkcije pov.adr. 1 x y 1 izvođenje y=2 1 x pov.adr. 2 y 1 nakon povratka 1 x Algoritmi i strukture podataka, FER, 2007/08.
Poziv funkcije predavanjem adresa argumenata – 1 #include <stdio.h> void zamijeni (short *x, short *y) { short pom; pom = *x; *x = *y; *y = pom; } short a, b; int main () { a = 3; b = 5; zamijeni (&a, &b); return 0; } Glavni program Stog poziv funkcije pom ? 3 pov.adr. 0x102 a 5 x 0x102 0x100 b y 0x100 izvođenje pom=*x 3 pom ? 3 pov.adr. 0x102 a x 0x102 5 0x100 b y 0x100 Algoritmi i strukture podataka, FER, 2007/08.
Poziv funkcije predavanjem adresa argumenata – 2 #include <stdio.h> void zamijeni (short *x, short *y) { short pom; pom = *x; *x = *y; *y = pom; } short a, b; int main () { a = 3; b = 5; zamijeni (&a, &b); return 0; } Glavni program Stog izvođenje *x=*y pom 3 5 3 pov.adr. 0x102 a x 0x102 5 0x100 b 0x100 y izvođenje *y=pom pom 3 5 pov.adr. 0x102 a x 0x102 3 5 0x100 b y 0x100 Algoritmi i strukture podataka, FER, 2007/08.
Poziv funkcije predavanjem adresa argumenata – 3 #include <stdio.h> void zamijeni (short *x, short *y) { short pom; pom = *x; *x = *y; *y = pom; } short a, b; int main () { a = 3; b = 5; zamijeni (&a, &b); return 0; } Glavni program Stog povratak u glavni pom 3 5 pov.adr. 0x102 a x 0x102 3 0x100 b y 0x100 nakon povratka 5 0x102 a 3 0x100 b Algoritmi i strukture podataka, FER, 2007/08.