Commit 7e7e60643bba361b6cef64ab099f5b5280a34e38

  • avatar
  • nieminen (Committer)
  • Wed May 03 16:00:49 EEST 2017
  • avatar
  • nieminen (Author)
  • Wed May 03 16:00:49 EEST 2017
  • Tree SHA1: d5718be
  • Parent SHA1: 12181fb (Merge branch 'master' of yousource.it.jyu.fi:itka203-kurssimateriaalikehitys/itka203-kurssimateriaali-avoin)
  • raw diff | raw patch
Luennon 12 suunnitelmaa tälle vuodelle.
luentosuunnitelma_2017.txt
(55 / 242)
  
652652 päällä Linuxissa on sovittu käytettäväksi kyseiselle
653653 prosessorille adaptoitua "SysV ABIa".
654654
655
655656** Luento 8: Osoitteen tulkinta, MMU, käyttöjärjestelmäkutsu, käyttäjätila, käyttöjärjestelmätila
656657
657658Edellinen loppuun:
952952 kullakin hetkellä kertyneet aliohjelma-aktivaatiot.
953953
954954
955* Kevään 2017 kurssi-instanssilla seuraavaksi:
955** Luento 11: Ohjelman jälki, kutsupino konekielessä, ABI
956956
957** Luento 11: Ohjelman jälki, kutsupino konekielessä, ABI, Historiakatsaus.
958
959957Täydennystä edellisiin aiheisiin:
960958
961959- Näkökulmia viime luennon keskusteluhuomioihin:
10721072 (mm. siviililentokoneiden ohjaus, tietyt lääketieteelliset
10731073 instrumentit).
10741074
1075About tässä kohtaa vappu.
1075About tässä kohtaa tapahtui vappu (ja söi yhden maanantailuentoajan).
10761076
10771077
1078* Kevään 2017 kurssi-instanssilla seuraavaksi:
10781079
1080** Luento 12: Historiakatsaus, prosessi, säie
1081
1082Millainen sää luentosalin ja Agoran ulkopuolella vallitsee tällä
1083hetkellä? Komennetaanpa shellissä:
1084
1085curl wttr.in/Jyvaskyla
1086
1087Mitäs? Joku on tehnyt hauskan palvelun, josta opiskelija vinkkasi
1088irkissä vuonna 2016. cURL on POSIXin määrittämä apuohjelma, joka
1089noutaa Internetin yli URLin mukaisen vastauksen palvelimelta ja ohjaa
1090sen standardiulostuloon... "man curl" kertoo lisää. Tämä on
1091standardimpi tapa yksittäisiin WWW-palvelinkyselyihin kuin
1092mm. demo-ohjeissamme käytetty "GNU Wget". Kapeaan terminaali-ikkunaan
1093ei välttämättä mahdu koko tuloste, joten luentosalissa seuraava voi
1094olla parempi komento:
1095
1096curl wttr.in/Jyvaskyla 2>/dev/null | head -7
1097
1098Tämä komento putkittaa curl'in tulosteen head'ille, jonka avulla voi
1099tulostaa vain argumenttina annetun määrän ensimmäisiä riviä. Nyt curl
1100voi joutua lopettamaan tulostuksensa kesken, kun head ei haluakaan
1101enää lisää syötettä. Curl toteaa tämän virheilmoituksena
1102standardivirhevirtaan, josta ei tässä komennossa olla kiinnostuneita,
1103joten virhetulosteet ohjataan operaattorilla '2>' kankkulan kaivoon
1104eli /dev/null'iin johon ohjatuilla tavuilla ei tehdä mitään.
1105
1106
1107Asiaan.
1108
1109
1110Demo 5:n juttuja:
1111
10791112- Aliohjelmakutsu siten kuin demo 5:ssä käsitellään.
10801113
10811114- Rekursio (Kokonaisluvun kertoma rekursiivisesti): saman aliohjelman
11221122 tekemistä.
11231123
11241124
1125
11261125Ja sitten:
11271126
11281127Katsaus tietokoneiden ja käyttöjärjestelmien symbioottiseen
11701170 time-sharing system" vuodelta 1974.
11711171
11721172
1173Sitten periaatteessa luentomonisteen järjestyksessä etteenpäin...
11731174
1174
1175* Luentojen toteuma 2016:
1176
1177
1178** Luento 12: IPC: signaalit, viestijono. Säikeet
11791175Prosessi, "säie", resurssit, haaroitus ja käynnistys
1180Vuoden 2016 luento 11 oli tällainen (TODO: 2017 suuntimat)
11811176
11821177
1183Sitten periaatteessa luentomonisteen järjestyksessä etteenpäin...
1184
11851178Prosessorin suoritussykli:
11861179
11871180- käskyn ja operandien nouto, suoritus, tulosten tallentaminen JA
11951195- prosessin käsite yhteenvetona aiemmasta: muistiin ladattu ja
11961196 käynnistetty, suorituksessa oleva 'kuva' ohjelmasta.
11971197
1198- Yllätys-POSIX-vartti: Miten POSIXin Base Definitions -osion
1199 termimäärittelyissä kuvaillaan termi "Process"? Vautsi... Pystytään
1200 jo ymmärtämään suurin osa tästä kuvailusta tähän asti käsiteltyjen
1201 esitietojen kautta! Määrittelyssä tulee jo mukavasti esille "säie",
1202 mikä tarkoittaa yhtä ajan suhteen etenevää suorituskohtaa
1203 ohjelmassa. Prosessilla on POSIXinkin mukaan aina vähintään yksi
1204 "säie", joka alkaa ohjelman alusta ja päättyy ohjelman
1205 loppuessa. Säie muodostaa yhden konekielisen jäljen, eli peräkkäin
1206 suoritettujen käskyjen sarjan. Tässä päästään jo pakosti uumoilemaan
1207 seuraavaa asiaa, eli että prosessilla voi olla yhden sijasta
1208 useampia säikeitä.
1198Kertausta aiemmista havainnoista:
12091199
1210 Prosessilla on vanhempi, mahdollisesti myös lapsia ja sisaruksia -
1200- POSIXin Base Definitions -osion termimäärittely "Process"?
1201 Vautsi... Pystytään jo ymmärtämään suurin osa tästä kuvailusta!
1202 Määrittelyssä tulee jo mukavasti esille "säie", mikä tarkoittaa yhtä
1203 ajan suhteen etenevää suorituskohtaa ohjelmassa. Prosessilla on
1204 POSIXinkin mukaan aina vähintään yksi "säie", joka alkaa ohjelman
1205 alusta ja päättyy ohjelman loppuessa. Säie muodostaa yhden
1206 konekielisen jäljen, eli peräkkäin suoritettujen käskyjen
1207 sarjan. Tässä päästään jo pakosti uumoilemaan seuraavaa asiaa, eli
1208 että prosessilla voi olla yhden sijasta useampia säikeitä.
1209
1210- Prosessilla on vanhempi, mahdollisesti myös lapsia ja sisaruksia -
12111211 riippuen mikä prosessi on pyytänyt luomaan uusia. Sillä on
12121212 identiteetti (vähintään ID-numero) sekä käynnistävän käyttäjän ja
12131213 mahdollisesti ryhmän identiteetit (vähintään ID-numerot). Lisäksi
12831283parin unen näkemistä. Tätä voi harrastaa vaikkapa vapun ohessa, joka
12841284tapahtuu vuonna 2016 tässä välissä ennen seuraavaa luentoa.
12851285
1286Vuoden 2016 luento 12:
1286[2016 luento 12 sisälsi seuraavaa:]
12871287
1288
1289
1290Alussa paikkaus viime fiikon fork() ja exec() -kuvaan. Rauhallisempi
1291katsanto minish.c -esimerkkiin eli minimalistiseen shell-ohjelmaan.
1292
1293Millainen sää luentosalin ja Agoran ulkopuolella vallitsee tällä
1294hetkellä? Komennetaanpa shellissä:
1295
1296curl wttr.in/Jyvaskyla
1297
1298Mitäs? Joku on tehnyt hauskan palvelun, josta opiskelija vinkkasi
1299irkissä. cURL on POSIXin määrittämä apuohjelma, joka noutaa Internetin
1300yli URLin mukaisen vastauksen palvelimelta ja ohjaa sen
1301standardiulostuloon... "man curl" kertoo lisää. Tämä on standardimpi
1302tapa yksittäisiin WWW-palvelinkyselyihin kuin mm. demo-ohjeissamme
1303käytetty "GNU Wget". Kapeaan terminaali-ikkunaan ei välttämättä mahdu
1304koko tuloste, joten luentosalissa seuraava voi olla parempi komento:
1305
1306curl wttr.in/Jyvaskyla 2>/dev/null | head -7
1307
1308Tämä komento putkittaa curl'in tulosteen head'ille, jonka avulla voi
1309tulostaa vain argumenttina annetun määrän ensimmäisiä riviä. Nyt curl
1310voi joutua lopettamaan tulostuksensa kesken, kun head ei haluakaan
1311enää lisää syötettä. Curl toteaa tämän virheilmoituksena
1312standardivirhevirtaan, josta ei tässä komennossa olla kiinnostuneita,
1313joten virhetulosteet ohjataan operaattorilla '2>' kankkulan kaivoon
1314eli /dev/null'iin johon ohjatuilla tavuilla ei tehdä mitään.
1315
1316
1317
1318Asiaan.
1319
13201288Katsotaan vielä kertaalleen viimeviikkoista minish -shelliä, ja
13211289yliopitaan se, sekä siihen liittyvät fork() ja exec()
13221290-palvelut. Monisteen kuva fork() ja exec() -kutsuista on myös korjattu
13691369
13701370 koodi 2016/esimerkit/l12/ -hakemistossa: race.c
13711371
1372** Luento 13: Kilpa-ajo, lukot, deadlock, semafori
13731372
1374- Millainen sää ulkona? (aurinko paistaa ja lämmintä on)
1373** Luento 13: IPC: signaalit, viestijono, kilpa-ajo, lukot, deadlock
1374** Luento 14: Semafori. Tuottaja-kuluttaja. Muistinhallinta, virtuaalimuisti
13751375
1376 Teinpä itselleni näppärän alias-komennon viime viikon
1377 wttr.in-palvelun käyttöön. Aliakset ovat POSIXissa määritelty tapa
1378 tehdä itselle tosi lyhyitä komentokorvikkeita shellin
1379 interaktiivisen käytön tehostamiseksi.
1380
1381Tarkennetaanpa viime kerralla epäselviksi jääneet asiat:
1382
1383- Mitä reittiä näppäimistöllä generoidut signaalit (esim. Ctrl-C,
1384 Ctrl-Z, Ctrl-D, ...) menevät ohjelmille?
1385
1386 (Alempana on TLDR-versio.) Pidempi vastaus arvailtuna meidän
1387 käyttämän bashin manuaalin osiosta "JOB CONTROL" lisättynä pienellä
1388 nettiseikkailulla... Jos itse ymmärsin oikein (korjatkaa, jos olen
1389 jonkun mielestä pahasti väärässä), niin homma kiteytyy näin: (1)
1390 painallushan tapahtuu asiakaskoneella, jonka pääteohjelma ensinnäkin
1391 lähettää, mitä haluaa. Yleensä jonkun muinoisen standardin mukaisina
1392 tiettyinä ohjausmerkkeinä, jotka nyt on vaan numeroiksi koodattuja
1393 kuten muutkin näppäinpainallukset (2) ssh-palvelin ohjaa
1394 näppäinpainallukset shellille, jonka se on käynnistänyt ja jolle se
1395 kommunikoi (3) jos siinä välissä on "screen"-apuohjelma, niin se
1396 nappaa painallukset ja oletusarvoisesti "syö" Ctrl-A:n omaksi
1397 ohjausnapikseen. Muut painallukset ohjautuvat sen screen-ikkunan
1398 shellille, joka käyttäjällä on valittuna. Screen on aikoinaan
1399 käynnistänyt tuon shellin, ja osaapi sille ohjata syötteensä (4)
1400 screenissä aktiivinen shell tutkii näppäinkoodin, ja joidenkin
1401 osalta se generoi signaaleja, jotka se lähettää
1402 ns. "foreground"-prosessille, eli sellaiselle, joka on shellissä
1403 "päällimmäisenä" suorituksessa tällä hetkellä.
1404
1405 Mainitusta "JOB CONTROL" -osiosta löytyy lisätietoa siitä, miten
1406 bashissä voi laittaa komentoja taustalle ("background"-prosessiksi),
1407 ja nostaa etualalle tarpeen mukaan. Muihin prosesseihin ei ole
1408 vaikutusta. Jos ei shellissä ole mitään prosessia etualalla, se
1409 tulkitsee näppäinpainalluksen itselleen. Bash itse ei esimerkiksi
1410 reagoi Ctrl-C:hen eikä Ctrl-Z:aan. Tyhjän rivin alussa se tulkitsee
1411 Ctrl-D:n kirjaimellisesti muinoisen numerokoodauksen mukaan
1412 ohjausmerkiksi "HUP - hangup" ja toteaa, ettei käyttäjä halua enää
1413 jutella. Rivin keskellä Ctrl-D tulkitaan GNU:n getline()-funktion
1414 mukaisesti editointikomennoksi, jolla poistetaan kursorin alla oleva
1415 merkki.
1416
1417 TLDR-kiteytys: Painat Ctrl-C, niin shellissä "meneillään oleva"
1418 ohjelma saa signaalin, jolla sitä pyydetään loppumaan. Ctrl-Z:lla
1419 sellaisen, jolla sitä pyydetään menemään toistaiseksi jäähylle.
1420
1421- Miksi dd ei toiminut, vaan oli "huono esimerkki"?
1422
1423 Jotain oli mennyt pahasti kuralle siinä shellissä, josta ajoin
1424 dd:tä. Miksi? Halusin käyttää ajan luentomonisteen ja esimerkkien
1425 parissa, joten jätin selvittämättä. Todennäköisesti olin painanut
1426 jotakin tosi väärää näppäintä epähuomiossa, tai sitten jokin
1427 esimerkkikoodi laittoi systeemejä sekaisin vanhempiprosessia
1428 myöten. Esim. minish ei välttämättä ole maailman parhaiten
1429 käyttäytyvä, vaikka se perusvaatimuksensa täyttääkin.
1430
1431 Ongelma poistui, kun suljin kyseisen shellin ja käynnistin
1432 screenistä uuden.
1433
1434 Esimerkki on siis edelleen yhtä hyvä kuin ennenkin, joten katsotaan
1435 se uudelleen ilman ihmettelyä.
1436
1437- Miksi järjestelmässä on "Zombie"-prosesseja, jotka eivät lähde pois
1438 edes komennolla "kill -9 1234"?
1439
1440 Tähän nyt tajusin vastauksen jo kun luentosalin ovi meni perässäni
1441 kiinni: Zombie on esim. Linuxin käyttämä nimi prosessin tilalle,
1442 joka monisteessame on geneerisesti "Exit". Prosessin suoritus on jo
1443 päättynyt, mutta se on mukana prosessitaulussa, kunnes sen
1444 vanhempiprosessi tarkistaa prosessin lopputilanteen. Ts. jos jossain
1445 on paljon "Zombieita", niin niiden vanhempiprosessi käyttäytyy
1446 jotenkin huonosti, eikä ole tehnyt tarvittavaa wait() kutsua, tai
1447 sitten prosessi on siirretty jotenkin väkipakolla vanhemmalta
1448 toiselle, ennen kuin se on päättynyt. Vanhemman lopettamisen pitäisi
1449 tuhota automaattisesti kaikki lapset, vaikka ne olisivat olleet
1450 Zombieita. Vanhemmattomaksi joutunueet Zombiet lienee aika
1451 mahdotonta siivota ajamatta järjestelmää alas, ja ne implikoivat,
1452 että jokin softa toimii haaroittamisen suhteen väärin. [Vastauksen
1453 voi lukea Walking Dead -kontekstissa, vaikka ilmeisesti viime
1454 luennon kysymys koski Linuxia. Asiaan? Ei vielä..]
1455
1456- Miksi säie-esimerkin koodi toimi ensin hitaammin, ja seuraavilla
1457 yrityksillä nopeammin?
1458
1459 Kotimatkalla hokasin pari mahdollista/todennäköistä selitystä:
1460
1461 + Voi olla, että fiksu järjestelmä pitäisi prosessoreja hitaammassa
1462 "virransäästelytilassa", kunnes tehdään havainto, että näinä
1463 aikoina tarvitaan nopeampaa laskentaa.
1464
1465 + ylipäätään meidän jalava ja halava ovat virtuaalikoneita, joten
1466 siinä on vielä isomman koneen "load balancing" mukana pelissä:
1467 paukkuja laitetaan niille koneille, joissa havaitaan
1468 laskentatarvetta.
1469
1470 + fiksusti tehty adaptaatio molemmissa tapauksissa toimii hiukan
1471 jälkijunassa aiheuttavaan ilmiöön nähden, koska aivan lyhyisiin
1472 ilmiöihin ei kannatakaan reagoida.
1473
1474 + tarkempi vastaus ei selviäisi ihan hetkessä :), mutta tämä
1475 "alkuhidastelu" on meidän järjestelmässä ihan toistettavissa
1476 oleva havainto, kuten tänäänkin nähtiin.
1477
1478TODO: aiemman kysymyksen tarkennus: "Jos mulla olisi vanhan mallinen
1479rinnakkais-/sarjaportti, miten tekisin/asentaisin sille laiteajurin
1480Linuxiin"? -> I/O -luennolle yhdeksi aiheeksi Linuxin laiteajurin
1481tekeminen (tai ainakin jonkinlainen lähtökohta...)
1482
1483Sitten luentomonistetta eteenpäin. Luku 9 seuraavana edessä.
1484
1485Prosessien/säikeiden välistä kommunikointia (inter-process
1486communication, IPC):
1487
1488- IPC: signaalit; käytiin viimeksi tarkoin läpi
1489
1490- IPC: viestit; käytiin viimeksi päällisin puolin läpi POSIXin
1491 mukainen esimerkki
1492
1493- IPC: jaettu muisti; katsotaan luentomonisteen kuvan tasolla läpi
1494
1495- IPC:tä vähän lisää (käsitteiden ja käyttöjärjestelmäkutsujen nimien
1496 tasolla): viestit, putket, RPC, socketit, verkkoprotokollat.
1497
1498
1499Ja nyt.. jatketaan suoraan viime luennon cliffhangerista...
1500
1501Yhdenaikaisuuden ongelmia ja ratkaisuja:
1502
1503- esimerkki: "kilpa-ajotilanne" eli race condition, lukotustarve
1504
1505 koodi repossa: 2016/esimerkit/l13/race.c
1506
1507- mutex, mutual exclusion; poissulku.
1508
1509- esimerkki: mutexin tekeminen POSIXin säiemutexilla.
1510
1511 koodi repossa: 2016/esimerkit/l13/race_fixed_mutex.c
1512
1513- mitä tapahtuu kokonaissuoritusajalle lukituksen kanssa?
1514
1515 + jos lukituksia tarvitaan paljon, käytännössä kaikki aika menee
1516 lukkologiikkaan ja jonotuksiin, ei hyötylaskentaan.
1517
1518 + Saatiin yleisöstä myös muita hyviä tarkennuksia! (ks. video)
1519
1520Kun on lukkoja, niin on niihin liittyviä vaaroja:
1521
1522- lukituksesta aiheutuva synkronointiongelma: deadlock, triviaali
1523 esimerkki "lukkiutuva vappu" (nimiä vaille sama kuin luentomonisteen
1524 "ruokailevat nörtit")
1525
1526 koodi repossa: 2016/esimerkit/l13/vappu_deadlock.c
1527 koodi repossa: 2016/esimerkit/l13/vappu_ei_lukkiudu.c
1528
1529- "ruokailevat filosofit" on klassinen esimerkki, jossa on enemmän
1530 kuin kaksi prosessia ja resurssia. Rutkasti (ei-pakollista)
1531 lisätietoa löytyy Internetin ihmeellisestä maailmasta, esim. tämä
1532 lähteineen: http://en.wikipedia.org/wiki/Dining_philosophers_problem
1533 Wikejä pitkin löytyi myös mm. seuraava vapaa ja ilmainen oppikirja
1534 synkronointiaiheista: http://greenteapress.com/semaphores/
1535
1536- esimerkki: mutexin toteutus binäärisellä POSIX-semaforilla.
1537
1538 koodi repossa: 2016/esimerkit/l13/race_fixed_sem_mutex.c
1539
1540- semafori käsitteenä (+historia) ja tietorakenteena.
1541
1542 Esihistoriasta (1960-luku)
1543 esim. http://www.cs.utexas.edu/users/EWD/ewd00xx/EWD35.PDF
1544
1545 Nykypäivästä esim. WoK-haku sanalla "semaphore"
1546
1547 Reunahuomautus: "lukekaa sitä matikkaa" ;)
1548
1549- jaetun resurssin ja kriittisen alueen käsite;
1550
1551Helatorstain ja viikonlopun cliffhanger:
1552
1553- Perusesimerkki tuottajaprosessin ja kuluttajaprosessin tarpeesta:
1554 animaation tuottaminen ja pakkaaminen yhdenaikaisena "liukuhihnana".
1555
1556** Luento 14: Tuottaja-kuluttaja. Muistinhallinta, virtuaalimuisti
1557
15581376Viime viikon aihe loppuun:
15591377
15601378Esimerkki moniarvoisen semaforin käytöstä:
18131813
18141814
18151815 -------------- tähän asti on tultu keväällä 2016 --------------
1816
1817
1818* Luentojen toteuma 2016:
18161819
18171820
18181821* Mahdollisesti 2017 pois jätettyä: