Vaarallisia ohjelmia

ITKA203 Käyttöjärjestelmät -kurssin Vapaaehtoinen Bonusdemo 1 keväällä 2015. Paavo Nieminen / Jyväskylän yliopiston Tietotekniikan laitos.

"Kokeillaan käytännössä käyttöjärjestelmän kuormittamista"

Lue ohjeet läpi ennen kuin aloitat!

Mistä tässä harjoitteessa on kyse

Materiaali syntyi Käyttöjärjestelmät -kesäkurssilla 2007 ja sitä jatkokehitettiin keväällä 2011 ja 2014. Kiitän kurssilaisia palautteesta. Tähän ovat käyttäneet aikaa noin puolitoista tuntia. Ollut kuulemma ihan valaisevaa...

Harjoituksen tavoitteet ovat vähintään seuraavat:

  • Harjaannut lukemaan lisää lyhyitä C-ohjelmia
  • Näet lisää esimerkkejä, miten käyttöjärjestelmäkutsuja tehdään C-kielestä käsin
  • Tutustut käytännön ohjelmakoodin kautta mm. fork() -käyttöjärjestelmäkutsuun eli tapaan, jolla uusi prosessi luodaan Unix-ympäristössä.
  • Tutustut käytännössä kuormituskokeilujen kautta käyttöjärjestelmään, prosesseihin ja järjestelmän rajalliseen kapasiteettiin.
  • Tutustut top -järjestelmänseurantaohjelmaan
  • Näet seurauksineen asioita, joita sinun ei ehkä koskaan kannata oikeissa töissä tehdä, ainakaan vahingossa ja tietämättäsi.

Ohjeet

Nämä demot täytyy tehdä ympäristössä, jossa järjestelmän kuormittaminen ei aiheuta hankaluuksia itselle tai muille. Tarkoitusta varten meillä on kurssilla oma testipalvelin itka203-testi.it.jyu.fi, joka ei ole yhdistetty verkkolevyyn ja jossa ei pitäisi olla muita aktiviteetteja kuin tämän kurssin demoja.

Idea on tarkastella järjestelmän toimintaa kahdessa pääteikkunassa, eli avaa kaksi rinnakkaista yhteysikkunaa tai käytä screen-ohjelmaa.

Tee testipalvelimelle hakemisto demoa varten ja hae paketti https://yousource.it.jyu.fi/itka203-kurssimateriaalikehitys/itka203-kurssimateriaali-avoin/blobs/raw/master/2015/demot/mallikoodia/v01/v01_paketti.zip

Avaa paketti.

Käy läpi ohjelmat, mieluiten seuraavassa järjestyksessä:

skripti_idiootti.sh
forkkaa_loppuun_asti1.c
forkkaa_loppuun_asti2.c
forkkaa_loppuun_asti3.c
forkkaa_loppuun_asti4.c
muistivuoto.c

Tutustu jokaiseen, koeta ymmärtää; Testipalvelimella saat kokeilla niitä mielin määrin, eli käännös gcc:llä ja ajo terminaali-ikkunassa. Erillisessä terminaali-ikkunassa (screen tai pääteohjelmasi) käytä top-ohjelmaa. Top kertoo reaaliaikaisen tilanteen käyttöjärjestelmän prosesseista: Montako on luotu, moniko on missäkin suoritustilassa, paljonko fyysistä ja virtuaalista muistia on käytettävissä ja paljonko siitä on vapaana. Näiden arvojen seuraaminen valaissee kunkin ohjelman toimintaa.

Tietenkin prosessori suorittaa kerrallaan vain yhden prosessin käskyjonoa, eikä mikään muu prosessi ole Running-tilassa silloin kun top on. Niinpä top näyttää tilastotietoa viimeksi kuluneelta hetkeltä (muistaakseni jollain topin argumentilla voi säätää tuon tarkasteluhetken pituutta, mutta defaultti tuntuu riittävän tähän tarkoitukseen ihan hyvin).

Esimerkiksi seuraaviin kannattaa kiinnittää huomiota:

  • Missä vaiheessa systeemi alkaa "tökkimään"?
  • Mitä se silloin tekee?
  • Mistä tökkiminen siis luultavasti aiheutuu?
  • Miten vuorontaja kohtelee prosesseja, joilla laskenta alkaa kestää?

