TIE-23101

Harjoitustyöt

Kurssin kakkosperiodilla luentojen määrä vähenee ja opiskelijoiden ajankäyttö on tarkoitus ohjata harjoitustöihin.

Kurssilla tehdään yksi tai useampi ohjelmointiharjoitustyö, joissa harjoitellaan C-kielistä ohjelmointia Linux:n systeemikutsujen ja kirjastojen parissa.

Koodauksen saa tehdä C tai C++ -ohjelmointikielellä. Ohjelman pitää kääntyä koneella linux-desktop.cc.tut.fi löytyvällä gcc-kääntäjällä (tätä kirjoitettaessa kääntäjän versio on 5.2.0).

Työ(t) tehdään ryhmissä. Muista ilmoittaa oma ryhmäsi viimeistään 10.10.2017 kurssin moodlessa

Ryhmä voi olla yksi tai kaksi opiskelijaa. Jos teet työn parin kanssa, niin muistakaa sopia etukäteen montako työtä aiotte tehdä (ettei ryhmiä tarvitse muutella jälkikäteen).

Arvostelu

Kurssin pakollisena osasuorituksena on yhden ohjelmointityön tekeminen.

Arvostelussa on myös leikkuri siten, että arvosanoja 4 ja 5 ei voi saada ellei ole palauttanut useampia harjoitustöitä eri aiheista.

Arvosanan maksimi Minimi palautettujen töiden määrä

1

1

2

1

3

1

4

2

5

3

Aiheita

UNIX signaalit
12 näppäimistön signaalit Toteuta terminaalilla interaktiivinen ohjelma (kyselee vaikka käyttäjältä jotain tietoja), joka osaa reagoida jotenkin järkevästä käyttäjän lähettäessä näppäimistöltä signaaleja (ctrl+c, ctrl+z ja ctrl+\)
14 timer Tutustu linuxin timer-rutiineihin, jotka lähettävät SIGALRM:n ajastimen lauetessa. Toteuta jotain säännöllisesti tulostava ohjelma.
fork
20 fork Toteuta ohjelma, joka luo itsestään uuden kopion fork():lla. Pääohjelma jää odottamaan uutta prosessia (vastaanottaa sen SIGCHLD signaalin). Uusi prosessi tulostaa jotain ja lopettaa sitten suorituksensa.
22 signaali ping-pong Ohjelma käynnistää 3 uutta kopiota itsestään. Kukin kopio lähettää pääohjelmalle signaalin SIGUSR1, odottaa saavansa SIGUSR2:n ja sen jälkeen lopettaa. Pääohjelma odottaa kaikki kolme SIGUSR1:stä ennen kuin lähettää vastauksen kaikille (SIGUSR2).
24 "komentotulkki" Ohjelma pyytää käyttäjältä käynnistettävän ohjelman nimen, jota etsitään PATH-ympäristömuuttujasta. Jos ohjelma löytyy, niin se käynnistetään fork():n ja exec():n avulla.
26 putkitus Toteuta kohdan 24 tyylinen komentotulkki, mutta lisää mukaan putkimerkki. Putkimerkin molemmin puolin olevat ohjelmat käynnistetään erillisiin prosesseihin ja niiden stdout-stdin on kytketty toisiinsa dup2()-kutsujen avulla.
tausta-ajo
30 daemon Selvitä mitä kaikkea suositellaan tehtäväksi prosessissa, jonka on tarkoitus mennä suorituksessa taustalle (daemon). Toteuta template-koodi, joka tekee kaikki suositellut asiat.
32 Prosessipuu Kerää kaikista /proc-tiedostojärjestelmässä näkyvistä prosesseista PID ja ParentPID tiedot. Tulosta puurakenne näistä suhteista.
virtuaalimuisti
40 mmap Tee ohjelma, joka toteuttaa saman toiminnan kuin wordcount "wc", MUTTA ohjelma lukee tiedoston sisällön mmap()-systeemikutsun avulla.
42 dlopen Toteuta "dynamic runner"-ohjelma, joka lukee tekstitiedostosta dynaamisten kirjastojen ja funktioiden nimiä. Kukin kirjasto ladataan ajoaikana ja nimettyä funktiota kutsutaan. Sisällytä myös testitapauksia (dynaamisia kirjastoja) mukaan.
44 madvice Tee jättisuuria taulukoita käsittelevä ohjelma ja optimoi sen muistinkäyttöä madvice()-systeemikutsulla. Mittaa ajoituksia eri versioilla ja dokumentoi tuloksesi.
tiedostojärjestelmä
50 Hakemistolistaus Tee ohjelma joka listaa parametrina annetun hakemiston sisällön (opendir, readdir) sekä kertoo kustakin tiedostosta saatavilla olevaa informaatiota (stat, getxattr).
52 Tiedoston vahdinta Toteuta ohjelma, joka tekee vastaavan toiminnon kuin "tail -f tiedosto"
54 Tiedostojen lukitus Toteuta ohjelma, joka toimii kuten "cat tiedosto", MUTTA ohjelma lukitsee tiedoston operaation ajaksi kokonaan omaan käyttöönsä (fcntl).
56 Hakemistovahti Toteututa taustalla toimiva ohjelma, joka vahtii yhtä hakemistoa ja kertoo kaikista siinä tapahtuvista muutoksista (tiedoston luonti, tuhoaminen, muutos). Linux inotify.
verkko-ohjelmointi
60 whois Tee tcp-asiakasohjelma, joka lähettää RFC3912:n mukaisen pyynnön palvelimelle whois.ficora.fi ja tulostaa saamansa vastauksen.
62 palvelin Sivulla http://www.cs.tut.fi/~kj/client2016/ on websocket-asiakasohjelma selaimeen. Tutustu protokollaan ja toteuta oma palvelin, joka lähettää TEXT-tyyppisinä viesteinä kellonaikoja 3 sekunnin välein.
64 asiakas-palvelin Toteuta palvelin, joka lähettää vastaanottamiinsa UDP-paketteihin vastauksena arvotut lottonumerot. Toteuta myös asiakas-ohjelma, jolla palvelinta voi käyttää.
kernel-moduulit
70 hello module world Toteuta linux:n ladattava kernel-moduuli, joka tekee uuden tiedoston /proc-tiedostojärjestelmään. Tiedostoa luettaessa ohjelma tuottaa aina jonkin vakioviestit (heippa maailma)
72 salaus Toteutua character device -laiteajuri, johon kirjoitettu viesti salataan ioctl-kutsulla määritellyllä avaimella. Salattu viesti luetaan samasta laitetiedostosta.
simulointi
80 käyttöjoukko Lataa ohjelman muistiviittauksia sisältävä data. Poimi muistiviittauksista sivun osuus (ylimmät 20 bittiä) ja tee simulointi, jossa annat ohjelman käyttöön erilaisen määrän muistisivuja ja poistat niitä jollakin algoritmilla (esim. FIFO). Kerrot tulokset (kuvaaja) kuinka paljon ohjelmassa tulee läsnäolokeskeytyksiä erilaisilla käyttöjoukoilla.
82 vuoronnus Tee ohjelma joka simuloi erilaisten säikeiden toimintaa (laskentaa/odotusta). Toteuta simulaatioon vuorontaja, joka päättää READY-tilaan tulevista säikeistä kuka menee seuraavaksi suoritukseen. Kerää ja esittele tuloksia järjestelmän toiminnasta erilaisilla vuoronnusalgoritmeilla.
FUSE
90 oma simuloitu tiedostojärjestelmä Tee C/C++ rajapinta, josta löytyy rutiinit open(), read(), write() ja close(). Tee toteutus näille, jotka tallentavat tiedot jotenkin yhden todellisen datatiedoston avulla (simuloit siis nimettyjä tiedostoja, joiden todellinen talletus on yksi tiedosto).
95 FUSE Toteuta Filesystem in Userspace -kirjaston avulla oma tiedostojärjestelmä, joka tekee jonkin mutkikkaamman toimenpiteen (ftp tiedostojärjestelmä, zip-pakattu, tms). Tätä ei välttämättä pysty ajamaan harjoitustyön ympäristössä, joten muista tehdä erityisen selkeä dokumentaatio tarkastajaa varten.

