3. Muistin hallinta. 3.1 Erityyppiset muistit

Koko: px
Aloita esitys sivulta:

Download "3. Muistin hallinta. 3.1 Erityyppiset muistit"

Transkriptio

1 Muistin hallinta Muistin hallinta Tämä luku käsittelee erityyppisiä muisteja ja ohjelman sijoittelua muistiin, dynaamisen muistin hallintaa ja yleensä muistinhallintaa. Pääpaino on siinä, miten muisti näkyy ohjelmoijalle, ja siksi monet laitteiston toteutusyksityiskohdat on sivuutettu, vaikka ne sinänsä mielenkiintoisia ovatkin. 3.1 Erityyppiset muistit Ohjelmoijan kannalta tärkein jako muisteille on se, voiko niiden sisältöä muuttaa vai ei. Tosin muuttamisen helppous tai vaikeus on myös tärkeää, ja joidenkin muistien kohdalla onkin hieman tulkinnanvaraista, minkä tyyppinen muisti oikeastaan onkaan. Yleensä jako tehdään lukumuisteihin ja luku kirjoitusmuisteihin. Tällöin lukumuisteiksi luetaan kaikki sellaiset muistit, joiden sisältöä ei voi muuttaa normaalilla suorittimen kirjoitusjaksolla. Voimme tehdä jaon myös periaatteella haihtumattomat muistit haihtuvat muistit. Tällöin korostamme sitä, säilyykö muistin sisältö sähkökatkoksen yli vai ei Luku kirjoitusmuistit Luku kirjoitusmuistit (RAM, random access memory 7 ) ovat yleisimpiä muisteja tietokoneissa. Oikeastaan voidaan sanoa, että tämä on muistin oletusarvo. Tavallisen luku kirjoitusmuistin sisältö ei säily sähkökat- 7. Nimi on itseasiassa kummajainen. Random viittaa siihen, että voidaan viitata mihin muistipaikkaan tahansa riippumatta edellisestä viittauksesta. Tämä erottaa muistin ikivanhasta muistitekniikasta, jossa voitiin viitata sujuvasti vain seuraavaan tai muutaman askelen päässä edessä olevaan muistipaikkaan. Tässä mielessä myös nykyiset lukumuistit ovat RAM-muisteja, mutta niitä ei koskaan tarkoiteta termillä RAM. Vain aniharvoin RAM-muistiin viitataan loogisemmalla termillä RWM, read-write memory.

2 52 Sulautettu ohjelmointi koksessa, joten tämä muistityyppi edustaa haihtuvia muisteja. Kuten muistin (suomenkielinen) nimi kertoo, suoritin voi lukea tai muuttaa muistin sisältöä yhden muistijakson aikana. Luku kirjoitusmuisti on yleensä nopeaa. Luku kirjoitusmuisteja on toteutustekniikaltaan erilaisia. Muisti voi olla staattista (SRAM), jolloin tieto säilyy muistissa niin kauan kuin käyttöjännite piirille on olemassa. Staattinen muisti on nopeaa, mutta se vaatii enemmän piipinta-alaa kuin sen päävaihtoehto, dynaaminen muisti (DRAM), joka vie bittiä kohden neljäsosan SRAMin vaatimasta piipinta-alasta. Dynaaminen muisti tallettaa muistitiedon kapasitansseihin, jotka purkaantuvat hiljalleen. Tämän takia muistia pitää virkistää säännöllisesti, jotta tieto ei katoaisi. Muistin virkistys tapahtuu joko ohjelmallisesti tai kuten yleensä on asian laita laitteistolla. Dynaaminen muisti on myös voitu tehdä ulkoisesti staattisen näköiseksi eli siinä on sisäänrakennettu virkistyslogiikka. Varsinkin dynaamisen muistin piirit voivat olla sellaisia, joissa käsiteltävä osoite kirjoitetaan muistiin kahdessa tai useammassa osassa: esimerkiksi siten, että ensin kirjoitetaan muistin ylimmät bitit ("riviosoite") ja sitten alimmat bitit ("sarakeosoite"). Muisti ajatellaan siis matriisiksi. Tästä rakenteesta johtuu edelleen se, että samalla rivillä olevia muistipaikkoja on nopeampi osoittaa kuin eri riveillä olevia, koska muistiosoitteesta ei tarvitse ladata kuin alaosa (niin sanottu page-mode, EDORAM). Ominaisuutta voidaan ainakin yrittää hyödyntää ohjelmien tai tietorakenteiden sijoittelussa, mutta käytännössä tämä tulee kyseeseen yleensä vain melko pieniä järjestelmiä rakennettaessa, sillä tavallisesti muut suunnittelunäkökulmat ovat huomattavasti merkittävämpiä. Erityyppisiä muisteja on monia, eikä ohjelmoijan yleensä tarvitse tietää niiden ominaisuuksista paitsi ehkä yllämainitusta samalta riviltä lukemisen paremmuudesta. Mikäli laitteessa on erityyppisiä muisteja, voi tulla tarpeen miettiä niiden käyttöä. Eroja voi olla ainakin muistin leveydessä (mikäli suoritin sallii erileveyksisiä muisteja) ja muistin saantiajoissa Lukumuistit Peruslukumuisti (ROM, read only memory) on muisti, jonka sisältö langoitetaan tekovaiheessa. Tällaisia muisteja ei nykyään käytetä kuin korkeintaan suorittimen sisällä joitain erikoistarkoituksia varten. Tavallisempaa onkin, että käytetään piiriä, jonka sisältö voidaan ohjelmoida jollain tavalla (PROM, programmable ROM). Mikäli ohjelmointi on

3 Muistin hallinta 53 mahdollinen vain kerran, piiristä tulee jätettä, mikäli sen sisältöä pitäisi muuttaa. Tämän takia kertaohjelmoitava piiri on lähinnä historiaa, eikä sillä ole juuri käytännön merkitystä. Myös edellistä käyttökelpoisemmat EPROM-piirit (erasable ROM) ovat pikku hiljaa käyneet vanhanaikaiseksi. Tällainen piiri voidaan tyhjentää jollain menetelmällä, tavallisesti ultraviolettivalolla, ja kirjoittaa sen jälkeen uudestaan. Kirjoittaminen tarvitsee usein poikkeavan jännitteen, eikä sitä voi tehdä enää "tuotantokäytössä". Edellä olevilla muisteilla on ohjelmoijan kannalta yksi yhteinen tekijä: käytössä olevan piirin sisältöä ei voi mitenkään muuttaa ohjelmallisesti. Lukumuisteille voidaan sijoittaa vain sellaista tietoa, joka ei muutu. Tavallisesti tämä tarkoittaa suoritettavaa ohjelmaa ja alustettua dataa, esimerkiksi merkkijonovakioita. Tässä kuvatut perinteiset lukumuistit ovat käyneet harvinaiseksi, ja niiden tilalle on tullut uudentyyppisiä ns. haihtumattomia muisteja Haihtumattomat muistit Lukumuistit ovat tietenkin kaikki haihtumattomia. Tämän takia niitä ei yleensä lasketa haihtumattomiksi muisteiksi, vaan haihtumattomalla muistilla tarkoitetaan muistia, jonka sisältöä voidaan muuttaa ja jonka sisältö säilyy sähkökatkoksen yli. Useimmat tällaiset muistit ovat hitaita ja joskus hankaliakin käyttää. Patterivarmistettu luku kirjoitusmuisti Ohjelmoijan kannalta yksinkertaisin haihtumaton muisti on tavallinen luku kirjoitusmuisti, jonka sähkönsyöttö on turvattu erityisjärjestelyin (esimerkiksi patterivarmistus). Tällaisena lukumuistina voi käytännössä olla vain staattinen muisti, sillä dynaaminen muisti vaatii virkistämistä joten pelkkä sähkönsyötön lisääminen ei riitä. Tällaisia muisteja ei kuitenkaan käytetä kovin paljoa, koska on harvinaista, että jatkuvasti päivitettäviä tietoja pitäisi säilyttää mahdollisen katkoksen yli. Esimerkkinä hieman poikkeuksellisesta käytöstä voisi mainita NFS-kiihdyttimen, jonka tarkoitus on nopeuttaa NFS-järjestelmän (network file system) toimintaa. Levypalvelin siirtää asiakkaalta tulleen tiedon ensin NFS-kiihdyttimen muistiin ennen levylle kirjoittamista. Itse levylle kirjoittaminen voidaan tehdä myöhemmin levyn käytön kokonaisoptimoinnin kannalta hyvään aikaan, mutta jo tässä vaiheessa voidaan "valehdella" asiakaskoneelle tiedon olevan levyllä, koska sen