Palautustehtävänä on korjaamasi tiedosto muistivuoto.c, siten että se ei enää vuoda muistia. Tiedostot kannattanee editoita pääteyhteyden yli testipalvelimella, jossa teet kokeilutkin. Palautusta varten tiedosto on kopioitava kotikoneelle tai mikroluokkatapauksessa U-asemalle. Kopioinnin voi tehdä halavassa tai koti-Macillä scp-komennolla tai koti-Windowsilla WinSCP:llä tai vastaavalla scp-tiedonsiirto-ohjelmalla.

U-asemalle tiedostoja saa esim. komentamalla testipalvelimella (hakemiston nimeltä kj15/demot/vapari01 tulee tietysti olla olemassa verkkolevylläsi):

scp TIEDOSTONIMI halava.cc.jyu.fi:~/kj15/demot/vapari01

Apuneuvo muistivuotojen tilkkimiseen: valgrind

Testipalvelimellemme on asennettu apuohjelma valgrind, jolla muistivuotoja voi yrittää etsiä. Valgrind toimii esimerkiksi seuraavalla tavoin:

gcc -g muistivuoto.c
valgrind ./a.out

Eli ohjelmalle annetaan argumenttina suoritettava komento, mukaanlukien hakemisto, ei ainoastaan tiedostonimeä. Valgrind suorittaa komennon ja antaa seuraavanlaista palautetta:

==29601== Memcheck, a memory error detector
==29601== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==29601== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==29601== Command: ./a.out
==29601==
Alkuperäiset jonot: 'Saippua' ja 'kauppias'.
Yhdistetty jono: 'Saippuakauppias'
Uusi yhdistetty jono: 'kauppiasSaippuakauppias'
Uusi yhdistetty jono: 'kauppiasSaippuakauppiaskauppias'
Uusi yhdistetty jono: 'kauppiasSaippuakauppiaskauppiaskauppiasSaippuakauppiaskauppias'
Jatkanpa tästä yhdistelemistä...
Jononi pituus on nyt 1062 merkkiä
Jononi pituus on nyt 2062 merkkiä
Jononi pituus on nyt 3062 merkkiä
Jononi pituus on nyt 4062 merkkiä
Jononi pituus on nyt 5062 merkkiä
^C==29601==
==29601== HEAP SUMMARY:
==29601==     in use at exit: 16,417,434 bytes in 5,671 blocks
==29601==   total heap usage: 5,671 allocs, 0 frees, 16,417,434 bytes allocated
==29601==
==29601== LEAK SUMMARY:
==29601==    definitely lost: 16,405,975 bytes in 5,669 blocks
==29601==    indirectly lost: 0 bytes in 0 blocks
==29601==      possibly lost: 0 bytes in 0 blocks

Oman ohjelman voi lopettaa normaalisti Ctrl-C -näppäilyllä. Ja ohhoh... Ilman korjauksia ohjelma hukkasi 16 megatavua muistia tehdessään 5000 merkin merkkijonon... Ei hyvä! Korjata pittää... ole hyvä ja toteuta :)

Vinkki: Muistivuoto tapahtuu silloin, kun muistiosoite unohtuu sovellukselta. Eli ratkaisun avain on pitää osoitteet tallella niin kauan kuin niiden osoittamaa muistia tarvitaan, mutta ei mielellään yhtään sen pidempään.

Ole tarkka! Edellä esitellyllä apuohjelmalla valgrind pitää saada näkymään seuraavan tyyppinen tuloste, vaikka annat ohjelman pyöriä valgrindissa useita sekunteja:

==28526== LEAK SUMMARY:
==28526==    definitely lost: 0 bytes in 0 blocks
==28526==    indirectly lost: 0 bytes in 0 blocks
==28526==      possibly lost: 0 bytes in 0 blocks

Palautustehtävä

Keväällä 2015 kurssin demot ja niiden palautus hoidetaan osoitteessa itka203.it.jyu.fi olevan järjestelmän kautta. Kullekin demolle on oma palautuslaatikko, johon tehtävässä tuotettu tiedosto palautetaan.

Tästä demosta palautetaan tasan yksi tiedosto nimeltään "muistivuoto.c", joka toimii muuten kuten alkuperäinen, mutta ei vuoda enää muistia.

(Tehtävä on vapaaehtoinen ja toivottavasti hauska; annan siitä yhden pisteen bonusta ensimmäiseen tenttiyritykseen, jos palautus on tehty ennen ensimmäistä tenttipäivää.)