Käyttöjärjestelmät I Osio 3: Prosessit, siirräntä ja tiedostojärjestelmä Tiina Niklander, kalvot Auvo Häkkinen Tietojenkäsittelytieteen laitos Helsingin yliopisto! " $#&%' (%+*,- $*./ 0 Stallings, Luku 3.1-3.3 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 3-2 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-1
0,!. #! ""#$ %#&"# '( * $ #&#$ #& +#$ '( *% +# #$,+ #$ KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-3! " $#&%' (%+*,- $*./ 0 -/.10 23 / 0 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-4 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-2
-- (,!*,-, $ #& +# #$ %! ", % +# + koodi, data, pino, prosessin kuvaaja PCB voi koostua useasta säikeestä +# # +# #$!# %,! ", vapaakäyntisyys (reentrancy Yhteinen koodialue kullakin oma data-alue, pino, PCB, "", +# #$ ", #$ ", #! ", #& " # KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-5 -- (,!*,-, 3 (. //,-,-, "!$#&%(' KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-6 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-3
-- (,!*,-, 3 (. //,-,-, ' # # #& " +##$ +#& osoitteet suhteellisia prosessin alun suhteen MMU tekee osoitemuunnoksen ajoaikana prosessin alueiden ei tarvitse sijaita fyysisesti peräkkäin muistissa tai olla jatkuvasti muistissa MMU ja KJ huolehtivat alueiden muistissaolosta prosessit voivat käyttää myös yhteisiä muistialueita "# # # *! base ja limit (fyys. alkuosoite ja pituus tai sivutaulu (missä sivutiloissa sivut sijaitsevat tai segmenttitaulu (alkuosoitteet ja pituudet KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-7 -- (,!*,-, ' # % +#$# #& # #&,# #& # %# #&" Aliohjelman/systeemikutsun parametrinvälitys! "" ""+ # #$# tunnistus vuorottajan tarvitsemaa tietoa mm. prosessorin tila (tallealue rekistereille tietoja varatusta muistista tietoja avatuista tdstoista ym. KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-8 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-4
-,-, +# #$, pid = process identification,+ #$ %#&# käyttäjän ja ryhmän tunniste uid = user id, gid = group id yleensä sama kuin prosessin käynnistäjällä saatu kun käyttäjä ottaa istunnon koneeseen,, %#&+ #$ mikä prosessi loi tämän prosessin kopioitu mammaprosessin kuvaajasta KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-9 -... *.$* (( *,- $* ( **.... ** ' # * ' # +# #$ " " #$, #& laitteisto tallettaa PC:n ja PSW:n pinoon käsittelijä tallettaa käyttämänsä rekisterit pinoon kun keskeytys käsitelty, palautetaan takaisin CPU:hun!#$ * #$ + "" "" keskeytyskäsittelyn lopuksi vuorottajaan vuorottaja tallettaa rekistereiden arvot PCB:hen prosessin tila saattaa vaihtua päivitettävä myös aika- ja viitelaskureita KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-10 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-5
- ( "/ * %#&" Running, Ready, Blocked... +#&# #& oletus, maksimi, minimi määrää sijainnin jonoissa suuri prioriteetti saa useammin CPU-aikaa voi vaihdella dynaamisesti " +#$ paljonko käyttänyt aikaa CPU:ssa, odotuksessa voi vaikuttaa prioriteettiin +# #$!#&, #&#$ KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-11 - //,-... + #& " " +#$ +#& Base ja Limit #$, # #&+#$ " +# taulu erillisellä muistialueella prosessin vaihdossa alkuosoite MMU:hun!#& + # # sama sivu / segmentti esiintyy eri prosessien muistivaraustauluissa käyttöoikeudet: esim. R / W / RW KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-12 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-6
- *,- &%' (%'*,- *./ #$ #$ " " #& alkio per avattu tdsto pääsy muihin tdstoon liittyviin rakenteisiin kaikille yhteistä tietoa! missä tdstoon kuuluvat lohkot käyttöoikeudet tdstolukot kullakin oma luku/kirjoituspositio!,+ #$ ", suhteellisen tdstonimen käyttö #$ %# #$ "# # # # KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-13 - // +# #$ +#,! ks. kuva 3.13 jonossa edeltävä ja seuraava viite mammaprosessin kuvaajaan... ",, #&, lipukkeita, semaforeja käsittelyä odottavat signaalit yhteiskäytössä oleva muisti KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-14 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-7
0! " $#&%' (%+*,- $*./ 0 -/.10 23 / 0 0 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-15 (,!*,-,... "" +# # "" "" vältä lukkiutuminen (deadlock ja nälkiintyminen (starvation +#&#&!# "", "" "" #$ "" takaa kelpo vasteaika maksimoi CPU:n käyttö "" # #,! ", + # palvelupyyntö +,+#,, #& IPC, inter process communication palvelupyynnöt yhteiskäyttöisen muistin allokointi KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-16 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-8
K K K K -- (,!*,-,,, - +# #$ #& "" + #$# parametrit pinoon ja palvelupyyntökeskeytys #,+#$ '( * " " "!$#%"!&"'( " " esim. tulostus kirjoittimelle * taustaprosessi palvelija keskustelee asiakkaiden kanssa + yksi prosessi per yhteys, '-".0/1#%243" """".0/1 25#%"!!3 ", 61%7 28 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-17 9;:=<?>A@?>>CBED F GA<HD IJB L 3 MON.P KJ valitsee yksikäsitteisen prosessinumero n Q "54!&'324R "S#2T koodi, data, pino koko: oletusarvot / annetut arvot alusta yhteiskäytön rakenteet U!3 MON.PV- nollaa kenttiä, aseta alkuarvoja, kopioi mammalta tila=ready (tai Ready-Suspended ei avoimia tiedostoja, ei varattuja resursseja... tai perii mammalta L 2 3W#% "0/1'3X6 " O"2 viite mammaprosessiin, liitä Ready-jonoon KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-18 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-9
K K K K B F F <HB D C:=<?>A@?>>CBED HB IV< Q " 1 " /1"! O ei kuitenkaan aina! J3N.M 1WV3"2 "'5 " " O-2 Palvelupyyntö + prosessi pyytää esim. siirräntää, jonka seurauksena joutuu odottamaan Poikkeus + prosessin suorituksessa virhe + prosessi joutuu exit-tilaan ja tapetaan Keskeytys + prosessin aikaviipale täynnä K Q 3O640/1 #%"!&2 tav. Round-Robin periaate KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-19 < @ > B4I B F D HB IV< < @ > B4I. 1 laitetoimintona etuoikeutettuun tilaan sitten suorittamaan KJ:tä N.M H3"( " "2 1"!!&!!& paljonko kello on? I/O valmis: siirrä I/O:ta odottanut Ready-jonoon, jatka keskeytynyttä prosessien välinen kommunikointi: herätä tapahtumaa odottanut Ready-jonoon, jatka keskeytynyttä KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-20 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-10
K K K < @ > B4I B F D HB IV< < @ > B4I K. " &6O 2"6"2" "S#25 "!&!& " '324 PC ja PSW aina laitetoimintona pinoon keskeytyskäsittelijä tallettaa pinoon vain ne, joita käyttää koodissaan MON.PV-X"5"5 "S#2 vähän yleisrasitetta MO "!33- "&""6" 2"2J5 " "25N.M J-X3 K Q 3O640/1 " 0/1( "S#% #% "X& KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-21 GA< :=<?I I K Q "!25"36#% " 3"2#% " /1 "N.M J-(!!& edellinen Blocked-tilaan aikaviipale täyttyi K MO #% "X N.M C3"2 " #3"0/1O Ẅ /1 N.M "! " 5O3"!246"!&!2 aikaviipaleet tarvittaessa KJ nostaa / laskee prosessin prioriteettia # käyttänyt paljon CPU:ta $ prioriteetti laskee # odotellut paljon I/O:ta $ prioriteetti nousee # KJ:n prosesseilla suurin prioriteetti KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-22 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-11
K K K H 9;:=<?>A@?>>CBED HB IV< K " 2"& "S#%J N.M J- MON.PV-&X" K MO"$#%2 " "!& 3"2 ' MO"$#%26(!&R PV!& ", 2 2T L 254!& "'3 "2" /1"O Q "!25"36#%63"2#%O Ready-jonon ensimmäinen Ready Running ei-virtuaalimuistia: aseta Base ja Limit virtuaalimuisti: nollaa TLB:n validibitit, aseta PTR! #"$ %& " #" %' "( +*,-/.01/23 ( KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-23 4651798;:98!8=<=>9?@?9ABAC!C D@E@F@G H I,--"-J % %&I-"K %&L!MON N L L KJ:n tarjoama palvelu, palvelupyyntö esim. TITO-kurssilla SVC SP,=HALT P%I3-"-% ( (-"!$-,, ' %& - % %&I" %&,-J poikkeukset parempi lopettaa kuin nilkuttaa virhetuloksia Q %R 2 S0L N ILUTVL!, M-"-I!%& (, ( - S0L N ILUTVL!, M-"-I -, *" $ -" ( Q #L-VNW!, M M KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-24 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-12
H 4651798;:98!8=<=>9?@?9ABAC!C D@E@F@G H S ( %%( M-L L-L L puutteelliset oikeudet esim. tiedoston käyttöön huomattuaan lukkiutumisen odotukseen liitetty ajastin laukeaa R R M I,--"-J % M N N L L! M %M #,--"-J %( M L L-IVN R %& L R R M I,--"-J % M-L L-IVN N saattaa myös lapsiprosessi päättyä $ - $ $-, TV KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-25?C;ABA?? 5 :98!A :?9A 4 "! KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-26 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-13
4651798;:98!8=< GG A/< E E < < 77 A/< Kuva 3.5 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-27 4651798;:98!8=< GG A/< AA B" ' N prosessi voisi edetä, jos saisi CPU:n käyttöönsä odottaa Ready-jonossa esim. prioriteetin mukaan ( ( %( prosessi käyttää parhaillaan prosessoria yksi prosessi per prosessori, $ " ' prosessi odottaa tapahtuman valmistumista (esim I/O, synkronointi, ajastus kullakin laitteella / tapahtumalla oma jono KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-28 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-14
4651798;:98!8=< 77 GG 79A Kuva 3.7 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-29 4651798;:98!8=< GG A/< AA 0" KJ luonut lapsiprosessin, prosessille annettu tunniste prosessille luotu hallinnolliset tietorakenteet mutta ei kelpuuta sitä vielä suoritettavaksi esim. vapaata muistia ei riittävästi liian suuri moniajoaste, liikaa heittovaihtoa... Q %& suoritus päättynyt, ei kelpaa enää suoritettavaksi mutta saattohoito tekemättä hallinnolliset rakenteet (lähinnä PCB olemassa muita sovelluksia varten esim: laskutus, tilastot KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-30 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-15
4651798;:98!8=< GG A/< 8=< < < 5 AC?9A 0" B" ' N resursseja riittävästi käytettävänä esim. prosessorin käyttöaste laskenut alle sopivan rajan muistissa riittävästi vapaata tilaa B" ' N ( ( %( vuorottaja valitsee suoritukseen Ready-jonon ensimmäisen prosessin ( ( %( B" ' N prosessin aikaviipale täynnä suuremman prioriteetin prosessi Ready-tilassa KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-31 4651798;:98!8=< GG A/< 8=< < < 5 AC?9A ( ( %(, $ " ' prosessi pyytää KJ:ltä palvelua, jonka valmistumista joutuu odottamaan tarvittava resurssi varattu odottaa siirrännän valmistumista odottaa toisen prosessin etenemistä sopivaan vaiheeseen (prosessin välinen kommunikointi sivunpuutoskeskeytys, $ " ' B" ' N prosessin odotus päättyy tarvittu resurssi vapautui siirräntä valmistui toinen prosessi saavutti synkronointikohdan KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-32 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-16
4651798;:98!8=< GG A/< 8=< < < 5 AC?9A ( ( %( Q %& prosessin suoritus päättyy normaali / virhetilanne KJ vapauttaa resurssit PCB:tä lukuunottamatta odotettava, että joku toinen prosessi kokoaa kirjanpidolliset tiedot PCB:stä %$-L 3-( -% Q %& KJ tai omistaja voi tappaa mammaprosessi päättyy Q %& kun saattohoito tehty, KJ vapauttaa PCB:n KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-33 :: <ABA 77 < A 77 (swapping I,--"-J %, ',-I -%%I #, ( * R % R %& I!$ -( paljon prosesseja Blocked-tilassa KJ voi ottaa suoritettavaksi lisää prosesseja riittääkö muistia?! #"$ %&'' ( ( %* + -,./"+01 liian suuri moniajoaste aiheuttaa ruuhkautumista 2 3546,.'' 7 89:,.'%'/"$'! ; ( ennaltanouto / tarvenouto <=0$>?"$%&?01@/0$A + '#"$ %B"$@/"$@ KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-34 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-17
- /"$@A '! ( /"1 4 ( A A Blocked-prosessi heittovaihdettu muistista levylle A/0 A Ready-prosessi heittovaihdettu muistista levylle Blocked ~ estynyt Suspend ~ erotettu määräajaksi, hyllytetty, lykätty toistaiseksi Monissa kirjoissa tilan nimenä kuvaavampi Swapped Out KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-35! " $#%'&(' *,+ " $#( - Kuva 3.8 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-36 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-18
( " $# $ 5 A/0 A KJ ottanut prosessin suoritettavaksi (=PCB luotu, mutta muistissa ei vielä tilaa uudelle prosessille 4 ( A 4 ( A A KJ tarvitsee lisätilaa Ready-prosesseille KJ tarvitsee tilaa uusille prosesseille 4 ( A A A/0 A Tapahtuman odotus päättyy, prosessi voisi jatkaa 4 ( A A 4 ( A Muistissa taas tilaa, odotettavissa että odotus päättyy Suuri prioriteetti KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-37 ( " $# $ A/0 A/0 A A/0 A KJ haluaa lisää muistitilaa, eikä yhtään Blocked-prosessia heittovaihdettavaksi A/0 A A/0 CPU:n käyttöaste laskenut riittävän alas ei prosesseja Ready-jonossa muistissa jälleen reilusti tilaa (ennakointi Yl. siirtymän Blocked --> Blocked Suspend seurausta Huomautus: Suspend-tilat eivät välttämättömiä, jos virtuaalimuisti (MMU huomaa puutoksen KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-38 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-19
' # KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-39!! ' " ' &! Kuva 3.10 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-40 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-20
!! ' " ' &! 2 % + tietoa kaikista järjestelmän prosesseista kullekin oma alkio = prosessin kuvaaja 2 354 alkiot linkitetty Ready ja Blocked-jonoihin KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-41! Kuva 3.13 KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-42 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-21
!! ' " ' &! < "$%* missä vapaata / varattua muistitilaa esim. yksi globaali sivutilataulu mitkä alueet kuuluvat millekin prosessille prosessikohtaiset sivutaulut PCB:ssä esim. sivutaulun fyysinen osoite kenellä käyttöoikeuksia muistialueisiin yhteiskäyttö joskus sallittua virtuaalimuistin ja heittovaihdon toteutus heittovaihtoalue levyllä sivutaulun alkioissa läsnäolobitit KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-43!! ' " ' &! A ( "$-,. /"01%& kirjanpito vapaista / varatuista levylohkoista pysyvä kirjanpito levyllä, KJ tuo muistiin käsittelyä varten hakemistoalkio per tdsto (myös hsto on tdsto! mitkä lohkot kuuluvat tdstoon muut tdston attribuutit (mm. omistaja, käyttöoikeudet kirjanpito avatuista tiedostoista prosessikohtaista PCB:ssä + yhteistä tietoa käyttöoikeuksien tarkistaminen luku / kirjoituspositio yhteiskäyttö: poissulkeminen / synkronointi KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-44 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-22
!! ' " ' &! ( "$-,. laitteiden käytössä tarvittavaa tietoa laitteen tunnistus, device id kenelle laite varattu laitteen tila mitä ajuria käyttää mitä ajurin funktiota kutsuttava missäkin tilanteessa open(, read(, write(, close( odottavat pyynnöt parametreineen laite palvelee yhtä kerrallaan 5 ( /0/.0/ ; ( '-, % % ( 2 354 -, %!4 ( A,. KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-45!! ' " ' &! :,.?"$%* %* %& 8%* ( KJ allokoi tilaa / vapauttaa tilaa niiden perusteella yhteiskäytössä tarvittavaa tietoa! " #$! " %&('* " *! %#+,'! mitä varattu juuri tälle prosessille PCB:stä helppo pääsy globaaleihin tietorakenteisiin -.%%* /0/#*!*21!13 4! "56,'7 8 /# // 9 8 :.;=<! "5 > /&? /&@A8& 8@ KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-46 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-23
"! #%$ &'&(% +* &( KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-47 -,./102 3 02 13 4 14-5 5 9:.76 < # 8! " %5 %+13% % /! " -.5 1 "5,'5 8/&! 98 8# %#!8 8#!! 98&/&! - 5 <9 % 5 "/& 5 13@! "&5;: "=</# " > melkein kaikki käyttävät PCB:tä? % - 5 14 * A@ KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-48 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-24
". /0.. 3 00 3 3 KJ:n osat eivät jonota! #"$ %&'%( * ( "+,+,-! #". / (. %.( 0 oikeus tehdä kaikkia KJ:n toimintoja kaikissa osissa 1 23%. *3! KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-49 44 " 55 7/ 00,, 55 102!.2 6 3%( ( kaikkien prosessien osoiteavaruudessa ( 7! #" ( hallittu siirtyminen keskeytyksellä, etuoikeutettu tila ' - 3- &,( 8 8( % 9 1 ((+ %.-%. 3! KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-50 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-25
55 7/ 00,, 55 102 1! #"+ + &2 %( ( 3 -, (& ( 7! #"+, %(( %& 3- +! #"+ 7! #". & 2. - 9%- 6 suoritukseen vuorottajan kautta KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-51! "! #"- ( $ 3- odottavat Blocked/Ready-jonossa kullakin oma osoiteavaruus tarvittaessa etuoikeutetussa tilassa, erilaisia oikeuksia # ( %- (-( $/ %. "- 6% (.%. % palvelupyyntö: lähetä / vastaanota sanoma sopii myös moniprosessori / hajautettuihin järjestelmiin %. & --(! % = mikrokernel KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-52 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-26
3. ; 00 4 " ##!*!+13!71!1 @ 4 //& - 5 @! "9# "" *!!& @ 4 " 4 : @ ' *! +@!" "!"=@;4 "513@!"!"5 /&/&5=@ 4 "598& 8,'*!%#+,' @ 4 //& "98& ",' %5 1 " "55 =@ 4 %! 8&/&% 3& A8/&. ' @ 4 //&*! ; /& % :9 " #!* =:98/&=@ 4 //&*! * 55 * 9 8&/&! " @ 4 " #=:=<?A " @ 4 "5 *#!!8& "%!"" - 5 13/&/&5* "55 @ KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-53 KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 9-27