4 54 Sulautettu ohjelmointi sisältö on turvassa sähkökatkolta. Toisin sanoen koko kiihdytin onkin itse asiassa patterivarmistettu luku kirjoitusmuisti. Sähköisesti tyhjennettävä muisti Sähköisesti tyhjennettävä muisti eli EEPROM (electrically erasable PROM) mahdollistaa muistipaikan sisällön muuttamisen, kun muistipaikka on erikseen ensin tyhjennetty. Ensimmäisen sukupolven laitteet vaativat erityisjännitteen tietojen muuttamiseen, minkä takia muutos ei yleensä onnistunut itse käyttölaitteella, vaan muutoksia varten piiri piti poistaa käyttölaitteesta. Tämän takia muistin käyttö oli hankalaa, mutta sitä voitiin käyttää tallentamaan esimerkiksi laitteen sarjanumero tai muu tunnistetieto tai järjestelmän tarvitsemia parametreja. Uuden sukupolven EEPROM tunnetaan paremmin nimellä Flash- ROM. Sen sisältöä voidaan muuttaa tavallisella käyttöjännitteellä, ja näin siihen voidaan tehdä muutoksia itse käyttölaitteessakin. Ensimmäiset Flash-ROM-piirit piti tyhjentää kokonaan ennen muutoksia, mutta nykyiset voidaan tyhjentää lohko kerrallaan. Kirjoittaminen voidaan tehdä muistipaikka kerrallaan. Flash-ROM-piireillä on rajoituksia siihen, montako kertaa piiri voidaan ohjelmoida uudestaan. Tämän takia pyritään siihen, että muutokset eivät kuluta loppuun yhtä lohkoa, vaan tieto tallennetaan peräkkäisillä kerroilla eri sivuille. Uusimmissa laitteissa ongelmat ovat yleensä pienempiä, sillä muistia on usein yli välittömän tarpeen, ja lisäksi sallittujen kirjoituskertojen määrä on kasvanut. Flash-ROM on hidas lukea ja kirjoittaa, ainakin luku kirjoitusmuistiin verrattuna. Tämän takia sen sisältö tavallisesti luetaan lukukirjoitusmuistiin käytön ajaksi nopean lukemisen mahdollistamiseksi. Näin tehdään erityisesti silloin, kun muistilla on ajettavaa ohjelmakoodia. Kirjoittamista tämä ei nopeuta, koska kirjoittaminen tulee tehdä aina itse flash-muistille asti. 3.2 Flash-muistin käytöstä Flash-muistin käyttöä rajaa eniten se, että sitä ei voi tyhjentää muistipaikka kerrallaan, vaan ainoastaan lohko kerrallaan. Näin yhtä muistipaikkaa ei voida muuttaa suoraan, vaan koko lohko on tyhjennettävä ja sitten kirjoitettava uudelleen. Tämä tapa ei ole käyttökelpoinen, sillä sähkökatkos juuri siinä välissä, kun vanha tieto on poistettu, mutta uutta

5 Muistin hallinta 55 ei ole vielä talletettu, johtaa tiedon katoamiseen. Lohkon tiedot pitää siis kirjoittaa ensin jonnekin, ja sitten vasta tyhjentää vanha lohko. Flash-muistia käytetään tässä esitetyn tavan lisäksi paljon viihdeelektroniikassa muun muassa digitaalisten kameroiden siirrettävänä kuvamuistina Kirjoituskertojen rajoitukset Toinen ongelma on flash-muistin kirjoituskertojen (write endurance) rajoitukset. Luotettavan kirjoittamisen raja voi olla suhteellisen matala. Laitteen käyttötarkoituksen ja odotettavissa olevien kirjoituskertojen mukaan voidaan päätellä, kauanko laite kestää käytössä. Kirjoituskertojen määrä vaihtelee tekniikan mukaan tuhansista yli miljoonaan kirjoituskertaan. Suurikaan kirjoitusmäärä ei täysin ratkaise ongelmaa, jos määrä kuitenkin on rajallinen, joten käyttökonteksti on siksi keskeinen tekijä laitteistoa valittaessa. Esimerkiksi harjoitustyökäytössä olevan laitteen suorittimen voi ohjelmoida 1000 kertaa luotettavasti. Mikäli oletetaan, että jokaisen harjoitusryhmän tulee tehdä ohjelmointi 10 kertaa, laite kestää sadan ryhmän käytön. Kun suorittimen hinta on noin kymmenen euroa, ja se on vaihdettavassa kannassa, tulee ryhmäkohtaiseksi kustannukseksi noin kymmenen senttiä. Tämä on promillen osia koko opintojakson kustannuksista, joten muistin käyttöä ei kannata optimoida. Toisaalta kyseessä voi olla loppukäyttäjällä oleva laite, jonka tulee kestää ainakin viisi, mieluiten kymmenen vuotta, ennen kuin se lakkaa toimimasta. Tällaisessa laitteessa täytyy haihtumattoman muistin eri osia käyttää mahdollisimman tasaisesti, ettei jokin tietty paljon muuttuva kohta pala loppuun paljon ennen muita. Täytyy tietenkin pitää mielessä, että tässäkin kohtaa on olennaista kirjoituskertojen määrä, ei laitteen ikä Muistitiedon päivittämisestä Flash-muisteja on kahta perustyyppiä. Toinen liitetään tietokoneeseen sarjaliitynnän avulla, ja sitä voi kirjoittaa ja lukea vain lohko kerrallaan. Tällaisia ovat esimerkiksi muistitikkujen sisällä olevat muistit. Toinen perustyyppi mahdollistaa viittaamisen muistipaikka kerrallaan. Muistipaikka kerrallaan viitattavat muistit jakaantuvat nekin kahteen ryhmään lohkojen koon mukaan. Toisessa on vakiokokoiset lohkot, joita käytetään symmetrisesti (niin sanottu FAT-tyyppi). Toisessa taas on muutama suurehko lohko ja monta pientä lohkoa (niin sanottu

6 56 Sulautettu ohjelmointi bootsector-tyyppi). Suuret lohkot on tarkoitettu ohjelmakoodille ja pienet usein muuttuvalle datalle. Ohjelmalohkot voidaan myös suojata kirjoittamiselta. Tällainen piirityyppi on yleinen tietokoneen alustusmuistin tallennuspaikkana (boot rom, bios). Flash-muistipiirillä on oheislaitteen tavoin ohjaus- ja tilarekistereitä, joiden avulla voidaan ohjata piirin toimintaa, muun muassa muistin tyhjentäminen tapahtuu ohjausrekisterien avulla. Monet Flashpiirit noudattavat standardiliittymää, joka mahdollistaa eri valmistajien muistin käytön samalla ohjelmalla 8. Bittien nollaus Tavallisesti tyhjä tieto muistipaikassa tarkoittaa sitä, että bitit ovat kaikki ykkösiä. Kirjoittamalla voidaan nollata bittejä, mutta niitä ei voi palauttaa ykköseksi tyhjentämättä koko lohkoa. Hyvin suunnitelluilla tietorakenteilla ja tiedon esittämistavoilla voidaan vähentää koko lohkon tyhjentämistarvetta siten, että (normaalitapauksessa) muuttujan elinajan arvot kulkevat ykkösbiteistä nollabitteihin päin. Esimerkiksi lukematon viesti on hyvä merkitä ykkösbitillä, jonka voi nollata lukemisen merkiksi. Edelleen viestin tuhoaminen on jonkin bitin nollaus. Tällöin ei tarvitse kirjoittaa ja tyhjentää koko lohkoa yhden bitin takia. Niin sanottuja WORM-levyjä (write once, read mostly) varten on tehty tiedostojärjestelmiä ylläkuvatuilla periaatteilla. Näitä periaatteita voidaan hyvin soveltaa myös Flash-muistiin. Nykylaitteista WORMlevyn tyyppisiä ovat CD-R- ja DVD-R-levyt. Lohkon tunnistaminen Koska tiedon päivitystä ei voi tehdä kuin aivan poikkeustapauksissa muuttamalla muistipaikan sisältöä suoraan, täytyy koko lohko uusine arvoineen kirjoittaa ensin toiseen paikkaan ja vasta sitten vapauttaa alkuperäinen lohko. Tästä seuraa se, että muuttujien paikat muistiavaruudessa muuttuvat, mutta käytännössä muutosta ei osoiteavaruudessa haluta nähdä. Tämä voidaan toteuttaa muistinhallinnan avulla. Suurempi ongelma onkin siinä, miten käynnistettäessä tunnistetaan käytössä oleva muisti. Tietoa aktiivisesta muistilohkosta ei voi tallettaa mihinkään vakiopaikkaan, koska silloin tästä osoitteesta tulisi koko järjestelmän heikoin lenkki, jonka vikaantuessa koko järjestelmä 8. Näin ainakin paperilla käytännössä eroja voi olla paljonkin.

7 Muistin hallinta 57 // Algoritmissa on varsin vapaasti käytetty sopivia aliohjelmia apuna struct {byte kaytto; byte tyyppi; int aikaleima; tiedot data} otsikko; const KAYTOSSA = 0x7f; const VANHA = 0; lohko *kirjoita_korvaava(lohko* vanha, tiedot *uudet_tiedot) { otsikko *vapaa = etsi_vapaa_lohko(); vapaa->kaytto = KAYTOSSA; copy(uudet_tiedot, &(vapaa->data) ); vapaa->aikaleima = time(); vapaa->tyyppi = vanha->tyyppi; vanha->kaytto = VANHA; } Ohjelma 3.1: Eräs flash-muistin käyttöalgoritmi. muuttuisi hyödyttömäksi. Tämän takia jokaisen lohkon tulee sisältää tieto siitä, mitä tietoa siihen on talletettu Päivitysesimerkki Käydään seuraavaksi läpi pieni esimerkki, jossa on kyseessä tiedon tallentaminen lohkoittain. Kun lohkon tietoa tulee muuttaa, eikä se onnistu vain bittejä nollaamalla edellisessä kohdassa esitetyllä tavalla, on pakko kirjoittaa lohko kokonaan uudestaan. Oletamme, että jokaisen lohkon alussa on yksi 8-bittinen tavu, joka kertoo lohkon tilan. Tyhjä lohko on FF 16, eli kaikki bitit ovat ykkösiä. Lohkon kirjoittaminen alkaa siis siitä, että etsitään vapaa lohko. Tämän jälkeen lohko merkitään otetuksi käyttöön nollaamalla ylin bitti. Muuttujassa on nyt siis arvo 7F 16. Tämän jälkeen kirjoitetaan varsinainen tieto lohkoon. Kirjoittamisen päätyttyä voidaan lohkon otsikkotietoihin eli lohkon käyttötavua seuraaviin tavuihin kirjoittaa lohkon aikaleima ja tyyppi. Kun tyyppi poikkeaa arvosta FF 16, se merkitsee, että lohko on loppuun kirjoitettu. Tämä voitaisiin varmistaa vielä sillä, että lohkon käyttötavun arvoksi asetetaan 3F 16, eli nollaamme toisenkin bitin ensimmäisestä tavusta, mutta tämä ei ole välttämätöntä. Edellä oleva on kuvattu myös ohjelmassa 3.1. Vanhan, käyttämättömäksi jääneen lohkon voimme merkitä nollaamalla käyttötavun bitit. Toinen vaihtoehto olisi tyhjentää lohko heti, mutta koska tyhjentäminen kestää suhteellisen kauan (esimerkiksi noin millisekunnin luokkaa), tyhjentäminen kannattaa jättää sellaiseen vaiheeseen, jossa järjestelmän käyttö on muuten vähäistä. Viivästettyä tyhjentämistä voidaan käyttää myös sen varmistamiseksi, että samaa lo-

