-*- coding:utf-8 ; mode:org -*- Käyttöjärjestelmät, kevät 2020. Tämä on suunnitelma, joka muuttuu ajankäytön ja muun perusteella. Aivan aluksi pohjana on luentojen eteneminen edellisenä vuonna. Ei mene pahasti vikaan, jos menee samalla lailla. * Toteutunutta vuonna 2020: ** Luento 1: (ke 18.3.2020) Aloitus, yleisinfo ja suoritusvaatimukset Luennon päätavoite on kuvailla kurssin tekniset vaatimukset ja muu perusinfo. Perinteinen kustomointi? Korona-aikaan mietittävä... tehtäneen seuraavalla luennolla. - Esittelyt: opettajat, opiskelijat, opiskelijoiden pääaineet (Luentosalissa vaikutti vuonna 2019 aika tyypilliseltä: suurin osa tietotekniikan opiskelijoita, seuraavaksi eniten tietojärjestelmätiedettä. Sivuaineopiskelijoita erilaisilta aloilta.) Kaikille yhteisesti tervetuloa toivon mukaan hyödylliselle kurssille! Opiskelijoiden pääasialliset käyttöjärjestelmät omassa käytössä (pöytäkoneet, tabletit, älypuhelimet)? 2010-luvulle tyypilliseen tapaan eniten Windowsia ja Androidia; lisäksi aktiivisessa käytössä myös Linux (todennäköisesti itse asiassa "GNU/Linux", josta oli puhe luennolla). Mac-käyttäjiäkin on; esimerkiksi kurssin opettajista Jonne. Useita erilaisia Linux-jakelupaketteja, Windows-versioit ja MacOS:ää. C64 ja Amiga OS. (tarkempi listaus luentovideolla) - Huom: Demojärjestelmään kun rekisteröidyt, niin muista että se on vähän kotikutoinen, joten ihan salaisinta salasanaa, joka on muualla käytössä, EI kannata tähän järjestelmään laittaa. Käyttäjätunnukset Jonne, Janne ja Paavo on varattu. Muuten olkaa kilttejä käyttäjätunnuksen valinnassa. TÄRKEÄ: Käytä samaa sähköpostiosoitetta rekisteröityessä ja vastatessa rekisteröitymisviestiin. Eli ei esim. kaiutusta osoitteesta toiseen. Jos/kun salasana unohtuu, niin samalla käyttäjätunnuksella uusi rekisteröinti. Eli MUISTA se käyttäjätunnus ja käyttämäsi sähköpostitili! - Käytiin läpi, mistä kaikki kurssiin liittyvä löytyy (kaikkiin löytyy vähintäänkin aloituslinkki kurssin nettisivulta): * Luentomoniste * Osaamistavoitteet * Demot ja niiden palautusjärjestelmä: Demot on julkaistu toistaiseksi HTML-muodossa (linkki kurssin etusivulta). Seuraavalla luennolla tulee tarkempi opastus ensimmäisiin demoihin, joten sinne asti voi olla ihan hyvä vielä malttaa ja käyttää aikaa vaikkapa esitietojen kertaamiseen, erityisesti Ohjelmointi 1:n osalta! Palautusjärjestelmää ei ole vielä ehditty testata tälle vuodelle, joten teknisestikään tänään ei ole vielä hyvä päivä palauttaa. Demojen miettiminen ryhmässä on aina suotavaa, mutta jokaisen tulee palauttaa tiedosto omalla tunnuksellaan jo teknisistä syistä. Lisäksi jokainen vastatkoon omalta kohdaltaan siitä, että aivan itselle kertyy käytännön osaamista, vaikka frendi jeesaa! On se myös frendin vastuulla! * Aikataulut ja salit: Aikataulut Sisussa - opetus pyörii niiden mukaisesti. Toimitaan etämoodissa, kunnes toisin ohjeistetaan. Ryhmäohjauksia tulossa ainakin käyntiin pääsemiseksi. Aikatauluista tiedotetaan. * Materiaalin reaaliaikainen tilanne -> YouSourcessa. Päivitysten julkaisu useimmiten 1-2 tunnin kuluttua luennon päättymisestä. [tauko 10 minuuttia, vapaata keskustelua! - ei tule videotallenteeseen] Tauon aikana ja jälkeen esitettyjä kysymyksiä: - Voiko jakaa omaa ruutua kysymyksen täsmentämiseksi? Hyvä idea! On teknisesti mahdollista. Muistettava, että tallentuvissa sessioissa kannattaa piilottaa salaisuudet ruudulta ennen sen jakamista. - Demojen deadlinet? Vahva suositus olisi noin 1 demo viikossa sen jälkeen kun annetaan lupa aloittaa eka. Muutenkin kaikilla kursseilla suositeltavinta on tehdä töitä tasaiseen tahtiin, tehokkaasti, ja pitäen kiinni myös omasta ajasta ja hyvinvoinnista! Ohjausta ei ehditä antamaan enää 24.5.2020 jälkeen, koska 4. periodi loppuu eikä kurssi ole sen jälkeen työsuunnitelmissa. Paavon kursseilla dedikset ovat ohjeellisia ja palautukset mahdollisia ympäri vuoden perustellusta syystä. Demopalautusjärjestelmä suljetaan jossain vaiheessa kesää 2020, mistä ilmoitetaan. Jatkuu: - Käydään läpi määrälliset vaatimukset, jotka ovat jo näkyvillä myös nettisivulla: Pakolliset demot ja tentti. - Etenkin etäopiskelijoille, mutta myös muille, meillä on käytössä kaksi vertaistukikanavaa: yksi virallinen ja yksi epävirallinen: * Sähköpostilista itka203_kevat2020_keskustelu@korppi.jyu.fi on virallinen. Viestit arkistoituvat listan jäsenille, mutta eivät julkisesti. Tarkoitus: kysykää apua kaverilta -> kaverit vastaa -> seuraavat kaverit oikaisevat, jos edellinen vastaus ei ollut aivan nappiin -> opettajat saattavat kommentoida ehtimisensä mukaan. Lista on erillinen, jotta informaatioähkyä välttävä opiskelija voi halutessaan poistua omatoimisesti listalta. Viralliset tiedotteet tulevat toisen listamme kautta, joka myös arkistoituu julkisesti. * Slack-ryhmä, Moodle, TIM tai jokin muu (?) reaaliaikaisempaan ryhmäviestintään. Selvitellään vielä vaihtoehtoja ja tiedotetaan jo perustetun sähköpostilistan kautta heti kun tiedetään! Ehdotuksia tuli jo luennon chatissä.. Teams, Telegram ja IRC mainittu; ruohonjuuritason aktiivisuudella saa halutessaan perustaa esim. samantyyppisen sillatun kanavan kuin linkillä / hacklabillä / instanssilla /jne.. ja ilmoitella siitä. HUOM: Virallisesti tuettu on tässä vaiheessa vain sähköpostilista. Muistetaan myös GDPR-suo - ollaan varovaisia!!! - Kokeiltiin paria Pollia Kysymyksiä: - Demoista lisätietoa? Tulee perjantain sessiossa. Älä aloita ennen perjantaita! Jatketaan perjantaina klo 10! Kiitos! ** Luento 2: (pe 20.3.2020) Luentomuoto, demo-ohjeistus, varoitukset(!) *** Päivän päätavoitteet: - Jokainen pystyy aloittamaan demo 1:n tekemisen heti tämän luennon sisäistettyään. - Sitä varten: käydään läpi varoitukset, joita demojen tekemiseen liittyy - Jokainen tietää, mitä teoriapuolelta pitäisi lukea ennen kuin seuraavan kerran nähdään yhdessä. - Eli toisin sanoen: Tämän kurssin opiskelu on kaikilla 100% käynnissä! *** Suunnitelmaa ja muistiinpanoja Tämä päivä ehkä vielä hiukan perinteisempää luentoa. Myöhemmin erittäin todennäköisesti muuttuu Flipped classroom -hengessä jotenkin. [copy-paste vuodelta 2019, mutta lisätty sana "erittäin" koska Jonne ehti jo eilen vetää ässän hihasta: katsotaanpa Moniviestin-kansion tämän hetken tilanne ja toiveita tulevasta!!] Tällaista on tehty aiemmin - mietitään miten nyt tehdään ku on koronaa ollu ja kaikkee: - Perinteinen ryhmäkuva vuosia harjoitellulla koreografialla... Kaikki, mitä "koreografiassa" nähdään, liittyy yksityiskohtiin, joiden parissa kurssilla pyöritään alusta loppuun, muiden asioiden muassa. [Tauko 12 minuuttia; jatketaan klo 11:15] Mini-info: - Demojärjestelmä toimii. - "Open labrapäivä" -konseptin selitys; aikataulut Sisusta.. ilmeisesti nyt Zoomin kautta kokeillaan. Koetetaan matkia ohj2-kurssia jne. Tästä luennosta alkaen mennään kaikki asiat juurta jaksaen käytännön esimerkkejä näyttäen ja auki selittäen. Tavoite on, että viimeistään demojen 1 ja 2 jälkeen opiskelijat uskaltautuvat myös itse kokeilemaan samoja juttuja omatoimisesti. Turvallisuus- ja mukavuussyistä tämän luennon varoitukset on syytä ensin sisäistää. Sitten asiaa kohti. Pääteyhteys ja siihen liittyviä asioita: - Luentomuoto ja kurssin työkalut alusta alkaen ja esimerkit näyttäen: pääteyhteys, bash-shell ja tekstipohjaiset työkaluohjelmat. - Miten lähdetään tekemään demoa 1: Alkuvaroitukset ja toisaalta rohkaisu. - Demojen tekemisen saa aloittaa vasta, kun on sisäistänyt varoitukset!! - UNIX-käyttäjätunnuksen aktivointi https://sso.jyu.fi/ -palvelussa (2019 ei pystynyt näyttämään luentosalissa tietoturvasyistä; demo 1:n alussa on ohje tähän. Vuonna 2020 voi muuten olla taas ihan erilaiset käyttöliittymät. Saattaa tarvita ohjevideon, joita ryhdyttiin nyt tekemään muutenkin ??) - HUOM: Windows-pääteyhteysohjelman (esim. KiTTY) todennäköinen ääkkösongelma ja sen korjaaminen: Omissa asetuksissa todettava etäkoneen merkistö; meidän tapauksessa UTF-8 (tätä ei pystytty näyttämään 2020, kun opettajilla ei ole KiTTYä tai PuTTYä käytössä. Suositus toki olisi ettei opiskelijoillakaan olisi!! - HUOM: Älä ryntäile tehtäviä läpi nopean suorituksen perässä, vaan pyri sisäistämään - tee tarpeen mukaan omia muistiinpanoja tärkeimmäksi kokemistasi asioista! - Nauhoitetun osuuden jälkeen vielä pienellä porukalla viimeisteltiin kurssin kustomointi ryhmäkuvalla. Skriptin ajosta esimerkit tulivat jo luennolla. *** Ennakkotehtävät ennen seuraavaa luentoa: Luettavaa: - Luentomonisteen alkuosa eli luvut 1-2. Jos tarvitset tai haluat niin myös pullantuoksuinen pehmojohdanto. - Demo 1:n varoitukset ja ohjetekstit. Tekemistä: - Demo 1 työn alle. ** Luento 3: (ke 25.3.2020) Yleiskuvaa, tavoitteita, esitietoja *** Päivän ja kurssiviikon päätavoitteet: - Varmistutaan, että viime viikolla tehty käynnistys onnistui ja nyt ollaan 100% tekemisen äärellä. - Ymmärretään tämän ITKA203-matkan merkitys, tavoitepiste, välivaiheet ja kunkin rooli tavoitteiden saavuttamisessa. - Autetaan ensimmäisen etapin saamista maaliin: Tavoite on selvillä, esitiedot hallussa ja tekniset ongelmat demojen tekemisessä selätetty. - Asetetaan seuraava välitavoite ennen tulevan viikon yhteisiä tapaamisia. Tarkennuksia: - Oliko se tavoite, että tällä viikolla on demo1 tehtynä? Tässä vaiheessa "työn alla". Toivottavasti ensi viikon tavoite että tehty! - Onko joku tietty osa luentomonisteesta, joka tulisi opetella tällä viikolla? Kyllä. Luvut 1-2, joita käsitellään yhdessä alkaen tänään. *** Suunnitelmaa ja muistiinpanoja Paavo selittänee alkuun vielä vähän perusteluja kurssin struktuurista ja muistiinpanojen jäsennyksestä "tavoite -> suunnitelma ja muistiinpanot -> ennakkotehtävät" Välihuomautus Zoom-tekniikasta: - Kun opettaja Linux-clientilla laittaa päälle Annotate-toiminnon, se on yksisuuntainen tie tämän session ajan. Vaikeuttaa muuta toimintaa jonkun verran. Demoefektin mahdollisuus on suuri! Ennen kuin voidaan edetä, pitää tarkistaa etenemisen edellytykset! Kunkin viikon ensimmäisessä yhteistapaamisessa on siis tarkistettava nämä: - Onko annetut ennakkotehtävät ehditty tehdä? - Paljonko on käytetty aikaa? Kalibroidaan aina vastausten mukaan tilannetta ja tekemistä. Tauon jälkeen. [Tauko 15 minuuttia. Vapaata keskustelua, vessatauot, kahvit ym. Venyttely!] Tänään siis ensimmäinen varmistaminen: - Nyt ja tulevaisuudessa vakiokysymys tyyliin näin: A) Opiskelin ennakkotehtävän mukaisesti, ja koen että ymmärrän B) Opiskelin ennakkotehtävän, mutta koen että on aukkoja ymmärryksessä C) Olen lukenut osittain D) Silmäilin vain E) En tehnyt ennakkotehtävää Ks. luentovideo. - Toinen vakiokysymys tyyliin näin: A) Keskityin tähän kurssiin reilusti yli 16 tuntia B) Keskityin 12-16 tuntia C) Keskityin 8-12 tuntia D) Keskityin 4-8 tuntia E) Keskityin alle 4 tuntia Sitten tutkitaan tuloksia ja mietitään toimenpiteitä, jotka pollien perusteella vaikuttaisivat tarpeelliselta. Kertaus: - Suunniteltu työmäärä kurssin sisällössä on ollut 16h/vko. - Oman ajankäytön jonkinasteinen seuranta on hyödyllinen taito. Jos ja kun voidaan edetä, niin edetään tästä... Pieni konkreettinen infoisku keväälle 2020: - Huomenna on ensimmäinen Open labrapäivä klo 8:15-10:00. Se tarkoittaa, että Paavo on saatavilla Zoomin kautta kyseisellä aikavälillä. Muuta tästä ei tiedetä ennen kuin nähdään, miten ensimmäinen kerta tapahtuu. Zoom-ID on joko tämä sama tai joku eri; tiedotetaan kestkustelusähköpostilistalla ennen huomista klo 8:15. - Kysy apuja keskustelupostilistalla ja open labrapäivässä; ei olla (vielä) täydellisiä ajatustenlukijoita, joten ei voida tietää, mikä on vaikeata. Se voi olla joku ihan eri asia kuin opettajina kuvittelemme! Kysy! - Huomatkaa myös opiskelijavetoinen Koodaamo 2.0; erittäin kannustettavaa touhua - Näyttääpi löytyvän Linkki Jyväskylä ry:n tapahtumakalenterista: https://linkkijkl.fi/tapahtumat/ - Näyttää siltä, että demojärjestelmä pelittää, ja sinne on tullut tosi kivasti jo demo1:n vastauksia. Hienoa! Tarkistuksia ja palautetta alkaa ropista heti, kun opettajat ehtivät. Se ei ole vielä ihan tänään, mutta toivottavasti pian. - Kertauksena vielä: Ohjeellinen "deadline" on noin 1 tehtävä / viikko. Järjestelmässä on kaikille tehtäville tekninen deadline 24.5.2020 tjsp., mutta niitä saa palauttaa omaan tahtiin jo ennen sitä. Demojen tekemistä varten kannattaa varmaan viimeistään tässä vaiheessa jo käydä läpi pari juttua: - kill -komento ja kuinka selvitä "nolosta ikuisesta silmukasta". - "Palopuhe" demojen tekemisestä. Olennaisimmat kohdat aiemmilta vuosilta havaittuna: + Ohjeet on syytä lukea ja ymmärtää ennen palautuksen tekemistä. + Vastausten ei tarvitse olla täydellisiä - tarkistus on harkinnan mukaan, voidaanko vastauksen perusteella ns. "epäillä" ettei ole ymmärretty asiaa. + On suorastaan epäkohteliasta palauttaa lähdekoodia, joka ei käänny syntaksivirheen takia! + Palautettavan tiedoston muoto on tärkeä monesta syystä, (mukaanlukien puoliautomaattinen rekisteröinti opintotietojärjestelmiin), joten ohjeet on tosiaankin luettava, jos mielii saada tehtävät läpi! - Komento alussa, sitten argumentit. Jokaiselta tulee sujua viikon päästä samanlaiset jutut kuin mitä yhteisissä sessioissa näytetään pääteyhteyttä ja screeniä käyttäen. Demot 1&2 opastavat alusta lähtien. Muista demon 1 varoitukset, mutta sen jälkeen vaan rohkeasti! Sitten kysymyksiä chattiin. Asiantuntijapaneeli Jonne+Paavo vastaa oman osaamisensa puitteissa, ja muutkin läsnäolijat voivat osallistua. Kysymyksiä voitaneen listata chatin kautta ja voidaan pollata ainakin kysymyskohtaisesti, mitä suurin osa demokratiasta haluaa käsiteltävän. Listaa: (siirretty seuraavan luennon muistiinpanoiksi) Jatkossa: - Mites sitten varmistetaan ymmärryksen syntyminen? Parhaimmillaan varmaan käytännön esimerkeillä, joihin pitäisi pystyä vastaamaan esitietojen pohjalta.. + Tenttitärppejä? Esim. vuoden 2019 vastaavalla luennolla oli printf POSIX-shellissä ja C-kielessä ja vähän heksaluvuilla leikkimistä niillä. **** Knoppeja aiemmilta vuosilta - Tarkennus sanan "computer" etymologiaan jälkikäteen (ihan Wikipediasta katsottu): 'According to the Oxford English Dictionary, the first known use of the word "computer" was in 1613 in a book called The Yong Mans Gleanings by English writer Richard Braithwait: "I haue [sic] read the truest computer of Times, and the best Arithmetician that euer [sic] breathed, and he reduceth thy dayes into a short number." This usage of the term referred to a human computer, a person who carried out calculations or computations.' *** Ennakkotehtävä ennen seuraavaa kertaa Seuraavahan on jo ylihuomenna, joten ei vielä liiemmin tarvetta tai aikaa käsitellä uutta? Pidetään viikkotavoite kirkkaana. Jos uskoo sen olevan omalla kohdalla mahdollista, niin saa edetä monisteessa luvun 3 puolelle ja demoon 2, koska epäilemättähän niitä kohti ollaan tässä menossa yhdessäkin! ** Luento 4: (pe 27.3.2020) (P) Mennään ennakkotehtävän pohjalta *** Infoisku keväälle 2020: (Jos on suoranaisia "tiedotteita" niin niiden paikka on varmaan heti tallenteen alussa, ennen kuin päivän tavoite asetellaan... ei tule sitten keskeytystä flow'hun, johon koetetaan laskeutua sillä tavoiteasettelulla... näin sanoi Paavon pieni päänsisäinen fasilitointirookie.) Huomattiin yksi juttu, kun suunniteltiin kurssin jatkoa: - Meillä näyttää olevan yksi tapaamiskerta vähemmän kuin yleensä, koska vappupäivä syö yhden luentopäivän (epähuomiossa suunniteltu pe 1.5.2020, mutta silloin ei siis tapahdu). - Pyritään korvaamaan se uudella, ennakkotiedoista poikkeavalla, sessiolla. Asiaa ei ole yhtään vähemmän kuin ennenkään. - Todennäköinen ajankohta on vappuaattona 30.4.2020 aamulla/aamupäivällä tai heti vapun jälkeisenä maanantaina 4.5.2020. Eli mahdollisimman pienellä muutoksella korvattavaan gäppiin. Havainto chätissä: - "Käyttöjärjestelmät aka vapun etkot" *** Tämän hetken tavoite Päivän tavoite (toissapäivän tarkennuksilla modattu): - Varmistutaan, että viime viikolla tehty käynnistys onnistui ja nyt ollaan 100% tekemisen äärellä. - Ymmärretään tämän ITKA203-matkan merkitys, tavoitepiste, välivaiheet sekä opiskelijan ja opettajien roolit tavoitteiden saavuttamisessa (monisteen luku 1 ja ensimmäiset yhteiset tapamiset). - Varmistutaan kurssin esitiedoista (monisteen luku 2). - Tekniset ongelmat demojen tekemisessä selätetty. Demo 1 on vähintäänkin työn alla jokaisella. - Päivän lopuksi tiedetään, mitä seuraavaksi pitää tehdä ennen ensi viikon yhteisiä tapaamisia. *** Suunnitelmaa ja muistiinpanoja **** Tekemisen tilanne ja kysymysten haaliminen Vedetään alkuun vakiokyselyt. Tilannehan on jo eri kuin 2 päivää sitten keskiviikkona! - mihin asti on päästy? - paljonko aikaa on käytetty 168 tunnin liukuvassa aikaikkunassa? **** Protokolla kysymysten haalimiseksi Pelisäännöt käsiteltävien asioiden etsimiseen. Sovelletaan luennoilla aina jatkossa: Vaihe 1: Kysyminen (jokin sopiva ajallinen kesto tälle - ehkä 5 min?) - Opettaja ohjeistaa, kun chattiin saa alkaa laittaa tämän päivän tavoitteisiin liittyviä kysymyksiä, joita toivotaan käsiteltävän. - Samaan aikaan ei saa laittaa chattiin mitään muuta kuin kysymyksiä - Esimerkiksi EI vastata kysymyksiin chatissä tässä vaiheessa, vaikka tietäisikin heittää jonkun täsmävastauksen suoraan! Vaihe 2: Kysymysten listaaminen ja muotoilu - Opettaja(t) kerää(vät) aikaikkunassa esitetyt kysymykset muotoon, josta kysyjä ja opettaja ovat mahdollisimman yhteisessä ymmärryksessä. Saattaa vaatia täsmennyksiä. Hoidetaan ne chätin kautta (ei taltioidu luentovideolle, joten ei paineita jne...) - Lista kysymyksistä muotoillaan tähän luentomuistiinpanotiedostoon, johon se jää talteen ja julkiseksi tiedoksi. - Lista itsessään on arvokasta tietoa kurssista kaikille opiskelijoille! Vaihe 3: Kysymysten priorisointi ja vastaaminen (ennakkoon tunnettu aikaikkuna) - Kaikkeen ei ehditä vastata eikä kaikkea käsitellä. - Jos on "triviaaleja", nopeita kysymyksiä, ne voitaneen käydä läpi alta pois. - Opettajien on hyvä tehdä pedagoginen esikarsinta ennen yhteistä priorisointia. Osa kysymyksistä voi olla liian edistyneitä aiheita tälle kurssille, tai tulla luonnostaan myöhemmässä vaiheessa lukemistoa. Keskitytään päivän tavoitteita tukeviin kysymyksiin. - Sitten pitää valita listasta tärkein asia, joka käsitellään ensimmäiseksi. Sen jälkeen toistetaan prosessia, kunnes aika loppuu. - Tänään (27.3.2020) vielä opetellaan ja ihmetellään, miten valinta tehtäisiin. Kokeillaan, tukeeko Zoom jotenkin näppärästi priorisointia. **** Tämän päivän kysymykset Ensimmäiset kysyttiin jo viime kerralla, joten lista olikin jo alustettu: - onko tämä ainoa kurssi jossa tarvitaan / opiskellaan assembly-kieltä millekään arkkitehtuurille - Olisiko jotain vinkkiä, jolla etäkäyttökoneelta saisi tehdyt tiedostot ulos tai palautettua helposti? Itse olen räpeltänyt tiedostot verkkolevylle ja sitä kautta ladannut omalle koneelleni. - Ctrl-C:stä https://superuser.com/questions/1268710/why-was-ctrlc-chosen-to-kill-a-process - mitä tekstieditoreita jalava/halavassa on? ainakin nano onko emacs vim ym - Olisiko joku pieni saarna virtuaalikoneista? - Mitkä ovat suurimmat käytännön erot eri shellien välillä? Onko vaikka bashin ja zsh:n välillä niin paljon eroa että eri shelleihin kannattaa erikseen tutustua - ja sitten, missähän pääsee opettelemaan noita heksamuunnosjuttuja, mulla on joku niihin liittyvä narkolepsia ja tarviin toisteisuutta että opin :) - muuttuuko flags aina? eli se joko pysyy nollana, on carry flag tai negative flag? Eli se paivittyy joka kaskyn jalkeen? - Mikä on abstraktisen ja konkreettisen tietorakenteen oleellinen ero? - Luentomonisteessa oli esimerkki: "Esimerkiksi luku 123 on heksajärjestelmässä 7B. 16 = 7 · 16^1 + 11 · 16^0 = 123." Miten tuo ratkaisu saadaan? Miten sitä lähdetään selvittämään? - Miten kurssin demot saa aluilleen? - Voiko jatkossa enää kysyä luvuista 1-2? [Tauko 10 min. Jatketaan klo 11:15] **** Nopeat vastattavat Nopeat vastattavat: - Voiko jatkossa enää kysyä luvuista 1-2? Voi! Kaikesta voi aina kysyä. Yhteisissä tapaamisissa pyritään demokraattisesti päättämään, mitä niissä käsitellään. Lisäksi on keskustelukanava, open labrapäivä, Koodaamo ym. - Ctrl-C:stä https://superuser.com/questions/1268710/why-was-ctrlc-chosen-to-kill-a-process (tämä ei oikeastaan ollukkaan kysymys) - mitä tekstieditoreita jalava/halavassa on? ainakin nano onko emacs vim ym On ainakin nano, emacs ja vim. - Mitkä ovat suurimmat käytännön erot eri shellien välillä? Onko vaikka bashin ja zsh:n välillä niin paljon eroa että eri shelleihin kannattaa erikseen tutustua? Vastaus: Erot ovat yleisesti tosi suuria eri kuorissa eli shelleissä. Tällä kurssilla käydään läpi POSIX-standardin mukainen osajoukko, joka löytyy monesta shellistä, mutta ei kaikista. (ehkä bash vs. zsh:n osalta ei niin iso ero). - Olisiko joku pieni saarna virtuaalikoneista? Vastaus: Rajataan virtualisointi, hypervisorit ym. jutut tämän kurssin alueen ulkopuolelle. Voisi ajatella, että "virtuaalikone == rajapinta alemman tason koneistoon". Jonnella eri näkemys asiaan. Termeillä on erilaisia määritelmiä. - Miten kurssin demot saa aluilleen? Ryhdy tekemään, ja kysy täsmällisempi kysymys esimerkiksi keskustelulistalla. - Olisiko jotain vinkkiä, jolla etäkäyttökoneelta saisi tehdyt tiedostot ulos tai palautettua helposti? Itse olen räpeltänyt tiedostot verkkolevylle ja sitä kautta ladannut omalle koneelleni. Huomautuksia: - tarkenna tarvittaessa keskustelulistalle tmv. mikä on verkkolevy, jos ei ole yliopiston verkkolevy, jossa tehdään nämä demot. - ssh -ohjelman tapaan voi käyttää scp -komentoriviohjelmaa omalta koneelta. Täsmäohjeita copy-pastella chätistä - kiitos porukalle!: - verkkolevyjen yhdistämisessä linuxilla pitää etsiä ohje sille file manager -softalle mitä käytät. jos idea oli siis yhdistää sinne verkkolevy... (ainakin gnomen oletussofta teki sen aika helpoksi, ja kde melkein yhtä helpoksi) - ainakin sshfs on ohjelma jolla voi tehda verkkokansiosta lokaalin kansion omalle koneelle Myöhempää, tämän kurssin jälkeistä, elämää varten voi kysyä Jonnelta lisää siitä, miten emacsilla voi suoraan käsitellä toisella koneella olevia tiedostoja. **** Pedagogisen karsinnan jälkeen äänestykseen menevät: - Missä assemblyä tarvitaan tämän kurssin jälkeen? onko tämä ainoa kurssi jossa tarvitaan / opiskellaan assembly-kieltä millekään arkkitehtuurille - Mikä oikeastaan on rajapinta? Saisko jotakin määritelmää tms sille? - Mitä tarkoittavat ALU:n yhteydessä olevat rekisterit IA, MD ja AC? - Hierarkkinen vs. modulaarinen rakenne? Rakenne mietityttää, hierarkkinen vs. modulaarinen, voisiko tästä puhua vähän lisää? (Tämä tarvitsee tarkennusta!! Chättiin :).) - muuttuuko flags aina? eli se joko pysyy nollana, on carry flag tai negative flag? Eli se paivittyy joka kaskyn jalkeen? **** Valikoitujen kysymysten käsittely Tärkein kysymys löydettiin. Se käsitellään ensimmäiseksi, ensi viikolla. - Mikä oikeastaan on rajapinta? Saisko jotakin määritelmää tms sille? *** Ymmärryksen syntymisen varmistaminen Hehe.. sieltä fasilitointisanastosta: Ymmärryksen syntyminen tulee varmistaa, ja siihen ei oikeasti riitä kysymys "ymmärsitkö/etkö" vaan tarvitaan konkreettisia sisältökysymyksiä eli kansakoulukielellä "pistokokeita". Kuvitelma ymmärryksestä on eri kuin ymmärrys (ja ilmiönä vaarallinen). Kokeillaanko jotain tenttitärppiä huvikseen jo? (ei ehditty vielä tänään. Jää seuraavan keskiviikon luentoon.) *** Seuraava ennakkotehtävä Luettavaa: - Seuraava osuus luentomonisteesta: luvut 3-4. - Demojen 1-2 ohjetekstit. Tekemistä: - Demo 1 valmiiksi ja palautusjärjestelmään! - Demo 2 työn alle. - Jo luvussa 3 on shellissä tehtyjä esimerkkejä, joita on hyvä alkaa kokeilla luovasti myös itse sitten, kun demo 1 & 2 hahmottuu ja tekstimuotoinen koneen käyttö alkaa olla turvallisen tuntuista ja "mukavuusalueella". - Demoilla 1-2 haettava tavoite on saada shellin, pääteyhteyden ja screenin käyttö tuotua omalle mukavuusalueelle! Tämä vaatii paljon harjoitusta ja energiaa, joka on sitten myöhempää elämää varten alta pois! - Ja muistutetaanpa, että 5 opintopistettä 8 viikossa tarkoittaa keskimäärin 16-17 tuntia viikossa tehokasta tekemistä. Muista tauot ja lepo, koska muuten ne varsinaiset tekemisen hetketkään eivät ole niin tehokkaita kuin voisivat olla! ** Luento 5: (ke 1.4.2020) (J) Useita yleisökysymyksiä. Starttia demoon 3. Otetaan hetki vastaan aiheita Zoomin-keskustelualueella. Myös saa huudella yleisöstä paikan päällä - tähän asti ollut yksinomaan hyviä kysymyksiä (onko muita olemassakaan?) *** Käsiteltyjä kysymyksiä - Mikä oikeastaan on rajapinta? Saisko jotakin määritelmää tms sille? - Rajapinta on sopimus siitä, mitä komentoja, palveluja on tarjolla, joiden välityksellä käyttöjärjestelmää käytetään. Esimerkki: POSIX-rajapinta (itseasiassa kolme rajapintaa) - Rakenne mietityttää, hierarkkinen vs. modulaarinen, voisiko tästä puhua vähän lisää? (Tämä tarvitsee tarkennusta!! Chättiin :).) - Paavo selitti oivasti, kuinka tietokone rakentuu pienistä komponenteista, jotka muodostavat hieman isompia komponentteja ja näin tulee hierarkia, esim. prosessorissa, emolevyllä, muistissa, ... - Mitä tarkoittavat ALU:n yhteydessä olevat rekisterit IA, MD ja AC? - Riittää ymmärtää, että ALU tarvitsee rekistereitä käsittelyyn ja ymmärtää, että rekisterit ovat kiinteäkokoisia säilytyspaikkoja sanoille (tavuille). - IP :: osoite käskylle - MD :: osoitteen tallennus tai käsittely, tai yleiskäyttöinen - IA :: yleiskäyttöinen, tai aritmeettis-loogisen operaation parametri - AC :: yleiskäyttöinen, yleensä aritmeettis-loogisen operaation tulos Kuvan rakenne on kuvitteelliselle prosessorille, joten se on kuvanakin ohjeistava. Jatkamme lähteen selvittelyä. Noniin, päivää myöhemmin alkoi kokonaisuus hahmottua. Jos katsotte tuota kuvaa tarkkaan, on noiden rekisterien ja ALUn välissä /kaksi/ eri väylää. ALUn tulos menee vielä kolmanteen väylään. Eli tuossa on kuvattu kolmiväyläistä CPU-toteutusta. Tämä toisaalta vähentää vielä enemmän noiden rekisterien ymmärtämisen tarvetta, on vain joitain rekisterejä ja ALUn syötteinä on eri rekisterijoukot. Tästä on toisenlainen kuva verkossa osoitteessa http://www.edwardbosworth.com/My5155Text_V07_HTM/MyText5155_Ch14_V07.htm Katsokaa kuvaa "Figure: Partial CPU Design". Vaan katsokaapas "Figure: Add the General Purpose Registers". Siellä on sama kuva vähän toisin piirrettynä ja alla toinen mielenkiintoinen kuva, joka selittää kuinka yleiskäyttöisiä rekisterejä lisätään tuohon aiemman kuvan mukaiseen rakenteeseen. Saman voi lukea Wikipediasta: https://en.wikipedia.org/wiki/Arithmetic_logic_unit#Data Vaan nyt aletaan mennä tämän kurssin ulkopuolelle. Meille riittää rajapinta, joka esittää CPU:n rekistereinä ja komentoina :-) - Missä assemblyä tarvitaan tämän kurssin jälkeen? onko tämä ainoa kurssi jossa tarvitaan / opiskellaan assembly-kieltä millekään arkkitehtuurille - Ei ole ainoa kurssi, ehkä ainut pakollinen :( - Ohjelmointikielten kääntäjät (kääntäjätekniikka) -kursseilla tarvitaan symbolista konekieltä. - Tietoturvakursseilla myös tarvitaan symbolista konekieltä. - Abstraktisen ja konkreettisen tietorakenteen oleellinen ero? - Abstrakti on yleistys, jotain riittävästi sinne päin, ilman toteutusyksityiskohtien tuomaa painolastia. Konkreetti taas ottaa kantaa vain noihin toteutusyksityikohtiin, miten abstraktin kuvauksen mukainen toiminta saadaan toteutettua. - muuttuuko flags aina? eli se joko pysyy nollana, on carry flag tai negative flag? Eli se paivittyy joka kaskyn jalkeen? olikos niitä FLAGrekistereitä useampia tai ennenkaikkea käytetäänkä sitä FLAGIA usean eri asian ilmaisemiseen vai pelkästään yhtä FLAGIA yhteen asiaan? kyseessä lienee rekisteri, eikä mikään yksittäinen bitti? - Flags ei muutu aina, mutta yleensä se muuttuu. Tieto muuttuuko vai ei löytyy käskyjen dokumentaatiosta. Lippuja on useita yhdessä rekisterissä. *** Uusia kysymyksiä - oliko näistä luennoilla ja luentojen ulkopuolella käydyistä kysymyksistä (kuten säpo-listoille tulleista ja vastatuista) yhteenvetoa jossain? - Kannattaako ensiksi opetella Nano vai aloittaa suoraan Vim tai Emacs? - Onko jotain kirjallisuutta mistä lukea kurssin aihealueista enemmän? - kuuluuko screen-ohjelma posix-standardiin? - mikä on Shell ? vieläkin on jäänyt epäselväksi.. - Voisikohan kuulla vähän lisää kerto- ja jakolaskusta asmissa? MUL ja DIV siis, luentomonisteessa vähän niukanlaisesti niistä - tmux aina houkuttelisi mut jos screen löytyy valmiiksi vaikka mistä niin... - Mikä on hyvä komentorivi aprillipila?
 **** Vanhoja kysymyksiä Luentoseinältä: - miksi päädyin jalavassa & halavassa tcsh:hon, enkä bashiin? Joillain on tämä ilmiö. Pyydä vaihtamaan, palvelupiste@jyu.fi Demoja pääsee tekemään bashillä. Voi antaa tcsh:lle seuraavan komennon: exec bash -l - screenin detach: mitä oikeastaan tekee ja miksi sitä tarvitaan? Irtautuu vanhempiprosessista ja jää suoritukseen palvelimelle. - chmod ei näytä muuttavan oikeuksia (tarkistettu ls -l komennolla) Yksi mahdollinen (jopa todennäköinen) syy: JY:n verkkolevy toimii eri tyyppisessä tiedostojärjelmässä. Kokeiluja paikallisella koneella voi tehdä /tmp/ -hakemistossa - "miten emacsissa tehdyt komennot copypastetaan komentoriville?" Tulkitsen kysymyksen näin: "Miten tekstieditorissa näkyvä asia copypastataan toiseen paikkaan?" Esimerkiksi pääteohjelman copypaste -toiminnolla. - Is it better to use `htop` instead of `top` If you like htop, use it. It is prettier. - Toimiiko luentomoniste muilla? Useimmilla vaikuttaisi toimivan. Tarkempaa ongelmakuvausta näkisi mielellään. - Difference between thread and task still unclear Yes, this is expected. Chapter 8 of lecture notes will cover this. - ./a.out käsittelee vain viimeisimmän käännetyn c-ohjelman? Tarkennus: ./a.out on viimeisin käännetty C-ohjelma, jos käännettiin oletusnimelle. Komento ``./a.out`` suorittaa sen. Matskuissa kerrotaan sitten aika pian, miten laitetaan joku muu nimi kuin a.out - Saako screenin jotenkin näyttämään nykyisen hakemiston missä on, niinkuin bashissa on kun etäyhteyden käynnistää? (screenissä näkyy vain: "bash-4.2$"). Itse asiassa kyseessä bashin asetus. Esim tuolla vinkkiä: https://www.ostechnix.com/hide-modify-usernamelocalhost-part-terminal/ Voi olla myös screenillä vastaavaan tapaan omia asetuksia. Luennolla jo yleisö testasi, ja toimii kuten näytettiin. (~/.bashrc) - miksei Vimin :help jotain komennot toimi, saako ne toimimaan Ei pystytty toistamaan ongelmaa. Lisätiedot auttaisivat. [tauko] - Edelliseen kysymykseen: halavassa / jalavassa näyttäisi olevan paikoillaan kaikki tarvittava :helpin käyttöön - vimtutor ja Emacs tutorial käynnistys ja ensimmäiset sivut. Edelliseltä luennolta jäi seuraavia: - Heksadesimaalien opettelua? Tehtäneen tätä vielä pari viikkoa. - lisää luvun 3 ja demon 3 "kickstarttia". HUOM: demossa 3 vähän lupaillaan, että luennolla on näytetty debuggerin käyttöä, joten se on syytä tulla joko nyt tai täsmälinkkinä edellisten vuosien videoihin. *** Perjantain ensimmäinen kysymys on - Heksaluvut, apuja opetteluun? ja sitten, missähän pääsee opettelemaan noita heksamuunnosjuttuja, mulla on joku niihin liittyvä narkolepsia ja tarviin toisteisuutta että opin :) Luentomonisteessa oli esimerkki: "Esimerkiksi luku 123 on heksajärjestelmässä 7B. 16 = 7 · 16^1 + 11 · 16^0 = 123." Miten tuo ratkaisu saadaan? Miten sitä lähdetään selvittämään? *** Lukupaketti pysyy perjantaille entisenään: - Monisteen luku 3 "Hei maailma - johdattelua tietokoneeseen". - Monisteen luku 4 "Konekielisen ohjelman suoritus". - Kestomuistutus: 5 opintopistettä 8 viikossa tarkoittaa keskimäärin 17 tuntia viikossa tehokasta tekemistä. Muista tauot ja lepo, koska muuten ne varsinaiset tekemisen hetket eivät ole enää tehokkaita! ** Luento 6: (pe 3.4.2020) (J) Aiheet määrittyvät dynaamisesti taas *** Tämän päivän ja ensi viikon tavoite Toivottu tilanne tänään, kun mennään kevätkurssia 2020 aikataulussa: - Monisteluvut 1-4 luettu (+ 29 sivua edelliseen) jollain tasolla; demot 1-2 sisäistetty, laitellaan 3. työn alle Päivän päätavoitteet - varmistaa omatoimisen lukemisen ja harjoittelun eteneminen - vahvistetaan aiemman omaksumista ja siirtymistä demo 3:een - käydä läpi kysymyksiä, joita toivottavasti on herännyt tehdessä. Seuraava viikkotavoite - ei uutta luettavaa monisteesta, vaan aiemman vahvistamista ja sisäistämistä - demo 3:n ohjeteksti luettavaksi - tee käytännön kokeiluja esitetyistä asioista - demo 2 täytyy tehdä ja palauttaa. *** Infoa vuodelle 2020 - HUOM: Demojärjestelmässä nolla tähteä tarkoittaa, että pitäisi palauttaa uudelleen! Näytetään luennolla esimerkki tilanteesta. Kyseessä on pieni käyttöliittymäfiba, joka korjataan, jos siihen on resursseja kevään 202x aikana. Arvio näyttää olevan "vihreällä", mutta meillä lasketaan näin: + 0 tähteä = hylsy, + 1 tai enemmän tähtiä = hyväksytty *** Tekemisen tilanne ja kysymysten haaliminen **** Ensin molemmat vakiokyselyt **** Kysymysten käsittelystä äänestäminen - käsittelemme tästä edespäin kysymykset yhden äänestyskerran perusteella **** Uusien kysymyksien haaliminen *** Kysymykset perjantaina 3.4.2020 - Heksaluvut, apuja opetteluun? ja sitten, missähän pääsee opettelemaan noita heksamuunnosjuttuja, mulla on joku niihin liittyvä narkolepsia ja tarviin toisteisuutta että opin :) Luentomonisteessa oli esimerkki: "Esimerkiksi luku 123 on heksajärjestelmässä 7B_16 = 7 · 16^1 + 11 · 16^0 = 123." Miten tuo ratkaisu saadaan? Miten sitä lähdetään selvittämään? Eri lukujärjestelmien numerot: - 01 binäärit - 0123456789 desimaalit - 0123456789ABCDEF heksadesimaalit Esimerkki kymmenjärjestelmässä ja heksadesimaalina: 123 = 1 * 100 + 2 * 10 + 3 * 1 0x7B = 7 * 16 + B * 1 = 7 * 16 + 11 * 1 = 112 + 11 = 123 Tuo '0x' on yleinen tunniste monissa kielissä, kun halutaan esittää heksoja. Liikaakin lisätietoa löytyy osoitteesta https://en.wikipedia.org/wiki/Hexadecimal - Voisikohan kuulla vähän lisää kerto- ja jakolaskusta asmissa? MUL ja DIV siis, luentomonisteessa vähän niukanlaisesti niistä Tätä varten on luentovideolla erittäin tärkeä filosofinen opastus. TL;DR; Opettelemme löytämään vastauksen AMD64:n oppaista. *** TAUKO 11:30 ASTI *** - Kannattaako ensiksi opetella Nano vai aloittaa suoraan Vim tai Emacs? - Unohtakaa Nano ja notepad ja kaikki kikkareet, käyttäkää Oikeita Editoreita, jotka ovat ohjelmoitavia ja laajennettavia! (Esim. Emacs) - mikä on Shell ? vieläkin on jäänyt epäselväksi.. - Ohjelma, jonka avulla päästää käyttämään käyttöjärjestelmän toimintoja. - "Komentorivin" toteuttava ohjelma. - 15% kaipaisi vielä parempaa selvitystä. - Onko jotain kirjallisuutta mistä lukea kurssin aihealueista enemmän? - Moniste ja sen lähdeviitteet. - Paavo suuresti suosittelee http://pages.cs.wisc.edu/~remzi/OSTEP/ - Sopivalla hakusanalla kaikki tieteelliset artikkelit (ACM ja IEEE paljon avoimia artikkeleita tällä hetkellä) - Esim. Tannenbaum - Modern Operating Systems - kuuluuko screen-ohjelma posix-standardiin? - Ei. Se selviää osoittesta: https://pubs.opengroup.org/ - tmux aina houkuttelisi mut jos screen löytyy valmiiksi vaikka mistä niin... - Tuota tmuxia saa käyttää, jos sellainen löytyy. - Mikä on hyvä komentorivi aprillipila?
 - Saattaa yksi myöhemmin tullakin. - oliko näistä luennoilla ja luentojen ulkopuolella käydyistä kysymyksistä (kuten säpo-listoille tulleista ja vastatuista) yhteenvetoa jossain? - Ks. tiedosto luentosuunnitelma_2020.txt kurssin aineiston koodivarastossa YouSourcessa johon on linkki kurssisivulla. - Mikä tapahtuu chätissa, jää tsättiin. - Sähköpostilista on arkistoituna Korppiin, linkki sähköpostissa, tulee myös julkiseksi kurssilaisille *** Tavoitekartoitus ja tulevan viikon tehtävät - Onnistuttiinko-kysely - Seuraava viikkotavoite - ei uutta luettavaa monisteesta, vaan aiemman vahvistamista ja sisäistämistä - demo 3:n ohjeteksti luettavaksi - tee käytännön kokeiluja esitetyistä asioista - demo 2 täytyy tehdä ja palauttaa. ** Luento 7: (ke 15.4.2020) (P) Kysymysten kautta mennään taas *** Infoisku keväälle 2020 - Muistutus tässäkin: Demo 1-2 palautteet annettu - lue ja reagoi - Ensi viikolla tapahtuu "Demo 4 porukalla" - mitä tämä tarkoittaa!? + Ryhmäharjoite + 90 minuutin sessio!! Paikalla vartin yli!! 90 minuutin päästä vasta pääsee pois. Demo 4 suoritus == olet läsnä, kun ope kirjaa, että olit läsnä. Läsnä == Zoomissa. Mahdolliset ajat on Sisussa. Voit valita itselle sopivan ja TULLA PAIKALLE ENNEN VARTIN YLI. Tarkennus: - jos ei mee oppi päähän, voiko tulla USEAMPAAN ryhmään????? Kyllä voit!! *** Edellinen ja seuraava välitavoite kirkkaaksi **** Toivottu tilanne tänään, kun mennään kevätkurssia 2020 aikataulussa: - Monisteluvut 1-4 (sivut 1-67) luettu ja jopa sisäistetty; - demot 1-2 sisäistetty ja palautettu. - demo 3 ohjeteksti luettu - tehty itsekin käytännön kokeiluja näissä esitetyistä asioista Pollataan tavoite ja ajankäyttö perinteiseen tapaan! **** Tämän päivän päätavoitteet - vahvistetaan aiemman omaksumista ja demo 3:n onnistumista pian - varmistetaan, että voidaan siirtyä kohti demoa 4 ja monisteen lukua 5. - käydään läpi kysymyksiä, joita toivottavasti on herännyt tehdessä. - Uutuus tästä eteenpäin: Aletaan varmistella osaamisen syntymistä (tenttitärpit?) **** Haaveiltu seuraava tavoite (jo tälle viikolle): Lukemista (jo perjantaiksi): - Demo 4 ohjeteksti; tärkeä ensi viikon demo 4 -ryhmätöitä varten! - Monisteen luku 5 työn alle Tekemistä: - Demo 3 valmiiksi ja palautus + asioiden sisäistäminen - Demo 4 ohjeteksti Poll: Onko tämän päivän ja viikon tavoite ymmärretty? Tarkennetaan tarvittaessa. *** Uusien kysymysten kartoitus ja priorisointi Kartoitetaan totuttuun tapaan protokollalla, joka jo osataan. Kysymyksiä (ei vastauksia!) chättiin 5 minuuttia. **** Kysymykset listattuna tarkennetussa muodossaan - assembler-käskyille välitettävät arvot: onko suluilla merkitystä ilman lisäystä tai vähennystä osoitteeseen, eli movq %rdx, %rax vs. movq (%rdx), %rax vs. movq 32(%rdx), %rax - voiko lähteä keulimaan demo 4 vai jättää ryhmä päivälle? - onko esim käyttöjärjestelmäohjelmointiin, suoritinarkkitehtuuriin ym kurssin asioihin joko jkl:ssä tai muualla jonkinlaista "syventävää" jatkokurssia tarjolla? - Onko shell komennoille annettavat "vivut" eli viivalla annettavat optiot argumentteja komennolle vai kutsutaanko niitä joksikin muuksi? - voidaanko katsoa yhdessä jotain hexadumppia vielä, ja miten sitä kannattaa lähestyä - onko demojen ja pdf:n etenemisestä ohjetta, jolla voisi edetä niin, että molemmat tukevat toisiaan - etukäteen edeten (ts. ilman ohjeistusta tunnilta, omaa, nopeampaa tahtia). - Miten käytän export -komentoa ympäristömuuttujan muokkaamiseen? (alkuperäinen: Mitenkä export komento toteutetaan, kun pitää vaikka ympäristömuuttujia muokata?) - Luentomateriaali sivu 56. Ensimmäinen kaavio debuggerin tulosteesta. Voiko käydä läpi, että mitä kaikkee siinä on? Olisi hyvä, jos siihen olisi piirretty lokeroidusti rivien merkitys. - Sivulla 42 sanotaan, "käyttöjärjestelmä käynnistää huutomerkin ja risuaidan väliin kirjoitetun ohjelman", kun puhutaan tiedoston alussa olevasta #!-yhdistelmästä. Tarkoittaako toi jotain muuta risuaitaa ja huutomerkkiä, vai pitäisikö sen olla niiden jälkeen kirjoitettu ohjelma? - Monisteessa kuva 12 sivulla 61, eli suorituspino, jäi epäselväksi. Miksi pinon huippu on lopuksi 992 eikä 990? "Kun pinoon laitetaan luku, rekisterin RSP sisältämä muistiosoite pienenee, koska pinon huippu kasvaa alaspäin. Pinon huipulta otettaessa RSP suurenee." Voiko tätä logiikkaa avata? Miksi pinon huippu kasvaa alaspäin? "Kommennolla 'pushq $12' RSP:n arvo pienenee 8:lla, koska q tarkoittaa 64-bittistä siirtoa." Liittyy edelliseen, mutta voisiko tätä myös avata? Miksi se pienenee juuri 8:lla? - Hieman epäselväksi monisteen lukemisen jälkeen on jäänyt, että mitä ovat otsikko- ja objektitiedostot. Saisiko näihin selvyyttä? - Tarkoitetaanko assemblerilla sekä symbolista konekieltä että konekielen kääntäjää? Ainakin luentomonisteessa vaikutti, että termiä käytettiin sekä kielestä että kääntäjästä. Pitääkö vain päätellä asiayhteydestä kumpaa tarkoitetaan? *** Käydään läpi joitain kysymyksiä nyt, joitain saa jäädä perjantaille Helpot alta pois: - voiko lähteä keulimaan demo 4 vai jättää ryhmä päivälle? Vastaus: Voi. - Tarkoitetaanko assemblerilla sekä symbolista konekieltä että konekielen kääntäjää? Ainakin luentomonisteessa vaikutti, että termiä käytettiin sekä kielestä että kääntäjästä. Pitääkö vain päätellä asiayhteydestä kumpaa tarkoitetaan? Vastaus: Kyllä, molempia. Pitää päätellä. [tauko 13 min.] Nopeita: - onko demojen ja pdf:n etenemisestä ohjetta, jolla voisi edetä niin, että molemmat tukevat toisiaan - etukäteen edeten (ts. ilman ohjeistusta tunnilta, omaa, nopeampaa tahtia). Vastaus: Ei ole muuta ohjetta kuin mainittuihin kirjatut lauseet. Olen yrittänyt laittaa kyllä ristiviittauksia demojen ja monisteen välille. Pollataan kerran käsittelyjärjestys. Tänään käytiin: - Mitä ovat otsikko- ja objektitiedostot? Hieman epäselväksi monisteen lukemisen jälkeen on jäänyt, että mitä ovat otsikko- ja objektitiedostot. Saisiko näihin selvyyttä? Vastaus: Tämä kerrotaankin demossa 4, joka annetaan puolen tunnin päästä tehtäväksi lukea. Kysymys nousee toivottavasti uudelleen, jos siihen jää demon 4 jälkeen epäselvyyttä. - Shellin vivut kuten '-f' argumentteja vai jotain muuta? Onko shell komennoille annettavat "vivut" eli viivalla annettavat optiot argumentteja komennolle vai kutsutaanko niitä joksikin muuksi? Vastaus: Saa sanoa parametreiksikin. "Argumentti" on vakiintunut ja esim. POSIXin ja C-kielen speksien käyttämä nimi. Tarkennus: Saako vielä tarkentavan kysymyksen heittää onko '|' putkitus myös argumentti samalla määritelmällä? Vastaus: Ei. Se on operaattori. ks. https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_02 - Voidaanko katsoa yhdessä jotain hexadumppia vielä? ja miten sitä kannattaa lähestyä Vastaus: Hyödyllisenä työkaluna datan sisällön tutkimiseen tavuina, esimerkiksi koodausjärjestelmät. Jos saa heittää tulevaisuuteen kysymyksen hexakoodiin liittyen, että jos ottaa tiedostosta hexdumpin niin sisältääkö se tiedoston metadataa vai pelkän sisällön? Vastaus: Lue/kertaa demo-ohjeista ja/tai monisteesta. *** Tavoite ennen perjantain luentoa Lukemista (jo perjantaiksi): - Demo 4 ohjeteksti; tärkeä ensi viikon demo 4 -ryhmätöitä varten! - Monisteen luku 5 työn alle Tekemistä: - Demo 3 valmiiksi ja palautus + asioiden sisäistäminen Poll: Onko tämän päivän ja viikon tavoite ymmärretty? Tarkennetaan tarvittaessa. ** Luento 8: (pe 17.4.2020) (P) Kysymysten kautta *** Tilannekartoitus edellisestä tavoitteesta Pollataan edellisen tavoitteen toteuma ja keskittynyt ajankäyttö 7 vuorokauden liukuvassa ikkunassa. *** Tämän päivän tavoite Päivän tavoite: - Saadaan vastaukset viime kerralta jääneisiin kysymyksiin. - Uutuus tästä eteenpäin: Aletaan varmistella osaamisen syntymistä (tenttitärpit? vieläkään ei ehditty. Siirtyy siis ensi viikkoon.) - Kartoitetaan jo uusia kysymyksiä, jos ehdittiin vastata edellisiin. Ei vielä priorisoida kuitenkaan. (Ehdittiin vastata edellisiin, mutta tiima loppui ennen uusien kartoittamista; ei se midn, koska ensi viikon alussa joka tapauksessa taas kartoitetaan!) - Luennon lopuksi tiedetään, mitä seuraavaksi pitää tehdä ennen ensi viikon yhteisiä tapaamisia. *** Keskiviikkona esitettyjen kysymysten läpikäyntiä Vastattiin näihin (katso luentovideolta laajemmat käsittelyt): - Luentomateriaali sivu 56 kaavio debuggerin tulosteesta? Voiko käydä läpi, että mitä kaikkee siinä on? Olisi hyvä, jos siihen olisi piirretty lokeroidusti rivien merkitys. [tauko 7 minuuttia. Jatketaan klo 11:16] - Assembler sulut "%rdx" vs "(%rdx)" vs "32(%rdx)" on mitä? assembler-käskyille välitettävät arvot: onko suluilla merkitystä ilman lisäystä tai vähennystä osoitteeseen, eli movq %rdx, %rax vs. movq (%rdx), %rax vs. movq 32(%rdx), %rax Vastaus: Sulut ovat tärkeät. Tarkoittaa, että lähde tai kohde on muistissa eikä rekisterissä. Osoite on suluissa ilmoitetun rekisterin sisältämä luku plus sulkuja edeltävä luku. Vois olla 0, mutta nollaa ei ole tapana kirjoittaa. - Mitkä risuaita ja huutomerkki? Sivulla 42 sanotaan, "käyttöjärjestelmä käynnistää huutomerkin ja risuaidan väliin kirjoitetun ohjelman", kun puhutaan tiedoston alussa olevasta #!-yhdistelmästä. Tarkoittaako toi jotain muuta risuaitaa ja huutomerkkiä, vai pitäisikö sen olla niiden jälkeen kirjoitettu ohjelma? Vastaus: Moniste on nyt korjattu sivulta 42. - Suorituspinosta tarkennusta, esim. miksi 992 eikä 990? Monisteessa kuva 12 sivulla 61, eli suorituspino, jäi epäselväksi. Miksi pinon huippu on lopuksi 992 eikä 990? "Kun pinoon laitetaan luku, rekisterin RSP sisältämä muistiosoite pienenee, koska pinon huippu kasvaa alaspäin. Pinon huipulta otettaessa RSP suurenee." Voiko tätä logiikkaa avata? Miksi pinon huippu kasvaa alaspäin? "Kommennolla 'pushq $12' RSP:n arvo pienenee 8:lla, koska q tarkoittaa 64-bittistä siirtoa." Liittyy edelliseen, mutta voisiko tätä myös avata? Miksi se pienenee juuri 8:lla? Vastaus: Ehkä myöhemmän elämän asiaa. Tällä kurssilla kaikissa esimerkeissä pinotaan 64-bittinen luku, mistä syystä osoitteiden ero on 8. - Miten käytän export -komentoa ympäristömuuttujan muokkaamiseen? (alkuperäinen: Mitenkä export komento toteutetaan, kun pitää vaikka ympäristömuuttujia muokata?) - Jatkokursseja assemblerista, käyttöjärjestelmistä ym.? onko esim käyttöjärjestelmäohjelmointiin, suoritinarkkitehtuuriin ym kurssin asioihin joko jkl:ssä tai muualla jonkinlaista "syventävää" jatkokurssia tarjolla? Jyväskylässä: - Kääntäjätekniikka - Kyberturvallisuuden tekniset kurssit. - Ohjelmointityö, Erikoistyö, LuK -tutkielma, Pro gradu -tutkielma Muualla: - Paljon MOOCeja ym. Helpointa neuvotella esim. ohjelmointityö jne. *** Tavoitekartoitus: edellinen ja seuraava Lukemista: - Demo 4 ohjeteksti; tärkeä ensi viikon demo 4 -ryhmätöitä varten! - Monisteen luku 5 ennen demo 4 -ryhmätyötä. - Monisteen luku 6 heti demo 4:n jälkeen. Tekemistä: - Demo 3 valmiiksi ja palautus + asioiden sisäistäminen Tarkennus: - kumpi demo 4 ohjeteksti pitää lukea vai molemmat? Tämä, ehdottomasti: http://users.jyu.fi/~nieminen/kj20/demovedokset/d04_c.html ** Luento 9: (ke 22.4.2020) (J) Kysymysten kautta *** Tilannekartoitus edellisestä tavoitteesta Pollataan edellisen tavoitteen toteuma ja keskittynyt ajankäyttö 7 vuorokauden liukuvassa ikkunassa. *** Tämän päivän tavoite Päivän tavoite: - Kartoitetaan uusia kysymyksiä. - Uutuus tästä eteenpäin: Aletaan varmistella osaamisen syntymistä - Luennon lopuksi tiedetään, mitä seuraavaksi pitää tehdä ennen perjantain yhteisiä tapaamisia. *** Kartoitetaan uusia kysymyksiä - Tuleeko ennen tenttiä jotain sellasta luentoa millon kerratas kurssin pääpointit tai maholliset tenttitärpit?
 - Millanen tentti tulee olemaan? - Mulle on monisteen luvun jälkeen vielä tosi epäselvää, miten assemblerilla voidaan tehdään silmukka. - makefile jäi aika pimentoon demo 4 teksteissä, pitäiskö siitä tietää enemmän? - Mitä on käyttöjärjestelmän päätehtävät? - Kun C ohjelmaa ajaa debuggerilla disassemble onko siinä näkyvät muistipaikat virtuaalimuistin paikkoja?
 *** Ymmärryksen syntymisen varmistelua Hehe.. sieltä fasilitointisanastosta: Ymmärryksen syntyminen tulee varmistaa, ja siihen ei oikeasti riitä kysymys "ymmärsitkö/etkö" vaan tarvitaan konkreettisia sisältökysymyksiä eli kansakoulukielellä "pistokokeita". Kuvitelma ymmärryksestä on eri kuin ymmärrys (ja ilmiönä vaarallinen). Ryhdytään testaamaan tähän astista osaamista! Jollain tavoin.. tenttitärppejä ja polleja? Chattiä? *** Uusien kysymysten läpikäynti - Mulle on monisteen luvun jälkeen vielä tosi epäselvää, miten assemblerilla voidaan tehdään silmukka. - makefile jäi aika pimentoon demo 4 teksteissä, pitäiskö siitä tietää enemmän? - Mitä on käyttöjärjestelmän päätehtävät? - Kun C ohjelmaa ajaa debuggerilla disassemble onko siinä näkyvät muistipaikat virtuaalimuistin paikkoja?
 *** Tavoitekartoitus: edellinen ja seuraava Lukemista: - Monisteen luku 5 ennen demo 4 -ryhmätyötä. - Monisteen luku 6 heti demo 4:n jälkeen. Tekemistä: - Demo 3 valmiiksi ja palautus + asioiden sisäistäminen - Demo 4 itsetehden tai demotilaisuudessa ilmoitettu palautus tehden Tarkennus: - kumpi demo 4 ohjeteksti pitää lukea vai molemmat? Tämä, ehdottomasti: http://users.jyu.fi/~nieminen/kj20/demovedokset/d04_c.html *** Seuraava lukupaketti - Perjantaiksi: luvut 5 ja 6 luettu - Ensi viikoksi: Monisteluvut 1-7 (+17 sivua) luettu jollain tasolla; demot 1-4 sisäistetty, aloitettu tutustumaan demoon 5. *** Aiempia kysymyksiä vuodelta 2019 **** Terminologiaa: instanssi, instantointi, instanssimetodi? - Demo4 matskussa ja luvussa 5 puhutaan instanssimetodeista, olioinstansseista, instantoimisesta. Ei ole tuttu termi aiemmilta kursseilta, mikä se instanssi tässä yhteydessä on? Jaah.. olipas tärkeä havainto!! Ei käynyt mielessäkään, ettei näitä termejä olisi Ohjelmointi 1 -kurssilla. Tässäpä käännökset ohj1-kielelle: olioinstanssi == (luokan) ilmentymä, olio instantoiminen == (luokan) ilmentymän luonti, olion luonti instanssimetodi == olion metodi, joka ei ole staattinen vaan ilmentymän kautta kutsuttava luokkametodi == staattinen metodi **** Viime viikolta: C, C#, C++ eroavuuksista? - Onko mahdollista selittää C:n, C#:n ja C++:n krittisimmät erot yhdellä lauseella? Lyhyt vastaus: En keksi, miten se tehtäisiin. Kysymykseen eroista palataan tarpeen mukaan, kun demo 3 ja demo 4 on ehditty lueskella ja tehdä, koska siellä aiheesta on useampia lauseita. Kuitenkin alkuarvaus tähän hetkeen (muutamia tärkeimpiä eroja): - C# ja C++ ovat olio-ohjelmointikieliä. C ei ole. - C# on uusin, C++ toiseksi uusin ja C vanhin. Uudempi on yritetty tehdä niin, että vanhassa todettuja ongelmia jäisi pois. (paitsi C++ tarkoituksella otti lähtökohdaksi silloisen C:n ongelmineen). - Edellisessä kohdassa "uutuus" tarkoittaa ensimmäistä versiota. Kaikki kielet kehittyvät ja uudistuvat koko ajan! Voidaan hyvin sanoa, että C11 on eri kieli kuin C99. Ohjelmoijan vastuulla on noudattaa uutta tapaa tehdä asioita, vaikka vanhakin on yhä mahdollinen. - Tyypillisesti C ja C++ käännetään natiiville konekielelle, kun taas C# virtuaalikoneen konekielelle. Mikään ei kuitenkaan estä kääntämästä C:tä tai C++:aa virtuaalikoneelle tai C#:ia natiiviksi. Pikainen googletus kertoo, että näitä kaikkia tehdään tänä päivänä käytännössä ja olemassa olevilla työkaluilla, jos se on tarkoituksenmukaista. - Onko Ohjelmointi 2 -kurssin C/C++ -lisäosassa paljon samaa/eri kuin tässä? Todennäköisesti C:n osalta samaa, kuten ``int main(int argc, char **argv)`` ja ``printf("Hei maailma ja %d opiskelijaa\n", 123)``. C++ sen sijaan on aivan erilainen kieli! - C-kielen tähtiin tarkennusta: mitä tekevät ja miksi tarvitaan Tarvitaan esimerkiksi samaan rooliin kuin viitteitä C#:ssa. Eli tiedetään, missä data sijaitsee. Syntaksin oppiminen vaatinee koodin lukemista, miettimistä, ja määritelmien kertaamista yhä uudelleen. - Eli C:ssä "ohjelma.kutsu korvataan ohjelma->funktiolla, ja viittaus toiseen tehdään *:llä?" Ei aivan... C:ssä ei ole metodikutsuja! Esim. meidän demo 4:ssä: + C#:n ``viitemuuttuja.attribuutti`` korvataan ``osoitinmuuttuja->attribuutti`` + tyyppinimissä ``Tyyppi viitemuuttuja`` korvataan ``tyyppi * osoitinmuuttuja`` Silloin puhutaan suurin piirtein samaa merkitsevistä asioista. C ei ole oliokieli, joten siellä ei tehdä ``viite.metodi()`` tai muuta vastaavaa. **** Hexdumpin yksittäiset selväkieliset merkit? - Onko hexdumpin satunnaisilla "@" "8" jne. joku tarkoitus? Saako niistä selville mitään? Kyseiset merkit ilmeisesti ELF-tiedoston heksavedoksesta. Jos eivät ole osa selväkielistä merkkijonoa, niin merkeistä ei tavallaan ole tarkoitus selvitä sen kummempaa - ne vain sattuvat olemaan sellaisella lukualueella, joka on mahdollista tulostaa merkkeinä. Tosin kyllä niistä saa selvää, sitten kun olet "Matrixin Neo": + merkki "@" on ASCII-koodauksessa heksaluku 0x40. Myöhemmin tällä kurssillakin valkenee, että AMD64:n Linuxissa yleensä ladataan ohjelmatiedosto muistiin osoitteeseen 0x400000, joten pienessä Hei maailma -tyyppisessä ohjelmassa hyvin monet ELFissä tarpeelliset muistiosoitteet sisältävät sen takia juuri tavun 0x40. Niinpä Matrixin Neo voi vilkaista 8 ja 16 tavun välein toistuvia "@"-merkkejä ja veikata tässä olevan AMD64:n Linux-binäärin alkupuolta ELF-formaatissa. Varmempi tapa tietysti todeta taikaluku 0x7f "ELF" tiedoston alusta... **** Polkuinjektio? - Toimiiko argumentteihin polkuinjektio? Esim ../deleteWin32 tms. Käyttäjän argumentteihin argv[1], argv[2], ... voi käyttäjä laittaa mitä vaan, joten niiden kanssa pitää olla tietysti yhtä varovainen kuin kaiken käyttäjäsyötteen kanssa! Mites argv[0]? Se on komento, jolla ohjelma käynnistettiin. Mutta kyseinen komento ei välttämättä käynnistä samaa ohjelmaa uudelleen, jos esimerkiksi ohjelmatiedosto on muutettu tiedostojärjestelmässä! (hyväntahtoinen ohjelmistopäivitys tai pahantahtoinen "injektio") Tietoturvan yksityiskohdat ovat jatkokurssien asiaa, mutta on hyvä tiedostaa tässäkin, että terve epäily on aina hyvä juttu... **** Viime viikolta: välimuisti? - Mitkä komennot suoritetaan välimuistissa ja mitkä ei? + Käytännössä kaikki, ks. lokaalisuusperiaate luvuissa 6 ja 10. **** Kohti demoa 5 - onko mahdollista saada vaiheittainen piirros pinon toiminnasta prosessorissa/muistissa aliohjelmakutsujen yhteydessä? Jep, se on täsmälleen tämän kurssin demo 5! - Selvennystä vielä IP:hen ja niihin muihin rekistereihin. Tätäkin tulee mm. demossa 5! **** Miten C:n osoitin eroaa C#:n vastaavasta? Ks. yllä. C#:n osoittimen sisältöä ei muokata, C:ssä taas usein muokataan, jotta päästään osoittamaan esim. seuraavaan muistipaikkaan. **** Tuleeko demosta 4 joku merkintä Korppiin tai demopalautusjärjestelmään, kun sen on tehnyt "labratyönä" parin kanssa? Kyllä. ** Luento 10: (pe 24.4.2020) (J) Kysymyksiä, vastauksentapaisia, tenttitärppejä! *** Tilannekartoitus edellisestä tavoitteesta Pollataan edellisen tavoitteen toteuma ja keskittynyt ajankäyttö 7 vuorokauden liukuvassa ikkunassa. *** Tämän päivän tavoite Toivottu tilanne tänään, kun mennään kevätkurssia 2020 aikataulussa: - Monisteluvut 1-6 luettu jollain tasolla; demot 1-4 sisäistetty, 5 alkaa pikkuhiljaa Päivän tavoite: - Käsitellään kysymyksiä, ehkä pari välispiikkiä - Kartoitetaan uusia kysymyksiä. - Luennon lopuksi tiedetään, mitä seuraavaksi pitää tehdä ennen ensi viikon yhteisiä tapaamisia. Viikkotavoite: - siirtyminen kohti seuraavia asioita eli monisteen lukuja 7 ja 8, demoa 5 jne. Juonipaljastus/twisti: Tähän asti kaikki on ollut teknistä yleissivitystä, jotta voidaan ymmärtää varsinainen asia. Nyt alkaa Käyttöjärjestelmät-kurssin aihepiiri *** Välispiikit **** Käyttöjärjestelmien historiasta kirjakatsaus "Operating systems", 1974 *** Kysymysten läpikäynti - Mulle on monisteen luvun jälkeen vielä tosi epäselvää, miten assemblerilla voidaan tehdään silmukka. - Voi toki tarkistaa, mitä hakukoneella löytyy, mutta voi myös kirjoittaa yksinkertaisen C-ohjelman, kääntää sen (c99 -s ohj.c) assembleriksi ja opiskella ja tutkiskella tätä assembler-tiedostoa. - makefile jäi aika pimentoon demo 4 teksteissä, pitäiskö siitä tietää enemmän? - Eipä juurikaan, mutta Demo 5:ssä on mukava Makefile, jota kannattaa lueskella ja pohtia ajamisen lisäksi. - Mitä on käyttöjärjestelmän päätehtävät? - Ensimmäinen kappale monisteesta, hieman avaten - muistin käsittely - prosessit ja prosessien hallinta, keskeytykset - oheislaitteiden ohjaus - tiedostojärjestelmä - Ja aina voi vilkaista, mille päällisin puolin näyttää käyttöjärjestelmän lähdekoodi, vaikkapa https://github.com/torvalds/linux - Ja tietysti https://pubs.opengroup.org/onlinepubs - Kun C ohjelmaa ajaa debuggerilla disassemble onko siinä näkyvät muistipaikat virtuaalimuistin paikkoja? - Kyllä. *** Tavoitekartoitus: edellinen ja seuraava Lukemista: - Monisteen luku 7 ja 8 Tekemistä: - Demo 5 työn alle - Nyt olisi jo pitänyt olla: Demo 3 valmiiksi ja palautus + asioiden sisäistäminen - Nyt viimeistään: Demo 4 itsetehden tai demotilaisuudessa ilmoitettu palautus tehden + asioiden sisäistäminen - Kysymyksiä kannattaa merkitä ylös etukäteen materiaalia lukiessa ja demoja tehdessä ** Luento 11: (ke 29.4.2020) (P) Kysymysten kautta mennään *** Infoisku keväälle 2020 - Huomenna on perinteiset "vapun etkot" eli käyttöjärjestelmien luento klo 14:15-16:00! - Huomenna myös open labrapäivä perinteisesti 8:15-10:00. - Terveisiä Hyviksiltä korona-aikaan (+Muistutus siitä, miten tämän kurssin deadlinet ja ajankäyttö määriteltiin jo alussa) - Demotarkastusten tilanne: TODO-listan kärjessä. Tiedotetaan. *** Tilannekartoitus edellisestä tavoitteesta Perinteiset pollit. *** Tämän päivän ja viikon tavoite Tämä viikko pysytään aiemmassa tavoitteessa, ja koetetaan varmistaa edellytykset siirtyä eteenpäin eli monisteen luku 9 ja demo 5:stä tavoiteltava ymmärrys. Tänään ja huomenna siis tavoite seuraavanlainen. Lukemista: - Monisteen luku 7 ja 8 Tekemistä: - Demo 5 työn alle - Nyt olisi jo pitänyt olla: Demo 3 valmiiksi ja palautus + asioiden sisäistäminen - Nyt viimeistään: Demo 4 itsetehden tai demotilaisuudessa ilmoitettu palautus tehden + asioiden sisäistäminen - Kysymyksiä kannattaa merkitä ylös etukäteen materiaalia lukiessa ja demoja tehdessä Poll: Onko selkeä vai tarvitseeko tarkentaa? *** Kartoitetaan uusia kysymyksiä Kysymykset tänään (5 min aikaa esittää): - Voiko sovellustaan nopeuttaa ohjeistamalla käyttöjärjestelmää säikeistämään sitä enemmän / vuorontamaan sitä muiden edelle? - Säikeet vs. prosessit? jäi vähän himmeeksi erot ja edut, miksi säie on "kevyempi"... - jos prosessi pyytää "forkkausta", onko se aina myönnettävä? jos resurssit riittää - Voisiko keskeytyskäsittelyä käydä hieman läpi? Eli mietin sitä step by step miten menee. - Miten määräytyy säikeiden määrä prosessille onko puhtaasti ohjelmoijan itse määrättävissä ja määritteleekö jokin mahdollisen säikeiden maksimimäärän? - PPID? aina se, joka pyysi prosessin aloittamista? - voisiko prosessin suoritussyklin selostaa vielä sanallisesti? monisteessa esim. kuva 19 - samoin kuva 20; sivu104, voisko jonkin keissin käydä läpi siihen kuvaan liittyen? - en tiedä oonko vaan ymmärtänyt demoissa väärin, mutta luentomonisteessa muistiosoitteista sanotaan, että suurin muistiosoite on pinon alimmaisena, mutta miksi demo 5 esimerkissä pino on toisinpäin, eli muistiosoite suurenee ylöspäin? - Onko mahdollista käydä luennolla läpi demo 5:n oikeat vastaukset jossakin vaiheessa? - sanooko Paavo tahallaan "pasix", "posix":n sijaan? vai miksi näin? - Voitaisiinko taas käydä vanhoja tenttikysymyksiä läpi pollien kera? *** Uusien kysymysten läpikäyntiä Nopeat alta pois: - Onko mahdollista käydä luennolla läpi demo 5:n oikeat vastaukset jossakin vaiheessa? Ei. Syy: Silloin ei opi. Vaan ensin pitää pääkoppa kuumana miettiä ja sisäistää tehtävän luonne ja kysymys. Kun tehtävään saa riittävän hyvän vastauksen eli vähintään 1 tähden demojärjestelmään, niin palautteen mukana tulee salainen linkki, jota seuraamalla pääsee näkemään mallivastauksen sekä laajan analyysin siitä, miksi vastaus on juuri sellainen ja mitä yleisiä virhekäsityksiä opiskelijoilla on tehtävässä yleensä ollut. Tällä tavoin oppiminen tulee mahdolliseksi. - Voitaisiinko taas käydä vanhoja tenttikysymyksiä läpi pollien kera? Kyllä. Niitä tullaan varmasti käymään läpi! - sanooko Paavo tahallaan "pasix", "posix":n sijaan? vai miksi näin? Tahallaan ja aikoinaan netin selaamisen kautta syntyneen käsityksen savolaisen version mukaisesti. [tauko 15:15 asti] Priorisoitu lista: - Keskeytyskäsittelyä läpi step by step - Prosessin suoritussykli, Kuva 19 sanallisestikin? Vastaus kahteen edelliseen: Luentovideolla (katso moniviestimestä) - Voiko käyttöjärjestelmää pyytää vuorontamaan prosessia muiden edelle? Voiko sovellustaan nopeuttaa ohjeistamalla käyttöjärjestelmää säikeistämään sitä enemmän / vuorontamaan sitä muiden edelle? Vastaus: Totta kai. Ei ehditä käsitellä menettelyjä tällä kurssilla. Niistä on alustava kuvaus monisteen luvussa 13 kyllä. Vaatii käyttöoikeudet prosessien priorisointiin. Esimerkiksi jatkokurssilla "Linux-virtuaalipalvelimen ylläpito" varmastikin käydään läpi yksityiskohtia. Loput huomenna. *** Seuraava välitavoite Käytetään luentojen välissä oleva "käyttisaika" viikkotavoitteen parissa eli aiempaa vahvistamalla. Ks. "Tämän päivän ja viikon tavoite". ** Luento 12: (to 30.4.2020) (P) Vapun etkot *** Tilannekartoitus edellisestä tavoitteesta Pollataan edellisen tavoitteen toteuma ja keskittynyt ajankäyttö 7 vuorokauden liukuvassa ikkunassa. *** Tämän päivän tavoite Varmistetaan, että voidaan siirtyä seuraavaan välitavoitteeseen. Se olisi toiveiden mukaan seuraava: Lukemista: - Monisteen luku 9 ja 10 Tekemistä: - Demo 5 täydessä vauhdissa - Kysymyksiä kannattaa merkitä ylös etukäteen materiaalia lukiessa ja demoja tehdessä Tämän päivän tavoite siis: - Varmistetaan, että demo 5 on käynnissä. - Paikataan ymmärrysaukkoja lukuun 8 saakka kysymysten pohjalta. Poll: Onko selkeä vai tarvitseeko tarkentaa? *** Välispiikki ja vappujäynä **** Säät suosivat - millaiset säät tänään? Millainen sää luentosalin ja Agoran ulkopuolella vallitsee tällä hetkellä? Komennetaanpa shellissä: curl wttr.in/Jyvaskyla Mitäs? Joku on tehnyt hauskan palvelun, josta opiskelija vinkkasi irkissä vuonna 2016. cURL on yleinen apuohjelma, joka noutaa Internetin yli URLin mukaisen vastauksen palvelimelta ja ohjaa sen standardiulostuloon... "man curl" kertoo lisää. Tämä on kenties hieman yleisempi tapa yksittäisiin WWW-palvelinkyselyihin kuin mm. demo-ohjeissamme käytetty "GNU Wget". Kapeaan terminaali-ikkunaan ei välttämättä mahdu koko tuloste, joten luentosalissa seuraava voi olla parempi komento: curl wttr.in/Jyvaskyla 2>/dev/null | head -7 Tämä komento putkittaa curl'in tulosteen head'ille, jonka avulla voi tulostaa vain argumenttina annetun määrän ensimmäisiä riviä. Nyt curl voi joutua lopettamaan tulostuksensa kesken, kun head ei haluakaan enää lisää syötettä. Curl toteaa tämän virheilmoituksena standardivirhevirtaan, josta ei tässä komennossa olla kiinnostuneita, joten virhetulosteet ohjataan operaattorilla '2>' kankkulan kaivoon eli /dev/null'iin johon ohjatuilla tavuilla ei tehdä mitään. Asiaan. **** Vappujäynä tai komentoriviaprillipila? Luentovideolla pieni kuvaelma. Katso. Lisätietoa: https://moniviestin.jyu.fi/ohjelmat/it/yhteiset/itka2050/recording-03-04-2020-14.18 *** Ymmärryksen syntymisen varmistelua Tenttitärppejä. Kaksi kärpästä yhdellä iskulla: Aloitetaan demoon 5 liittyvästä, niin saadaan käytyä demo 5:n ideaa muutenkin. + Ensin nykyisen ymmärryksen kokeileminen A: 0x00007fffffffdcc0 B: 0x00007fffffffdcf0 C: 0x00007fffffffde38 D: 0x7fffffffdcf0 E: 0x00007fffffffdd50 + Sitten käydään läpi demo 5 ja moniste tältä osin Tavoite: Demo 5 on nyt mahdollista tehdä, tietäen sen tavoite ja aloitus. Pollattiin. Vaikuttaisi ainakin pollin perusteella mahdolliselta. [Tauko 15:25 asti] - en tiedä oonko vaan ymmärtänyt demoissa väärin, mutta luentomonisteessa muistiosoitteista sanotaan, että suurin muistiosoite on pinon alimmaisena, mutta miksi demo 5 esimerkissä pino on toisinpäin, eli muistiosoite suurenee ylöspäin? Vastaus: Riippuu kumminko päin kuva piirretään. Demo 5 on teknisistä syistä ylösalaisessa järjestyksessä. Osoitteista sen näkee! *** Kysymysten läpikäynti - Säikeet vs. prosessit? Miksi säie on "kevyempi"? jäi vähän himmeeksi erot ja edut, miksi säie on "kevyempi"... + Teoriaymmärrys kannattaa tsekata ennen ja jälkeen selitystä tenttitärpin kautta. + Speksi kannattanee hakea, avata ja selvitellä, miten lueskellaan. + (TODO: Konkretiaa kannattanee katsoa esimerkkikoodin kautta.) + Ja kurssimateriaalin kiteytykset aiheesta on hyvä tuplatsekata, että mitä satuja siellä sanotaan suomeksi aiheesta.. - Miten määräytyy säikeiden määrä prosessille? onko puhtaasti ohjelmoijan itse määrättävissä ja määritteleekö jokin mahdollisen säikeiden maksimimäärän? Roadmap vastaukseen: + Etsitään speksi ja vastaus. Eli opetellaan lukemaan speksiä täsmänä täsmäkysymykseen. POSIX, pthread_create jne Vastaus: Ohjelmoijan määrättävissä. Maksimi on järjestelmänvalvojan asettama (per prosessi). - Jos prosessi pyytää "forkkausta", onko se aina myönnettävä? jos resurssit riittää siis? Roadmap vastaukseen: + Etsitään speksi ja vastaus. Eli opetellaan lukemaan speksiä täsmänä täsmäkysymykseen. Vastaus: Kotitehtävä. Selvitä itse seuraamalla luentoesimerkkiä tiedonhausta. Löytyy POSIXista fork() -käyttöjärjestelmäkutsun määritelmästä. - Prosessin tilakaavio, Kuva 20; Selitys ja keissi? Vastauksen roadmap: + Teoriaymmärrys kannattaa tsekata ennen ja jälkeen selitystä tenttitärpin kautta + Keissit kannattaa ottaa koodi- ja shell-esimerkkien kautta, verraten terminaalin näkymiä tilakaavioon. - PPID? aina se, joka pyysi prosessin aloittamista? Ennakkoon annettu vastaus (jos ei ehditä käydä läpi): Lähtökohtaisesti ainakin aluksi juuri se. Roadmap vastaukseen, jos on aikaa käydä läpi: + Perusmenettely ja opittava asia IT-tutkinnossasi: Tarkistetaan speksistä. POSIX määrittelee muun muassa PPID-asian tarkkaan ja tositarkoituksella vain osittan: Osio "Base definitions", luku 3 "Definitions". Sieltä termit "Parent Process", "Parent Process ID". Siellä se vastaus on, jos ei ehditty luennolla näyttämään, miten se löytyy - kokeile itse etsiä, niin opit sitä tärkeintä eli etsintäprosessia ja speksin lukemista :). Tiedät vastauksen löytyneen, kun luet sellaista englanninkielistä kuvausta, joka ei jätä mitään arvailun varaan. *** Tavoitekartoitus: edellinen ja seuraava Tavoitteena oli päästä aloittamaan seuraava viikkotehtävä: Lukemista: - Monisteen luvut 9 ja 10 Tekemistä: - Demo 5 täydessä vauhdissa - Kysymyksiä kannattaa merkitä ylös etukäteen materiaalia lukiessa ja demoja tehdessä Tämän päivän tavoite siis: - Varmistetaan, että demo 5 on käynnissä. - Paikataan ymmärrysaukkoja lukuun 8 saakka kysymysten pohjalta. Poll: Saavotettiinko tavoite, eli voidaanko ottaa työn alle yllämainittu? Pollin perusteella kyllä. [Tässä kohtaa tapahtuu vappuaattoilta! Ainejärjestöillä ja JYY:llä tarjolla etäohjelmaa. Sinne siis kokemaan ehkä erilaisin vappu ikinä!] ** Luento 13: (ke 6.5.2020) (J) Kysymysten kautta *** Tilannekartoitus edellisestä tavoitteesta Mitä piti olla tehtynä? Pollataan edellisen tavoitteen toteuma ja keskittynyt ajankäyttö 7 vuorokauden liukuvassa ikkunassa. *** Tavoite 2020 Lukemista: - Monisteen luvut 9 ja 10 luvussa ja luettuna Tekemistä: - Demo 5 täydessä vauhdissa - Kysymyksiä kannattaa merkitä ylös etukäteen materiaalia lukiessa ja demoja tehdessä Tämän päivän tavoite siis: - Varmistetaan, että demo 5 on käynnissä. - Paikataan ymmärrysaukkoja lukuihin 9 ja 10 kysymysten pohjalta. **** Tavoite 2019 Toivottu tilanne tänään, kun mennään kevätkurssia 2019 aikataulussa: - Monisteluvut 1-9 luettu (+ 29 sivua) jollain tasolla; demot 1-4 sisäistetty, 5 työn alla ja 6 esikatselussa Päivän päätavoitteet: - varmistaa omatoimisen lukemisen ja harjoittelun eteneminen. - käydä läpi kysymyksiä, joita toivottavasti on herännyt tehdessä. Viikkotavoite: - siirtyminen kohti seuraavia asioita *** Kartoitetaan uusia kysymyksiä Kysymykset tänään (5 min aikaa esittää): - Tentti 20.5. vai 27.5.? Korpissa on 27.5., mutta kurssin sivuilla 20. - Voisko vielä kerrata, että millä komennolla .s -loppuinen asm tiedosto käännetään ja suoritetaan?
 - Oliko semaforit muussakin käytössä kuin mutexhommissa? - Jäi epäselväksi miten tuota demo 5 selailua pitäisi lukea, heitäkkö selvennystä? - Demo 5:ssä on vielä epäselvää, miten taulukon alkioiden muistiosoitteet määräytyvät. Miksi selailukoodissa listatut muistiosoitteet ovat välillä 2, välillä 8 välein? - Lokaalisuusperiaattesta jokin tiivistävä määritelmä? Milloin taikka miten tulisi huomioida vai tulisiko lainkaan? - Jos prosessi olisi jaettavissa 2 täysin identtiseen osaan jotka jaettaisi 2 säikeelle niin missä suhteessa prosessin läpiajo nopeutuisi vs prosessi suoritettaisiin yhdellä säikeellä alusta loppuun? (Ahmdal) - Tehtäiskö vaikka esimerkkitapaus kädestä pitäen virtuaaliosoitteen muuttamisesta fyysiseksi, esim. materiaalin kuivien 27 -> avulla? *** Läpikäydään uusia kysymyksiä **** Nopeat: - Tentti 20.5. vai 27.5.? Korpissa on 27.5., mutta kurssin sivuilla 20. - Ensimmäinen tenttikerta on 20.5.2020 klo 14:15-18:15. - 27.5 on myös tentti, mutta suositellaan osallistumaan 20.5. tenttiin. 20.5. tulokset eivät tule valmistumaan 27.5. mennessä. - Tarvitseeko ilmoittautua? Kyllä, kurssille ainakin! Tentistä tiedotetaan. - Voisko vielä kerrata, että millä komennolla .s -loppuinen asm tiedosto käännetään ja suoritetaan? - Kannattaa lukea monisteen lopussa olevan koodiliitteen esimerkkejä. Sieltä löytyy esimerkit as ja ld komentojen käyttöön. - Oliko semaforit muussakin käytössä kuin mutexhommissa? - Kyllä, kuten monisteessa esimerkissä luvussa 9.5.2 esimerkiksi käytetään. TAUKO: Jatketaaan 15:15. (Kello tuossa alla!) **** Hitaat: - Jäi epäselväksi miten tuota demo 5 selailua pitäisi lukea, heitäkkö selvennystä? - Demo 5:ssä on vielä epäselvää, miten taulukon alkioiden muistiosoitteet määräytyvät. Miksi selailukoodissa listatut muistiosoitteet ovat välillä 2, välillä 8 välein? - 0x7fffffffe010 + 1 = <--- 0x10 !!! 0x7fffffffe011 0x7fffffffe012 0x7fffffffe013 0x7fffffffe014 0x7fffffffe015 0x7fffffffe016 0x7fffffffe017 0x7fffffffe018 <------ 0x18 !!! 0x7fffffffe019 + 1 = 0x7fffffffe01a 0x7fffffffe01b 0x7fffffffe01c 0x7fffffffe01d 0x7fffffffe01e 0x7fffffffe01f 0x7fffffffe020 <------ 0x20 !!! 0x7fffffffe021 ... 0x15 = 00010101 binäärinä, eli heksat ovat kivoja! - Kääntäjä päättää paikan, mutta pinokehykseenhän nuo järjestyksessä näyttävät menevän. *** Pääsimmekö tavoitteeseen Tämän päivän tavoite siis: - Varmistetaan, että demo 5 on käynnissä. - Paikataan ymmärrysaukkoja lukuihin 9 ja 10 kysymysten pohjalta. *** Perjantaiksi 8.5.2020 - Luvut 9 ja 10 luettuna. - Demo 5 tekemistä tarkkaavaisesti! - Kysymykset muistiin! *** Kysymyksiä 2019 Päivän teema oli "Mitä voisimme tehdä nyt, että oppisit lisää Käyttöjärjestelmistä?" - Tiivistää luvut 5-9. :D Käytiin läpi tätä tematiikkaa.. Ei näitä oikein voi tiivistää :D mutta omaa osaamista voi testailla esimerkiksi käymällä läpi sisällysluettelon otsikoita: onko lukemisen ja ajattelun kautta muodostunut käsitys siitä, mitä käsitteitä termien takana on ja miten ne liittyvät toisiinsa? Esimerkinomaisesti käytiin läpi luvun 5 alilukujen otsikoita. - Luvussa 9 luvataan luentoesimerkkejä - tuleeko niitä? Voidaan tehdä, kun sen aika on. - Eli demo5:ssä halutaan komennolla make ja cat tarkistella eri tiedostoja, poimia niistä olennaiset tiedot ja päivittää vastaus-tiedoston osiot kuvaamaan näitä? Teknisesti joo. Osaamistavoite on ymmärtää tasan tarkkaan, miten konekielinen ohjelma toimii tietokonelaitteistossa. Esim. VASTAUS X: 0x7fffffffdc10 Vaikka vastaus "0x7fffffffdc10" tulee copy-pastella komennon ``make selaile`` tulosteesta, niin sehän ei voi olla mikä tahansa kohta, vaan aina joku tietty. Ja tarkkaan ottaen vastaus ainakin yhteen kohtaan on oikeasti yhtä pienempi luku kuin se, joka olisi suoraan copy-pastattavissa. Mikä niistä ja miksi? No se pittäis tavallaan niinku ymmärtää ja löytää, jotta osaamistavoite toteutuisi. Etsi ja löydä täsmällinen kysymys, joka auttaa asiassa eteenpäin! ** Luento 14: (pe 8.5.2020) (J) Lukujen 9 ja 10 läpikäyntiä esimerkein *** Tilannekartoitus edellisestä tavoitteesta Mitä piti olla tehtynä? Pollataan edellisen tavoitteen toteuma ja keskittynyt ajankäyttö 7 vuorokauden liukuvassa ikkunassa. *** Tavoite Lukemista: - Monisteen luvut 9 ja 10 luvussa ja luettuna Tekemistä: - Demo 5 täydessä vauhdissa - Kysymyksiä kannattaa merkitä ylös etukäteen materiaalia lukiessa ja demoja tehdessä Tämän päivän tavoite siis: - Paikataan ymmärrysaukkoja lukuihin 9 ja 10 kysymysten pohjalta. - Varmistetaan, että demo 5 on käynnissä. *** Läpikäydään vanhoja kysymyksiä **** Hitaat: - Tehtäiskö vaikka esimerkkitapaus kädestä pitäen virtuaaliosoitteen muuttamisesta fyysiseksi, esim. materiaalin kuvan 27 -> avulla? - Katso luentovideo. [ TAUKO -> 11:15 ASTI ] - Lokaalisuusperiaattesta jokin tiivistävä määritelmä? Milloin taikka miten tulisi huomioida vai tulisiko lainkaan? - kannattaa pohtia esimerkin B.4 cache.c kautta - iltalukemista: http://denninginstitute.com/pjd/PUBS/CACMcols/cacmJul05.pdf - Jos prosessi olisi jaettavissa 2 täysin identtiseen osaan jotka jaettaisi 2 säikeelle niin missä suhteessa prosessin läpiajo nopeutuisi vs prosessi suoritettaisiin yhdellä säikeellä alusta loppuun? - Katso vaikka Wikipediasta Amdahlin laki. ( - esimerkin kautta 'Rinnakaislaskentaa säikeistämisellä' s. 217 ja seuraava ) Katsottiin vielä, mistä Demo 6:ssa on kyse. *** Pääsimmekö tavoitteeseen Tämän päivän tavoite siis: - Varmistetaan, että demo 5 on käynnissä. - Paikataan ymmärrysaukkoja lukuihin 9 ja 10 kysymysten pohjalta. - Katsottiin demo 6:tta *** Tulevat tehtävät - Luvut 11 ja 12 luettuna. - Demo 5 valmiiksi ja palautus tarkkaavaisesti! - Demo 6 käyntiin. - Kysymykset muistiin! ** Luento 15: (ke 13.5.2020) (P) Kysymysten kautta *** Infoisku keväälle 2020 **** Demotarkastusten tilanne Demo 4 katsottu 30%, loput tullee tämän illan aikana. Todennäköistä, että demot 1-5 tarkastettuna hyvinkin tällä viikolla! **** Ensisijainen tentti 20.5.2020 klo 14:15-18:15 Tentti tapahtuu ensi viikon keskiviikkona eli 20.5.2020 klo 14:15-18:15. Tämä tiedetään tänään: + Ajankohta on varma. + Todennäköinen toteutustapa on Moodlen ajoitettu etätentti. + Kaikkea netistä avoimesti löytyvää materiaalia on lupa käyttää, mutta kommunikointi kenenkään muun henkilön kanssa tentin aikana on ehdottomasti kiellettyä. Teknisesti kommunikaatiokieltoa on liki mahdoton valvoa, joten asia on nyt "honor code" -tasoinen. Ethän sorru huijaukseen - jälkihäpeä siitä on mittaamaton! + Kysymykset, muotoilu ja arvostelu ovat tasapuolisuussyistä mahdollisimman samanlaiset kuin vuosina 2017-2019 (mallitentit), mutta kysymyksissä ei voi olla sellaisia, joiden vastaus löytyisi suoraan materiaalista tai mallitenttien julkisista palautteista. Tilanteesta johtuen tentti tulee väistämättä mittaamaan osin erityyppistä osaamista kuin aiemmin; tämä lienee enimmäkseen nykyisen vuosikurssin eduksi, koska aiemmissa kysymyksissä osa on eittämättä "ulkoa oppimisen" mittaamista, joka on lähtökohtaisesti väärä asia. Tänä vuonna, kiitos koronaviruksen, tentti mittaa oikeampia asioita eli soveltamista ja tarvittavan tiedon nopeaa kertaamista tai jopa uuden etsimistä. + Voidaan selvästi olettaa, että tentissä on jokaisella nettiyhteys ja selain käytössä, joten se mahdollistaa sellaistenkin kysymysten laatimisen, joiden vastaus löytyykin nimenomaan netistä eikä suoraan materiaalista - toki kuitenkin kurssilla nähdyillä toimintatavoilla. Lisäksi voidaan olettaa, että kurssin demoista tuttu palvelinympäristö jalava/halava on käytettävissä pieniin käytännön kokeiluihin myös tentissä. Tällaisiin voi jossain määrin varautua; luentovideoihin on kertynyt useita esimerkkejä onnistuneista ja epäonnistuneista tiedonhauista nimikkeellä "mallioppiminen". Kerrankin on tilanne, jossa voisi mitata myös tätä sinänsä kaikista tärkeintä taitoa! Muuta ei vielä tänään tiedetä, eikä pystytä tietämään, mutta kaikesta tiedotetaan ennen tenttiä kurssin sähköpostilistalla! Varmista, että olet saanut niiden kautta viestejä, ja käy lukemassa viimeisimmät tiedot ennen tenttiä ke 20.5.2020 klo 14:15. Varmista jo etukäteen: - että olet ilmoittautunut kurssille, ja näet Moodle-alueen (joka on siis tenttiä varten). **** Toissijainen tentti 27.5.2020 klo 16:00-20:00. Toinen tentti on jo 27.5.2020 klo 16:00-20:00. Ajankohta on helppo lukita - tietenkin sama kuin jo viime kesänä tiedotettu yleisen tentin ajankohta: https://www.jyu.fi/it/fi/ohjeita-opiskelijalle/opiskelu/yleiset-tentit/tenttipaivat Ei lähdetä säätämään tai sooloilemaan yhtään, sama mitä koronaviruksia sataisi taivaalta, vaan pidetään se, mikä on ollut mahdollisesti kalenterissa jo vuoden verran! Huomioitavaa: + Kyseessä on tavallinen yleinen tentti, joten ilmoittaudu ihan normaaliin tapaan Korpissa. + Tentti on saman muotoinen kuin 20.5.2020, mutta tietysti eri kysymykset. + Toivottavaa on, että tämä on toissijainen vaihtoehto, mikäli 20.5.2020 klo 14:15 tapahtuva tentti ei ole mitenkään mahdollinen itsellesi. + Esimerkiksi uusintana tätä ei voi ajatella, koska 20.5.2020 ei varmastikaan ehdi olla tarkastettu ennen kuin 27.5.2020 jo tapahtuu. + Myöhempiäkin tenttimahdollisuuksia tulee; oletan ja toivon, että suurin osa käy tenttimässä jo 20.5.2020 ja lopuissa on sitten muun muassa vähemmän hommaa tarkastaa jne. Tarkennuksia, lisäspeksiä: - Tenttiin 20.5.2020 ei tarvitse ilmoittautua näillä näkymin. - Jos käy molemmat, niin jääkö huonompi voimaan? Vastaus: Saa käyttää aikaa 8h sen sijaan että 4h. Parempi jää voimaan. **** Tällä viikolla open labrapäiviä tavanomaista viikkoa tiheämmin. Tällä viikolla open labrapäiviä tavanomaista viikkoa tiheämmin: + to 8:15-12:00 (yhteensä 4 tuntia!) + pe 8:15-10:00 (eli vielä ennen viimeistä luentoa yksi) Tulee myös ensi viikolle, mutta aikataulut tiedotetaan myöhemmin. **** Aikatauluttamisen osalta "demot vs. tentti" huomioi seuraavaa: Aikatauluttamisen osalta huomioi seuraavaa: + Demo 6 on pakollinen kurssin suorittamiseksi, mutta sen sisältö ei ole tentissä suuressa määrin tärkeä (paitsi se, mitä se mahdollisesti selventää jo demossa 5 käytyyn asiaan nähden). Näin ollen kannattaa ehkä käyttää energia ja aika ensin tenttiin valmistautumiseen ja vasta tentin jälkeen demon 6 viemiseen loppuun. + Demojärjestelmän deadline 24.5.2020 on ohjeellinen. + Demo 5 vähän sama juttu: Siihen liittyen on vakiotärppejä luvassa tenttiin usean pisteen edestä, mutta mikäli se tuntuu haastavalta, voi olla tärkeämpää hoitaa ensin tentti. Arvosanatavoitteeseen 4-5 tuskin pääsee vastaamatta oikein myös demo 5:n osaamista mittaaviin tärppeihin, mutta kaikki muutkin arvosanat ovat vaarassa, jos yleisemmän tason perusteissa on puutteita. Huomioi siis oman ajankäytön balansoinnissa tämäkin! + ERIKOISHUOM: Tentin jälkeen on vielä saatavilla apua demon 6 tekemiseen. To 21.5.2020 on vapaapäivä (helatorstai), mutta jo pe 22.5.2020 tulee Open labrapäivä klo 8:15-12. Sitä seuraavalle viikolle tulee vielä erityisesti demo 6:tta varten ohjauksia, joista tiedotetaan myöhemmin. Ja toki, jos ongelmia on vielä aiemmissakin demoissa, niin niihin saa apuja vielä toukokuun ajan. **** Opettajan kainot toiveet lähiviikoille Tämä kaikki sanottuna, toivon seuraavaa: - Mahdollisimman moni tekisi tentin heti 20.5.2020, vaikka myöhempiä uusintojakin tulee. - Mahdollisimman moni hyödyntäisi toukokuun apujen pyytämiseen kaikkia kanavia pitkin, jotta kurssisuoritus jälkijunassakin helpottuisi. Toukokuun jälkeen opettajien työsuunnitelma on täynnä muuta kuin tätä kurssia, joten apujen saaminen tämän suhteen tulee olemaan niukkaa. *** Tilannekartoitus edellisestä tavoitteesta Perinteiset pollit. Tavoite oli: - Luvut 11 ja 12 luettuna. - Demo 5 valmiiksi ja palautus tarkkaavaisesti! - Demo 6 käyntiin. - Kysymykset muistiin! Ajankäytössä kurssin on nyt sama selkeä notkahdus kuin aiempinakin vuosina on tässä kohtaa nähty. Nyt tsemppiä! On faktisesti vähän jäljellä! "Jaksaa, jaksaa, painaa, painaa!" *** Tämän päivän ja viikon tavoite Aikataulun mukainen tentti on ensi viikolla. On tullut aika asettaa viimeinen luentoviikkotavoite: - Kartoitetaan avoimeksi jääneet kysymykset, ja käsitellään ne, mitä ehditään. - Lisäksi ja erityisesti: Arvioidaan osaamista ja kokonaisymmärrystä. Tämän viikon jälkeenhän pitäisi olla hahmottunut kaikki se, mitä tämän kurssin aikana on ylipäätään tarkoitus ehtiä hahmottaa! - Perjantaina jokaisella on havaintojen pohjalta käsitys, paljonko ja minkälaista tekemistä vaatii saavuttaa itse tavoittelemansa osaamistaso. Poll: Onko selkeä vai tarvitseeko tarkentaa? *** Kartoitetaan uusia kysymyksiä Kysymykset tänään (5 min aikaa esittää): - Joku maininta Flash muistista ja sen erosta SSD muistiin? - Tietääkö siis siitä että on varmasti kurssilla, että pääsee moodlessa sivulle jossa lukee "Prinsessa ei ole tässäkään linnassa."? Ja tämä riitti tentti-ilmoittautumiseksi? - Luentomonisteessa sivuilla 145 ja 146 esitettyjen kysymyksien vastauksien perustelut. - Tuleeko olemaan aamupäivän tenttejä tarjolla? Työt menee keskiviikon tentin kanssa päällekkäin... - Jos joku kova linkattu tiedosto poistetaan niin poistuuko kaikki kyseisessä linkki "ketjussa" olevat tiedostot? - oisko mahdollista saada joku yhteenveto kurssin pääaiheista/ tärkeimmistä aiheista - Voidaanko katsoa vielä mistä kohtaa luentomonistetta näkyisi demo 5 parhaat neuvot? - Lisää tenttitärppien läpikäymistä! - Voisiko katsoa materiaalien sivulla 164 kuvan 33. vielä läpi, jotta kunnolla sisäistää kokonaisuuden - Mitenkä parametrinvälitys aliohjelmalle (assembly-tasolla) menee, jos ei ole integer-tyyppinen muuttuja vaan esimerkiksi file? - DMA ja RAID? Näiden toimintaperiaatteet? - Luentomonisteen tärkeimmät luvut jotka erityisesti kannattaa sisäistää? - s.57 monisteessa puhutaan exit() kutsusta ja sen järjestysnro on 60, mutta s 56 olevassa koodissa en löydä tätä - voisi vielä kerrata tuota sivun 79 kuvan pinokehysasiaa Priorisoidaan tauon jälkeen. [Tauko 15:15 asti. Kesti vähän yli, koska tapahtui opettajien pedagoginen esikarsinta ja jäsennys ennen pollausta.] Priorisoitiin. *** Väliin ainakin yksi tenttitärppi, että muistetaan käydä Otsikon mukaisesti tsekataan jo joku yleisempikin tenttikysymys. Käytiin läpi "lauseiden yhdistämistehtävät" kahdessa esiintyvässä muodossaan: (1) yhdestä yhteen ja (2) yhdestä moneen vaihtoehtoiseen loppuun. Muut tehtävätyypit (väittämä, lukuarvovastaus) on käyty läpi jo aiemmilla luennoilla. Nyt on tiedossa tarkalleen tämänkin vuoden tentissä tulevat kysymykset. *** Kysymykset kevään tenteistä + sisällön ulkopuolelle rajatut Käytänteisiin liittyvää: - Tietääkö siis siitä että on varmasti kurssilla, että pääsee moodlessa sivulle jossa lukee "Prinsessa ei ole tässäkään linnassa."? Ja tämä riitti tentti-ilmoittautumiseksi? Vastaus: Kyllä! - Tuleeko olemaan aamupäivän tenttejä tarjolla? Työt menee keskiviikon tentin kanssa päällekkäin... Vastaus: Pohditaan. - Lisää tenttitärppien läpikäymistä! Vastaus: Tuli jo. Aihealueen ohittavat: - Joku maininta Flash muistista ja sen erosta SSD muistiin? Vastaus: Katso Googlesta. - DMA ja RAID? Näiden toimintaperiaatteet? Vastaus: Rajataan tänä vuonna tentin ulkopuolelle. Monisteessa on OK lähdöt, ja Wikipedia kertoo kyllä lisää. [Perjantaina loput.] ** Luento 16: (pe 15.5.2020) (P) Viimeinen luento. *** Infoisku keväälle 2020 - Demo 4 on tarkastettu. Katso palaute!! - Paavon opetusnäyte 20 min asiantuntijaluento + 10 min kysymykset ma 18.5.2020 klo 14:15-14:45. Zoom-linkki tulee keskustelulistalle Tervetuloa! *** Perinteiset alkutoimet vielä kerran Pollit tehtiin. *** Tämän päivän tavoite Näkyy väliotsikoista: *** Kysymysten läpikäyntiä Nopeat: - Mitenkä parametrinvälitys aliohjelmalle (assembly-tasolla) menee, jos ei ole integer-tyyppinen muuttuja vaan esimerkiksi file? Vastaus: "file" (anteeksi lainausmerkit) välitetään esimerkiksi fgetc():lle muistiosoitteena FILE -tyyppiseen tietueeseen. Välitettävänä on siis kokonaisluku, joka on muistiosoite. Parametrin välitys on täsmälleen samanlainen kuin saman pituisissa kokonaisluvuissa. Esimerkiksi AMD64:ssä 64-bittisille kokonaisluvuille. Sopimus: SysV ABI kertoo kaikki muutkin vaihtoehdot, mutta niitä EI nähdä tällä kurssilla. - Voidaanko katsoa vielä mistä kohtaa luentomonistetta näkyisi demo 5 parhaat neuvot? Vastaus: Luennolla kuvatuin perustein sanoisin, että *erityisesti luku 4* avaa demon 5 asiaa. Edellyttää esitietoja luvuista 1-3, ja koko homman tavoitteena on tukea lukujen 6-12 ymmärtämistä. - Luentomonisteessa sivuilla 145 ja 146 esitettyjen kysymyksien vastauksien perustelut. Vastaus: Pitkä ja harras selitys tärpeistä tähän tehtävään on "Luento 14: (pe 8.5.2020)". Kysymys virtuaalimuistiosoitteen muuntamisesta. Esikarsitut, pollatut ja priorisoidut: - Kurssin pääaiheiden yhteenveto Oisko mahdollista saada joku yhteenveto kurssin pääaiheista/ tärkeimmistä aiheista Vastaus: Katso luentovideo. Luentomonisteen tärkeimmät luvut jotka erityisesti kannattaa sisäistää? * Luvut 1-5 ehdottoman tärkeä. Muuten ei ole edellytyksiä edetä. * Luku 6 motivaation kannalta, mutta ei ehkä teknisen näkökulman tai teknisen tekemisen tasolla. * Varsinainen sisältö ovat (tällä kurssilla) luvut 7-12. Kaikki ovat yhtä tärkeitä! [Tauko 11:20 asti] - Tiedostojärjestelmän tietorakenteet (s. 164) Voisiko katsoa materiaalien sivulla 164 kuvan 33. vielä läpi, jotta kunnolla sisäistää kokonaisuuden Vastaus: Katso luentovideo. Pointtereita seuraaviin, joita ei ehditty käydä "varren kanssa": - Pinokehyksen kertaaminen (s. 79) voisi vielä kerrata tuota sivun 79 kuvan pinokehysasiaa Varsi olisi ollut: Etsittäisiin luentomuistiinpanoista, millä luennolla tätä käytiin läpi. Tarkistettaisiin videolta, tuliko siellä riittävästi. Jatkovarsi olisi ollut: Miten tämä asia ilmenee demossa 5. - Miten tiedostolinkit toimivat? Jos useampi tiedosto on kova linkattu niin poistaa yhden poistuuko kaikki? Vai ymmärsinkö koko linkityksen väärin Varsi olisi ollut: Kokeillaan käytännössä halavalla / jalavalla. Vastaus: On hyvä perusosaamisen testi itsellesi, osaatko tehdä tämän kokeilun ja vakuuttua siitä, kuinka homma näyttää jalavalla/halavalla pelittävän. - Miksi s.57 exit() on 60 mutta ei konekoodissa? s.57 monisteessa puhutaan exit() kutsusta ja sen järjestysnro on 60, mutta s 56 olevassa koodissa en löydä tätä *** Luento-osuuden loppuarviointi Ks. video. MUISTA anonyymi kurssipalaute kaikista kursseista! *** Seuraava välitavoite Tentti. * Ja se oli sitten siinä vuodelta 2019. * Alla on aiempien vuosien häröilyjä *** [Vuodelta 2019... jos on tarvis/hyötyä jotain poimia näistä(?)] *** Koodiesimerkkejä Loppukurssin esimerkit nyt kasattu materiaalivaraston hakemistoon 2019/ ja voitaisiin käydä läpi about tällaisessa järjestyksessä (+ käyty läpi, - jäi seuraaville luennoille): + signaalikäsittelijät: sigesim.c + viestijonot: chattomyself.c + säikeet: saikeiden_tarve.c - lähdekoodi selittämättä - kilpa-ajo: race.c ja "fixed"-versiot - deadlock: kahvihuone.c - tuottaja-kuluttaja: tuottaja_kuluttaja_rikki.c ja tuottaja_kuluttaja.c *** Uusia kysymyksiä Joltakin edelliseltä luennolta vuonna 2020: Tähän voi vastata sitten, kun/jos kerkeää. Monisteessa lukee: "...muistiosoitteessa 0 ei olisikaan järkeä olla mitään, koska tämä tulkitaan NULL-osoittimeksi eli ’ei osoita tällä hetkellä mihinkään’. Kysymykseni: Miten osoite 0 tulkitaan NULL-osoittimeksi? Mikä osoite 0 on prosessorin näkökulmasta, epäilemättä osoite siinä kuin muutkin(?), mutta mitä muuta siihen liittyy? Uusia kysymyksiä, jos ilmenee (v. 2019 saldoa): - Millon saadaan demo4:n labrapäivästä merkintä? - Aikanaan, mutta se tulee, olkaa huoleti. - Voidaanko käydä mutexeja, semaforeja, tuottaja-kuluttajaa läpi vaihe vaiheelta? Monisteessa mainitaan "luentoesimerkki" useammassa kohtaa. :) - Kyllä. - vähän konkreettisempi esimerkki tuottaja-kuluttaja ongelmasta olisi hyvä - yritetään. - Haluaisin kuulla hieman lisää tentistä, voidaanko käydä joku esimerkkivastaus vanhoista kysymyksistä? - jos jää aikaa, mutta katsokaapas aiempia luentoja videolta - käydäänkö kurssilla dbus etc - ei :( - kuinka tapetaan zombie - TODO lisätään tästä asiaa tulevalle luennolle - https://en.wikipedia.org/wiki/Zombie_process - TODO chattomyself bye ei toimi toiselle osalliselle, tarkista - eikö halavassa ole 16 prosessoria, miksi ei nopeudu 4 säikeen jälkeen - täyttyykö muistin ja prosessorin välinen väylä? tästä jatkamme samalla kanavalla keskiviikkona! - TODO halavassa on vain neljä prosessoria *** Koodiesimerkkejä Loppukurssin esimerkit nyt kasattu materiaalivaraston hakemistoon 2019/ ja voitaisiin käydä läpi about tällaisessa järjestyksessä: + signaalikäsittelijät: sigesim.c + viestijonot: chattomyself.c + säikeet: saikeiden_tarve.c - lähdekoodi selittämättä + kilpa-ajo: race.c ja "fixed"-versiot deadlock: kahvihuone.c tuottaja-kuluttaja: tuottaja_kuluttaja_rikki.c ja tuottaja_kuluttaja.c *** Uusia kysymyksiä (2019) - Miten TLB päivittyy? Selvitä itse; ei kuulu tämän kurssin sisältöön. ** Tentti: (ke 20.5.2020) (J&P) * Vuodelta 2019 jäänteitä ** Luento 8/19 Päivän lukujärjestelmäesimerkit - Googletetaan "Ariane 5 test launch" ja katsotaan joku helposti löytyvä video (EI Moniviestimeen, kun videoita ei saa toisintaa). https://www.youtube.com/watch?v=gp_D8r-2hwk Kurssin asiat eivät ole rakettitiedettä, mutta rakettienkin kanssa toimittaessa ne täytyy ymmärtää, mm. lukujärjestelmät ja tallennustilan rajallisuus laitteistossa. Videolla paukahtaa puolisen miljardia euroa nätisti, koska 16 bitin mittaiseen tallennustilaan yritettiin laittaa luku, joka olisi tarvinnut useampia bittejä. Oli siinä muutakin, alkaen muuttuneista vaatimuksista (tavanomaista ohjelmistoissa) ja puuttuvista esitarkistuksista (tavanomainen paikka, josta säästetään, kun painotetaan aikatauluja). Lisätietoa, jos kiinnostaa: http://sunnyday.mit.edu/accidents/Ariane5accidentreport.html - Hexdump, tiedostomuodot ja "reverse-engineering fon fun (not profit)": ELF ja mysteeridata ** Luento 8/19 Viime viikolta siirtyneitä kysymyksiä **** Viime viikolta: ELF + ELFiin jos saisi hiukan lisää selvennystä Katsottiin käytännössä suoraan assemblerilla tehtyä Hei maailmaa ja siitä syntynyttä ELF-tiedostoa hexdumpilla. Totuteltiin ``hexdump -C tiedosto`` -komennon tulosteen osioihin. Varmistettiin, että osataan löytää Googlella tietoa esimerkiksi ELF-formaatista. Katsottiin laatikkokuvaa, jollaiseen piirretään yhtäjaksoisen datapötkön osioita, joilla on tietty merkitys. + Loput itsenäisesti dokumentaatiosta! **** Viime viikolta: Assembler-syntaksin tunnistamisesta. - Mistä helpoin/nopein tapa tarkistaa, onko AT&T- vai Intel-syntaksi? Assemblerissa on välttämättä tiettyjä muutaman käskyn mittaisia pätkiä, joista voi päätellä syntaksin. Esimerkiksi käyttöjärjestelmäkutsua ``syscall`` edeltää lukujen laittaminen rekistereihin. Hei maailma -ohjelman lähdekoodista voitiin päätellä, että kopioinnin lähde on vasemmalla ja kohde oikealla, niin silloin on AT&T -syntaksi. GNU-assemblerin murteen tunnistaa dollarimerkistä lukuarvojen edellä ja prosenttimerkistä rekisterien nimen edellä. (tauko 6min) **** Viime viikolta: Demo 3, argumentit ja ympäristömuuttujat - Demo3:ssa vaikeuksia päästä alkuun, en ymmärrä annetaanko argumentti ja ymp.muuttujat scriptissä vai komentorivillä. Jos tähän tehtävään antaisit potkun oikeaan suuntaan. - Ympäristömuuttujat ei mene kaaliin. Esim. demo3 tehdessäni tulostuksesta tuli erinäköinen kuin annetussa mallissa vaikka mielestäni tein ohjeen mukaan. Luennolla annettiin lopulta täysi malli siihen, miten Demo 3 tehdään alusta loppuun. Myös esimerkki ympäristömuuttujan ``KISSA`` asettamisesta arvoon ``KOIRA``. **** Viime viikolta: Tähti-tähti eli osoitin osoittimeen? Kyllä. Ja ``***`` on osoitin osoittimen osoittimeen ja niin edelleen... Ensimmäinen esimerkki tähti-tähdestä on C-pääohjelman argumentit, jotka ovat tyypiltään ``char**``. Toinen tapa kirjoittaa sama on ``char* nimi[]`` eli pääohjelmassa yleensä ``char *argv[]``. Katsottiin, miten ohjelman voi käynnistää gdb-debuggerissa komennolla ``start argumentti jne`` ja sitten tulostella arvoja ``print argv[0]``, ``print argv[1]`` jne. Tehtiin ensihavainto siitä, että C:ssä ei voi tietää taulukon pituutta, ellei siitä pidetä kirjaa erikseen, esimerkiksi C-kielen pääohjelman parametri ``int argc``. Tulosteltiin debuggerissa argumentteja. Toivottu asia on, että vastaavia kokeiluja opetellaan tekemään itse. Tutkiva asenne ja silleen :). ** Kysymyksiä ja vastauksia *** Aiempien vuosien luento 6 kysymykset (2019) Geneeriset kysymykset nyt jopa valmisteltuna Socrativeen: - mihin asti on päästy? - paljonko aikaa on käytetty? Otetaan kiireisimmät mietteet salista ääneen. Keskustelua tilannekatsauksesta [ks. video]: - Niin sanottua pakollista palauttamista on aika vähän. Herää kysymys, mitä nyt tekisin? Ehdotuksia: + Omatoimisia (turvallisia) kokeiluja + Oikean taustamateriaalin lueskelua! POSIX, AMD64-manuaalit. ELF-määritelmä, jne. - Opettajalle TODO: lukupaketin ohessa voisi olla "täkyjä" taustamateriaalin suhteen. Käytellään lisäksi Socrativea, johon voi laittaa ehdotuksia anonyymisti. Kysymys on siis: - Mihin asiaan haluaisit lisää selvyyttä ennakkotehtävän pohjalta tai muuten? Jäsennellään löydökset osioon "yleisökysymyksiä" alla ja käydään niitä läpi sopivassa järjestyksessä tämän viikon luennoilla. **** Kysymyksiä ja vastauksia ***** Kysymys englannin kielestä ja kurssin suorituskielestä - Ylipäätään saako tätä tehdä englanniksi, jos "ei hyväksy suomen kieltä tietotekniikassa"? Menemättä meistä riippumattomiin taustoihin, valitettavasti tentti ja demot ovat suomenkieliset. Opiskelu englanninkielisistä materiaaleista on jopa suotavaa! ***** IRC-ohje ja käytännön demo - Mikä oli kurssin irssikanava? Risuaitamerkki ja kurssikoodi yhteen pienillä. - Miten sinne ircciin siis mennään? :D Pääteyhteydessä komento: irssi Se käynnistää irssi -nimisen IRC-asiakasohjelman. Irssiin komento: /connect irc.cc.tut.fi Kun palvelin on ottanut sut vastaan (se kestää hetken, ja onnistumisesta tulee ilmoitus), voi liittyä kanavalle nimeltä KANAVA komennolla: /join KANAVA Jos on pakko lähteä pois IRCistä kokonaan, niin asiakasohjelmasta irssi pääsee pois komentamalla: /bye HUOM: Ilo screenin käytöstä on, että ei tarvitse poistua IRCistä. Irtautat vaan screenin, niin siellä on sitten oma tunnus "idlaamassa" ja voit myöhemmin katsella, mitä poissaollessasi on keskusteltu. Komento /help ja Internet kertovat lisää. ***** Nopeasti käsitellyt kysymykset - Millä ohjelmointikielellä pelastaisit prinsessan? Riippuu tilanteesta. Tällä kurssilla POSIXin sh, C99 tai AMD64 konekieli. - Osaisitko kertoa vähän symlinkeistä? Mikä hyöty tai aiheuttaako ongelmia? (ei tämän kurssin asiaa! Symlinkit ovat enimmäkseen myöhemmän elämän asia. On hyötyä enemmän kuin ongelmia, KUN TIETÄÄ mitä tekee. Tällä kurssilla opetellaan tervettä varovaisuutta siinä kaiken tekemisessä.) (tauko 7 min) ***** Aiempiin asioihin tarkennuksia - Demo 2 palautettavaan tehtävään en vielä oikein saanut otetta, jos voisi vielä vähän selventää skripti-asiaa + Tulikin aika hyvä lisäpainotus kurssin tärkeimmälle asialle: tiedetään, mitä tehdään. - Muistutatko vielä mitä heksalukuihin binäärilukuihin liittyen piti osata? Muuttaa niitä toiseksi lukumuodoksi ja laksea yhteen? + koko ajan lisää. Tällä kertaa demottiin livenä printf -komentoa ja "tasalukujen" (heksana) suuruusluokkia kymmenjärjestelmässä. *** Päivän (luento 7, 2019) lukujärjestelmäesimerkit Pari esimerkkiä biteistä ja heksaluvuista: - Eräs neuroverkkovisa, jonka vastauksen voi tarkistaa muuntamalla bitit heksoiksi. -> dokumenttikameralla, ks. video. - Opettajan mielestä ehkä edelleen hienoin tietokoneohjelma, jonka hän on tähän mennessä tehnyt: Lähdekoodi: https://yousource.it.jyu.fi/synti2/synti2/trees/master/synti2/doc/assembly16_1k Julkaistu tuotos ja vertaisarvioita: http://www.pouet.net/prod.php?which=67941 (rikkoo monia standardeja ja sääntöjä, mukaanlukien tapa, jolla länsimaiset soittimet viritetään... mutta myös ainakin ELF, SysV ABI, Linux, Bash - eli kaikki mitä tällä kurssilla opitaan on rikott... hyödynnetty luovasti ja tietäen tasan tarkkaan, mitä ollaan tekemässä ja miksi:)) Tehty muiden syiden ohella myös opettavaiseksi esimerkiksi mm. konekielestä, ELFistä, heksaluvuista ja "luovasta ohjelmoinnista" jos sellaista on olemassa. Esimerkillisesti ainakin tekeminen oli tuskaa ja tärkeimpänä hauskaa. *** (L07 / 2019) Kysymyksiä, vastauksia, mielellään käytännön esimerkkien kautta **** Viime kerralta siirtyneitä kysymyksiä Socrative-seinältä viime kerralta: - Jos on vaikka 1 tähti palautuksessa ja päättää tehdä uudestaan niin kannattaako uusi teos palauttaa? Ei tarvii, kunhan olet oppinut!! Oppiminen on tärkeintä, ja nollaa isommat tähdet ovat saman arvoisia suorituksen kannalta. - Kaverin puolesta: miten labrapäivään ilmoittaudutaan deadlinen jälkeen? "Open labrapäivä": Ei ilmoittautumista. Tulee vaan paikalle. Korpista näkee, milloin tapahtuu. Ensi viikon demo 4 sessiot: Ilmoittautuminen tarvitaan, että tietää väkimäärän. - Rajapinta-termin käyttöön (monisteessa) Koetetaan käsitellä esimerkin kautta. Seuraavat auki ja mietitään (linkit etsitty ja toimivia 3.4.2019): + Monisteen määritelmä termille "rajapinta" (termiluettelosta): siinä puhutaan "kerroksista", koska se on sopiva ajatusmalli tällä kurssilla. Rajapinta yleisesti ottaen voi olla minkä tahansa kahden osion välillä. + JyPeli (aloittelijaystävällinen ja pedagoginen sovellusrajapinta pelin tekemiseen): https://trac.cc.jyu.fi/projects/npo/wiki/KirjastonOhjeet https://trac.cc.jyu.fi/projects/npo/attachment/wiki/JypeliOhjeenLiitteet/arkkitehtuuri.png + .NET (yleiskäyttöinen joukko sovellusohjelmointirajapintoja): https://docs.microsoft.com/en-us/dotnet/ + C# (korkean tason kielijärjestelmä eli ohjelmointirajapinta, jolla voi käyttää esim. .NETiä): https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/ + POSIX (standardoitu käyttöjärjestelmärajapinta): http://pubs.opengroup.org/onlinepubs/9699919799.2018edition/ + C99 (korkean tason kielijärjestelmä eli ohjelmointirajapinta, joka on osa vielä nykyistä POSIXia; varmasti myöhemmin vaihtuu uudemmaksi, koska standardointi on pitkäpiimäinen prosessi): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf + Linux system call interface (konkreettinen käyttöjärjestelmäkutsurajapinta; linkki johtaa käsityönä tehtyyn, "kauniiseen" hakusivuun): https://filippo.io/linux-syscall-table/ + AMD64 (konkreettinen prosessorilaiterajapinta) https://developer.amd.com/resources/developer-guides-manuals/ (erityisesti osio "AMD64 Architecture") + Vulkan (moderni grafiikkaprosessorirajapinta) https://www.khronos.org/registry/vulkan/ Mikä sitten olisi synteesi näistä, eli "mitä tarkoittaa rajapinta"? Äänestetään, hyväksytäänkö johdantokurssin luentomonisteessa oleva 5-rivinen kiteytys, vai täsmennetäänkö jotenkin? Alustava yritys sanoa asia vielä toisin sanoin: + Avainsana rajapinnan käsitteessä on _abstrahointi_: rajapinta on _abstrakti_ määritelmä/lupaus/sopimus, joka tarjoaa keinon käyttää sen takana olevaa _konkreettisempaa_ järjestelmää, riippumatta siitä, mitä siellä takana käytännössä on. + Rajapinnat kerrostuvat eri _abstraktiotasoille_. Edellä mainituista esimerkeistä JyPeli on korkeimmalla ja AMD64 alimmalla tasolla. + Aina on mahdollista päästä alemmas, kunnes oltaisiin nanometriluokan piirikaaviotasolla prosessoreja tekevän yrityksen suunnitteluosastolla. En usko, että ovat julkisia dokumentteja tänä päivänä. + Sitä alempi taso liittyy mm. kvanttimekaniikkaan, jonka toiminta on osittain tuntematonta, koska luonto ei valitettavasti ole kirjoittanut meille manuaalia, vaan fyysikoiden täytyy päätellä siitä uusin versio pala kerrallaan. Googlella löytyi esimerkiksi seuraava sivu aiheesta: http://www.openculture.com/free-physics-textbooks Onneksi meidän alalla voidaan toimia ihmisten määrittelemän rajapinnan päällä. Ja voidaan valita, minkä kerroksen päällä ollaan! Tällä kurssilla käydään kohtalaisen matalalla. Retro-innostuneille linkki: http://www.visual6502.org/ - "Mitä rajapintoja tietokoneessa käynnistyy kun se laitetaan päälle esim. bios jne." Ne, jotka tietokonejärjestelmän kokoonpanija (esim. Lenovo, HP, Apple, Dell, Microsoft, ...) on päättänyt. Itse prosessori käynnistyessään ottaa manuaalin lupaamasta muistiosoitteesta ensimmäisen käskyn, ja suorittaa käskyjonoa siitä eteenpäin. Osoite voi kytkeytyä väylän kautta kokoonpanijan tekemään ROM-muistiin, jossa on pieni ohjelma, joka alkaa etsiä käyttöjärjestelmää USB-tikulta, kovalevyltä, nettiosoittesta, tmv. Kokoonpanija voi määrittää, mihin väylän osoitteet heidän laitteistossaan kytkeytyvät. **** Uusimpaan ja tulevaan lukupakettiin liittyviä - Laitteistorajapinta ja konekieli + Mikä on luvun 4 tärkein pointti? Lyhyesti: Ensikosketus prosessorin toimintaan ja laitteistorajapintaan. Yksityiskohtiin on todennäköisesti palattava demojen 5 ja 6 kohdalla, ja niihin toivottavasti tulee konkreettisen tekemisen kautta lisää ymmärrystä. Kaikki uusihan on aluksi sanahelinää. Tsekataanpas porukalla, että monisteen osaamistavoitteet ja yhteenveto ovat kondiksessa... + ELFiin jos saisi hiukan lisää selvennystä Katsotaan käytännössä suoraan assemblerilla tehtyä Hei maailmaa. Tästä on ehkä syytä vielä vähän jatkaakin! *** (L10 / 2019) Vuoden 2019 kysymyksiä - Kuulemma olisi tulossa lisää labrapäiviä? On. Ei vielä Korpissa. - Onko konekieli tavallaan ensimmäinen ohjelmointikieli? Tulkitaan kysymys historian näkökulmasta. Varmastikin ensimmäiset nykyisenlaiset tietokoneet oli ohjelmoitava konekielellä. Hyvin pian tuli symbolinen konekieli eli assembler-kieli. Mitä kuitenkin on ohjelmointi tai kieli? On myös analogisia tietokoneita, joita voi ohjelmoida. Mm. operaatiovahvistin, jollainen löytyy puhelimesta. Matemaatikon näkökulmasta "kieli" voi olla bittijono, mutta ihmiselle ei niinkään. Lisää jännää aiheesta mm. kurssilla Automaatit ja kieliopit. - Mitä tarkemmin tarkoittaa, että tietokonevirukset karkasivat laboratorioista? Lisätietoa saattaa löytyä esim. https://en.wikipedia.org/wiki/Computer_virus#Early_academic_work_on_self-replicating_programs - Mitä BSD:stä periytyi Windowsiin / Mac OS X:ään? Opettajapaneelilla ei ole päässään tietoa Windowsista. Luultavasti alunperin ei paljonkaan. Mac OS X on BSD. Tämä voi mm. aiheuttaa päänvaivaa GNU/Linuxiin tottuneille. Standardointi on iloinen asia, koska POSIX määrittelee yhteisen nimittäjän näille. Hyväksi havaittuja ominaisuuksia pyritään yleensä ottamaan mukaan uusiin versioihin suuntaan ja toiseen käyttöjärjestelmien välillä. - Onko Y2038-problem vakavampi kuin Y2K? Sehän riippuu tämänkin kurssin opiskelijoista!! - Onko tehty virusmaisesti käyttäytyvää "vastavirusta" (vertaa vastapalo), ohjelmaa joka aktiivisesti metsästää viruksia koneelta toiselle? Mielenkiintoinen filosofinen kysymys. Esim. miten tämä eroaisi viruksesta? Konkreettisia ongelmia on paljon, erityisesti tällaisen vastaviruksen tosi iso koko ja tarve päivittyä. Tästä asiasta runsaasti lisää kyberturvallisuuden maisteriohjelman teknisillä kursseilla! - Mitä mullistavaa kvanttitietokone voisi mahdollisesti tuoda mukanaan? Nykypäivänä: ks. esim. https://qiskit.org/ (tauko 7 min) - Mikä olisi "pienin mahdollinen käyttöjärjestelmä"? Esimerkki reaaliaikajärjestelmien kurssilta: Vuorontaja (jos on tarvetta olla useita ohjelmia samassa tietokoneessa; seuraavassa lukupaketissamme lisää tietoa siitä, mikä on vuorontaja) Jonnen ehdotus: FORTH. ks. esim. https://www.forth.com/starting-forth/ Paavon ehdotus: Olennainen kysymys on, mikä on pienin tarvittava käyttöjärjestelmä? Tällä kurssilla käydään läpi kaikki osiot modernista yleiskäyttöisestä käyttöjärjestelmästä. ** TODO: Muistoja vuoden 2019 luennolta 14, toistetaankohan 2020? Laitetaan luentoseinä päälle, mutta aloitetaan myös C-esimerkkikoodien tutkiskelu. Tähän liittyen oli viimeksi jopa ihan kysymyskin: - Luvussa 9 (ja muissakin!) luvataan luentoesimerkkejä - tuleeko niitä? Voidaan tehdä, kun sen aika on. Ja aikahan alkaa olla, kun vaan alkais olla teoriapuoli luettuna ja esitiedot hallussa ;) Esimerkit ehkä helpoiten löytyvillä materiaalirepon hakemistosta 2018/ ja voitaisiin käydä läpi about tällaisessa järjestyksessä: fork ja exec: minish.c signaalikäsittelijät: sigesim.c viestijonot: chattomyself.c säikeet: saikeiden_tarve.c kilpa-ajo: race.c ja "fixed"-versiot deadlock: kahvihuone.c tuottaja-kuluttaja: tuottaja_kuluttaja_rikki.c ja tuottaja_kuluttaja.c Tällä luennolla palasteltiin minish.c Prosessin käsitettä ja virtuaalimuistia katsottiin luentomonisteen kuvien kautta (liittyi pyydettyyn "kiteytykseen" luvuista 5-9 :)) Lopussa käytiin läpi konekieleen liittyvää tenttitärppiä, jonka onnistunut tekeminen vaatinee kynää ja paperia aivotyön avuksi. Ja toki mittaa mielikuvamallia prosessorin toiminnasta. * Vuonna 2019 taisi olla yksi tapaaminen lisää(?): ** Luento 16: (13.05.2019) Katsotaan, mihin asti päästiin.. Toivottu tilanne tänään, kun mennään kevätkurssia 2019 aikataulussa: - Monisteluvut 1-12 luettu (+21 sivua) jollain tasolla; demot 1-5 sisäistetty, 6 työn alla ja vähintäänkin tavoite jo hahmottunut. Tässä kohtaa prioriteettina tentti. Demot voi palauttaa loppuviikosta tai hitusen myöhässäkin. Kevään 2. periodihan päättyy nimellisesti sunnuntaina 19.5.2019 (https://opiskelu.jyu.fi/fi/opiskelijalle/sujuva-opiskelu/lukukaudet). - Monisteluvut 13-15 eivät kuulu kurssin nykyiseen sisältöön. Niissä on yhteenvetoja ja pohdintoja aiheista, joita on sivuttu ja rajattu tietoisesti pois. Lukemistoa luppoajalle siis. *** Koodiesimerkkejä Loppukurssin esimerkit nyt kasattu materiaalivaraston hakemistoon 2019/ ja voitaisiin käydä läpi about tällaisessa järjestyksessä (+:lla merkityt käyty tähän mennessä; jäljellä vielä muutama): + signaalikäsittelijät: sigesim.c + viestijonot: chattomyself.c + säikeet: saikeiden_tarve.c - lähdekoodi selittämättä + kilpa-ajo: race.c ja "fixed"-versiot + deadlock: kahvihuone.c tuottaja-kuluttaja: tuottaja_kuluttaja_rikki.c ja tuottaja_kuluttaja.c *** Viimeiset tarkentavat kysymykset ja vastausyritykset Aiemmin esitettyjä vielä copy-pastella, ettei unohdu: - Semaforeja ja sivutauluja jos voitaisiin esimerkein käydä vähän läpi. - Voidaanko käydä mutexeja, semaforeja, tuottaja-kuluttajaa läpi vaihe vaiheelta? Monisteessa mainitaan "luentoesimerkki" useammassa kohtaa. :) - Kyllä. - vähän konkreettisempi esimerkki tuottaja-kuluttaja ongelmasta olisi hyvä - yritetään. - Vanhoissa tenttikysymyksissä oli kysymyksiä kehys- ja sivutauluista tyyliin: "Mistä virtuaaliosoitteesta prosessi 7 saisi käyttöönsä tavun, joka sijaitsee kovalevyllä indeksissä 0xf2345 heittovaihto-osion / -tiedoston (engl. swap space) alusta lukien?" En tajua, miten tämä katsotaan...? - Sivutaulua jos voitaisiin käydä vähän läpi esimerkinomaisesti. Ja heittovaihtoa myös. - Vanhoista tenteistä: prosessien versus sen säikeiden muistiavaruudet & osoitteet? Monisteen sivu 111 plusmiinus... - Haluaisin kuulla hieman lisää tentistä, voidaanko käydä joku esimerkkivastaus vanhoista kysymyksistä? - jos jää aikaa, mutta katsokaapas aiempia luentoja videolta (tärppejä ja vastauksiahan on katseltu pitkin matkaa!) Uusia kysymyksiä, jos ilmenee: - Miten käyttöasteen määrää voidaan kasvattaa tietokonejärjestelmässä? - Onko mallitentteihin vastauksia? Ei suoria, "ulkoa opeteltavia", mutta palautemeileistä voi ounastella yleisiä vääriä käsityksiä oikaisuineen. *** Hyödyllistä settiä aiemmalta vuodelta, kannattanee käydä läpi? Moniajo, prosessi, "säie", resurssit, haaroitus ja käynnistys. Esim. vuoron vaihto prosessien välillä sisältää hukka-aikaa: P1 |------| |------| P2 |------| kj |---| |---| |---| Tiheämpi kellokeskeytys: P1 |---| |---| P2 |---| |---| kj |---| |---| |---| Prosessi? Kertausta aiemmista havainnoista: - POSIXin Base Definitions -osion termimäärittely "Process": "An address space with one or more threads executing within that address space, and the required system resources for those threads." Vautsi... Pystytään jo ymmärtämään suurin osa tästä kuvailusta! Määrittelyssä tulee jo mukavasti esille "säie", mikä tarkoittaa yhtä ajan suhteen etenevää suorituskohtaa ohjelmassa. Prosessilla on POSIXinkin mukaan aina vähintään yksi "säie", joka alkaa ohjelman alusta ja päättyy ohjelman loppuessa. Säie muodostaa yhden konekielisen jäljen, eli peräkkäin suoritettujen käskyjen sarjan. Tässä päästään jo pakosti uumoilemaan seuraavaa asiaa, eli että prosessilla voi olla yhden sijasta useampia säikeitä. Lisähuomio POSIXin termimäärittelyssä: "Many of the system resources defined by POSIX.1-2008 are shared among all of the threads within a process. These include the process ID, the parent process ID, process group ID, session membership, real, effective, and saved set-user-ID, real, effective, and saved set-group-ID, supplementary group IDs, current working directory, root directory, file mode creation mask, and file descriptors." - Prosessilla on vanhempi, mahdollisesti myös lapsia ja sisaruksia - riippuen mikä prosessi on pyytänyt luomaan uusia. Sillä on identiteetti (vähintään ID-numero) sekä käynnistävän käyttäjän ja ryhmän identiteetit (vähintään ID-numerot). Lisäksi sillä on oma muistiavaruus, joka sisältää koodi-, data-, pino- ja kekoalueen sekä dynaamisten kirjastojen koodialueita. Nykyisin myös käyttöjärjestelmän tarvitsemat alueet on liitetty jokaisen prosessin virtuaalimuistiavaruuteen käyttöjärjestelmäkutsujen tehostamiseksi. Mitä muuta liittyy prosessiin? - resurssin käsite: laitteiston osat, tiedostot ja yhteydet, mukaanlukien prosessorin käyttöaika ja rajallinen keskusmuisti, ovat resursseja, joita käyttöjärjestelmä allokoi prosessien käyttöön niiden pyynnöstä; aiemmin mainittujen lisäksi näihinkin tietoihin on päästävä käsiksi prosessikohtaisten tietojen kautta. (Näkökulma käyttöjärjestelmään resurssimanagerina). - Prosessit käyttöjärjestelmän tietorakenteena: prosessielementti ("Process Control Block", PCB) ja prosessitaulu ("process table" / "process array") tai prosessilista (kuten Linux-toteutuksessa on). - Linuxin task_struct -tietorakenne, eli noin 450 koodiriviä (versiossa 4.4) määritelmiä siitä, mitä tietoja yhteen prosessiin kuuluu. Kiinteä linkki version 4.4 lähdekoodiin: http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.4#L1378 Havaintoja: osa on kokonaislukuja, mutta suuri osa on osoittimia laajempiin tietorakenteisiin, joille on varattu muistia jostain toisesta kohtaa muistia. Suuri osa myös riippuu konfigurointivaiheessa valituista ominaisuuksista (#ifdef CONFIG_JOKIN_OMINAISUUS_MUKANA ... #endif). Tämä ``task_struct`` on normaali C-kielen tietorakenne, jonka sisäiset kentät ovat muistissa tallessa peräkkäisessä järjestyksessä. Huomaa mm. rakenteen määrittelyn lopussa oleva kommentti, joka muistuttaa, että x86-koneiden osalta nykyisellään viimeiseksi kirjoitetun kentän on todellakin oltava viimeinen, eikä sen jälkeen saa lisätä mitään muuta. Liukulukuja ei käyttöjärjestelmäkoodissa juurikaan ole. Esim. ajat mitataan kokonaisina nanosekunteina eikä osittaisina sekunteina tai muuta, mikä edellyttäisi muita kuin kokonaislukuja. Tässä kohtaa tilakaavio. Ja jumppa. Jatketaan suoraan prosessin olemuksesta: - Prosessin luonti haaroittamalla eli kloonaamalla vanhempiprosessi (unix-pohjaisen käyttöjärjestelmän tapa luoda uusia prosesseja): Esimerkkinä ihan itse käännetty minimalistinen shell, joka odottaa komentoriviä ja osaa käynnistää käyttäjän pyytämän ohjelman. [ Tällä kurssilla tutkitaan unixmaista tapaa luoda prosesseja; jos Windows-maailman variaatio sattuu kiinnostamaan, käyttöjärjestelmäkutsun CreateProcess() rajapinta löytyy tuolta: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx ] Prosessielementin kloonaus fork():illa ja korvaaminen ladattavan ohjelman tiedoilla exec():issä vaatii "maistelua", miettimistä ja parin unen näkemistä. - Prosessin tilat ja tilasiirtymät, tilakaavio. - Vuorontaja ja vuorottelu: prosessoriajan jakaminen. "Kiertojono" eli Round Robin. Odottelujonot blokatuille prosesseille. - Kontekstin vaihto laitteiston ja käyttöjärjestelmän yhteistoimintana. Koko kontekstin vaihtaminen (kaikki rekisterit + muistikartta) vaatii aikaa, joka on pois hyötylaskennasta - optimointina esim. pidemmät aikaikkunat ja modernien prosessorien "kevyet vaihdot". Harvemmat vaihdot prosessien välillä -> isompi "throughput". Pakollisena kompromissina tulee pidemmät vasteajat tai huonompi tasapuolisuus. (ks. esimerkkikuva tämän luennon alussa) **** Jos on aikaa, niin jotakin Viime vuoden luennolta 9 Asiaan. Täydennystä edellisiin aiheisiin: - Linuxin uusimman version toteutus käyttöjärjestelmäkutsun "vastaanottopuoleksi", arvatenkin GNU Assemblerilla toteutettuna: http://lxr.free-electrons.com/source/arch/x86/entry/entry_64.S#L107 Eli tasan tarkkaan se, mitä prosessorin käsketään tehdä välittömästi sen jälkeen, kun käyttäjän prosessin SYSCALL on takana päin nyky-Linuxissa. Tämä osio vaatii mm. tiettyjen rekisterien tilan tallentamista, joten se on pakko toteuttaa konekielellä. Järkevää tämä on tietysti vain symbolisena, ihmisen ymmärtämänä, assemblerina, jonka syntaksi mukailee prosessorin dokumentoitua käskykanta-arkkitehtuuria. Sitten jälleen mukavasti "tutuksi ja turvalliseksi tulleen" demo4:n mallikoodin ja samalla tapaa tutun tekstimuotoisen debuggerin parissa: Isompi ohjelma, jossa on vaikkapa aliohjelmakutsuja ja silmukoita: - Askelletaan demo 4:n esimerkkikoodia lähdekoodirivi kerrallaan debuggerilla. Havainnoidaan kutsupinoa, jonka tilanteen saa gdb:ssä näkyviin komennolla "backtrace" tai lyhennettynä "bt". Muita nimiä ainakin aktivaatiopino, suorituspino. - Katsotaan vähän vinkkiä demo4:n palautustehtävän aloittamiseksi. Entä jos tulee vahingossa "ikuinen silmukka"? (Helposti käy...) Ctrl-C, debuggeri ja tarkkaavaisuus koodaamisessa auttavat. Älä unohda kynää ja paperia! - aliohjelmakutsu, kutsupino - debuggerin näkymä kutsupinoon, 'backtrace'-komento näyttää pinoon kullakin hetkellä kertyneet aliohjelma-aktivaatiot. - askeltaminen konekielikäsky kerrallaan erityisesti rekursion päättymisen kohdalla. **** Jos on aikaa, niin jotakin Viime vuoden luennolta 10 Jatketaan demo4:n esimerkkikoodeilla ja luentomonisteen pinokehyssarjakuvasta. Esimerkkejä C-kielellä (HUOM: osin kertaavaa!): - Demo4:n palautustehtävään vähän sommittelua alkuun, esim. seuraavan luvun laskeminen (ei spoilata kokonaan kuitenkaan!) - Mitä tapahtuu, ja mitä voi tehdä, jos vahingossa tulee ikuinen silmukka? ("Ctrl-C" painallus, "killall ohjelmanimi" -komento) - Muistetaan perinteinen "kaikenlaskija" -esimerkki demonstroimaan aikakatkaisun tarvetta. Aliohjelmien ja pinon käyttö (osin jo myös demon 5 aihepiiriä): - klassinen pinokehysmalli, aktivaatiotietueen rakentuminen pinon päälle: kutsuva koodi pinoaa parametrit, call-käskyn suoritus pinoaa automaattisesti paluuosoitteen, kutsuttu koodi pinoaa edeltävän aktivaatiotietueen kantaosoitteen (BP) talteen, kiinnittää oman BP:n ja varaa omille paikallisille muuttujilleen tilaa vähentämällä SP:stä sen verran kuin paikallinen data tarvitsee tavuja. Ylösalaisin piirretyssä kuvassa (muistiosoite 0 kuvan ylälaidassa) pino kertyy visuaalisessa mielessä ylöspäin. - Huomautus aktivaatiopinosta: Pinoon tallennetuista BP-osoitteista muodostuu viittausketju, jonka kautta löytää aina pykälää alemman aktivaatiotietueen. Pääohjelmassa tässä kohtaa on nolla eli "NULL-viite", mistä tiedetään että pinon pohja on löytynyt. Tämä on yksi konkreettinen esimerkki abstraktin "listamaisen" tietorakenteen toteutuksesta muistiosoitteilla, jotka niin sanotusti linkittävät mielivaltaisen kokoisia tietueita aina "seuraavaan" eli tässä tapauksessa aiemmin kutsutun aliohjelman aktivaatiotietueeseen. - Monisteen sarjakuvassa on esitetty kutsuvaiheen operaatiot. Paluuvaiheen operaatiot on tehtävä käänteisessä järjestyksessä. Monisteen tekstissä nämä on kuvailtu, ja demo 5:n kohdalla nähdään debuggerin kautta konkreettinen toteutus AMD64:llä. - Lisähuomautus: Aliohjelman kutsuminen ja sieltä palaaminen tulee tietenkin määritellä konekielen tasolla laitteisto- ja käyttöjärjestelmäkohtaisessa ABI-sopimuksessa (Application binary interface), jotta konekielelle käännetyn ohjelman on mahdollista käyttää konekielisiä jaettuja kirjastoja. Yhden ohjelman sisäisiä kutsuja saa kukin tietysti tehdä ihan miten haluaa, joten esimerkiksi koodin automaattinen optimointi saattaa tehdä aivan kummallisen näköisiä kutsuja, joita on hankala ymmärtää ja debuggailla disassemblyn perusteella. Kääntäjän vivut "-g -O0" tekevät ymmärrettävämpää jälkeä. Demossa 5 esimerkkikoodissa on ylimääräinen aliohjelmakutsu, joka ei tee mitään muuta hyödyllistä kuin estää kääntäjää optimoimasta liikaa. Demo 5:n olennainen sisältö, eli aliohjelma-aktivaatio ja konekielinen ohjelman suoritus. - Ohjelman jälki (engl. "trace"; mm. Stallingsin kirjan terminologiaan vedoten) eli varsinaisten suoritettujen käskyjen ketju. Tietyssä muistipaikassa oleva konekielikäsky voi sisältyä jälkeen useita kertoja (toistuvat silmukat, useasti kutsutut aliohjelmat). Toisaalta tietty konekielikäsky ei sisälly jälkeen lainkaan (esim. tiettyä aliohjelmaa ei tarvitse kutsua tai tietty ehto ei koskaan täyty jossakin ehtolauseessa). - Reunahuomautus: Kaikkein tiukimmat laadunvarmistusmenettelyt vaativat muiden seikkojen ohella, että testien koodikattavuus eli "code coverage" on 100%. Tämä tarkoittaa, että testiohjelman jäljen tulee kulkea jokaisen konekielisen käskyn läpi vähintään kerran. Eli testikeisseissä on oltava oikeita ja vääriä syötteitä sekä simuloituja toimintahäiriöitä niin paljon, että kaikki if-then-else -vaihtoehdot ja catch-lohkot käydään testin aikana läpi. Tämä on kallista puuhaa, joten 100% koodikattavuus on järjetön muiden kuin potentiaalisesti ihmishenkeä uhkaavien ohjelmistojen testaamisessa (mm. siviililentokoneiden ohjaus, tietyt lääketieteelliset instrumentit). - Aliohjelmakutsu siten kuin demo 5:ssä käsitellään. **** Jos on aikaa, niin jotakin viime vuoden luennolta 11 Ennakoiva havainto: - Jälki, laitekeskeytykset ja reaaliaika: Nykyjärjestelmissä sovellusohjelma ei tiedä, mitä kahden konekielikäskyn välissä tapahtuu ja kauanko siinä kestää. Käyttöjärjestelmän koodi voi estää estää tai sallia uudet keskeytykset, joten "atomisen toimenpiteen" toteutuminen sovellusohjelmassa edellyttää käyttöjärjestelmäkutsun tekemistä. Ja sitten: Katsaus tietokoneiden ja käyttöjärjestelmien symbioottiseen historiaan. Jotta voidaan katsoa nykypäivästä eteenpäin, täytyy tietää, mistä tähän ollaan tultu ja miten! Ensimmäiset tietokoneet 1940-1950 -luvuilla eivät moniajoa mahdollistaneet, mutta siitä se kehitys sitten havaittujen ongelmien ja ratkaisujen kautta lähti... ensimmäisenä ohjelmointikielten ja kääntäjien rakentelulla, suojatun tilan ja käyttöjärjestelmätilan toteuttamisella prosessorin ominaisuutena sekä keskeytysten, mm. aikakatkaisun löytymisestä prosessorin piirteenä, joka keskeyttää sovelluskoodin ja siirtää prosessorin käyttöjärjestelmätilaan aina, kun laitteistossa tapahtuu jotakin uutta. Lähes 70-vuotisen historiikin kautta perusteltakoon tarpeet vuorontamiseen, moniajoon, muistin ja muiden laiteresurssien hallintaan sekä muihin toimenpiteisiin, joihin käyttöjärjestelmää nykypäivänä tarvitaan. Merkkipaaluja tietokoneiden ja käyttöjärjestelmien kehityksessä vuosien varrella. Kehitys nykymuotoisia käsitteitä ja toimintamalleja kohti tapahtui erityisesti 1960-luvun aikana: - hukka-ajan poisto: keskeytykset, I/O:n odotus ja aikakatkaisu - Prosessorin täytyy voida toimia ainakin kahdessa eri tilassa: suojatussa ja rajoitetussa (tietyt muistiosoitteet ja I/O-toimenpiteet kiellettyjä) käyttäjän tilassa ja rajoittamattomassa käyttöjärjestelmän tilassa; tilojen välinen siirtymä täytyy olla mahdollista - erityisesti meneillään olevan suorituksen keskeyttäminen esimerkiksi aikakatkaisuna täytyy olla mahdollista. Myös käyttäjätilan ohjelmalla täytyy olla mahdollisuus pyytää siirtymää käyttöjärjestelmän palveluun ("system call") jolloin prosessorin tilan on vaihduttava. Ihan pari historiallista artikkelia: - lokaalisuusperiaatteen historiaa lähdemateriaalista vilkuillen (kirjallisuusviite kiinnostuneille, lisämateriaalia, ei pakollinen: http://denninginstitute.com/pjd/PUBS/CACMcols/cacmJul05.pdf ... edistyneenä osaamistavoitteena on oppia löytämään ja lukemaan tieteellisiä artikkeleita vuosien varrelta) - katsottakoon läpi myös alkuperäinen UNIXin, C-kielen ja putkitusta tukevan shellin uutuuksia hehkuttava artikkeli "The UNIX time-sharing system" vuodelta 1974. - pakollinen maininta: http://www.cs.utexas.edu/users/EWD/ewd01xx/EWD196.PDF eli Dijkstran "The structure of the THE-multiprocessing system", josta käyttöjärjestelmien jakaminen kerroksiin (julkaisussa 'System hierachy', nykyään 'layers'), sivutetun virtuaalimuistin esiversiot ja semaforit ovat peräisin. (lisämateriaalia) Sitten periaatteessa luentomonisteen järjestyksessä etteenpäin... Yhteenveto käyttöjärjestelmän tehtävistä, tavoitemittareista ja kompromisseista. Prosessorin suoritussykli, tarkempi kuva: - käskyn ja operandien nouto, suoritus, tulosten tallentaminen JA mahdollinen ohjelman itsensä aiheuttama (syscall-pyynnöllä tai laittoman/mahdottoman käskyn seurauksena) tai ulkopuolelta tuleva keskeytys. Keskeytys on mahdollinen minkä tahansa käskyn jälkeen, jos sen aiheuttaa ulkopuolinen, kontrolloimaton, lähde. Käytännössä ainoa koodi, joka voi tapahtua ilman keskeytyksiä, on alkupuoli käyttöjärjestelmän keskeytyskäsittelijästä - kunnes kyseinen koodi itse sallii uudet keskeytykset. Luentomoniste kertoo hieman lisää yksityiskohtia. - "FLIH", eli mitä keskeytyksen tullessa tapahtuu prosessorissa ennen seuraavan käskyn noutoa. Yleisön kysymys 2017: "Blue screen" (win), "kernel panic" (linux) tulosteista.. kyseessä käyttöjärjestelmän virhe, josta ei ole paluuta. kyllä näissä virheilmoituksissa nimenomaan viitataan käyttöjärjestelmän muistialueisiin (koodiosoite RIP, kernel stack pino-osoite RSP) **** Jos on aikaa, niin viime vuoden luennolta 13 Säie vs. prosessi: - Säie on yksi ajassa etenevä suorituskohta prosessin koodissa, joka muodostaa konekielisten suoritusten "jäljen" ja vaikutuksia dataan. Pieni tenttitärppi luennolla tässä kohtaa (paperin käyttö jäljityksessä pääkopan tukena). - Prosessilla voidaan aina ajatella olevan vähintään yksi säie. (ks. esim. POSIXin Base definitions -luvun määritelmä termille "Process") - Jos alusta (ts. käyttöjärjestelmä ja apukirjasto) tukee useampia yhdenaikaisia säikeitä, niitä voi luoda prosessille tarpeen mukaan, esim. POSIXin säielaajennoksen kutsulla pthread_create(). Lähdekoodissa säie ilmenee aliohjelmana, jonka päättymistä voi jäädä odottelemaan esim. POSIXin kutsulla pthread_join() tai säikeen voi jättää suorittamaan tehtäväänsä "taustalle" tarvittaessa vaikka koko prosessin päättymiseen saakka, tai niin pitkään kuin säikeen operaatio ylipäätään kestää. - Suorituksen vuorottelun mielessä säie ja prosessi ovat hyvin samantyyppisiä käsitteitä: periaatteessa kaikki säikeiden avulla tehtävät asiat voitaisiin hoitaa myös luomalla prosesseja. - Säie on kuitenkin yhden sovelluksen sisäisiin tarpeisiin paljon kevyempi konsepti: se tarvitsee olennaisesti vain prosessorin kontekstin, pinomuistin ja muut suorituskohtaan liittyvät tiedot - kaikki muu, mukaanlukien koodi, keko, globaali data, avatut tiedostot, ym. ovat yhteiset säikeen omistavan prosessin kanssa. - mihin säikeitä voi käyttää? Esim. ohjelman sisäiset "tausta-ajot" (esimerkiksi videon toistaminen selaimen välilehdessä samalla kun käyttäjä voi klikkailla muita välilehtiä; suurten tiedostojen lataamiset ja tallentamiset), seinäkelloajan minimointi rinnakkaislaskennalla. - Laskentatehtävien nopeuttaminen säikeistämällä vaatii säikeiden suorittamista konkreettisesti yhtäaikaa rinnakkaisilla prosessoriytimillä. Yhdenaikainen tausta-ajo onnistuu tietysti yhdelläkin prosessorilla normaalin prosessien vuoronnusmenettelyn tapaan. - esimerkki: taulukon täyttäminen peräkkäisillä luvuilla koodit 2018/l13/ -hakemistossa: saikeiden_tarve.c saikeet.c - katsottiinpa myös Googlella Java Thread API ja C# vastaava. - "kilpa-ajotilanne" eli race condition: vuoronnus voi milloin vain keskeyttää säikeen (tai prosessin) ja antaa suoritusvuoron toiselle: koodi 2018/l13/ -hakemistossa: race.c - lukitus auttaa: keskinäinen poissulku race_fixed_mutex.c - deadlock -tilanne, esimerkki huolimattomasta resurssilukituksesta: huonon kahvihuoneen simulaattori kahvihuone_deadlock.c ja toimivamman kahvihuone_ei_lukkiudu.c **** Jos on aikaa, niin viime vuoden luennolta 14 Demo 6 esittely. Vilkaistaan mallitenttiä (sama kuin viime vuonna). Tästä jatketaan viimeinen viikko tiukasti siihen asti kuin vaan ehditään: Prosessien (ja säikeiden) välinen kommunikointi eli IPC: - engl. Inter-process communication. Yksi tärkeistä tehtävistä, joihin käyttöjärjestelmää tarvitaan. Esimerkkejä: + signaalin lähettäminen pääteyhteyden näppäilyllä "päällimmäiselle" ohjelmalle, jolle syötteet ohjautuvat. + signaalin nappaaminen C-kielisessä ohjelmassa: koodi 2018/l14/sigesim.c + signaalin lähettäminen kill -komennolla shellistä. Signaalien listaaminen. Esimerkkisovellus: dd -apuohjelman tilannetiedon kysyminen (ei toiminut luennolla jostain toistaiseksi tuntemattomasta syystä; manuaali lupaa, että dd:n pitäisi osata napata SIGUSR1 - kumma juttu.. selvitellään..) + yksi erilainen IPC-tapa, viestijono (message queue): koodi repossa: 2018/l14/chattomyself.c (tässä oli "demoefekti" luennolla 15.. todellinen efekti siis se, että luennoitsija luuli varoitusta virheeksi ja ettei koodi kääntynyt.. vaikka se kääntyikin. Esimerkistä korjattu nyt myös varoitukset pois.) Semafori: - esimerkki: tuottaja-kuluttaja -probleemi sekä sen ratkaisu kolmella semaforilla koodi repossa: 2018/l14/tuottaja_kuluttaja.c "ASCII-sarjakuva" repossa: 2018/l14/tuott_kulutt_rengaspuskuri.txt Vaatii omakohtaista miettimistä! Tämäkin esimerkki on tarkoituksella yliyksinkertainen, vaikka siinä onkin mukana olennaiset osuudet: semaforien alkuarvojen asettaminen ja oikeellinen järjestys semaforikutsuille. Osaamistavoite on ymmärtää, mikä on semafori ja miten rengaspuskuria käyttävä tuottaja-kuluttaja toteutetaan semaforilla. - Pienoishuomioita prosessien/säikeiden synkronoinnista: + Onnistuu semaforeja vastaavalla "vahvuudella" mm. myös viestinvälityskutsuilla ja ns. "monitoreilla"; kauan sitten tutkittu, todettu ja julkaistu asia. + Nykyisissä oliokielissä helppoa: Javassa heitetään avainsana "synchronized" kentälle ja C#:ssa ilmeisesti (tsekattu lyhyesti nettifoorumeilta) tyyliin "[MethodImpl(MethodImplOptions.Synchronized)]" tai "lock { /*lukituksen tarvitsevaa koodia tässä*/ }".) + Deadlock ja muut ongelmat aina mahdollisia myös uudemmissa oliokielissä! Varovasti aina! Yhdenaikaisuus vaatii erityistä tarkkuutta suunnittelussa. + Synkronointia ei pidä käyttää, jos ei sitä tarvita! Miksi? Tulee älyttömästi hukka-aikaa lukituksia hoitavista käyttöjärjestelmäkutsuista!! Mutta pitää tunnistaa kohdat, joissa välttämättä tarvitaan. Erityisesti täytyy tietää aivan yksittäisen muuttujan tasolla, onko se mahdollisesti jaettu usean säikeen kesken. Tarkkana suunnittelussa ja toteutuksessa! + Säikeitä kannattaa alkaa käyttämään omissa ohjelmissa tarpeen mukaan, muistaen tarkkaavaisuuden ja potentiaaliset ongelmatilanteet! **** Jos on aikaa, niin viime vuoden luennolta 15 Loppusuoralle / lopputaisteluun... Niin monta tuntia aikaa ekaan tenttiin, että kyllä me siihenkin mennessä vielä paljon hyviä asioita ehditään oppia. Muistinhallinta: - tavoitteet: + maksimaalinen kapasiteetti, riittävä nopeus. Perusidea: pidetään tällä hetkellä käyttämättömät tiedot hitaassa mutta isossa muistissa, tuodaan tarvittaessa lähemmäs. Eli hyödynnetään lokaalisuusperiaate -havaintoa. + suojaus, eri oikeudet eri muistialueilla. Looginen eriytys segmentteihin: koodi, data, pino, keko (dynaamiset oliot) - käytettävissä: muistihierarkian mukaiset muistit, prosessori, MMU Sivuttava virtuaalimuisti: - sivutus - osoitteen tulkinta, osoitteenmuunnos virtuaalisesta fyysiseksi - prosessorin sivutaulu: sisältää fyysisen sivukehyksen indeksin sekä yksittäisinä bitteinä sivukohtaiset suojaus- käyttöhistoriatiedot ja tiedon, onko sivu muistissa vai kovalevyllä. - heittovaihto (swap), working set: + Siinä missä laitteisto hoitaa prosessorin sisäiset välimuistit, käyttöjärjestelmä pystyy ottamaan vastaavalla periaatteella avuksi myös käytännössä rajattoman kokoiset massamuistit. + prosessorissa on ominaisuudet (sivutaulun automaattisesti päivittyvät bitit), joilla heittovaihto on mahdollista toteuttaa. - sivuvirhe (page fault) / sivunvaihtokeskeytys ja sen käsittelijä - käyttöjärjestelmän tietorakenteet: prosessikohtaiset sivutaulut ja kehystaulu. - Korvausalgoritmi, esim. least-recently-used (LRU). Käyttöjärjestelmän operaatiot "swap out" ja "swap in" -vaiheissa. Välimuistin ruuhkautuminen eli "cache trashing" tarkoittaa välimuistin ulkopuolisen väylän tai pahimmillaan heittovaihdon suhteellisesti tiuhempaa käyttöä, joka tuhoaa suorituskyvyn - välimuistien osaltakin dramaattisesti, mutta heittovaihdon osalta jopa rampauttavasti). - Esimerkki: (jälleen simppeli "koeputkiesimerkki", jotta perusilmiö näkyisi mahdollisimman hyvin): koodi repossa: 2018/l15/cache.c - Miten tällaisilta vältytään? + Suunnitellaan algoritmit suoraviivaisiksi ja mahdollisimman vähän operaatioita vaativiksi aivan normaaliin tapaan; lisäksi selvitetään, millä tavoin alla oleva alusta käyttää muistia, eikä tehdä "luonnonvastaista" koodia. + Yhdenaikaisten prosessien/säikeiden ja putkien käyttö mahdollistaa peräkkäisten dataoperaatioiden rakentelun modulaarisesti (operaatiot vaihdeltavissa keskenään; peräkkäiset operaatiot tapahtuvat yhdenaikaisesti, kun data on vielä edeltävän operaation jälkeen lähemmässä muistikomponentissa) + (ja niin edelleen. Lisää jatkokursseilla, joissa puhutaan enemmän ohjelmistojen ja järjestelmien suunnittelusta.) Esimerkki muistin kartoituksesta ja muiden kuin tavallisten tiedostojen ilmenemisestä tiedoston näköisinä, normaalissa hakemistopuussa, unixmaisessa käyttöjärjestelmässä; aasinsilta tiedostojärjestelmiin: - Esim. prosessin 1234 muistikartan saa Linuxissa nähtäville tulostamalla erikoistiedoston nimeltä /proc/1234/smaps - Katsotaan jotain oikean ohjelman karttaa, esim. emacs-tekstieditorin. Havaitaan mm. lukuisa joukko kirjastoja, joiden tarvitsee olla ladattuna fyysiseen muistiin vain yhtenä kopiona, vaikka emacs olisi käynnissä vaikka kuinka monena prosessina. Pari lisäesimerkkiä Unix-tyyppisestä "kaikki ilmenee tiedostona" -lähestymisestä (näitä on ehditty nähdä jo aiemminkin, kun signaaliluennolla juteltiin dd -ohjelmasta): + /dev/urandom -"tiedostosta" voi lukea loputtomiin satunnaislukuja + /dev/sda vastaa ensimmäisen koneeseen liitetyn fyysisen kovalevyn tavuja ilman tiedostorakennetta; voi käyttää esim. täydellisen varmuuskopion tekemiseen tai palauttamiseen. Tietenkin käyttö on sallittu vain ylläpitäjän oikeuksilla. Kopiointi myös edellyttää järjestelmän käynnistämistä esim. muistitikulta siten, että kovalevy ei ole kopioinnin aikana kytketty tiedostoineen. + Hakemiston /dev/ listaaminen näyttää monia muitakin tiedostonimiä, jotka itse asiassa vastaavat fyysisiä I/O-laitteita. Useimmat ovat saatavissa vain järjestelmänvalvojan oikeuksilla, ja niitä on tarkoitus käyttää sovelluksissa käyttöjärjestelmäkutsujen kautta sen sijaan että suoraan esim. päätteeltä. + /dev/sda -"tiedostosta" voi lukea (käyttöoikeuksien salliessa) kovalevyn koko sisällön bitti bitiltä esimerkiksi koko järjestelmän kattavaa varmuuskopiointia varten. Lisää tiedostonhallinnan käyttäjänäkökulmaa: Esimerkki: - Tiedostojen käyttöoikeudet rwx / ugo. Shell-ohjelma chmod nähty jo aiemmin. (HUOM: yliopistomme verkkolevyt eivät sisäisesti tue POSIXin käyttöoikeusmääritelmiä; omat kokeilut kannattaa tehdä siis esim. itka203-testi.it.jyu.fi -palvelimella, joka ei muutenkaan ole kytketty verkkolevyyn, tai sitten jalavan tai halavan /tmp -hakemistossa. Viimeksi mainitusta siivoa lopuksi kokeilutiedostosi pois, etteivät jää muiden vaivoiksi yhteiskäyttöiseen järjestelmään... kyllä /tmp kuulemma kait myös siivotaan aika ajoin myös jonkinlaisella automaattivälineellä...) I/O ja Tiedostonhallinta käyttöjärjestelmätoteutuksessa: - Tavoitteita: datan organisointi, osoitteistaminen, puumainen hierarkia ("kansiot"). [kyseessä on todellisuudessa pikemminkin suunnattu graafi eikä puu, koska hakemistoista voi olla ns. linkkejä muihin hakemistoihin ja muissa hakemistoissa sijaitseviin tiedostoihin. Puu on kuitenkin ehkä hyvä ensimmäinen analogia.] - Käytettävissä olevat laitteet: prosessori, I/O -portit, laitteiden aiheuttamat keskeytykset; rajapinnan takana hyvin erilaisia laitteita - I/O -ohjelmiston kerrosmainen rakenne: laiteriippumaton osuus, laiteriippuva osuus (ajurit). - I/O -kutsun kulku ohjelmistokerrosten läpi (karkea yleiskuva). Lopussa vielä http://www.pouet.net/prod.php?which=67941 Sitä nyt vaan ei voi estää. ** Luentotentti: (15.05.2019) Nykyisen ohjeistuksen mukaan ensimmäinen tenttiyritys luentoaikaan tässä kohtaa. * Ja se oli sitten siinä vuodelta 2019! Vuoden 2019 mukaista kurssia voi suorittaa helmikuuhun 2020 saakka. Virallisten tenttikertojen (3 kpl) jälkeen eli syksystä 2019 alkaen kysy erillistä tenttimahdollisuutta. * 2019 eroja vuoteen 2018 (tullee divergoimaan paljon...) ** Luennolla 3 pois jätettyjä 2019 vs 2018 Keväällä 2019 Mentiin Aiemmin on käsitelty vastaavalla luennolla esim. seuraavanlaisia juttuja, joista osa käytiin 2019 jo luennoilla 1-2: - Mainintoja oppikirjoista, esim. OSTEP http://pages.cs.wisc.edu/~remzi/OSTEP/ - Kurssimonisteen luonne. HUOM: Nyt alkakkee sukeltaa monisteeseen! - Vilkaisu "jyrkempään" taustamateriaaliin: AMD64-manuaalit, POSIX, C99 spesifikaatio. Mitä ihmettä ja miksi? - Miten homma jatkuu demossa 2: Screen-ohjelman käyttely. Demoissa tulee paljon muutakin. Ajatuksella kannattaa tehdä, mutta aloittaa pian. - Lopussa spoileria demo 1:een, useless use of echo ym. Vuonna 2018 käsiteltyä: - Luentomonisteen sisällysluettelon pääotsikot suhteessa kansainvälisiin osaamistavoitesuosituksiin. Samoja ovat.. jatkokurssien opettajat aika-ajoin kyselevät, mitä tällä kurssilla käsitellään. Päädyn lupaamaan noin yhden luennon mittaisen ensijohdannon aika monesta tärkeästä asiasta, joissa myöhemmin mennään syvemmälle. - Johdanto: Kerrokset ja rajapinnat. Käyttöjärjestelmän rooli informaatioteknologian kokonaiskuvassa. Käyttöjärjestelmäkurssin rooli IT-alan oppisisällössä ja suhde muihin osaamiskohteisiin. - Esitietojen varmistaminen: Mitä ohjelmointi 1 -kurssilta pitäisi muistaa ( ks. https://trac.cc.jyu.fi/projects/ohj1/wiki/sisallys ) - Esi- tai ennakkotiedot: Palautellaan mieleen Ohjelmointi 1 -kurssia: alkeistietotyypit, määrämuotoiset tietorakenteet ja taulukot. Ilmeneminen C:n lähdekoodissa (ei kovin erilaista kuin esim. C#:ssa tai Javassa, joiden syntaksi tarkoituksella jäljittelee C:tä). * 2018 pois jätettyä: ** C-kielestä "pienoisgallup" Alkuun "YPE-hype" (eli omien yliopistopedagogisten opintojeni hurmoksen herättämä interaktiohetki): - Muodosta lähimpänä istuvien 2-3 henkilön kanssa keskusteluryhmä; keskustelkaa seuraavasta kysymyksestä demo4:n ja tähän asti luennoilla käsitellyn valossa: + Mikä tällä hetkellä askarruttaa eniten C-kielessä? (esim. suhteessa aiemmilta kursseilta tuttuihin kieliin, muihin aiempiin ohjelmointikokemuksiin tai ennakko-odotuksiin? Keskustelu saa rönsyillä muihinkin suuntiin, kunhan pyörii C:n ympärillä.) - Keskustelun löydöksiä (luentovideo alkaa tästä kohtaa): + "viitemuuttujat", ts. viedään aliohjelmalle **muistiosoite**. + miksi Windowsin ja Linuxin (tai ylipäätään eri käyttöjärjestelmien) C-ohjelmat eivät ole yhteensopivia keskenään? HUOM: Ne *ovat* yhteensopivia, jos niissä (1) ei kutsuta käyttöjärjestelmäriippuvaisia aliohjelmia ja (2) ohjelmat käännetään uudelleen (ABI määrää mm. miten aliohjelmia kutsutaan konekielessä; ABI on käyttöjärjestelmän tekijän valinta ja riippuu aina prosessoriarkkitehtuurista.) + (on ihan OK, jos tässä vaiheessa "ei osaa vielä muodostaa kysymystä". Toivottavasti se on pian mahdollista!) + C:n "listat"? HUOM: Lista on teknisesti eri asia kuin taulukko (ks. esitietoluku monisteesta!) Kysymyksessä tarkoitettiin taulukkoa ``int taulukko[3]`` - miksi se sallii kirjoittaa ``taulukko[1000] = 42`` Noh.. C yrittää tehdä mahdollisimman "vähän" ja jättää loput ohjelmoijan vastuulle. HUOM: käännösvaiheessa voi olla vaikea tietää, mihin sijoitetaan. Esim. ``taulukko[i] = 42``. Itse pitää ohjelmoida esim. ``if (lkm > maximi) error("") else ...`` Voi aina tehdä kirjaston, joka hoitaa esim. tarkistukset. ``turvallinen_taulukko_lisaa(taulukko, maksimi, indeksi, arvo);`` HUOM: C:n taulukko on erilainen (yksinkertaisempi) kuin modernimpien kielien automaattisesti skaalautuvat ja rajat tarkistavat tietorankenteet. + "Eikö ne 1970-luvulla 'tajunneet' tehdä taulukosta turvallisempaa"? Historiikeista voi selvitä. Joka tapauksessa voi olla suorituskykykysymys. - vuosi 2018 tässä moi, ja Jonne: Kyllä tajusivat. Taulukoiden rajojen tarkistus (ainakin 1960-luvulta https://en.wikipedia.org/wiki/Bounds_checking#Index_checking), poikkeukset (LISP ja PL/I 1960-luvulla) ja roskien keruu (LISP 1950-luvun lopussa) oli keksitty jo tuolloin, mutta valitettavasti K&R C:tä tehdessään halusivat tehdä vain "makroassemblerin", joten moiset höpötykset saivat jäädä kielestä pois. Tämä sama pätee seuraavaan kysymykseen. + Miksi muistivuotojen hallinta ja muu resurssien vapautus on ohjelmoijan vastuulla C:ssä? Vastaus on kysymyksessä: Milloin pitäisi vapauttaa? Vaatii ajonaikaisen järjestelmän, joka tarkkailee resurssin tarvetta. Uskomukseni on, että ainakin osittain tavoite on ollut vähentää alustan monimutkaisuutta. Myöskin tutkimus kielten toteutuksessa on elänyt omaa raidettaan 1970-luvun jälkeen, kun C syntyi. + Mikä on .c, .h ja .o -tiedostojen suhde toisiinsa? Ks. demo3 ja demo4 tehtäväohjeet. Tästä jatkuu itse asia sitten: - Tavujärjestys (byte order), jos jotakuta on ihmetyttänyt (parhaimmillaan on ihmetyttänyt!)? AMD64:ssä on "little-endian" -järjestys. Kokeillaan luvulla 0x0123456789abcdef, jonka tavujärjestys on helppo varmistaa vaikkapa debuggerin tulosteesta. ** Lisuketta edelliseen - Näkökulmia viime luennon keskusteluhuomioihin: + C on lähtökohtaisesti suunniteltu "laiteläheiseksi" - esimerkiksi lähdekoodissa näkyvät rakenteet vastaavat datan sijoittumista tietokoneen muistiin niin, että mitään ei ole tai tapahdu "piilossa". Mm. tämän lähtökohdan vuoksi C (ja sittemmin C++) soveltuvat käyttöjärjestelmien ja muun laitehallinnan toteuttamiseen: datan sijainti tietokoneen muistiavaruudessa nähdään suoraan, koska struct-rakenteet ja taulukot (mukaanlukien merkkijonot) ovat kiinteitä, peräkkäin sijaitsevia pötköjä. + Mitä muuta C:n yksinkertaisuudesta seuraa? Mahdollisimman pieni määrä ajonaikaista alustakoodia - mm. siksi C soveltuu sellaisten pienten prosessorien ja mikrokontrollereiden ohjelmointiin, joissa ohjelmalle tai datalle ei yksinkertaisesti ole kovin paljon tilaa. Tällaisten valmistus ja siten käyttäminen tuotteiden osana on luonnollisesti halvempaa (=tarkoituksenmukaista) kuin isompien. + Miksei C:ssä olisi edes käännösaikana estetty taulukoiden tilan ylittämistä? Itse asiassa kääntäjät osaa varoittaa aika hyvin. Käytä oikeassa ohjelmassa -Werror argumenttia gcc:ssä ** Ehkä vielä takas? [Siirtynyt aiemmasta..] Alkuun pieni esimerkki shellin käyttämisestä tiedonlouhintaan liittyvässä tutkimuksessa: + Alustava kokonaiskuva ennen näkemättömästä datasetistä: minkä muotoinen tiedosto, kuinka paljon, miten jakautunutta (karkeasti ottaen) + Erotinmerkin muuttaminen (tässä pilkku -> välilyönti), mikäli halutaan ladata käsittelyyn ohjelmalla, jolle alkuperäinen erotinmerkki ei käy. Vastaavasti voisi muuttaa myös esim. desimaalierottimen. + Shellin perustyökaluilla pystyy tekemään paljon muutakin hyödyllistä ensivaiheessa, ennen siirtymistä varsinaisen tutkimusohjelmiston käyttöön. + Todellisessa tilanteessa data voi tulla asiakkaalta hyvinkin kummallisessa muodossa, jota ei suoriltaan pysty lataamaan työkaluihin, eikä asiakkaan edustaja välttämättä itse edes tiedä, mikä tiedostomuoto on. Ensimmäinen vaihe voi siis hyvinkin olla "reverse engineering" -tyylistä. ** alkupuolen luennoilta.. + (ei pilata kaunista speksiä vuonna 2018 tällä:) Suora Linuxin käyttöjärjestelmäkutsu, myös tuttavalliselta nimeltään "exit()". Ensimmäinen toteutus C:n epästandardina inline-assemblynä. Ei jatketa tällä tiellä yhtään pidemmälle... Toimii samalla tavoin vain yhdellä kääntäjällä (meillä GNU C), yhdellä käyttöjärjestelmällä (meillä Linux) ja yhdellä prosessoriarkkitehtuurilla (meillä x86-64). Viime vuoden "opettajan pääsiäisläksy" eli pääohjelma, jossa ei ole eksplisiittistä return-lausetta lopussa... tämähän se tuotti hämmennystä ja "huonon esimerkin", kun en saanut kääntäjää varoittamaan ja kieltäytymään omaan silmääni vaaralliselta näyttävästä koodista... No.. läksy oli helppo, koska pääsiäisläksyn tehtävä eli nollasta poikkeavan virhekoodin jättävä ohjelma olisi ollut faktisesti mahdoton tehdä: C99-standardi määrittelee seuraavaa main()-aliohjelman loppumisesta (luku 5.1.2.2.3):: 5.1.2.2.3 Program termination If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0. If the return type is not compatible with int, the termination status returned to the host environment is unspecified. Siellähän se standardissa luvataan: "reaching the } that terminates the main function returns a value of 0". Tältä osin kaikki kunnossa, ja itsekin olen yhtä asiaa viisaampi. Ja esimerkistä tulikin hyvä :) sovitaan vaan, että se käsitteli asioiden tarkistamista standardista, jos joku alkaa käytännössä ihmetyttämään. Silti suosittelen kirjoittamaan lähdekoodiin "return 0":n niin ei tule ihmetystä eteen niillekään, jotka eivät ole yhtä tarkkaan lukeneet speksiä. Tämä löytyi ensin Googlettamalla ja sitten varmistamalla itse C99-standardista (ISO/IEC 9899:1999), että näin se on komitea mennyt sopimaan. Ehkä tämä määritelmä auttaa keskimäärin vähentämään ohjelmointivirheitä, kun porukka kumminkin unohtaa sen return 0:nsa kirjoittaa, eikä tajuaisi muuttaa kääntäjän varoituksia virheiksi :). Vastaus luennolla esitettyyn tarkennukseen kirjastofunktioiden linkittämisestä käynnistysvaiheessa, eikä enää varsinaisen ajon aikana: Ainakin GNU:n työkaluilla ELF-muotoiseen ohjelmatiedostoon voi laittaa pyynnön kirjastojen linkittämisestä heti ohjelman latauksen yhteydessä seuraavalla komennolla (osio "-Wl,-z,now"):: c99 -Wl,-z,now -Werror -g -O0 -o omaecho omaecho.c Merkintä tulee luonnollisesti aivan viimeisessä työkaluketjun vaiheessa eli linkitysohjelmassa "ld". Vastaus löytyi kuin löytyikin helpoiten selaamalla ld:n manuaalia ja tarkistamalla c99-komennolla käynnistyvän julkisivuohjelman manuaalista, miten ld-vaiheelle saadaan tuupattua argumentteja. "-Wl,-z,now" johtaa siihen, että ohjelmatiedoston kasaamisvaiheessa konepellin alla ajettava komento "ld" saa mm. peräkkäiset argumentit "-z" ja "now". Oletusarvoisesti ld:n ajo tulkitaan kuten "-z lazy" eli jaetut kirjastot ladataan laiskasti vain tarvittaessa, eli kun jotakin kirjastossa sijaitsevaa aliohjelmaa faktisesti kutsutaan. * 2017 pois jätettyä: Semaforin käyttö kuluttaja-tuottaja -ongelman ratkaisussa. (Semafori tietorakenteena käytiin läpi, ja se on muistettava, ts. resurssien määrää kuvaava kokonaisluku ja jono/joukko prosesseja, jotka jonottavat siinä tapauksessa, että vapaana on 0 kpl resurssia). TODO: Hyvä tietää -osastolle 2017: *** Tiedostonhallinnan sovellusnäkökulma: Esimerkki: - Tiedostojen käyttöä POSIX-käyttöjärjestelmäkutsuilla ja C:n alustakirjaston kutsuilla; tiedoston avaaminen ja luominen, kirjoittaminen, sulkeminen. Käyttöoikeuksien asettaminen. koodi repossa: 2017/esimerkit/l17/hellofile.c Esimerkki: - Oman "cat -apuohjelman" raakile; tiedoston avaaminen, lukeminen ja kirjoittaminen tavu kerrallaan, sulkeminen C:n alustakirjaston kutsuilla. koodi repossa: 2017/esimerkit/l17/liit.c Aasinsilta kohti tiedostonhallintaa ja tiedostojärjestelmiä muuttuu oikeaksi sillaksi, kun käsitellään välissä vielä I/O -laitteiston piirteitä, esimerkkinä kovalevy, joka soveltuu tiedon pitkäaikaiseen säilyttämiseen tiedostoihin ja hakemistoihin organisoituna. *** Lisää esimerkkejä erikoistiedostoista /dev/ -hakemistossa Luennoilla on aiemmin nähty esimerkkejä muistakin erikoistiedostoista, esim. /dev/urandom -tiedoston lukeminen saa käyttöjärjestelmän generoimaan satunnaislukuja. Tiedostoon /dev/null voivat kaikki käyttäjät "kirjoittaa", mutta siihen ohjattu data ei mene mihinkään, vaan erikoistiedosto "nielee" tavut. Muita vastaavia, joita unixmaisista usein löytyy: + /dev/random yrittää tuottaa "aitoa satunnaisuutta" tarkkailemalla ulkopuolisesta ympäristöstä riippuvia tekijöitä, kuten nettiyhteyksiä. *Älä käytä turhaan yhteiskäyttökoneella*, koska generointi hidastuu kaikkien tarvitsijoiden osalta. Ulkoisia ilmiöitä tapahtuu harvakseltaan "uskottavan satunnaisuuden" aikaansaamiseksi. Normaalitarpeisiin lue /dev/urandom -tiedostoa ("u"=="unlimited"), joka toimii kuten C:n rand()-funktio. Tiukempiin kryptografiatarpeisiin tällainen pseudosatunnaisuus ei ole välttämättä riittävä. + /dev/zero tuottaa loputtomiin nollatavuja luettavaksi. + /dev/tty on jopa POSIXin määräämä. Se toimii erikseen jokaiselle prosessille, ja sitä tulee voida käyttää syöttöihin ja tulostuksiin samoin kuin päätettä *** Tiedostojärjestelmien toteutuksesta fyysiseen massamuistiin: - kovalevyn rakenne - lohkot muistissa ja levyllä; lohkot yleensä isompia kuin levyn sektorit - käyttöjärjestelmän yleiset tavoitteet (läpivienti, tasapuolisuus, vasteajat jne.) voimassa myös I/O:n osalta. Lisäksi saatavuus- ja säilyvyyskysymykset; vikasietoisuus. - käytännön penkaisua shellin kautta: + komennot ``df`` (POSIX) ja ``mount`` (ei POSIX), ``du`` (POSIX). reunahuomio: Mistä tietää, mikä on POSIXia ja mikä ei? Tietysti standardin tekstistä. Komento joko on siellä tai ei. Tietyn tiedostojärjestelmän toiminta ei ole standardin vaan kunkin käyttöjärjestelmän omien laajennosten varassa. Unixmaisissa tiedostojärjestelmän kiinnittäminen hakemistopuuhun tapahtuu kuitenkin usein mount() -järjestelmäkutsulla ja shellissä mount -apuohjelmalla. Irrottaminen umount() -järjestelmäkutsulla ja umount -apuohjelmalla. POSIX vetää siis määrittelynsä rajan selvästi laiteriippumattoman ohjelmiston ominaisuuksiin (ts. tiedostojärjestelmän ja massamuistien olemassaolo, osoitteistaminen). + inode / POSIXin "sarjanumero" : komennot ``ls -i`` (POSIX) ja ``stat`` (ei POSIX). - esimerkki: vanhan unixin tiedostojärjestelmän toteutuksesta yleiskuva, inodet ja levylohkot, isot tiedostot hierarkkisena lohkolistana - journalointi: kirjataan ensin ylös, mitä levylle aiotaan kirjoittaa; sähkökatkon sattuessa menetetään vain meneillään olleen kirjoituksen tiedot, mutta tiedostojärjestelmän rakenne ei muilta osin korruptoidu, koska kesken jäänyt kirjoitustransaktio voidaan peruuttaa seuraavan käynnistyksen yhteydessä. - levyoperaatioiden vuorontaminen on oma haasteensa. Internetin ihmeellinen maailma kertoo meille paljon hakusanalla "disk scheduling" (tieteelliset artikkelitietokannat kertovat tietysti uusimpia tutkimustuloksia yleistiedon lisäksi) Havainto: myös laitteita on vuoronnettava! Magneettisen kovalevyn vuorontaminen on sidoksissa fyysisen laitteen ominaisuuksiin (pyöriminen, lukupään sijainti) ja tiedostojärjestelmän organisointiin levyn pinnassa. *** Lisäesimerkki -- kurssin mielessä kokonaisuudessaan liian syvällinen: Kurssin opiskelijan harrastusprojekti: muinoisen rinnakkaisportin keskeytyskäsittely. - Tietoja portista: http://retired.beyondlogic.org/spp/parallel.htm Tässäpä olikin hieno testi luennoitsijan omalle tiedonhakukyvylle :). En voinut käyttää tähän kovin paljon aikaa, mutta tässä ensimmäiset, ei välttämättä aivan oikeaan osuvat, tulkintani: - Jos ymmärsin oikein, laitteelle täytyy lähettää merkki, ikäänkuin se olisi "printteri" (mitä se ei tässä tapauksessa kuitenkaan ole:)). Sitten täytyisi tallentaa aikaleima hetkellä, jolloin "ikäänkuin printteri" ilmoittaa keskeytyksellä, että se on "tulostanut" edellisen merkin ja on valmis vastaanottamaan lisää. Fyysisen laitteen luonteesta johtuen ei voi ennalta tietää, millaisen ajan päästä tämä keskeytys tulee. - Ensimmäisellä googletuksella tuli vastaan tällainen softa: http://parapin.sourceforge.net/ - Tämä Parapin on ilmeisesti tehty Linuxin versiolle 2.6, jota ei pahemmin tueta enää 2016. Ytimen rakenteessa voi olla tapahtunut muutoksia, jotka edellyttäisivät softan porttaamista uuteen versioon. Seuraava perustuu ajatukseen, että Parapin tai vastaava toimisi nykyisessä Linuxissa (tai käyttötarkoitus on sellainen, että laitetta hallinnoivaan koneeseen voisi tietoturvallisesti asentaa version 2.6). Ohjelmiston dokumentaatiossa ensinnäkin on linkki selkeästi hyvään johdantokirjallisuuteen: - Rubini & Corbet: "Linux Device Drivers": http://www.xml.com/ldd/chapter/book/ (ilmainen online) http://shop.oreilly.com/product/9781565922921.do (ostoversio) Jos esim. tuon Parapin-ohjelmiston ominaisuudet eivät riitä, niin kirjan perusteella saanee yleiskuvan siitä, miten Linuxin ajurijärjestelmä ja keskeytyskäsittelijät toimivat :), jotta voi modata esimerkin perusteella oman ajurin. Kyseinen Parapin -ohjelmahan on juurikin esimerkki rinnakkaisporttia käyttävästä ajurista. Siinä näyttäisi kyllä olevan lähes kaikki ominaisuudet, joita kysymyksen esittäjä tarvitsee harrastusprojektissaan. Parapinin voi äkkivilkaisun perusteella kääntää Linuxin ajuriksi, joka toimii yhteistyössä normaalin "parport" -ajurin kanssa. Keskeytyskäsittelijässä näyttäisi olevan callback-funktio, johon ilmeisesti voi ajurin ylösajon kohdalla saada oman C-aliohjelman ajettavaksi aina kun tietty rinnakkaisportti keskeyttää. Keskeytyksen kohdalla voisi *ehkä* tehdä jotain "quick-and-dirty" -tyyppistä, kuten:: static void rakentele_aikaleima_jotenkin(char *buf){...} static laheta_porttiin_taas_uusi_operaatiopyynto_jotenkin(void *id){...}; void oma_koukkufunktio(int irq, void *dev_id, struct pt_regs *regs){ char[20] aikaleima; rakentele_aikaleima_jotenkin(aikaleima); printk(KERN_INFO "Laite sanoi tiks kellon ollessa %s\n", aikaleima); laheta_porttiin_taas_uusi_operaatiopyynto_jotenkin(dev_id); } Ja sitten, teoriassa, jos tällaisen saisi pyörimään, niin ytimen lokitiedosta voisi käydä ajoittain nappaamassa rivit, joilla lukee "Laite sanoi tiks", tyyliin shell-komento ``dmesg | grep "Laite sanoi tiks"`` ja jäsentää riveiltä aikaleimat. Tai sitten tuo oma käsittelijä voisi tehdä jotain hienompaa. "Oikea unixmainen ajuri" näyttäytyisi tietenkin loppukäyttäjälle tiedostona, esim. "/dev/munlaite/tilanne", josta käyttäjä voisi lukea tekstimuodossa aikaleimoista johdetut yhteenvetotiedot (jotka ovat käsittääkseni harrastusprojektin lopullinen käyttötarkoitus). Kevyellä tai raskaalla toteutuksella joka tapauksessa tuossa harrastuksessa joutuu lueskelemaan oppikirjallisuutta ja esimerkkikoodia, että saa homman pelittämään :). Hieno harrastus siis!! :) TODO: Heläytetään löytynyt oppikirja ehkä myös luentomonisteen lisälukemistolistaukseen. *** Muita ohitettuja 2017 Esimerkki: - kahden eri ohjelman jakama muistialue POSIX-käyttöjärjestelmäkutsuja käyttäen; toinen aasinsilta tiedostojen käsittelyyn (jaettu muistialue näyttäytyy ohjelmalle ja muillekin tiedostona!) koodit repossa (+krediitit alkuperäiselle tekijälle): 2016/esimerkit/l15/shm_msgclient.c 2016/esimerkit/l15/shm_msgserver.c 2016/esimerkit/l15/README_shm_example.txt - Todetaan esimerkissä oleva kilpa-ajotilanne (korjaamisen voi tehdä erittäin vapaaehtoisena, hieman vaativampana, harjoitustehtävänä...; sigesim.c:n malliin olisi syytä myös käsitellä TERM-signaali, jotta serveri osaa poistaa jaetun muistialueen loppuessaan lopetussignaalin johdosta. Oletuskäsittelijä ei voi tietää, että prosessi on pyytänyt yhteisen muistialueen.) - Katsotaan, että muistialue näkyy tiedostona hakemistossa /dev/shm ... POSIXin vaatima kauttaviivalla alkava nimi on vaan lisätty Linux-toteutuksessa /dev/shm:n perään. - Ja juu.. elä anna hakkerin tehdä tätä jaetulle muistillesi: echo Hei vaan hei | dd of=/dev/shm/foo1423 bs=1 seek=4 conv=notrunc - Telmitäänpä hetki tämän esimerkin ja tietoturvakysymysten äärellä, ja varmistutaan että Ohjelmistoturvallisuus ja Tietoverkkoturvallisuus ovat tarpeellisia jatkokursseja... *** I/O:sta ja laitteista ohitettua 2017: - DMA. - RAID *** Vuoronnusmenettelyjä, RT, skriptit. Vuoden 2016 luennoilta 9-10: Kerrataan tässä kohtaa yleisökysymys, joka viikko sitten tuli vasta varsinaisen luentoajan jälkeen, videoinninkin loputtua. Tämä tulee ihan pian tarkemmin, mutta otetaan silti jo alustava näkemys asiaan: - muistihierarkian käytännön toiminta: laitteisto tosiaankin hoitaa; sovellukselle päin näkyy peräkkäisiä tavun eli 8 bitin mittaisia muistipaikkoja, joilla on omat, peräkkäiset osoitteensa. Vilkaistaan kurssin loppupuolelle (lukuun Muistinhallinta): AMD64:ssä on nelitasoinen hierarkinen "kartasto", jonka kautta konkreettinen osoitteentulkinta virtuaalisesta fyysiseksi tapahtuu. Idean tasolla meille riittää ajatella yksitasoista ns. sivutaulua, jollaisen osaaminen on yleensä ollut tenttikysymyksenäkin. Eli ikään kuin ajateltaisiin vain AMD64:n viimeistä taulukkotasoa, jonka nimi oikeassa manuaalissakin on "Page table". Idean tasolla riittää myös ajatella paljon lyhyempiä muistiosoitteita kuin esim. AMD64:ssä oikeasti on. Joka tapauksessa muistiosoitteen bittijonon alku ilmoittaa, mille sivulle osoitus kohdistuu, ja loppuosa, esim. 12 bittiä ilmoittaa tarkan osoitteen kyseisen sivun sisällä. Fyysinen muisti on jaettu sivukehyksiin. Sivutaulujen (ja tarvittaessa monitasoisten hakutaulukostojen) luonti on käyttöjärjestelmän muistinhallintaosion vastuulla. Se tekee sen prosessorin ja MMU:n manuaalin määrittelemillä keinoilla. Toki itse taulut ja "kartastot" ovat määrämuotoista dataa, joka sijaitsee tietokoneen muistissa (käyttöjärjestelmän hallitsemalla alueella), missä kaikki muukin. Esim. "AMD64 System Programmer's Reference" kertoo kaiken siitä, miten näitä tauluja käytetään. * Vuoden 2015 toteumaa: ** Luento 17: Tarvittavat paikkaukset. Yhteenveto. Kertaus ja tärpit Agendalla olisi: *** Tomin terveisiä demoista: - demot 1, 2 ja 3 mennyt hyvin ja ohjeaikataulussa: + demosta 1 läpi 137, hylkykertoja 26, syy yleensä "oudot rivinvaihdot", jollaisia ei suoraviivaisesti ohjeiden mukaan toimimalla oikein pysty tulemaan.. + demosta 2 läpi 117, hylkykertoja 17, syy yleensä jokin puuttuva tai erilainen tuloste kuin pyydettiin + demosta 3 läpi 108, hylkykertoja 4 (syy ympäristömuuttujan puuttuminen) + demosta 4 läpi 70, hylkykertoja 26 (yleensä useita ongelmia; pienillä on mennyt läpi, mutta vähintään merkin poistamisen) * ei-kääntyviä ohjelmia tänä vuonna vain 2. * varottava "1:llä ohi" virheitä. * yksinkertaisuus on hyve. * kynä ja paperi! + demosta 5 läpi 38, hylkykertoja 41 (pienillä mennyt läpi, ts. noin 2-3 ongelmakohtaa läpi, useampi -> ei vielä läpi) * selkeitä ongelmia ymmärryksessä on, jos esim. kuvittelee paikallisten muuttujien sijaitsevan koodialueella tai toisin päin. * suurin muistiosoite, joka on taulukolla käytössä? * bitit ja tavut sekaisin? "tavu==8 bittiä" Montako tavua varattu tilaa 6:lle 8-tavuiselle int:lle? Ei varmaan 6*8*8 tavua! * kummallisiakin lukuja, joille Tomi ei keksinyt selitystä.. * muistin olemuksesta ei vielä ole selkeää, yksinkertaista mielikuvamallia. * Missä muuttujan "samoja" arvo oli aluksi? + demosta 6 läpi 39, hylkyjä 6 (hyväksymisperusteena, että ohjelma vähintäänkin toimii niinkuin tehtävänannossa on - Hyvin harva on käyttänyt hyödykseen Tomin varattavia ohjauksia. Toivottavasti sessioista on kuitenkin ollut hyötyä. *** Käsittelemättä jäivät edistyneempi vuoronnus ja skriptaus Vuoronnuksesta ja vuoronnusmenettelyistä lyhyesti: - yksinkertaisimmillaan FCFS (first come first serve), "eräajo" - moniajossa yksinkertaisimmillaan Round-robin - prioriteetit, esim. prioriteettikohtaiset kiertojonot; monimutkaistaa vuorojen jakamista - tarvitaan monipuolisempi vuoronnusalgoritmi; vaarana mm. nälkiintyminen (matala prioriteetti ei ehdi saada juuri lainkaan aikaa) - dynaamiset prioriteetit - reaaliaikajärjestelmät ja -vaatimukset, prioriteetit ja pre-emptiivisyys, watchdogit - kompromissit esim. vasteaika vs. throughput - mikroydinmallissa käyttöjärjestelmän omien säikeiden vuoronnus ja prioriteetit vaikuttavat kokonaisuuden toimintaan Eräs IPC:henkin liittyvä yksityiskohta: - Käyttöjärjestelmän suorituksesta ja moduulijaosta; kernel mode vs. user mode. - Käyttöjärjestelmän ajonaikaisesta rakenteesta: monoliittinen vs. microkernel + vuoronnus, kutsurajapinta ja IPC-menettelyt tarvitaan käyttöjärjestelmätilassa, mutta muut palvelut voivat tapahtua joko käyttöjärjestelmätilassa tai käyttäjätilassa; palveluprosessit voivat kommunikoida ja synkronoida toimintonsa IPC-menettelyjen kautta. + Käytännössä yleensä hybridi, jolla haetaan kompromissia (mm. modulaarisuus, turvallisuus ja toimintavarmuus vastaan suorituskyky). - Uusinta tutkimusta aiemmista aihepiireistä? Katsotaan vähän vaikka WoKista ja ACM digital librarysta hakusanoilla "deadlock", "process synchronization", "microkernel" (tai muita tähän mennessä nähtyjä avainsanoja). - Yksi esimerkki microkerneliksi suunnitellusta ytimestä on "Plan 9 from Bell Labs": http://plan9.bell-labs.com/plan9/ Johdattelua skriptaukseen: - katsotaan läpi muutama etäkäyttökoneelta ja/tai netistä löytyvä skripti erilaisiin tarkoituksiin, esim.: + ohjelman käynnistäminen tietyssä ympäristössä tai tietyin lisäargumentein, esim. yliopiston palvelimilla komento "c99" on skripti, joka tekee esivalmisteluja ja käynnistää varsinaisesti gcc -kääntäjän. + järjestelmäpalveluiden käynnistys/pysäytys, kokonaisjärjestelmän ylösajon operaatiot; esim. yliopiston palvelimilla skripti /etc/rc.sysinit tapahtuu käynnistyksessä; mm. yhdistää hakemistopuuhun tiedostojärjestelmiä, aloittaa heittovaihdon ym. + monisteessa luetellaan useita muita shell-sovelluksia - shellin perusrakenteita (demotehtävän 6 tasolla); esimerkkinä c99:n käynnistysskripti, jossa on muuttujia, for-silmukka, case-ehdot, tulosteen ohjaus virhetulosteeksi. *** Mitä siis ehdittiin tänä vuonna Yleiskuva luentomonisteeseen - luvut 1-12, 14 ja 15. Koodiliitekin on.. *** Sitten kertaus ja tärpit! Tentin kysymystyypit ja yleinen rakenne julkaistiin noin 5 vuorokautta ennen tätä luentoa. Yleiskuvaa: - kysymyksiä on muutamaa eri tyyppiä: väittämiä, termien yhdistämistä niitä kuvaileviin määritelmiin tai ominaispiirteisiin. Esimerkkiskenaarioihin tai mallikoodeihin perustuvia väittämiä ja "mikä on lopputulema" -tyyppisiä. Vastauksena joka kohdassa on kirjain, järjestetty jono kirjaimia tai lukuarvo. Kysymyksissä pitää olla tarkkana, koska jokainen sana vaikuttaa luonnollisessa kielessä ja jokainen merkki vaikuttaa ohjelmointikielen syntaksissa! Alkuperäisessä, muotoilemattomassa mallitentissä on kysymysten lisäksi mallivastaukset sekä pohdintaa. - alkupuolella erillisiä osaamistavoitteita on useampia, joten aihepiirit saattavat vaihdella enemmän tenttikerrasta toiseen. - on myös "kestotärppejä" eli aihepiirejä, joista tullaan kysymään joka tentissä (joskin eri kysymyksiä ja mahdollisesti tahallaan eri tavoin toimivan esimerkin kanssa, joten mallivastausten opettelu ulkoa ei auta, vaan koodien ja algoritmien toiminta pitää ymmärtää): + erityisesti shell-komentojonot, minish-toteutus, assembler-ohjelma, pino ja aktivaatio debuggerissa, sivutaulut ja osoitteenmuunnos. - Tehtävissä tarkoituksella "harhautuksia", joten vastaaminen edellyttää ymmärtämistä ja annetun esimerkin tarkkaa läpilukua. Ei muuta kuin onnea (...eipäs kun osaamista) -- tenttiin! Keskustelua, jos aikaa on!! ** Palauteluento ekan tentin jälkeen 2015 (vapaaehtoinen/täydentävä) Koska salia ei ole, tämä tullee nyt vaan meilitse, kunhan ensimmäisen tentin arvostelu on tehty. *** Agenda: - Arvio vastauspapereihin kirjatuista ja jälkikäteen ilmoitetuista kommenteista kysymyksiin liittyen. Alustavat kommenttini niistä, ennen kuin ehdin meditoida asian ympärillä enemmän. - "Vapaa sana" -vastaukset (anonymisoituina) ja omat kommenttini niistä. - Yleistä palautetta demojen tarkastuksessa havaittujen ilmiöiden pohjalta (pääasiassa tulevia opintoja ja alalla toimimista silmälläpitäen) - Kysymyksiä, kommentteja, keskustelua. *** Sähköpostilistalla esittämäni toimintasuunnitelma: Kysymysmuoto oli uusi, ja silloin on "bugien" riski suuri. Saa nähdä, miten tässä käy.. että onko sitä hommaa nyt enemmän vai vähemmän kuin avoimissa kysymyksissä, ja saadaanko järkevän näköistä arvosanajakaumaa. Mikäli arvosteluperusteita täytyy justeerata, tehdään muutokset tietenkin opiskelijan eduksi, jos niitä päädytään tekemään. Ei ollut vielä lupaus, ennen kuin vastausten kokonaisuus ja koko populaation arvosanajakauma on selvillä. 113 perinteisen "esseetentin" tarkastaminen kestäisi itselläni useita työpäiviä, missä ajassa luultavasti ehdin suorastaan tekemään automaattisen tarkistimen, johon [tämänkertaisen tenttimuodon] vastaukset voi syöttää. Optista lukijaa ei (vielä tässä vastausmuodossa) pysty käyttämään, mutta pikaisen testin perusteella yhden vastauspaperin manuaalinen syöttäminen kestää 30 sekuntia, mikä on kokonaisuuden kannalta olematon aika. Sieltä saapi sitten nähtyä myös kysymysten osalta, onko jokin ollut selvästi vaikeampi / mahdottomampi kuin jokin toinen. *** Arvio tavoista, joilla arvostelua korjataan tarvittaessa: - Kysymyksen poistaminen arvostelusta kaikkien osalta ei tarkemmin ajatellen ole oikeudenmukaista. Monitulkintaisuus on varmasti hienovaraisissa nyansseissa, joita ei ole tullut ajatelleeksi kysymyksen tekijä, eikä luultavasti suurin osa vastaajistakaan. Olisi paha, jos suurimmalta osalta kumoutuisivat pisteet tapauksessa, jossa monitulkintaisuuden havaitseminen vaatii syvällisempää eforttia. Miten sitten voisi toimia? Tämän hetkinen suunnitelmani: + Moniselitteiseen kysymykseen hyväksytään kaikki oikeiksi tulkittavat vastaukset, +0.5 pistettä + Muissa kuin väittämäkysymyksissä ei kuitenkaan hyväksytä vastauksia, jotka ovat tulkinnasta riippumatta vääriä (niistä edelleen miinuspisteitä) + Tyhjä kohta, jossa on mainittu moniselitteisyydestä, tulkitaan oikeaksi vastaukseksi, koska löytyy ymmärrystä osoittaa monitulkinnallisuus. Tästä +0.5 pistettä. + Tyhjä kohta, jossa ei ole mainittu moniselitteisyydestä, tulkitaan edelleen ohitetuksi. Edelleen 0.0p. Uskoisin, että näin (1) ei rokoteta ketään turhaan, (2) ei vähennetä pisteitä tyypeiltä, jotka ovat luottaneet kysymykseen omana supertärppinään (3) ei myöskään palkita "tuulituloksella" niitä, jotka eivät ole osanneet vastata suuntaan saati toiseen. Toimintamalliehdotusta saa kommentoida. Lopullinen arvostelu tapahtuu automaattisesti; tieto perustelun olemassaolosta kirjataan arvosteluskriptiin. (sanoinko skripti? juu, samalla python-skriptillä tullaan arvostelemaan, millä kysymykset on generoitu kysymyspankista... pittää vaan liittää tietorakenteisiin vielä lippuattribuutti, oliko kysymys havaittu huonoksi.. kysymys.isBadQuestionOMG()) *** Tentin osallistujien esitykset monitulkintaisiksi kysymyksiksi: Mahdollisesti tai todennäköisesti arvosteluun vaikuttavia huomioita: - Tehtävä 1: Tapahtui reaalimaailman "off-by-one" -virhe.. [luennolla sanoin muuten "one-off", joka on tietysti väärä sana tähän tarkoitukseen. Off-by-one on oikea termi...] olin heti niin tyytyväinen ensimmäiseen kysymykseen, että sitä en juurikaan ajatellut enää uudempaan kertaan, vaan tarkka läpikäynti lähti kysymyksestä 2, koska "se ensimmäinenhän on jo varmasti OK, kyllä mä sen tiedän". No ei se ihan ollut. Opiskelijoiden havaintoja: + "moniselitteinen, koska ei voida tietää puhutaanko koko lähdekoodista vai tarkoitetaanko vain sitä, että prosessin omat säikeet toimivat prosessin koodin sisällä, sillä ne eivät välttämättä käytä koko koodia" + "A, jos siis tarkoitetaan sitä koodia ohjelmoijan kirjoittamana tekstipötkönä, ei sitä, ettäkö säikeet suorittaisivat aina samaa kohtaa koodista. Tässä mahdollinen monitulkinnallisuus?" + "Valtavan epämääräinen sana 'koodi'" Mielessäni tarkoitin koko ajan "prosessin koodialue on sen säikeille yhteinen", enkä tulkinnut tehtävänantoon päätynyttä tekstiä siten kuin se oli ("prosessin koodi on sen kaikille säikeille yhteinen"). Siis tuo "koodi" voi olla paljon kaikkea: lähdekoodi (hyvin todennäköisesti eri lähdekoodi jokaisella säikeellä), käännetty binäärikoodi (jossa todennäköisesti eri osio jokaisella säikeellä), prosessin virhekoodi, salauskoodi.. - Tehtävä 7: Kysymyksenasettelu meni pieleen, joten arvostelu vaatii tältä osin jonkin oikeudenmukaisen korjauksen. Havaintojen yleiskuva: + Esimerkissä menin ja sanoin että skenaariossa on 10 intensiivisesti laskevaa sovellusta. Nämähän pyörähtää 50Hz kellolla läpi 5 kertaa sekunnissa jokainen. Väliin mahtuu myös satunnainen muu prosessi viimeistään 0.2 sekunnin sisällä, vaikka se tulisi kiertojonon perältä. Ei tämä nyt ihan megaluokan viive olisi ihmisen näkökulmasta. Eri asia olisi reaaliaikajärjestelmä, jossa on pakko kelata jonoa nopeammin. Mutta tällaista ei nyt ollut spesifioitu tehtävän esimerkkiskenaariossa. + lisäksi sanamuoto voisi olla "painottaa vähän" tai "vähän laskentaa vaativia". Luonnollinen kieli on ikävästi moniselitteistä; onneksi on ohjelmointikielet syntakseineen :) Alustava suunnitelma siis, että A, B ja "perusteltu tyhjä" hyväksytään kaikki oikeina vastauksina (+0.5p). Tyhjä ilman perustelua normaali 0.0p - tehtävät 21--22: Tässä on muutaman opiskelijan kanssa keskustelu / väittely kesken, että oliko kyseessä oikeasti osaamistavoitteita mittaava kysymys vai "liian paha kompa" tiedostopäätteestä .tex tai sen puuttumisesta johtuen. Jonkinlainen ratkaisu tästä tulee, mutta toistaiseksi auki. Mahdollisesti on höllennettävä väärän vastauksen miinuspisteitä tämän osalta. Mutta tyhjäksi tätä ei varmasti ole jättänyt kukaan, jolla oikea osaaminen löytyy. Huolimattomuus on sitten asia erikseen, ja pittää pohtia, kuinka paljon sitä sitten saisi sallia. - Tehtävä 28: Tapahtui perinteinen "viime hetken tarkennus", joka ei ollut loppuun asti harkittu. Note to self: älä tee viime hetken tarkennuksia. Tarkkaavaisen opiskelijan havainto: + "Mahdollinen monitulkinta: ohjelmakoodissa sem.arvo on kurssin mallin mukaan kokonaisluku (joka siis voi olla etumerkillinen kuten koodissa on 'if (sem.arvo <= 0))', mutta todellisuudessa ei arvo koskaan laske pakkasen puolelle. Ei voi olla vaikkapa '-2' vapaata tai täyttä paikkaa. Näin se on. Toteutus voisi antaa semaforin arvon mennä pakkasen puolelle, jolloin sen itseisarvo tarkoittaisi jonottavien prosessien määrää.. Tämä ajatus nyt ei ollut itsellä mielessä, kun "tarkensin" tehtävänantoa viime hetkellä. Uusinnoissa tämä väite tulee muotoon, jossa etumerkistä ei puhuta. Tällä kertaa tässäkin hyväksyttävä A ja B sekä kommentoitu tyhjä. - Tehtävä 29: Edellisen kohdan vuoksi mahdollisesti myös moniselitteinen. Tutkitaan ennen kuin hutkitaan. - Tehtävä 45: En vielä tiedä toimintamallia, ennen kuin nähdään kaikki vastaukset. Opiskelijan havainto: + "B, koska käyttäjä voi itse määrittää tiedoston nimen" Nythän on niin, että voi määrittää.. mutta tiedostoon voi määrittää useita nimiä ns. kovina linkkeinä. Asia on mielestäni kyllä kirjoitettu auki aika hyvin monisteen nykyiseen versioon. Samoin se, että nimi ei ole osa tiedoston sisältöä eikä myöskään i-solmun sisältöä. Itse asiassa monisteen lopullisessa versiossa on suorastaan kursiivilla (harvoissa ja valituissa paikoissa käytetty tehokeino!) seuraava täsmällinen ilmaisu: "tiedoston nimi määräytyy hakemistotiedostoon kirjatun merkkijonon perusteella!" Voi olla, että evidenssi ei tule riittämään tämän tehtävän arvostelun muuttamiseen. Havaintoja, jotka eivät välttämättä aiheuta toimenpiteitä: - Lukuisia yksittäisiä havaintoja; erityisesti sellaisten ääritapausten pohdintaa, joihin asti johdantokurssilla ei päästä. Olin jo aikeissa ennen tenttiä meilata, että "elvistely on sallittua, jos sille on oikea osaamispohja olemassa". Tulen käymään näiden muutamien "Agoran elvisten" tiuhaan kommentoidut vastauspaperit läpi erikseen, ja jos kommentit ovat tarkoin analysoituna valideja niin antaa mennä vain... Vastauspaperien yleiskuva (ilman tarkempaa tarkastelua) voisi viitata siihen, että nämä ovat osaamisensa aiemmin hankkineita, joiden arvosanat painottuvat yläpäähän joka tapauksessa. Tämä sinänsä miellyttävä "gurujen" kanssa operointi ei vaikuta johdantokurssin tietojen pohjalta tehtyihin vastauksiin. *** "Vapaaehtoinen vapaa sana" -kysymyksen vastaukset: - "Varsin selkeä kurssi. Osaamistavoitteet selkeytti ja mallitentti helpotti varsinaiseen tenttiin lukua, kun näki vähän sokeita pisteitään. Lisäksi se, että näki kysymystyypit ennakolta helpotti ja nopeutti tenttiä. Ihana tavoite: opiskelija *uskaltaa* ja osaa käyttää selliä. Siinä on pieni kynnys, kyllä." Kiitos positiivisesta palautteesta. Voin kertoa, että mietin tavoitteita tarkoin, ja tuo "uskaltaa" on olennainen osa, vaikka mielestäni tärkeintä kyseisessä tavoitteessa onkin "aiheuttamatta vaaraa omille tiedoille tai häiriötä muille käyttäjille tai järjestelmälle" :) - "Harmi kun kaikki mielenkiintoinen ja tärkeä tiivistyi n. 5 viimeiseen luentoon. Pehmojohdanto oli parasta viihdettä vähään aikaan. Luennot aina yhtäaikaa eikä jaksanut käydä siksi paikalla. Kiva kun demoilla ei kovaa kiirettä." Kiitos rakentavasta palautteesta, jossa oli positiivisiakin osioita :). Itse olen sitä mieltä, että alusta lähtien kaikki oli tärkeää. Mielenkiintoisuus on subjektiivista. Omasta mielestäni alkupuolen asia on huikean mielenkiintoista, mutta kuten monisteen johdannossakin totean, henkilökohtaiset mielenkiinnon kohteet vaihtelevat varmasti. Tarkoitus oli, että alkupuolella tulisi tekninen pohja ymmärtää ilman suurempaa käsienheiluttelua loppupuolen asiat, joissa ns. "korjataan hedelmät" (termi, jota joku matematiikan luennoitsija aikoinaan käytti siitä, kun alkupuolen teoreettisilla tuloksilla aletaan viimeisillä luennoilla tehdä jotakin hyödyllistä :)) Pehmojohdanto ilmaantui viimevuotisen yksittäisen palautteen perusteella, ja sen on tosiaan tarkoitus olla viihteellinen. Tulevaisuudessa siirrän sen ehkä kuitenkin liitteeksi, jolloin pääteksti menisi ensimmäisillä sivuilla suoraan tekniseen asiaan. - "Vaikeata on, kun tulee miinuspisteitä. Kurssin alussa olleet demot olivat liian helppoja, niin kuljin vähän löysin rantein. Pistä seuraavalla kerralla assembler-jutut heti ja skriptit lopuksi, niin lähtee oikeammalle raiteelle. Kurssin asiasisältö on kokonaisuutena OK ja materiaali oli hyvää. Sellaista toivoisin, että jos keräsin nyt vahingossa liikaa miinuksia, enkä pääsekään läpi, niin voisitkohan tiedottaa epäonnistumisesta heti? Muuten en ennätä valmistautua uusintaankaan. Mukavaa oli, että tenttitilaisuudessa on kunnolla aikaa." Kiitos jäsennellystä palautteesta, hyvistä huomioista ja kohteliaista lisäyksistä :). Miinuspisteiden osalta on ehkä katsottava kaikkien 113 tenttijän tulokset ja tehtäväkohtaiset pisteet, ja mietittävä, onko se -0.5 pistettä liikaa arvaamisen kitkemiseksi. Väittämätehtävissä odotusarvo arvaamalla olisi 0, ja nyt kun on myös "yhdistä lauseita" ym., joissa oikean vastauksen arvaustodennäköisyys on mallia 25%, niin arvaamisen odotusarvo oikeastaan on negatiivinen. Voi olla, että pienemmälläkin miinustuksella saataisiin minimaaliseksi riski päästä arvaamalla läpi. Maito on tietysti jo maassa siinä mielessä, että arvosteluperuste (-0.5 väärästä) oli tiedossa tenttiä tehtäessä, joten jokainen tenttijä on tehnyt oman riskiarvionsa sen tiedon varassa. Tällä perusteella tätä ei ehkä uskalla jälkikäteen enää muuttaa tämän kurssikerran osalta. Katsotaan ja analysoidaan tulokset, ja tehdään sitten toimenpiteitä. Erityisesti katsotaan, että arvosanajakauma käy järkeen. 113 hengen populaatio on uskoakseni riittävän suuri arvioiden tekemiseen ja vertaamiseen aiempiin kurssikertoihin, vaikka kysymykset nyt erityyppisiä olivatkin. - "GNU/Linux; kernel ja käyttis ovat eri asia, kernel ei yritä toteuttaa POSIXia" Hyvä täsmennys. Asiahan on selvä, mutta on saattanut jäädä sanomatta juuri noilla sanoin. Kirjataan se jatkossa materiaaliin noilla sanoin. Uskon kuitenkin, että tällä kurssikerralla saatiin riittävän useaan otteeseen käsiteltyä kirjastojen kerroksia ja ytimen kutsurajapintaa, joten kokonaisuuden jälkeen pitäisi olla kyllä selvää, mihin kirjasto loppuu ja ydin alkaa, ja mihin kerrokseen POSIXin toteuttaminen sijoittuu. HUOM: Jos muistat laittaneesi tenttipaperiin jotakin, mitä tähän ei ollut kaivettu, niin ilmoita!! Koska olen mielestäni ottanut kaikki papereissa olleet kommentit tähän. [Seuraavat löytyivät tarkemmassa läpikäynnissä luennon jälkeen]: - "Tulin tähän tenttiin koska olin unohtanut poistaa ilmoittautumiseni ajoissa. Tarkoitus oli tulla tekemään koe vasta 12.6., eli tähän tilaisuuteen ei oltu valmistuttu. Ompas käsiala huonontunut kun tässä opinahjossa on vuoden viettänyt." Propsit siitä, että tulit paikalle tenttitilaisuuteen, johon olit ilmoittautunut! Onnea ja osaamista seuraavaan yritykseen 12.6. Käsiala kannattaa pitää kunnossa. Pidemmän päälle joutuu melko todennäköisesti draftailemaan suunnittelukaavioita, mindmappeja ynnä muuta, joista kavereiden täytyy saada selvää. Alussa ei vielä ehditä tuohon opinahjossa, kun on niin paljon koodattavaa :). - "Tentti oli hyvä." Noh.. kiva että ainakin joku tykkäsi :) Katsotaan onko tilanne sama vielä arvostelun jälkeen... - "Unohdin lukea tenttiin :)" - "Täytyy vielä vähän treenata..." - "Valitettavasti tälle kurssille ei jäänyt aikaa, mutta opiskelen varmaan kesällä ja tentin heinäkuussa :) Uusinnassapa sitten! - "Hyvä kurssi. Haastava verrattuna moneen ja taitaa uusintaan tentti mennä. You are not prepared!" Kiitos positiivisesta palautteesta. Haastaviahan kaikkien kurssien pitäisi olla, eihän niissä muuten oppisi uutta :). Next time you'll be prepared! - "Tuuletetaan! (toivottavasti tarkastuksen jälkeenkin on syytä siihen) Tutkitaan ennen kuin hutkitaan. Kyseisen palautteen antaja voi kylläkin tuulettaa vähintään selkeää läpipääsyä vastausrivinsä yleiskuvan perusteella. Mallia monta oikein, eikä yritelty arvailla liikaa. - "Ei voi mennä läpi. :)" Hyvä, jos tilanne kuitenkin hymyilyttää hymiön verran :). Uusinnassa sitten! - "Monivalinta on yllättävän hyvä tenttimuoto; vääristä vastauksista tosin rokotetaan ehkä turhan ankarasti, vaikka virhe ajattelussa voi olla pieni. Kiitokset hyvästä kurssista!" Kiitos positiivisesta palautteesta sekä perustellusta kritiikistä! Kyllähän se näin jälkiviisaasti ajatellen on rankka rokotus tuo -0.5 pistettä. Nyt kun sitä ei etukäteen osattu arvata, niin tämän kanssa on elettävä vielä kesän kaksi uusintaa (ks. perustelut yllä). Populaation tasolla skaalataan kokonaispisteytystä kaikkien osalta tarvittaessa, jos tarvetta ilmenee. - "Mukava kurssi, paljon asioita jotka on hyvä tietää. Tavallaan hyötyy ja tavallaan kärsii demojen vapaammasta aikataulusta (soveltuu kyllä hyvin kiireisemmän opiskelijan aikatauluun). Kiitos positiivisesta palautteesta ja rehellisestä mielipiteestä aikataulutuksesta. Deadlinet ovat pohdituttaneet paljon vuosien varrella, ja jokaisessa ratkaisussa on hyviä ja huonoja puolia. - "Muistutti niin paljon mallitenttiä, että tuntui helpolta. Kohta 28 meni arvailuksi, muut kuvittelen tietäväni." Näin oli tarkoitukseni, että malliin tutustutaan ja sitten tuntuisi helpolta. Mutta toivottavasti olit myös tarkkana, koska tehtäviä oli muutettu malliin nähden! Automaatti sen aikanaan kertoo. Tehtävää 28 ei olisi kylläkään välttämättä kannattanut arvata :) Katsotaan nyt, miten kyseisen tehtävän arvostelun kanssa käy ylipäätään (ks. palauteluennolla läpikäydyt huomiot ylempänä). - "Kurssi oli loistava, mutta Ohjelmointi 2 ja vaihtoon hakeminen söivät voimavaroja suoritukselta. Tehtävät olivat paras osa. Erityisen selkeä opastus ja harjoitteet vähensivät pelkoa uudelta unixkäyttäjältä" Kiitos positiivisesta palautteesta. Olen tehnyt paljon töitä mm. mainitsemiasi piirteitä kohti eli selkeää opastusta ja pelkokertoimien pienentämistä uusien teknisten asioiden lähestymistä kohtaan. Toivottavasti vaihtokohde löytyy! Vaihtoon lähteminen on erittäin suositeltavaa. Muista sopia vaihdossa tehtävistä kursseista *etukäteen* oman opintoneuvojan kanssa :) - "Pitäisi katsoa luentotallenteet ainakin kaksi kertaa lisää ennen kuin tuntisi osaavansa." Niitä voi onneksi kotona kelailla tylsien osien yli ja katsoa tuplanopeudella tai hidastettuna tarpeen mukaan :) *** Yleistä palautetta demoista Nämä löytyvät demosivustolta (ei varsinaisa spoilereita niille, joilla demot on vielä kesken): http://itka203.it.jyu.fi/pages/geneerinen_palaute_opiskelijoille_2015.rst Käydään läpi luennolla, jos ehditään.