Aiheita on otsikoiduissa ryhmissä. Jos palautat useampia töitä, niin niiden täytyy olla eri ryhmistä (käytännössä jokaisen palautetun työn ensimmäinen numeromerkki pitää olla eri).

Huomaa, että pelkkä koodaus ei ole harjoitustyö vaan tarvittavat taustaselvitykset esim. make:n käytöstä ja manuaalisivujen luku tms. ovat osa työmäärää.

UNIX-järjestelmissä on tapa ilmaista manuaalisivun "aihealue" suluissa olevalla numerolla. Esim. signal(2):sta vastaavan manuaalisivun saa komentorivikomennolla man 2 signal

Ympäristö ja palautus

Ryhmille luodaan oma tietovarasto koneelle gitlab.rd.tut.fi. Palautuksessa ryhmä tekee git-tietovarastoonsa hakemiston, joka on nimetty valitun työaiheen nimellä ja numerolla tyyliin: 40-mmap.

Hakemiston sisällä tulee olla tiedosto Makefile, jonka avulla palautuksen ohjelmakoodi kääntyy kun hakemistossa ajetaan koneella linux-desktop.cc.tut.fi komento make. Palautuksessa riittää lähdekoodi, joka on kirjoitettu selkeästi ja sisältää sen ymmärtämistä helpottavia kommentteja.

Tee palautus jota haluaisit itse lukea Kirjoita taustoja ja kommentointia riittävästi, jotta lukija saa helposti selväksi mitä missäkin kohdassa tapahtuu (miksi mitäkin systeemikutsua esim. käytetään). Dokumentoi käyttämäsi rutiinit ja niiden parametrit - muista tarkistaa kaikki paluuarvot mahdollisten virheiden varalta.

Nykypäivänä internet on pullollaan (tämänkin) kurssin aihepiirin tietoa ja sen käyttäminen ei ole kiellettyä. Suora tekstin tai koodin kopiointi on. Tarkoitus on tuottaa omaa tuotosta eikä toistaa toisten tekemää.

Oletamme ammattiainekurssilla työn laadun olevan sellaisella tasolla, että minkäänlaisia "bumerangikierroksia" töissä ei tarvita.

Töiden tulee olla valmiina ja talletettuna gitlab:ssa viimeistään 11.12.2017 klo 8:00.

Töitä ei tarvitse "palauttaa" mihinkään gitlabin ulkopuolelle erikseen. Palautusten deadline-päivänä tietovarastoista ladataan sen hetkinen versio ja arvostelu tehdään kyseisen koodin perusteella.

Pisteytys

Töiden arvostelussa katselmoidaan koodi ja päätetään täyttääkö se minimivaatimukset. Hyväksytyistä töistä voidaan erityisen selkeän ja hyvän kokonaisuuden perusteella antaa bonuspisteitä 1-2 kpl. Bonuspisteitä myönnetään helpommin mutkikkaille työaiheille
(esim. simulointi on aivan eri asia kuin signaalien lähetys prosessille).

Bonuspisteet lasketaan mukaan toteutuskerran jokaisella tenttikerralla lisäpisteinä siten, että kolme pistettä vastaa maksimissaan 10 prosenttia tenttipisteistä.