8 58 Sulautettu ohjelmointi hkoa ei käytetä jatkuvasti. Toinen vaihtoehto olisi toteuttaa vapaan lohkon etsintä siten, että uudeksi lohkoksi valitaan se vapaa lohko, joka seuraa viimeksi käyttöön otettua lohkoa. Kun järjestelmä käynnistetään, pitää lohkoista etsiä oikea tieto. Periaatteessa riittää etsiä ensimmäinen oikeaa tyyppiä oleva lohko, jonka status on käytössä ja käytämme sitä. On tietenkin mahdollista, että sähköt katosivat juuri ennen kuin vanha lohko ehdittiin merkitä vanhaksi (ohjelman 3.1 viimeinen rivi). Emme siis lopeta etsintää ensimmäiseen löydettyyn, vaan jatkamme, ja jos löytyy muista vastaavansisältöisiä lohkoja, otamme käyttöön sen, jonka aikaleima on suurin. Muut voidaan merkitä vanhoiksi tässä vaiheessa. Esimerkissä erityyppisiä sivuja on vain yhden tavun verran (eli 255, koska FF 16 on keskeneräisen kentän tunnus). Koska muistit ovat paljon tätä suurempia, käytännössä tunnuksen arvoalueen tulee olla suurempi. 3.3 Ohjelman sijoittelu muistiin Sulautetuissa järjestelmissä varsinkin niissä pienimissä muistitilan käytön suunnittelu on pitkälti käsityötä. Tyypillisiä jakotapoja edustavat seuraavat näkökohdat: ajettava ohjelma, sijoitetaan lukumuistiin (ROM, Flash) alustettu data, kirjoitussuojattu, sijoitetaan lukumuistiin (ROM, Flash) staattinen muistialue, sijoitetaan luku kirjoitusmuistiin (RAM) järjestelmän asennusparametrit 9, esimerkiksi tunnistetiedot tai muu sellaiset sijoitetaan johonkin haihtumattomaan muistiin (patterivarmistettu RAM, Flash) dynaaminen muistialue, pino, sijoitus luku kirjoitusmuistiin (RAM) oheislaitteet, sijoitus absoluuttiosoitteisiin (näyttävät tavallisesti RAMilta) keskeytysvektorit, sijoitus absoluuttiosoitteisiin (ROM); käynnistyssekvenssissä vektorit voidaan siirtää RAM-muistiin. Varsinkin pienen sulautetun järjestelmän muistinhallinta eroaa tavanomaisesta PC-ympäristöstä monin tavoin. Ensinnäkin ohjelma on tyypillisesti valmiiksi muistissa eikä sitä ladata levyltä keskusmuistiin osana 9. Ovat loogisesti staattisia muuttujia, mutta näitä ei alusteta kertaakaan järjestelmää käynnistettäessä.

9 Muistin hallinta 59 ohjelman käynnistymistä. Lisäksi osa osoitteista on suoraan laiteosoitteita ja keskeytysvektori vie osan osoitteistosta. Järjestelmässä myöskään voida suoraviivaisesti toteuttaa alustetun data aluetta, jota voidaan muuttaa ohjelman ajon aikana, vaan toteutuksessa esimerkiksi kopioidaan alustettu data lukumuistiin (osa kääntäjistä saattaa tehdä tämän automaattisesti, osa jättää asian ohjelmoijan vastuulle). Toisaalta mitä suuremmasta sulautetusta järjestelmästä on kyse, sitä todennäköisempää on, että mukana on paljon automatisoituja rutiineja liittyen käynnistykseen ja lataamiseen. Tällöinkin ohjelmoija tosin voi usein vaikuttaa sijoitteluun esimerkiksi parametrein ja konfiguraatiotiedostoin. 3.4 Ohjelman sisäinen muistinhallinta Ohjelmaa rakennettaessa ohjelmistosuunnittelija joutuu jatkuvasti tekemään ratkaisuja, jotka vaikuttavat muistin kulutukseen ohjelman suorituksen aikana. Se, miten muuttujat ja tietorakenteet sijoitellaan muistiin, luonnollisesti määrittelee reunaehdot sille, mitä vähintään tarvitaan. Tämän lisäksi myös ohjelman suorituksessa välttämättömät tietorakenteet, joista tärkein on suorituspino, vaikuttavat siihen, miten sijoittelu kannattaa tehdä. Yksittäisen muuttujan kannalta ainakin seuraavat kolme vaihtoehtoa tulevat kyseeseen: 1. staattisesti varattu muuttuja, joka sijaitsee muistissa vakiopaikalla, ehkä jopa ROMissa 2. dynaamisesti varattu muuttuja, joka on sijoitettu pinoon (käytännössä siis joko aliohjelman sisäinen muuttuja tai parametri) 3. dynaamisesti varattu muuttuja, joka on sijoitettu kekoon (heap), josta muistia voidaan varata ohjelmoijan toimesta käyttäen ohjelmointikielen tarjoamia operaatiota, kuten vaikkapa C-kielen malloc-rutiinia. Käymme seuraavassa lyhyesti läpi näiden vaihtoehtojen hyvät ja huonot puolet Staattisesti varattu muuttuja Staattisesti varatut muuttujat ovat ohjelman suorituksen alussa luotuja muuttujia, joiden muistiosoite ei muutu. Näiden muuttujien varaaminen muistiin on yleensä helppoa lukuunottamatta tilanteita, joissa muistia ei

10 60 Sulautettu ohjelmointi kerta kaikkiaan ole tarpeeksi. Muuttujaan viittaaminenkin on yksinkertaista, sillä se voidaan aina tehdä saman muistiosoitteen kautta. Vaikka staattisesti varatut muuttujat ovat oikeastaan globaaleja, niiden näkyvyysalueiden rajaaminen esimerkiksi vain yhteen aliohjelmaan voi usein johtaa modulaarisuuden kannalta parempaan ratkaisuun. Jos arvoa oikeasti tarvitaan jossakin muuallakin, on sen arvo mahdollista välittää esimerkiksi seuraavaan tapaan: int* osoitin_staattiseen_muuttujaan() { static int x = 0; return &x; } Abstraktioihin liittyvistä syistä näin ei kuitenkaan yleensä ole suositeltavaa toimia, vaan kannattaa pyrkiä muihin, ohjelmistoteknisesti selkeämpiin ratkaisuihin Dynaamisesti varattu muuttuja pinossa Dynaamisesti luodut muuttujat, jotka sijaitsevat ohjelman suorituspinossa, ovat aliohjelmien sisäisiä muuttujia ja parametreja. Koska kyseessä ovat dynaamisesti luodut muuttujat, uusia muuttujia syntyy ja vanhoja katoaa sitä mukaa, kun uusia aliohjelmakutsuja tehdään ja vanhoja kutsuja saadaan suoritettua loppuun. Koska muuttujat elävät vain sen aikaa kuin mitä ne omistavan aliohjelman suoritus kestää, on oltava huolellinen sen suhteen, mitä aliohjelmasta voidaan palauttaa tai paljastaa muille operaatioille. Tällöin muuttujaa käytettäessä se ei ehkä enää olekaan olemassa, sillä operaation suoritus on jo päättynyt, kuten vaikkapa seuraavassa esimerkissä: // VAROITUS: Negatiivinen esimerkki, älä koskaan tee näin! int * osoitin_paikalliseen_muuttujaan() { int x = 0; return &x; } Joissakin ohjelmankirjoitusohjeissa esitetään jopa, että viitettä olioon, joka sijaitsee pinossa, ei koskaan pitäisi välittää eteenpäin. Tämä on kuitenkin ehkä hätävarjelun liioittelua, sillä ne metodit, joita olion omistava metodi tai proseduuri suorittaa, voivat kyllä luottaa siihen, että olio säilyy muistissa niiden suorituksen loppuun saakka. Sen sijaan viitettä olioon ei tietenkään saa palauttaa kutsujalle.

11 Muistin hallinta 61 Koska jokaista tehtyä metodi- tai proseduurikutsua kohti joudutaan ohjelman suorituspinosta varaamaan tilaa uuden aliohjelman sisäisille muuttujille, parametreille, paluuarvolle ja ohjelmaa suoritettaessa tarvittavalle kirjanpitodatalle, aivan pienimmissä sulautetuissa järjestelmissä joudutaan joskus pohtimaan, miten syviä proseduurikutsuketjuja voidaan sallia. Jopa matkapuhelimien ohjelmoinnissa tämän suhteen voi tulla ongelmia, jos pinossa olevat oliot ovat suuria, ja niitä joudutaan kopioimaan metodista toiseen. Tästä syystä kannattaa ehkä pohtia viitteen välitystä olioon uuden kopion rakentamisen sijaan, vaikka periaatteessa viitteen välitystä pinosta varattuun olioon ei suositellakaan. Lisäksi rekursion suhteen kannattaa sulautettuja järjestelmiä suunniteltaessa olla huolellinen. Jos rekursio halutaan sallia, kannattaa ainakin varmistaa, että rekursiivisilla kutsuilla on joku riittävän pieni yläraja, jotta voidaan yhtäältä varmistua siitä, että muistia ei voi kulua tiettyä määrää enempää, ja toisaalta siitä, että ohjelma ei ryhdy suorittamaan liian pitkää laskentaa, vaan vasteajat pysyvät edelleen järkevissä rajoissa Dynaamisesti varattu muuttuja keossa Dynaamisesti muistiin allokoidut rutiinit, joissa ohjelmoija varaa muistin keosta (heap) eroavat pinossa sijaitsevista muuttujista sikäli, että keosta varatut muistialueet ovat jatkuvasti ohjelmoijan koordinoimia. Muistia voidaan varata joko ohjelmointikielen keinoin (esimerkiksi C++:n new) tai käyttäen kirjastorutiineja (esimerkiksi C:n malloc). Jälkimmäiset saattavat olla järjestelmäkohtaisia, ja niiden toteutus voi vaihdella rajustikin. Esimerkiksi seuraava koodirivi varaa muuttujan verran muistia keosta: int* x = (int*) malloc(sizeof(int)); *x = 0; Dynaamisesti keosta varattuja muuttujia (ja niille varattuja muistialueita) ei (yleensä) vapauteta automaattisesti läheskään kaikissa ohjelmointikielissä, vaan ohjelmoija joutuu itse tekemään päätöksen siitä, milloin muistialue voidaan vapauttaa.

