Operativsystemer og grensesnitt
Ulike måter å bruke OS'et på Application Program Interface (API) Applikasjoner (ofte C-programmer) som f.eks. emacs, som bruker tjenestene i OS ved å kalle på funksjoner i API Service Provider Interface (SPI) Kode fra utsiden (drivere) implementerer tjenester i OSet for f.eks. ny hardware, iht. SPI Programmering i Java* Krever et ekstra lag med programkode mellom Javaprogrammet og OS: Kompilator, Java API og JVM Skall (shell) og GUI for kommandoer fra brukere * Eller tilsvarende høynivåspråk
API, systemtjenester og kjernen Systemtjenestene/systemkall er tjenester som OS-et kan utføre på kommando, f.eks. skrive til disk. Systemtjenester utføres i OS-et ved å kalle en funksjon (oftest skrevet i språket C) fra et applikasjonsprogram (eller fra JVM). Eksempel: Når (C-)funksjonen write kalles, vil den utføre en systemtjeneste som skriver data til en fil. Dette er en systemtjeneste, fordi det er OS-et som sørger for at det gjøres på riktig måte. Systemtjenestene er samlet i OS-ets kjerne (kernel), som gjerne oppdateres automatisk ved behov (ny maskinvare/forbedringer). Systemtjenestene, dvs. OS-ets kjerne, er tilpasset maskinvaren og er ofte skrevet i C eller maskinkode. API er grensesnittet mot systemtjenestene.
Brukermodus og kjernemodus CPU har minst to forskjellige modi: Brukermodus (user mode) Kjernemodus (supervisor mode) Under utføring av normal kode er CPU i brukermodus Kan bare endre programmets egne data i RAM For å kunne utføre instruksjoner som har å gjøre med håndtering av maskinvare, må CPU-en være i kjernemodus: Koden som kjøres får utvidete rettigheter I kjernemodus kan data internt i operativsystemet også endres Gir ekstra sikkerhet, vanlig brukerkode kan aldri forårsake inkonsistens og/eller feil i OS
Utføring av en systemtjeneste Når en systemtjeneste kalles fra en applikasjon skjer dette: CPU-en settes i kjernemodus Kjernens programkode for systemtjenesten utføres CPU-en settes tilbake til brukermodus CPU-en fortsetter å utføre programmet som kalte systemtjenesten Denne operasjonen kalles et programvareavbrudd Kontrollen overføres fra applikasjonens program til OSkjernens programkode for systemtjenesten, og deretter tilbake. Programvareavbrudd gjøres med en egen instruksjon (INT) som setter CPU i kjernemodus.
OS og høynivåspråk/java Java tilbyr et høyere abstraksjonsnivå der: Maskinen er et stykke programvare (JVM) Data kan lagres i variable med navn og type, inne i objekter og i tabeller. Variable opprettes og fjernes automatisk når programkoden utføres. Programmereren bruker et ferdig laget bibliotek av klasseobjekter som tilbyr egne grensesnitt for f.eks. å lese og skrive data fra I/O-enheter og filer. Programmereren ser aldri maskinvaren, OS-et eller systemtjenestene, dette er gjemt i JVM og i klassebibliotekene.
Java i Linux Finnes en lang rekke GUI-verktøy for programutvikling Tekstbasert / fra kommandolinen: Skriv koden i en teksteditor, emacs anbefales Kompilator: javac JVM: java Krever at skallvariablene PATH og CLASSPATH er satt riktig: Skal (bør?) gjøres automatisk ved pålogging
Programvaren som gir abstraksjon Kompilatoren Klasse- / programvarebibliotek Run-time system / Kjøremiljø
Kompilatoren Oversetter et program fra høynivåspråket til kjørbar objektkode* Objektkoden inneholder: Hvilke (virtuelle) maskininstruksjoner som skal utføres Programmets ressursbehov Hvilke andre delprogrammer som skal brukes/lenkes Objektkoden lastes inn sammen med den andre koden som den er lenket til, før kjøring Java-kompilatoren: Produserer ikke maskininstruksjoner for den fysiske datamaskinen, men bytecode for Java Virtual Machine Bytecode er portabel og kan distribueres uten kildekode (applets) * Output fra kompilatorer kalles tradisjonelt for objektkode eller objektmoduler, dette har ingenting med OOP å gjøre.
Klasse- / programvarebibliotek Samlinger av ferdig kode for ulike oppgaver som utføres ofte og mye, f.eks.: GUI-håndtering I/O og andre OS-tjenester Matematikk Manipulering av tegnstrenger Java tilbyr klasseobjekter med grensesnitt som implementerer funksjonalitet Java API inneholder abstraksjonslaget der OStjenestene/systemkallene er gjemt
Run-time system / Kjøremiljø Programmer skrevet i høynivåspråk må kjøres i en omgivelse som utfører støttefunksjoner, bl.a.: Laster inn objektkoden Får OS til å sette av minne og andre ressurser Organiserer bruken av RAM / programmets minneområde under kjøring av programmet Run-time systemet i Java ligger i stor grad internt i Java Virtual Machine (JVM)
Håndtering av minne i run-time Programmet får tildelt et eget minneområde ved oppstart I høynivåspråk er ikke det totale minnebehovet kjent ved oppstart Variablene og objektene har ulik levetid under kjøringen av programmet Run-time systemet har ansvar for å organisere minnet effektivt og gjenbruke minneområder når variable dør under programutførelsen.
Tre ulike typer variable/objekter Statiske: Eksisterer så lenge programmet kjører Plass i minnet kan settes av ved oppstart Automatiske: Parametre og lokale variable til metoder, opprettes ved metodekall Eksisterer så lenge metoden kjører Plassbehov ikke kjent ved oppstart, men avhenger av kalldybden Kan fjernes i omvendt rekkefølge av opprettelsen Dynamiske Opprettes av programmet under kjøring Kan enten fjernes eksplisitt (C, C++) eller automatisk (Java) Plassbehov ikke kjent ved oppstart
Memory stack og memory heap Automatiske variable lagres på en stack: Meget enkel Last-In-First-Out (LIFO) datastruktur Automatiske variable (og returadresser) stables oppå hverandre etter hvert som de opprettes ved metodekall Fjernes i omvendt rekkefølge ved å plukke fra toppen når metodene er ferdig kjørt Dynamiske variable lagres i en heap: Ingen systematikk/logisk rekkefølge i minnebruken Lagrer en heap av ledige minneområder, sortert på størrelse Tar ut minste område større enn det som ønskes reservert Legger område tilbake på heap etter bruk Heap er en datastruktur som er spesielt effektiv og rask for dette
Brukerkommandoer: Skall og GUI Brukere kan gi kommandoer til OS gjennom: Skall / shell Tekstbasert linje-for-linje som i gamle dager Krever mer av bruker, mindre av maskin/nettverk Er en egen programmeringsomgivelse Effektivt til håndtering av store datamengder Uunnværlig til systemadministrasjon GUI Enklere å forstå, krever mye mer ressurser enn shell Visualisering/grafisk fremstilling av filer og systemtilstand Peke-klikke-dille-mikke databehandling, lite effektivt