12 62 Sulautettu ohjelmointi 3.5 Dynaamisen muistin hallinta osana ohjelmistosuunnittelua Dynaamisen muistin käyttöä koetetaan välttää sulautetuissa järjestelmissä, koska siihen liittyvien virheiden tekeminen on liiankin helppoa. Lisäksi virheet voivat ilmetä vasta pitkän ajan jälkeen, ja niiden löytäminen on vaikeaa. Kolmas syy dynaamisen muistin välttämiseen on siinä, että sen ylläpito vie paljon aikaa, ja muistin käyttöasteesta ja pirstoutumisesta riippuen sopivankokoisen muistin löytämisen aika vaihtelee, mikä taas on ongelma reaaliaikajärjestelmissä Joitakin tyypillisiä haasteita Tyypillisiä virheitä ovat jäänneviittaukset eli viittaukset jo vapautettuihin alkioihin, jotka on pahimmassa tapauksessa jo uudestaan käytössä, ja roskaantuminen eli se, että käyttämätöntä muistia ei vapauteta. Edellisistä jäänneviittaukset ilmenevät yleensä nopeasti ohjelman toiminnan sotkeentumisena, mutta roskaantuminen voi ilmoittaa itsestään vasta hyvinkin pitkän ajan kuluttua. Hoitamaton roskaantuminen aiheuttaa väistämättä muistin loppumisen, mikäli laite on päällä tarpeeksi pitkään. Valitettavasti tarvittava aika voi olla niin pitkä, ja roskaamisen aikaansaamiseksi tarvittavat operaatiot voivat olla niin monimutkaisia, että kaikkia mahdollisia ongelmia on mahdoton löytää järjestelmää testaamalla. Kolmas melko tavallinen ongelma, joka liittyy dynaamiseen muistin varaamiseen, on muistin pirstoutuminen. Pirstoutumisella tarkoitetaan eri kokoisten muistialueiden varaamisen ja vapauttamisen aiheuttamia eri kokoisia varattuja ja vapaita muistialueita. Toisin kuin jäänneviittaukset ja roskaantuminen, pirstoutuminen ei välttämättä johdu varsinaisesta sovellusohjelmoijan ohjelmointi- tai suunnitteluvirheestä, vaan pikemminkin siitä, miten dynaamisen muistin varausrutiinit on toteutettu ja miten niitä sovelluksesta käytetään. Ongelmia voi yleensä välttää pyrkimällä vapauttamaan muisti mahdollisimman aikaisin, ja varaamalla tarvittava muisti mahdollisimman myöhään. Tällöin parhaiten tarkoitukseen sopiva muistialue voidaan yleensä löytää helpommin. Turvallinen kompromissiratkaisu dynaamisuuden, joustavuuden ja staattisen varauksen turvallisuuden välillä on varata kaikki dynaaminen tila heti käynnistysvaiheessa, jonka jälkeen dynaamisia varauksia ei enää tehdä. Valitettavasti tämä ratkaisu ei aina ole mahdoll-

13 Muistin hallinta 63 inen, sillä usein se rajoittaa huomattavasti mahdollisten toimintojen määrää. Seuraavassa esitellään joitakin tapoja ja näkökulmia dynaamisen muistin käsittelemiseen sulautetussa ympäristössä Vain varauksia -vaihtoehto Tämä vaihtoehto on yksinkertaisin kaikista vaihtoehdoista. Se ei silti ole täysin poissuljettu, sillä dynaamista muistinvarausta saatetaan käyttää vain siksi, että laite olisi parametroitava. Tällöin muistivaraukset tehdään kaikki käynnistysvaiheessa, eikä tämän jälkeen sen koommin varata kuin vapautetakaan muistia. Vain varauksia sisältävä toteutus on varsin yksinkertainen, mikäli niin halutaan. Toteutukseen ei tarvita kuin kaksi muuttujaa: address alkumuisti; int koko; Alustusrutiinin tehtävänä on alustaa nämä muistipaikat siten, että alkumuisti osoittaa dynaamisen muistialueen alkuun ja koko sisältää vapaana olevan muistin koon. Vaikka sovellukset eivät dynaamista muistia tarvitsisikaan, tällä tavoin voi käyttöjärjestelmä varata prosessien tarvitsemat pinot. Itse varausrutiini palauttaa NULLin, mikäli muistia ei ole haluttua määrää, muutoin se palauttaa muistin alkuosoitteen: address malloc (int varaa) { address apu; if (varaa > koko) { return NULL; } apu = alkumuisti; alkumuisti += varaa; koko -= varaa; return apu; } Jokaiselle prosessille voidaan antaa oma dynaaminen muistialue, joka varataan tällaisen rutiinin avulla ja josta edelleen kukin prosessi varaa muistia tällä samalla tai muilla rutiineilla. Vain varauksia -vaihtoehto on usein paras mahdollinen ratkaisu, kun halutaan rakentaa järjestelmä, jonka toimintaa on mahdollista testata hyvin huolellisesti. Voidaan jopa ajatella, että kyseessä on yksi ainoa tietorakenne, joka sisältää kaikki ohjelman tarvitsemat muuttujat.

14 64 Sulautettu ohjelmointi Tämän jälkeen testaamisessa tarvittavat erilaiset tilat on huomattavasti helpompi rakentaa kuin mitä dynaamisia muistinvarauksia tehdessä kävisi Sekä varauksia että vapautuksia Dynaamiselle muistille on olemassa monta erilaista ratkaisua. Näitä menetelmiä on käsitelty tarkemmin algoritmikursseilla. Kaikissa järjestelmissä tarvitaan varsinaisen hyötykuorman lisäksi hallinnollista tietoa, mitä ei tarvittu juurikaan edellä olleessa vain varauksia sallivassa vaihtoehdossa. Eri ratkaisut suhtautuvat hieman eri tavoin siihen, miten helposti muisti pirstoutuu pienemmiksi paloiksi. Mikäli varattava muistialue on aina saman kokoinen, tilanne yksinkertaistuu huomattavasti. Tällaisen järjestelmän alustuksessa muistialueista muodostetaan yksisuuntainen linkkilista, josta varaus ja vapauttaminen käyvät hyvin yksinkertaisesti: address vapaa; /* Alustetaan vapaan tilan alkuun */ address varaa () { alkio *v; if (vapaa == NULL) { return NULL; } v = vapaa; vapaa = vapaa->seuraava; return (address) v; } void vapauta (address vapautettava) { alkio *v = (alkio *) vapautettava; v->seuraava = vapaa; vapaa = v; return; } Hyvänä puolena on sekin, että vaikka linkkilistan ylläpitoon tarvitaan osoitin, osoitinta ei tarvita muistin ollessa käytössä. Varjopuolena on siis se, että varattavien muistialkioiden tulee olla samansuuruisia. On myös muunlaisia toteutuksia, joihin eri ohjelmointikielet voivat tarjota mahdollisuuksia. Esimerkiksi Ada-kielessä voidaan jokaiselle osoitintyypille varata oma altaansa, josta tyypin dynaamiset muuttujat varataan. Näissä varauksissa voidaan käyttää hyväksi tämäntyyppistä optimointimahdollisuutta tarvittaessa, mutta siirrettävyys- ja

15 Muistin hallinta 65 ylläpidettävyyssyistä kannattaa yleisesti ottaen mieluummin pyrkiä hyvään lopputulokseen ohjelmistosuunnittelun keinoin yksittäisten työkalujen ja työkaluversioiden tarjoamien mahdollisuuksien hyödyntämisen sijaan. Kannattaa myös ottaa huomioon, että muistinvaraus on usein suorituskyvyn kannalta raskas operaatio. Tästä syystä joskus toimitaan siten, että samalla muistinvarauksella varataan tilaa usealle tietorakenteelle, jotka sitten voidaan sijoittaa samaan varattuun muistialkioon. Tällöin saavutetaan myös jonkin verran etua välimuistin suhteen, sillä yhteen tietorakenteeseen viitattaessa saattaa käydä niin, että koko muistialkio haetaan välimuistiin, ja muihin tietorakenteisiin viittaaminen on siten nopeampaa Muistinhallinnan algoritmeista On huomattava, että olio-ohjelmointi tuo luonnostaan dynaamisia alkioita järjestelmään. Tällöin dynaamista muistia on käytännössä pakko käyttää. Edelläolevista algoritmeista ei oikein ole tähän tilanteeseen apua, vaan on parempi käyttää jotain tehokkaampaa menetelmää. Muistinkäytön kannalta tehokkaimmasta päästä on algoritmi, joka linkkilistaa läpikäydessään ottaa ensimmäisen tarpeeksi suuren lohkon (first fit -algoritmi). Tämän algoritmin ongelma on siinä, että pahimmillaan sopivan kokoisen muistialkion löytämiseksi täytyy selata koko linkkilista läpi. Lisäksi muistia vapautettaessa pitää osata yhdistää vierekkäiset vapaat lohkot yhteen. Yksi suhteellisen hyvä menetelmä on binaarinen vieruskaverimenetelmä (binary buddy system), jossa yhdistäminen on helppoa. Algoritmeja ja niiden keskeisimpiä ominaisuuksia käsitellään tarkemmin tietorakenteiden kursseilla, joten niihin ei paneuduta tämän tarkemmin tässä yhteydessä Dynaaminen muisti monelle prosessille Yksinkertaisinta on pitää kullekin prosessille omaa dynaamisen muistin aluetta, josta se varaa muistia. Tällöin kyseinen prosessi ja sen suunnittelijat ovat vastuussa prosessin muistinkulutuksesta. On myös mahdollista asettaa rajat prosessin haltuun annettavalle muistialueelle. Tämä mahdollistaa sen, että kokonaisjärjestelmän muistinkulutusta on mahdollista arvioida jo silloin, kun järjestelmää ollaan rakentamassa. Lisäksi, kun suunnittelijat tietävät käytettävissä olevan muistin määrän, on muistinkulutusta helpompi optimoida. Myös testattavuuteen liittyvät

16 66 Sulautettu ohjelmointi syyt puoltavat sitä, että jokaiselle prosessille allokoidaan tietty alue sulautettua järjestelmää rakennettaessa. Toisaalta etukäteen suoritettu muistin allokointi eri prosesseille on joskus hyvin rajoittavaa. Paljon joustavampi ratkaisu on luoda yksi ainoa dynaamisen muistin alue, jolta kaikki varaavat muistia. Tällöin tulee varaus- ja vapautusrutiineissa muistaa huolehtia poissulkemisesta, sillä muussa tapauksessa sama muistialue voi päätyä usean eri prosessin käyttöön. Uusien virhemahdollisuuksien lisäksi myös testaaminen vaikeutuu merkittävästi, sillä järjestelmän kokonaistilaa ei voida enää konstruoida yksittäisten sovellusten tilan yhdistelmänä, vaan myös dynaamisen muistin varaustilanne on otettava huomioon. Mikäli prosessit voivat päättyä, eikä voida luottaa siihen, että ne vapauttavat muistinsa, hallintatietoon tulee lisätä muistin varanneen prosessin tunnus, jolloin dynaaminen muistitila voidaan prosessin päättyessä vapauttaa. Tämä tieto voidaan kerätä myös prosessin kuvaajaan (prosessielementtiin). Mikäli käytettävissä on jonkinlainen käyttöjärjestelmä, eikä ohjelmistoa toteuteta suoraan laitteiston päälle, tarjoaa käyttöjärjestelmä yleensä riittävät palvelut yllä mainittujen tehtävien suoritukselle Roskaantuminen Muistin roskaantuminen on yksi suurimpia ongelmia, mikäli järjestelmä käyttää aktiivisesti dynaamista muistia ja se on päällä pitkiä aikoja yhteen menoon. Tällöin muistia varataan ja vapautetaan useita kertoja, ja pienetkin virheet muistinhallintaan liittyvissä rutiineissa voivat johtaa ongelmiin kumuloituessaan ajan kuluessa. Roskaantumiseen liittyvien ongelmien pienentämiseksi on mahdollista toteuttaa erilaisia rutiineja, joiden avulla järjestelmä voi itse yrittää vapauttaa tarpeettomia, mutta edelleen varattuja muistialkioita. Mikäli muistipalat ovat keskenään samanlaisia kuten kohdan esimerkkitapauksessa, voidaan melko helposti merkitä sellaiset alkiot, joihin on vielä olemassa viittaus aktiivisista muuttujista. Joissain kielissä, kuten Lispissä, tämä on suorastaan kieleen sisäänrakennettu ominaisuus, olkoonkin että Lisp on äärimmäisen harvinainen sulautetuissa järjestelmissä. Ehkä parempi esimerkki on Java, jossa muistinhallinta huolehtii roskien keruusta automaattisesti. Roskien keruuta varten on olemassa useita algoritmeja, joiden toiminta voidaan jakaa karkeasti kahteen kategoriaan. Näistä yksinkertaisempi, niin sanottu stop-the-world-roskienkeruu, perustuu siihen,

17 Muistin hallinta 67 että ohjelman suoritus pysäytetään, käyttämättömät varatut muistialueet vapautetaan, ja sitten ohjelman suoritusta jatketaan. Toinen perusvaihtoehto on suorittaa roskienkeruurutiinia koko ajan rinnakkain ohjelman suorituksen kannalta, mikä on huomattavasti monimutkaisempaa kuin roskien keruu käyttäen stop-the-world-tyyppistä algoritmia. Koska sulautettu järjestelmä on yleensä reaaliaikainen, järjestelmää ei ole vara pysäyttää satunnaisena ajankohtana roskienkeruuta varten. Tämän takia, mikäli mahdollista, roskienkeruuta ajetaan rinnakkain sovelluksen kanssa. Algoritmeja on useita, joista osa perustuu käytössä olevien olioiden kopiointiin ja vanhojen muistialueiden vapauttamiseen, osa käytettyjen alueiden merkkaamiseen ja muiden vapauttamiseen (niin sanottu mark-and-sweep), ja osa hyödyntää viitteiden laskentaa. Lisäksi näiden algoritmien erilaiset kombinaatiot ja olioiden eliniän huomiointi ovat mahdollisia, esimerkiksi siten, että koska suurin osa olioista elää vain vähän aikaa, vastikään luotujen olioiden roskankeruussa voidaan hyödyntää algoritmia, joka siivoaa selvät tapaukset nopeasti, ja jo pitkään olemassa olleiden olioiden roskienkeruu puolestaan voi olla hitaampaa mutta huolellisempaa Ohjelmointikielistä dynaamisen muistin kannalta Kolmesta ehkä sulautettujen järjestelmien kannalta tärkeimmästä kielestä (C, C++, Java) C on dynaamisten ominaisuuksien osalta turvallisin, sillä ohjelmoija pystyy siinä täysin päättämään siitä, milloin dynaamista muistia käytetään. C++ on C-kieltä sikäli "vaarallisempi", että se saattaa yllättää ohjelmoijan siinä, milloin se varaa ja vapauttaa dynaamista muistia. Samoin rakentajien ja purkajien suoritus saattaa joissain tilanteissa yllättää ohjelmoijan, sillä uusia olioita saattaa joissakin tilanteissa syntyä vahingossa. Java on näistä vaihtoehdoista ongelmallisin, koska käyttäjä ei voi pakottaa muistin vapauttamista tiettyyn hetkeen ohjelmallisesti. Näin muistin vapauttaminen voi yllättää pahassa paikassa. Javasta on kuitenkin olemassa myös deterministisempi ja reaaliaikajärjestelmien kannalta soveliaampi versio Real-Time Specification for Java (JSR-001), jota käyttäen myös Javaa voidaan käyttää vaativienkin sulautettujen järjestelmien toteuttamisessa. Yllä mainittujen kielten lisäksi Ada-kieltä on käytetty jonkin verran erityisesti ilmailussa ja avaruusteknologiassa. Kieli tarjoaa suuren

18 68 Sulautettu ohjelmointi joukon erilaisia ominaisuuksia, ja eri ajoajan ympäristöt tarjoavat niistä suorituskyvyltään ja muistinkulutukseltaan vaihtelevia toteutuksia. Tästä syystä voidaan kielen tarjoamien ominaisuuksien joukkoa rajoittaa sellaiseen alijoukkoon, joka tarjoaa riittävän ilmaisuvoiman, mutta joka takaa riittävästi ennustettavuutta liittyen dynaamisen muistin käyttöön. Esimerkiksi kielen tarjoaman tehtävämekanismin sijaan voidaan päätyä käyttämään sovellusympäristön tarjoamia prosesseja, tai poikkeusten käyttö voi olla rajoitettua. Samaan tapaan on tietysti mahdollista rajata myös muiden kielten ominaisuuksia sovelluskohteeseen mahdollisimman hyvin sopivaksi käyttäen erilaisia ohjelmointikäytäntöjä. Lisäksi monet ympäristöt tarjoavat mahdollisuuden käyttää jotain dynaamista ohjelmointikieltä sovellusohjelmointiin skriptinomaisesti. Tällaisilla ohjelmointikielillä toteutetut ohjelmat ja niiden ajoajan ympäristön ominaisuudet ovat yleensä melko vaikeasti ennakoitavissa. Tästä syystä näitä ympäristöjä käytetään lähinnä tarjoamaan jonkinasteista laajennettavuutta ja konfiguroituvuutta, jota olisi vaikea toteuttaa muuten. 3.6 Muistinhallintayksikkö ja välimuisti Varsinaisten muistipiirien lisäksi myös muistinhallintayksikkö ja välimuisti voidaan laskea osaksi muistinhallintaan käytettyä laitteistoa. Käymme seuraavassa läpi nämä toiminnot pääpiirteissään Muistinhallintayksikkö Muistinhallintayksikön (MMU, Memory Management Unit) päätehtävänä on suojata prosesseja toisiltaan ja saada kunkin prosessin muisti pidettyä hallinnassa eli kätkeä mahdolliset epäjatkuvuuskohdat fyysisessä muistissa ja saada kaikkien prosessien muisti näyttämään rakenteeltaan samankaltaiselta. Vaikka muistinhallintayksikön yhteydessä puhutaan virtuaaliosoitteista (joskus loogisista osoitteista), tämä ei välttämättä tarkoita, että koneessa olisi käytössä virtuaalimuisti. Muistinhallintayksikön toiminta Muistinhallintayksiköt ovat hyvinkin erilaisia. Käyttöjärjestelmäkirjoissa on esitelty näitä tarkemmin. Tyypillisesti muistinhallintayksikkö sisältää erilliset rekisterit käyttäjä- ja käyttöjärjestelmätiloille (muuten

19 Muistin hallinta 69 keskeytykset voisivat olla hankalia). Kumpaakin tilaa varten voi olla erilliset muunnokset datalle ja koodille. Edelleen osoitteen jakautuminen osiin on tyypillisesti ohjelmoitavissa (esimerkiksi sivunpituutta voi muuttaa). Muistinhallintayksikkö sisältää myös TLB:n (Table Lookahead Buffer), joka voi esiintyä myös hieman erinimisenä (esimerkiksi ATC, Address Translation Cache). Muistiviittauksen tullessa TLB:stä tarkastetaan, onko viitatun sivun tiedot valmiina ja jos on, muunnos tapahtuu heti ilman lisäkuormaa. Jos tulee huti, muistinhallintayksikkö generoi viittauksia keskusmuistiin, joiden avulla osoitteenmuunnokseen tarvittava tieto siirretään muistinhallintayksikölle. Näiden siirtojen jälkeen jatketaan kuin hutia ei olisi ollutkaan. Jos sivua ei löydy, generoidaan virhekeskeytys, samoin, jos sivun suojauksia loukataan. Muistinhallintayksikössä yhteisen muistin hallintaan voi olla erikoispiirteitä. Esimerkkimuistinhallintayksikkö kuvassa 3.1 on kaksitasoiseen sivutauluun perustuva. Tasoja voi olla useampiakin, mutta tavallisesti kaksi tasoa riittää. Taulun juuri Virtuaaliosoite taulun A indeksi taulun B indeksi siirtymä A-taulu B-taulu sivutaulun osoite & sivutilan numero muistiosoite & Kuva 3.1 Kaksitasoinen sivutaulu Muistinhallintayksikön käyttö Konetta käynnistettäessä muistinhallintayksikkö tiputetaan automaattisesti pois käytöstä. Alustusrutiinit rakentavat käyttöjärjestelmätilan muunnostaulut keskusmuistiin ja herättävät muistinhallintayksikön

20 70 Sulautettu ohjelmointi toimimaan. Vastaavasti prosessia luotaessa kirjoitetaan prosessien muunnostaulut keskusmuistiin. Muistinhallintayksikössä voidaan kertoa sivukohtaisesti muun muassa seuraavia tietoja (vaihtelevat yksiköstä toiseen): miten sivua voi käsitellä käyttöjärjestelmätilassa (luku/kirjoitus) miten sivua voi käsitellä käyttäjätilassa (luku/kirjoitus) onko sivu olemassa onko sivu pinon vai tavallisen muistin osa (vaikuttaa joissain ratkaisuissa laillisen osoitteen laskentaan) käytetäänkö sivulle muunnosta vai päästetäänkö sivun osoitteet suoraan väylälle onko välimuisti päällä vai ei (esimerkiksi oheislaitteiden ohjausja tilarekisterien kohdalla ei saa olla päällä). Prosessia vaihdettaessa muistinhallintayksikön rekisterit tyhjennetään ja uuden muunnostaulun alkuosoite siirretään muistihallintayksikköön, jonka jälkeen laitteisto hakee sivujen tiedot rekistereihin sitä mukaa, kun sivuihin viitataan. Mahdollisia virhetilanteita Muistinhallintayksikön avulla voidaan havaita sellaisia virheitä, joita on erittäin vaikeaa tai jopa mahdotonta huomata ilman sitä. Tällaisia virhetilanteita ovat muun muassa kirjoittaminen ohjelmakoodin päälle, joka ei välttämättä vaikuta mitään, jos muisti on lukumuistia, mutta kyseessä on silti virhe, sillä onhan selvää, ettei se tarkoitettukaan muistipaikka päivity tässä tilanteessa. Yleisin havaittu virhe lienee se, että osoitteenmuunnoksen aikana havaitaan, että osoitetta vastaavaa sivua ei ole olemassa. Mikäli kyseessä on virtuaalimuistijärjestelmä, käsitellään tämä tilanteesta riippuen joko aitona virheenä tai läsnäolokeskeytyksenä. Jos kyseessä on läsnäolokeskeytys, viittauksen käsittelyä jatketaan virtuaalimuistin käsittelyn tapaan. Jos taas kyseessä on aito virhe, se aiheuttaa ytimestä ja sen palveluista riippuen joko ohjelman päättämisen tai signaalin lähettämisen ohjelmalle. Tällöin voidaan generoida bus error tai muu vastaava virhe. Sulautetuissa ja reaaliaikajärjestelmissä virtuaalimuisti on harvinainen, koska se aiheuttaa ajoituksen ennustamiseen ongelmia. Tämän takia emme käsittele virtuaalimuistia tämän enempää. Tarkempia kuvauksia löytyy mistä tahansa käyttöjärjestelmäkirjasta.

Arto Salminen, arto.salminen@tut.fi

Arto Salminen, arto.salminen@tut.fi 3. Luento: Muistin hallinta Arto Salminen, arto.salminen@tut.fi Agenda Mitä väliä? Erityyppiset muistit Ohjelman sijoittelu muistiin Ohjelman sisäinen muistinhallinta Muistinhallintayksikkö Välimuisti

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

Käyttöjärjestelmän rakenne

Käyttöjärjestelmän rakenne Käyttöjärjestelmän rakenne Tietokonejärjestelmä = Laitteisto + ohjelmisto Sovellus saa laitteiston käyttöönsä kj:n avustuksella CPU ja muisti Oheislaitteet KJ tarjoaa laitteiston käytössä tarvittavat palvelunsa

Lisätiedot

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

Lisätiedot

OHJ-4301 Sulautettu Ohjelmointi

OHJ-4301 Sulautettu Ohjelmointi OHJ-4301 Sulautettu Ohjelmointi (http://www.cs.tut.fi/~sulo/) 5op, to 12-14, TB 109 Arto Salminen, arto.salminen@tut.fi Läpäisyvaatimukset Hyväksytysti suoritetut: Tentti Harjoitustyöt Harjoitustyöt 3

Lisätiedot

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14 Arkkitehtuurikuvaus Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy Ryhmä 14 Muutoshistoria Versio Pvm Päivittäjä Muutos 0.4 1.11.2007 Matti Eerola 0.3 18.10.2007 Matti Eerola 0.2

Lisätiedot

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100 Tiedonsiirtokäskyt LOAD LOAD-käsky toimii jälkimmäisestä operandista ensimmäiseen. Ensimmäisen operandin pitää olla rekisteri, toinen voi olla rekisteri, vakio tai muistiosoite (myös muuttujat ovat muistiosoitteita).

Lisätiedot

Tietokoneen muisti nyt ja tulevaisuudessa. Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu

Tietokoneen muisti nyt ja tulevaisuudessa. Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu Tietokoneen muisti nyt ja tulevaisuudessa Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu Yleisesti Muisti on yksi keskeisimmistä tietokoneen komponenteista Random Access Memory on yleistynyt

Lisätiedot

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä.

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä. Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä. On arvioitu, että maailmassa on tällä hetkellä enemmän sulautettuja

Lisätiedot

MUISTIPIIRIT H. Honkanen

MUISTIPIIRIT H. Honkanen MUISTIPIIRIT H. Honkanen Puolijohdemuistit voidaan jaotella käyttötarkoituksensa mukaisesti: Puolijohdemuistit Luku- ja kirjoitusmuistit RAM, Random Access Memory - Käytetään ohjelman suorituksen aikaisen

Lisätiedot

2 Konekieli, aliohjelmat, keskeytykset

2 Konekieli, aliohjelmat, keskeytykset ITK145 Käyttöjärjestelmät, kesä 2005 Tenttitärppejä Tässä on lueteltu suurin piirtein kaikki vuosina 2003-2005 kurssin tenteissä kysytyt kysymykset, ja mukana on myös muutama uusi. Jokaisessa kysymyksessä

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

4. Luento: Prosessit ja säikeets. Tommi Mikkonen, tommi.mikkonen@tut.fi

4. Luento: Prosessit ja säikeets. Tommi Mikkonen, tommi.mikkonen@tut.fi 4. Luento: Prosessit ja säikeets Tommi Mikkonen, tommi.mikkonen@tut.fi Agenda Prosessi Säikeet Keskeytykset Keskeytyskäsittely Käyttöjärjestelmäkutsut Prosessielementti Prosessin hallinta Suunnittelunäkökohtia

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen, tommi.mikkonen@tut.fi

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen, tommi.mikkonen@tut.fi 5. Luento: Rinnakkaisuus ja reaaliaika Tommi Mikkonen, tommi.mikkonen@tut.fi Agenda Perusongelmat Jako prosesseihin Reaaliaika Rinnakkaisuus Rinnakkaisuus tarkoittaa tässä yhteydessä useamman kuin yhden

Lisätiedot

Käyttöjärjestelmät: prosessit

Käyttöjärjestelmät: prosessit Käyttöjärjestelmät: prosessit Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Lähteet Stallings, W. Operating Systems Haikala, Järvinen, Käyttöjärjestelmät Eri Web-lähteet Käyttöjärjestelmä

Lisätiedot

1. Keskusyksikön rakenne

1. Keskusyksikön rakenne 1. Keskusyksikön rakenne Kuvassa on esitelty TTK-91 esimerkkikoneen keskusyksikkö. Oikeiden tietokoneiden keskusyksiköt ovat luonnollisesti monimutkaisempia, mutta tämä riittää oikein mainiosti asian havainnollistamiseen.

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

9. Luento: Ohjelmistotyö. Tommi Mikkonen, tommi.mikkonen@tut.fi

9. Luento: Ohjelmistotyö. Tommi Mikkonen, tommi.mikkonen@tut.fi 9. Luento: Ohjelmistotyö Tommi Mikkonen, tommi.mikkonen@tut.fi Agenda Johdanto Ristikäännös Testaus ja virheen jäljitys Yleensä Kehitysympäristössä Käyttöympäristössä Laitteiston testaus Iteratiivisesta

Lisätiedot

Tietokoneen rakenne: Harjoitustyö. Motorola MC68030 -prosessori

Tietokoneen rakenne: Harjoitustyö. Motorola MC68030 -prosessori kevät 2004 TP02S-D Tietokoneen rakenne: Harjoitustyö Motorola MC68030 -prosessori Työn valvojat: Seppo Haltsonen Pasi Lankinen RAPORTTI 13.5.2004 Sisällysluettelo sivu Tiivistelmä... 1 Lohkokaavio... 2

Lisätiedot

2. Olio-ohjelmoinista lyhyesti 2.1

2. Olio-ohjelmoinista lyhyesti 2.1 2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

1 Tehtävän kuvaus ja analysointi

1 Tehtävän kuvaus ja analysointi Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.

Lisätiedot

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön? Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön? 2013-2014 Lasse Lensu 2 Systeemiohjelmat ovat tietokoneen laitteistoa lähellä olevia ohjelmia,

Lisätiedot

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen

Lisätiedot

Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle,

Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle, Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle, sovellusohjelmille ja käyttäjille? 2012-2013 Lasse Lensu

Lisätiedot

Muistihierarkia Kiintolevyt I/O:n toteutus

Muistihierarkia Kiintolevyt I/O:n toteutus Luento 8 (verkkoluento 9) Järjestelmän ulkoinen muisti I/O Muistihierarkia Kiintolevyt I/O:n toteutus 1 Muistihierarkia Ulkoinen muisti (levymuisti) on halvempaa toteuttaa per tavu Ulkoinen muisti on paljon

Lisätiedot

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla ohjelmoida useita komponenteiltaan ja rakenteeltaan

Lisätiedot

LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA

LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA Tavallisimmin lukuja käsittelevien datasanojen tyypiksi kannattaa asettaa kokonaisluku 16 bitin INT, jonka vaihtelualueeksi tulee

Lisätiedot

Taulukot. Jukka Harju, Jukka Juslin 2006 1

Taulukot. Jukka Harju, Jukka Juslin 2006 1 Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti

Lisätiedot

Väylät. Prosessorin tie ulkomaailmaan Pienissä järjestelmissä vain yksi väylä. Osoite, data ja ohjaussignaalit Prosessori ainoa herra (master)

Väylät. Prosessorin tie ulkomaailmaan Pienissä järjestelmissä vain yksi väylä. Osoite, data ja ohjaussignaalit Prosessori ainoa herra (master) Prosessorin tie ulkomaailmaan Pienissä järjestelmissä vain yksi väylä Prosessoriväylä Osoite, data ja ohjaussignaalit Prosessori ainoa herra (master) Suuremmissa erillisiä väyliä Muistiväylä Oheislaiteväylät

Lisätiedot

Tietojenkäsittelyn perusteet 2. Lisää käyttöjärjestelmistä

Tietojenkäsittelyn perusteet 2. Lisää käyttöjärjestelmistä Tietojenkäsittelyn perusteet 2 Lisää käyttöjärjestelmistä 2011-02-09 Leena Ikonen 1 Systeemiohjelmat Systeemiohjelmiin kuuluvat Kääntäjät ja tulkit (+debuggerit) Käyttöjärjestelmä Linkittäjät Lataajat

Lisätiedot

Olio-ohjelmointi Javalla

Olio-ohjelmointi Javalla 1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi

Lisätiedot

Dynaaminen muisti Rakenteiset tietotyypit

Dynaaminen muisti Rakenteiset tietotyypit C! Dynaaminen muisti Rakenteiset tietotyypit 1.3.2016 Agenda Kertausta Dynaaminen muisti Valgrind-perusteet ja esimerkkejä Yhteenveto tietorakenteista Vilkaisu 3. kierroksen tehtäviin Esim: miten linkitetty

Lisätiedot

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, että se pystyy suorittamaan kaikki mahdolliset algoritmit?

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

Lisätiedot

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille: Merkkijonot C-kielessä merkkijono on taulukko, jonka alkiot ovat char -tyyppiä. Taulukon viimeiseksi merkiksi tulee merkki '\0', joka ilmaisee merkkijonon loppumisen. Merkkijono määritellään kuten muutkin

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

IT K 1 45 K ä yt t öj ä rj estelmät

IT K 1 45 K ä yt t öj ä rj estelmät IT K 1 45 K ä yt t öj ä rj estelmät Tenttikysymyksiä ja vastauksia Aliohjelman suoritusperiaate, ts. selvitä pinon käyttö ja paluuarvon välittäminen (3p) 1. Ennen aliohjelman aloittamista kutsuja tallettaa

Lisätiedot

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

Lisätiedot

Zeon PDF Driver Trial

Zeon PDF Driver Trial Matlab-harjoitus 2: Kuvaajien piirto, skriptit ja funktiot. Matlabohjelmoinnin perusteita Numeerinen integrointi trapezoidaalimenetelmällä voidaan tehdä komennolla trapz. Esimerkki: Vaimenevan eksponentiaalin

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

CT50A2602 Käyttöjärjestelmät Seminaarityö. Tietokoneen muisti nyt ja tulevaisuudessa

CT50A2602 Käyttöjärjestelmät Seminaarityö. Tietokoneen muisti nyt ja tulevaisuudessa CT50A2602 Käyttöjärjestelmät Seminaarityö Tietokoneen muisti nyt ja tulevaisuudessa Jyrki Eurén Raimo Asikainen Janne Laitinen Teppo Lapinkoski Manu Toivanen Pasi Ruuth Johdanto Taustaa Työn taustana ryhmän

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä

Lisätiedot

Osio 2: Luennot 4-7 Muistinhallinta YKSINKERTAINEN MUISTINHALLINTA. ltöä YLEISTÄ MUISTINHALLINNASTA. Looginen muisti.

Osio 2: Luennot 4-7 Muistinhallinta YKSINKERTAINEN MUISTINHALLINTA. ltöä YLEISTÄ MUISTINHALLINNASTA. Looginen muisti. Käyttöjärjestelmät t I Osio 2: Luennot 4-7 Muistinhallinta Tiina Niklander; kalvot Auvo Häkkinen YKSINKERTAINEN MUISTINHALLINTA Stallings, Luku 7 Tietojenkäsittelytieteen laitos Helsingin yliopisto KJ-I

Lisätiedot

Tietokonejärjestelmä. Tietokoneen rakenne. Ch 1 - Ch 8 [Sta06] Valikoituja paloja. TITO-kurssista. John von Neumann ja EDVAC, 1949.

Tietokonejärjestelmä. Tietokoneen rakenne. Ch 1 - Ch 8 [Sta06] Valikoituja paloja. TITO-kurssista. John von Neumann ja EDVAC, 1949. Tietokoneen rakenne Luento 1 Tietokonejärjestelmä Ch 1 - Ch 8 [Sta06] Valikoituja paloja John von Neumann ja EDVAC, 1949 TITO-kurssista Luento 1-1 Sisältöä Tietokonejärjestelmä KJ:n näkökulma laitteistoon

Lisätiedot

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu Taulukot Taulukon määrittely ja käyttö Taulukko metodin parametrina Taulukon sisällön kopiointi toiseen taulukkoon Taulukon lajittelu esimerkki 2-ulottoisesta taulukosta 1 Mikä on taulukko? Taulukko on

Lisätiedot

Agenda. Johdanto Ominaispiirteitä Kokonaisjärjestelmän määrittely Eri alojen edustajien roolit Sulautetut järjestelmät ja sulautettu ohjelmointi

Agenda. Johdanto Ominaispiirteitä Kokonaisjärjestelmän määrittely Eri alojen edustajien roolit Sulautetut järjestelmät ja sulautettu ohjelmointi 1. Luento: Sulautetut Järjestelmät Arto Salminen, arto.salminen@tut.fi Agenda Johdanto Ominaispiirteitä Kokonaisjärjestelmän määrittely Eri alojen edustajien roolit Sulautetut järjestelmät ja sulautettu

Lisätiedot

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006 TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa

Lisätiedot

6.3. AVR_rauta. EEPROM-muisti 09.12.2007 pva

6.3. AVR_rauta. EEPROM-muisti 09.12.2007 pva 6.3. AVR_rauta. EEPROM-muisti 09.12.2007 pva Experience is what causes people to make new mistakes instead of old ones... - Unknown Sisältö Yleistä EEPROM-rekisterit Protoilu-ohje EEPROMmista ja Fuse-biteistä

Lisätiedot

Tiedon muuttumattomuuden tarkistus Järjestelmän sisäinen muisti

Tiedon muuttumattomuuden tarkistus Järjestelmän sisäinen muisti Luento 7 (verkkoluento 7) Tiedon muuttumattomuuden tarkistus Järjestelmän sisäinen muisti Pariteetti, Hamming-koodi Välimuisti, muisti 1 Tiedon tarkistus Tiedon oikeellisuutta ei voi tarkistaa yleisessä

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,

Lisätiedot

ohjelman arkkitehtuurista.

ohjelman arkkitehtuurista. 1 Legacy-järjestelmällä tarkoitetaan (mahdollisesti) vanhaa, olemassa olevaa ja käyttökelpoista ohjelmistoa, joka on toteutettu käyttäen vanhoja menetelmiä ja/tai ohjelmointikieliä, joiden tuntemus yrityksessä

Lisätiedot

Järjestelmän ulkoinen muisti I/O

Järjestelmän ulkoinen muisti I/O Luento 9 (verkkoluento 9) Järjestelmän ulkoinen muisti I/O Muistihierarkia Kiintolevyt I/O:n toteutus 1 Muistihierarkia Ulkoinen muisti (levymuisti) on halvempaa toteuttaa per tavu Ulkoinen muisti on paljon

Lisätiedot

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne. Proseduurit Proseduuri voi olla 1) Funktio, joka palauttaa jonkin arvon: real function sinc(x) real x sinc = sin(x)/x... y = sinc(1.5) 2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman

Lisätiedot

Sivu 1/5 Mitä CD- tai DVD-muotoa tulisi käyttää? Tässä artikkelissa Tarpeita vastaavan levyn ja muodon valinta Tietoja Live File Systemin ja masteroidun levymuodon eroista Miksi Live File System -muodosta

Lisätiedot

5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma

5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma 5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma Every cloud has a silver line. - englantilainen sananlasku Tässä osiossa tärkeää: yksi- ja moniulotteinen taulukko Sisältö Yleistä Yksiulotteinen

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

Käyttöjärjestelmät. Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi

Käyttöjärjestelmät. Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Käyttöjärjestelmät Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Lähteet Stallings, W. Operating Systems Haikala, Järvinen, Käyttöjärjestelmät Eri Web-lähteet Kurssin sisältö Johdanto, historiaa

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

etunimi, sukunimi ja opiskelijanumero ja näillä

etunimi, sukunimi ja opiskelijanumero ja näillä Sisällys 1. Algoritmi Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.1 1.2 Algoritmin määritelmä Ohjelmointi

Lisätiedot

1. Algoritmi 1.1 Sisällys Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. Muuttujat ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.2 Algoritmin määritelmä Ohjelmointi

Lisätiedot

4.2 Muistinhallintaa avustava kirjasto Tutnew

4.2 Muistinhallintaa avustava kirjasto Tutnew 48 Harjoitustöiden laadun kehittäminen [5] Edison Design Group. 2000. Compiler Front Ends for the OEM Market, http://www.edg.com/cpp.html/, 21.8.2001. [6] Henricson, M., & Nyquist E. 1992. Programming

Lisätiedot

1 Kannat ja kannanvaihto

1 Kannat ja kannanvaihto 1 Kannat ja kannanvaihto 1.1 Koordinaattivektori Oletetaan, että V on K-vektoriavaruus, jolla on kanta S = (v 1, v 2,..., v n ). Avaruuden V vektori v voidaan kirjoittaa kannan vektorien lineaarikombinaationa:

Lisätiedot

Muistipiirit. Digitaalitekniikka (piirit) Luku 20 Sivu 1 (24)

Muistipiirit. Digitaalitekniikka (piirit) Luku 20 Sivu 1 (24) Digitaalitekniikka (piirit) Luku 20 Sivu 1 (24) Digitaalitekniikka (piirit) Luku 20 Sivu 2 (24) Johdanto Tässä luvussa esitetään keskeiset muistipiirityypit ja muistipiireihin liittyvät käsitteet mainitaan

Lisätiedot

Asetusvalikossa voidaan määrittää erilaisia tulostimen ominaisuuksia. Lisätietoja saat valitsemalla valikon vaihtoehdon:

Asetusvalikossa voidaan määrittää erilaisia tulostimen ominaisuuksia. Lisätietoja saat valitsemalla valikon vaihtoehdon: Asetusvalikossa voidaan määrittää erilaisia tulostimen ominaisuuksia. Lisätietoja saat valitsemalla valikon vaihtoehdon: Hälytysääni määr Sivunsuojaus 1 Autom. jatko Näytön kieli Tallennuspaikka Tukosselvitys

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

Käyttöjärjestelmät: Virtuaalimuisti

Käyttöjärjestelmät: Virtuaalimuisti Käyttöjärjestelmät: Virtuaalimuisti Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Lähteet Stallings, W. Operating Systems Haikala, Järvinen, Käyttöjärjestelmät Eri Web-lähteet Muistinhallinta

Lisätiedot

Sukupuu -ohjelma. Ossi Väre (013759021) Joni Virtanen (013760641)

Sukupuu -ohjelma. Ossi Väre (013759021) Joni Virtanen (013760641) Sukupuu -ohjelma Ossi Väre (013759021) Joni Virtanen (013760641) 7.11.2011 1 Johdanto Toteutimme C -kielellä sukupuuohjelman, johon käyttäjä voi lisätä ja poistaa henkilöitä ja määrittää henkilöiden välisiä

Lisätiedot

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.

Lisätiedot

TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD)

TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) Ohjelmointikäytännöt 21/3/11 Mikko Vuorinen Metropolia Ammattikorkeakoulu 1 Sisältö 1) Mitä on hyvä koodi? 2) Ohjelmointikäytäntöjen merkitys? 3) Koodin asettelu

Lisätiedot

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Viimeksi muokattu 5. toukokuuta 2012 Maastotietokannan torrent-jakeluun sisältyy yli 5000 zip-arkistoa,

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero

Lisätiedot

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML AJAX-konsepti AJAX Asynchronous JavaScript And XML Viimeisin muoti-ilmiö web-ohjelmoinissa, termi Ajax tuli käyttöön vuoden 2005 aikana Joukko teknologioita, joiden avulla voidaan toteuttaa uudenlaisen

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja

Lisätiedot

Muistimoduulit. Asiakirjan osanumero: 393521-351. Tässä oppaassa kerrotaan tietokoneen muistin vaihtamisesta ja laajentamisesta.

Muistimoduulit. Asiakirjan osanumero: 393521-351. Tässä oppaassa kerrotaan tietokoneen muistin vaihtamisesta ja laajentamisesta. Muistimoduulit Asiakirjan osanumero: 393521-351 Lokakuu 2005 Tässä oppaassa kerrotaan tietokoneen muistin vaihtamisesta ja laajentamisesta. Sisällysluettelo 1 Muistimoduulien lisääminen tai vaihtaminen

Lisätiedot

Testidatan generointi

Testidatan generointi Testidatan generointi Anu Ahonen Kevät 2008 Tämä työ on tehty Creative Commons -lisenssin alla Työn tarkasti 9.4.2008 Jouni Huotari (JAMK/IT) 1 SISÄLTÖ 1 TYÖN LÄHTÖKOHDAT JA TOTEUTUS...2 2 TESTIDATAN GENEROINTI

Lisätiedot

24.9.2015. Työasema- ja palvelinarkkitehtuurit (IC130301) Apumuistit. Kiintolevyt. 5 opintopistettä. Petri Nuutinen

24.9.2015. Työasema- ja palvelinarkkitehtuurit (IC130301) Apumuistit. Kiintolevyt. 5 opintopistettä. Petri Nuutinen Työasema- ja palvelinarkkitehtuurit (IC130301) 5 opintopistettä Petri Nuutinen 5 opintopistettä Petri Nuutinen Apumuistit Tarvitaan ohjelmien ja dokumenttien tallentamiseen, kiintolevyjen varmuuskopiointiin,

Lisätiedot

Muuttujien roolit Kiintoarvo cin >> r;

Muuttujien roolit Kiintoarvo cin >> r; Muuttujien roolit Muuttujilla on ohjelmissa eräitä tyypillisiä käyttötapoja, joita kutsutaan muuttujien rooleiksi. Esimerkiksi muuttuja, jonka arvoa ei muuteta enää kertaakaan muuttujan alustamisen jälkeen,

Lisätiedot

1. Yleistä. 2. Ominaisuudet. 3. Liitännät

1. Yleistä. 2. Ominaisuudet. 3. Liitännät 1. Yleistä SerIO on mittaus ja ohjaustehtäviin tarkoitettu prosessorikortti. Se voi ohjemistosta riippuen toimia itsenäisenä yksikkönä tai tietokoneen ohjaamana. Jälkimmäisessä tapauksessa mittaus ja ohjauskomennot

Lisätiedot

Tietosuojatyöryhmä. Työryhmän 23 päivänä helmikuuta 1999 hyväksymä. suositus 1/99

Tietosuojatyöryhmä. Työryhmän 23 päivänä helmikuuta 1999 hyväksymä. suositus 1/99 5093/98/FI/lopullinen WP 17 Tietosuojatyöryhmä Työryhmän 23 päivänä helmikuuta 1999 hyväksymä suositus 1/99 ohjelmistojen ja laitteistojen Internetissä suorittamasta ei-havaittavasta ja automaattisesta

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap Tietorakenneluokkia ja -rajapintoja Java tarjoaa laajan kokoelman tietorakennerajapintoja ja - luokkia. Aiemmin

Lisätiedot

Datatähti 2009 -alkukilpailu

Datatähti 2009 -alkukilpailu Datatähti 2009 -alkukilpailu Ohjelmointitehtävä 1/3: Hissimatka HUOM: Tutustuthan huolellisesti tehtävien sääntöihin ja palautusohjeisiin (sivu 7) Joukko ohjelmoijia on talon pohjakerroksessa, ja he haluavat

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 16.2.2010 1 / 41 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen

CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen CUDA Moniydinohjelmointi 17.4.2012 Mikko Honkonen Yleisesti Compute Unified Device Architecture Ideana GPGPU eli grafiikkaprosessorin käyttö yleiseen laskentaan. Nvidian täysin suljetusti kehittämä. Vuoden

Lisätiedot

Käyttöjärjestelmät: poissulkeminen ja synkronointi

Käyttöjärjestelmät: poissulkeminen ja synkronointi Käyttöjärjestelmät: poissulkeminen ja synkronointi Teemu Saarelainen Tietotekniikka teemu.saarelainen@kyamk.fi Lähteet Stallings, W. Operating Systems Haikala, Järvinen, Käyttöjärjestelmät Eri Web-lähteet

Lisätiedot

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b Pythonin Kertaus Cse-a1130 Tietotekniikka Sovelluksissa Versio 0.01b Listat 1/2 esimerkkejä listan peruskäytöstä. > lista=['kala','kukko','kissa','koira'] ['kala','kukko','kissa','koira'] >lista.append('kana')

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat

Lisätiedot

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi

Lisätiedot

Luento 2: Tiedostot ja tiedon varastointi

Luento 2: Tiedostot ja tiedon varastointi HELIA 1 (19) Luento 2: Tiedostot ja tiedon varastointi Muistit... 2 Päämuisti (Primary storage)... 2 Apumuisti (Secondary storage)... 2 Tiedon tallennuksen yksiköitä... 3 Looginen taso... 3 Fyysinen taso...

Lisätiedot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan

Lisätiedot