Návrat na detail prednášky / Stiahnuť prednášku / Univerzita Komenského / Fakulta matematiky, fyziky a informatiky / Princípy PC
Poznamky (poznamky_full.doc)
Princípy počítačov - operačné systémy
Princípy počítačov OS – poznámky strana 16
Úvod do operačných systémov
Úrovne počítača
Aplikačné program | SW vrstva |
Vyšší programovací jazyk = assemblerový jaz. | Bežné programovanie |
Operačný systém | Systémové programovanie |
Konvenčný počítač / Strojový kód //najnižší možný jazyk | HW vrstva |
Mikroprogram //neviditeľný pre bežného programátora //procesore = nie je to čistý HW |
|
Číslicové obvody //čistý HW |
|
Operačný systém
- jeho služby : otváranie, zatváranie, vytváranie súborov, procesov, posielanie dát, kreslenie, ....
- 4 zákl. časti – správa procesov, pamäte, I/O zariadení, súborov
- proces = bežiaci program
- stavová informácia zahŕňa premenné & históriu volania procedúr pre otvorené súbory v konkrétnom čase
- správa súborov – abstrakcia sektorov na súbory
- vzniká ako rozšírenie strojového kódu s novými inštrukciami pre zjednodušenie práce s I/O zariadeniami
- MS-DOS – 2-rozmerné pole znakov na adresu <=> Windows – virtualizácia – spúšťa aj DOS programy
Vyšší programovací jazyk
- nie je viazaný na konkrétny HW
- prekladá do strojového kódu, volá knižnice //v niektorých možno použiť priamo assembler
- aplikačné programy
Programovacie jazyky
najskôr málo zrozumiteľné pre používateľov, bližšie procesoru => nové jazyky boli kvôli HW prekladané do viac userfriendly jazykov
vrstvenie jazykov
L3 L2 |
L2 L1 |
L1 |
kompilácia
kompilácia
interpreter
INTERPRETER
- vstupom je program v danom jazyku – výstupom je konkrétny výsledok – vykonanie programu
- HW interpreter = číslicové obvody = interpreter mikroprogramu
- I diagram
KOPILÁTOR – prekladá, vstup aj výstup je konkrétny jazyk, T diagram
Interpreter HW interpterer Kompilátor
Kompilácia pascalu v pascale
Vývoj programovacích jazykov
- 1951 M. V. Wilkes – pridal k počítaču mikroprogram medzi číslicové obvody a strojový kód => zjednodušenie, väčšia flexibilita, zlacnenie, spomalenie
- n-bitový procesor = n-bitová dátová zbernica, aritmetika, registre // slovo = n bitov
- predný panel 1k-bit PC s 2 registrami, 8-ková sústava => HW rieši programátor
- zárodok OS – knižnice na prácu s I/O zariadeniami
- zloženie:
vyšší programovací jazyk – Fortran (IBM) //formula translation
assembler
zárodok OS – podpora behu
HW
- mid 50’s - počítač využíva jeden človek, viac manuálna obsluha – výmena diernych štítkov
Pascal P-Kód Pascal P-Kód
Pascal Pascal P-Kód Pascal
Pascal P-Kód
CDC
Pascal
-človek- CDC
P-Kód
CDC
6600
P-Kód P-Kód
Fortran Fortran CDC CDC
CDC
CDC
- dierne štítky
- 80 stĺpcov / 12 dierok – 1 riadok = 80 znakov
- 1 štítok = 1 riadok programu
- BATCH processing // dávkové spracovanie
- JCL – job control language
- príklad programu
*JOB meno => jazyk OS
*FORTRAN
~ ~ ~ ~ => vyšší programovací jazyk
~ ~ ~ ~
*END
*RUN
~ ~ ~ ~ dáta => jazyk programu
~ ~ ~ ~ dáta
*RUN
~ ~ ~ ~
~ ~ ~ ~
*END
- rozdiel medzi HW a SW nie je jasný, vlastnosti v rôznych vrstvách nie sú jednoznačne dané k vrstve // HW a SW sú logicky ekvivalentné
História počítačov a OS
0. Prehistória (stroje)
17. stor.
- Pascal – Pascalína (1641) – sčítanie šesťmiestnych čísel
- Gotfried Wilhelm Leibniz (1647) – počítací stroj stupňovými valcami pre 4 základné aritmetické operácie, zaoberá sa aj dvojkovou reprezentáciou čísel
19. stor.
- Charles Babbage
– „Different Engine“ (1822) – opakované výpočty 1 polynómu / diferenčná metóda
– „Analytical Engine“ (1838) – vstup aj výstup – predchodcovia diernych štítkov; 4 časti: pamäť, procesor, I/O
20. stor.
- Konrad Zuse – elektromechanická kalkulačka – obsahuje relé, zobrazenia v binárnej sústave
- 1943 angličan Turinn – počítač Colosus (tajný) – dešifrovanie nemeckých správ
- 1944: Howard H. Aiken – Mark 1 – prvý americký počítač
1. Generácia
1945 – 55
- 1946: P. Eckert a J. W. Mauchly – ENIAC – prvý čisto elektronický počítač z elektrónok a relé
- Von Neuman (1946 – 1952) – EDSAC
- model počítača s uloženým programom => program = forma dát, inštruk.
- základná schéma počítača // procesor, pamäť, zbernica, I/O
- okolo 1950 sa objavujú dierne štítky
- všetko sálové počítače
2. Generácia
1955 – 65
- objavuje sa transistor (1956)
- počítače sa dostávajú do veľkých firiem
- rozvoj OS – BATCH system
- binárna aritmetika
- použitie počítačov – vedecko-technické výpočty a ekonomické výpočty (hromadné spracovanie dát)
- BCD – rýchlejšie I/O operácie //4 bity = 1 cifra
- čítanie z diernych štítkov, zápis na magnetické pásky
- stále sálové počítače – filozofia: počítač je drahý – treba ho urobiť tak, aby stále počítal, max. využitie
3. Generácia
1965 – 80
- integrované obvody
- stále sálové počítače – multiprocessing / multiprogramming
- IBM 360 – OS 360, IBM 370
- ZSSR kópia (menej spoľahlivá) – J SEP – EC 1020, 1050 // J SEP = jednotný systém
- time sharing – komunikácia s úlohou cez terminál
- multics (na prelome 60-70’s) – projekt, kde jeden počítač obsluhuje tisíce terminálov, minul sa vývoju
Minipočítač
- nová kategória počítačov
- nepotrebuje výpočtové stredisko
- monoprograming (žiaden multiprogramming)
- Dec PDP 1, Dec PDP 7, Dec PDP 11
- ZSSR kópia – SMEP CM, SM (systém malých elektronických počítačov)
- operačný systém unics – protipól multicsu, väčšina kódu v jaz. C //unix
4. Generácia
- mikroprocesor – processor počítača integrovaný do 1 čipu, unifikácia procesorov
- 1971 intel 4004
- mikropočítač – pre jedného užívateľa
- sieťové OS
- CP/M – INTEL 8080
DOS – diskový OS, základný I/O systém
BIOS – (?) podprogr. na výpis znaku na obraz, prečítaný sektor z diskety
- 1987 INTEL 8086; 1980 INTEL 8088 – 16 bitové
- 8-palcové diskety, max 1MB, 5 ¼ palcové diskety
- 1981 IBM PC – procesor 8086/88, zverejnené všetky, popisy zbernice
- 1983/4 – IBM PC AT 80286
IBM PS2 – personal system 2 (neujal sa)
IBM OS/2
- mikropočítač – rôznorodé programy pre rôzne počítače – posudzovanie noriem PC – nie noriem programov ako v minulosti
Úroveň konvenčného počítača
//programovací jazyk – strojový kód – špecifický pre procesor intel, kompatibilita na tejto úrovni s 8386
procesor intel pentium
register = pamäťové miesto v procesore //32 bit procesor => 32 bitový adresový priestor
//286 – 16kbit procesor, 24 bit adresová zbernica, 8086 – 16kbit procesor, 20 bit adresová zbernica
2 byte = WORD, 4B = DWORD, 8B = QWORD
znamienkové operácie
- príklad rozdelenia čísel na znamienk. a neznam.
mod 5 0 1 2 3 4 //2 + 4 = 1, 2 + 3 = 0, 1 + 4 = 0 4 = -1, 3 = -2
0 1 2 -2 -1
- násobenie -1
256 = 1 0000 0000
+5 0000 0101
0 1111 1011
–5 1111 1011 + 0000 0001 = 1111 1011
- všetky operácie - +, –, *, / zložené zo sčítania a násobenia –1
- 1 byte – čísla 0..255 bez znamienka – so znamienkom čísla od –128 po +127 //podobne pri word, dword, qword
čísla
- single: 4B
- double: 8B
- extended: 10B
- real = double
- real 48 //nezodpovedá ničomu na úrovni procesora – pomalšia aritmetika
Vývoj operácií / procesory
- 8080 – len +
- 8086 – bez reálnych čísel
- 8086 + 8087 – reálne čísla z koprocesoru pre reálne čísla
- 286 a 287
- 386 a 387
- 486 – integrovaný koprocesor, násobenie bez koprocesoru
FPV – aritmetická jednotka pre reálne čísla (+,-,*,/,log,....)
celé čísla v Pascale
neznamienkové 1B = = BYTE
2B = = WORD
4B = = LONGWORD
znamienkové 1B = = SHORTINT
2B = = SMALLINT
4B = = LONGINT
8B = = INT 64
INTEGER – generický, celé čísla so znamienkom
CARDINAL – kladné čísla
- kvôli riziku pretečenia a kvôli výstupu je nutné zadať, či je operácia znamienková/ neznam., nerovnosť 2 čísel, násobenie
- Porovnávanie 2 čísel – kompilácia na int 64
4B = = smerník / adresa; uložený / daný + nasledovné 3 adresy
LITTLE ENDIAN (intel) najmenší bit v najväčšej adrese
BIG ENDIAN (motorola v mac, IBM 360) najmenší bit v najmenšej adrese
problém v komunikácii viacerých procesorov sieťové protokoly
Registre
- staré PC – 1 akumulátor (register) a pamäte – – neskôr viac registrov
- intel – rôzne typy registrov
- ľavá skupina registra – zameniteľná
- 8 x 32 bit registre – – väčšinou rovnocenné / operácie výlučne na daný register
- 8086 – AX, BX, CX, DX, SI, DI, BP, SP
- 8 bit operand – – AH,AL, BH, ... DL
- 16 bit operand – – AX, BX, ....
- 6 x 16 segmentových registrov
- 8086 = 16 bit dát + 20 bit adresové zbernice
SP = stack pointer
smerník na vrch zásobníka
na začiatku ukazuje do zásobníka / vrch prázdny
volania podprogramov
EIP – ukazuje na miesto, kde sa vykonáva program
CS = kódový segment
segmentový register, ukazuje na začiatok programu
všetky adresy budú relatívne k CS
ES = extra segment
môže pracovať s dátami, ktoré sú od seba ďalej ako 64kB
DS 1 3 D 2 0
adresa A 3 7 0 posunutie o 4 // 1 D E 9 0 – skutočná 20bit adresa
- ofset = posunutie
- segmenty musia začínať na číslach deliteľných 16
- Win 3.1 – 16 bit Pentium – segmenty – reálny režim
- chránený režim – segment a ofsetová časť, ale nesčítavajú sa priamo
- segmentové registre majú stále význam 32 bit Win – všetky adresy 32 bit, ukázané len v rámci segmentu, každý proces = 1 segment zjednorozmernenie
Register EFLAGS
- register príznakov
- 32 bitov
- obsahuje vedľajšie výsledky aritmetických operácií, nastavenia procesora, prepínače
CF
ZF
OF
SF
IF
CF = = carry flag – v beznamienkových operáciách – – pretečenie; prenos o mínus n-bit
ZF = = zero flag (ak výsledok = 0)
OF = = pretečenie znamienkovo – zlý výsledok
SF = = znamienkový bit
IF = = prerušenie = mechanizmus ako môže reagovať na komunikáciu v reálnom čase, napr. vstup z klávesnice; nevykonáva ďalšiu inštrukciu, ale podprogram a vráti sa asynchrónne prerušenie; zakázanie – 0 = IF, potvrdenie – 1 = IF
12 – 13 bit = IOPL – oprávnenie 0, 1, 2, 3 – I/O operácia vykonaná len s oprávnením väčším než je dané
Procesor Pentium
- 32 bitový – fyzický adresový priestor = 46 B
- adresa = SELECTOR//segment + OFFSET
- reálny režim – adresovanie SEGMENTOR_0 0 0 0
__ OFFSET___
///////////////////////////////// spolu 20 bit
- CS: [1305] – určenie segmentu 1305ho bytu v časti pamäte, obsah registra sa použije ako selektor
- 2-rozmerné adresovanie v chránenom režime zachováva 2 časti adresy
selector offset
_____3 2 1 0 | ___1 3 5 0__
- selector – vyberá TAB – globálna GDT / lokálna LDT = = pole popisovačov segmentov
- register GDTL – začiatok GDT, LDTL – začiatok LDT
- selector = jeden zo 6 určených registrov
- v CS – selector je program, ktorý sa práve vykonáva
- CS: EIP – vykonáva inštrukciu
- SS: ESP – vrchol zásobníka
- DS – dátový segment
- v každom deskriptore je bit p – – p=1 / p=0 – nie je v pamäti segmentu, nájde na disku, zmení údaje na 1, pokračuje
Flat memory model
- jednorozmerný
- OS nastavuje segmentový register, každý program sa pohybuje vo svojom segmente a má 64 B virtuálnej pamäte – OS vie o existujúcich častiach pamäte
- pamäť procesoru je 1 segment – adresovanie len offsetom, adresovanie 46 B
- nespojité časti
Inštrukcie procesoru Pentium
MOV
MOV EAX, 1 prenesie zdroj. operand do cieľového
OPERANDY – register, priama hodnota, adresa do pamäte, v pamäti zväčša 1 operand
MOV [2806], EBX – na pozíciu 2806 – 2809 uloží 4B z EBX – nemožno ukladať pozíciu na pozíciu!! //[..]
MOV EAX, [3200] priradenie, [3200] = offset (priama adresa) do virtuálnej pamäte
MOV [2806], EAX
MOV EAX, [EBX] – uloží obsah EBX na adresu v EAX
MOV [EAX],[EBX] – vloží obsah EBX do obsahu EAX
polia, recordy, smerníky nemožno adresovať priamo
x: array[1..10] of integer //40B
adr (x[i]) = adr (x) + (i-1)*4
x[i] := 25
MOV EAX, [20500]
MOV [ ], 25 = MOV [10000 + (EAX-1)*4], 25 = MOV [10000 + EAX*4 – 4], 25 =
MOV [9996 + EAX*4], 25
najzložitejšie adresovanie
MOV [EAX + EBX*4 + 20000]
MOV EAX, EDX
ADD EAX, EBX
ADD EAX, 1
INC EAX
INC [EAX + 5000] ZLEE INC DWORD PTR [EAX + 5000]
ADD [2305], EBX
operandy – 1, 2, 4 byte – nemožno krížiť rôzne veľkosti operandov
x: DB 4 – vynechá 4B + premenuje na x
MOV EAX, X [3205]
oblasť, v ktorej je program a oblasť v ktorej sú premenné – – VPY, ASM, OS, SK
ADD, SUB, SBB, ADC //VŠETKO NA PAPIERI
ADD EBX, EDX
ADC EAX, ECX + prenos z predošlej operácie, nastaví CF
MUL [3210] treba nastaviť dĺžku
DIV, IDIV – hlási chybu pri delení nulou – – pretečený výsledok
Vetvenie programu
nepodmienený skok JMP @1
podmienené skoky
i: integer;
while i<10 do
i:=i+1;
@2: MOV EAX, I
CMP EAX, 10
JGE @1
INC I
JMP @2
@1:
KONZOLOVÁ APLIKÁCIA
var x,i: integer;
begin
x:=1;
i:=1;
while x<4 do begin
i:=2*I;
x:=x+1;
end;
end;
//zbehne 3x, i=2³
ODD(x) – true pre nepárne čísla // najnižší bit = 1
ROTÁCIE
ROL EAX,1
function Pocet1(x: cardinal):byte;
asm
push ebx
mov ebx,x
@2: rol ebx,1
jnc @1
inc a1
@1: loop @2
pop ebx
end;
**********************************
AND AL,7 = = AL:=AL AND 7 //MASKA
MOV AL,0
TEST EAX,127
JZ @1
MOV AL,1
@1:
program sko49 na 1 ak 7 najnižších bitov EAX = 0, tak AL = 1
127: 00000001111111
************************************
TYPE BIT4 = 0..15
FUNCTION ZLOZ2(A,B: BIT4):BYTE
begin
Result:=A*16+B;
end;
MOV AL,[A]
SHL AL,4 pretečie do CF – SAR
OR AL,[B]
********************************
PUSH EAX
PUSH [X]
EBX a EDX musia mať rovnakú hodnotu ako na začiatku
********************************
Function POLET1(x: cardinal):byte;
ASM
PUSH EBX
MOV EBX,EAX
MOV AL,0
MOV ECX,32
@2: SHR RBX,1
JMC @1
INC AL
@1: LOOP @2
POP EBX
END;
//program ráta počet 1 v čísle
MOV EDX,EAX
MOV AL,0
@2: SHR EDX,1
JMC @1
INC AL
@1 LOOP @2
*********************************
Function PALINDROM(x: byte):Boolean;
IF AL<>BL THEN
AL:=0
ELSE
AL:=1;
RESULT:=AL=BL
ASM
PUSH ECX
OBRAT
CMP AL, BL
JE @1
MOV AL,0
JMP @2
@1 MOV AL,1
@2 POP ECX
END;
Function OBRAT(x: byte):byte;
ASM
PUSH EBI
MOV BL,AL
MOV ELX,8
@1 SHR BL,1
LCL AL,1
LOOP @1
POP EBX
END;
Plánovanie ROUND ROBIN = každý program dostane rovnaký objem času, opak – PRIORITNÉ PLÁNOVANIE
Správa procesov v preemptívnom OS
Princíp: plánovač procesov – dostáva sa „k slovu“ keď časovač spôsobí prerušenie
Podmienky na reálne plánovanie
- efektívnosť (čo najvyššia)
- férovosť //subjektívne hodnotenie
- čas odozvy – čo najmenší
- doba obrátky – čo najmenšia
- priepustnosť – čo najvyššia
Prioritné plánovanie
priorita:
- terminal kvantum
- I/O
- short kvantum
- long kvantum
2 priority
- statická – musí sa meniť explicitne, počiatočná priorita
- dynamická – podľa nej sa plánuje, pravidlá zmien priorít s časom – zmenšuje sa s časom stráveným v stave bežiacom
CIEĽ – rozlíšiť úlohy
typy úloh:
- veľké kvantá, menej často
- častejšie, menšie kvantá
História
bolo nutné k úlohe zadať aj čas, koľko bude trvať
A – 8 & B, C, D – 4
ak idú v poradí A B C D – priemerný čas obrátky je 8 + 12 + 16 + 20 / 4, čiže 14 //program D má čas 20 aj keď sa vykonával len 4 a čaká 16
ak idú v poradí B C D A – priemerný čas je 11 //čaká sa menej
shortest job – vyberie sa najlepšia priemerná doba obrátky úloh zadaných v čase 0
životný cyklus interaktívnej aplikácie – stavy bežiaci a čakajúci
Policy driven
uprednostňujú sa procesy, ktoré minuli najmenej času a majú najnižší možný termín
dvojúrovňové plánovanie
Komunikácia medzi procesmi //typy procesov
- ak je proces samostatný nie je viazaný na ostatné a je si vedomý, že beží spolu s inými, ale aktívne nevyužíva
- proces komunikujúci
Race condition // časová závislosť
nastáva vtedy keď výsledok 2 a viac procesov sa líši v závislosti od poradia, v akom boli plánované.
Rovnaký kód – rôzne výsledky kvôli poradiu problém v dátovej štruktúre.
Pravidlo konzistencie zdieľaných údajov – race condition – prerušenie behu programu na nekonzistentnom mieste – kritická sekcia – úsek programu, ktorý pracuje so zdieľanými dátami a to tak, že na začiatku a konci úseku sú dáta konzistentné a v strede úseku nie
riešenie problému časovej závislosti: Mutual exception // vzájomné vylúčenie
Mutual exception // vzájomné vylúčenie
Podmienky pre dobré riešenie vzájomného vylúčenia
- keď sa žiadne dva procesy sa neocitnú vo svojej kritickej sekcii naraz
- nepredpokladáme nič o vzájomnej rýchlosti ani o počte procesov
- žiaden proces nesmie brániť ostatným procesom dostať sa do svojej kritickej sekcie, pokiaľ v nej práve nie je
- férovosť – žiaden proces nebude „dlho“ čakať na vstup do kritickej sekcie
- základný predpoklad všetkých riešení – kritická sekcia sa vykoná v konečnom (krátkom) čase
Typy riešení
- s aktívnym čakaním – busy waiting
- spotrebúva sa čas, testuje sa podmienka, ktorá sa nemôže počas behu zmeniť
- náročné na čas procesora
- s podporou OS
- proces je v stave čakajúci, bežia ostatné procesy – daný proces čaká na udalosť od nich
1. busy waiting
Zamykacie premenné
zámok: boolean – while cyklus – kým zamknuté, tak sa vykonáva
var front: array[0..n] of string
N:integer = 0;
Zamknute: boolen=false;
Procedure pridaj (meno:string);
Begin
while zamknute do begin
front[n]:= meno;
n:= n+1;
zamknute:=false;
end;
End;
zamykacie premenné NIE SÚ riešením !!!
Striktné striedanie
spĺňa základnú podmienku, z ostatným nespĺňa jednu treba vedieť, koľko je procesov
var front: array[0..n] of string
N:integer = 0;
Narade: integer = 1;
Procedure pridaj (meno:string);
Begin
repeat until narade = 1 repeat until narade = 2 CMP narade,1
front[n]:= meno; ~~ JNE @1
n:= n+1; ~~
narade:=2; narade:=1;
end;
ak sa zakážu prerušenia – plánovač sa nedostane k slovu
ASM CLI END;
CLI zakáže prerušenie
povolí to Win 98 Win XP – pokus o vykonanie privilegovanej inštrukcie, ktorú môže robiť len jadro OS
ASM STI END;
môže vážne narušiť systém
bežná používaná metóda pri programovaní driverov – keď vznikne prerušenie – odovzdá sa program – zakážu sa prerušenia
Nedeliteľné „testuj a zamkni“
@1:TSL OTVORENE, EAX //inštrukcia z IBM 360 – prenesie pamäťové miesto/register do registra a vynuluje
CMP EAX,1 môžem prerušiť viem testovať či bolo otvoren
var front: array[0..n] of string
N:integer = 0;
Otvorene: boolen=true;
Procedure pridaj (meno:string);
ASM
SHR OTVORENE,1 prenesie carry
JNC @1;
front[n]:= meno;
End;
OTOVORENE:= TRUE; Aktívne čakanie
Petersonove riešenie – potrebuje vedieť, koľko procesov
2. s podporou OS
Systém SLEEP & WAKE UP
if not otvorene then sleep
otvorene:= false;
...
...
wakeup(2) //druhý proces
druhý proces -- wakeup(1), ak 1 nespí nič sa nestane
môže sa stať, že sa wakeup stratí a program odíde do kritickej sekcie, wakeup sa znovu nevykoná
zase nefunguje, nie je to správne riešenie
Binárny semafor – E. W. Dijskstra, 1965
typ s dvoma stavmi – 0 a 1 a operáciami DOWN a UP
| 0 | 1 |
DOWN | 0 Proces sa preradí do stavu čakjúci...* | 0 |
UP | 1 | 1? //CHYBA |
*..., čaká na UP semafor, jeden z programov sa uvoľní, skončí a dá UP – uvoľní sa ďalší
Ak nečaká =>1
Ak niekto čaká - 1 čakajúci sa znení na pripravený, bod zostane na 0, končí to na 1 – keď prešli všetky programy krit. sekciami
otvorene: semafor; //1 z procesov ho inicializuje
DOWN semafor;
...
UP semafor
semafor je kombináciou sleep/wakeupu a zámkov, stále sa používa
Všeobecný semafor
ľubovoľné stavy >= 0, tiež procedúry DOWN a UP,
CONST MAX = 100;
var m:integer;
voľné = N, obsadené = 0 : vseobecny semafor
DOWN VOLNE;
DOWN OTVORENE;
front[n]:= meno; PRODUCENT
N:=N+1 mod MAX;
UP OTVORENE;
procedure zober(var m:string);
begin
DOWN OBSADENE;
DOWN OTVORENE;
MENO:= FRONT(M); KONZUMENT
M:= (M+1) MOD MAX;
UP OTVORENE;
UP VOLNE;
end;
Cyklický front – riešenie úloh typu producent – konzument
Monitory (Hoare, Hansen) – v praxi stačia semafory, //lock a unlock v Delphi pri Canvase
DeadLock // uviaznutie
(väčš.) chyba programátora
množina procesov uviazla vtedy, keď každý proces z tejto množiny čaká na udalosť, ktorú môže spôsobiť len iný proces z tej istej množiny //2 procesy sa navzájom blokujú
**************************************************************************************
Komunikácia medzi procesmi
Posielanie správ
send (adresát, správa) //správa = pole bytov
možnosti – či chce odosieľateľ čakať na prijatie alebo nie
receive (odosieľateľ, var správa)
- v niektorých verziách nemusí byť určitý
- pri správe aj voľby – flagy ...či chcem čakať a pod.
win control – posiela správy, ktoré príjmajú okná
sendmessage (handle, správa, wparam, lparam)
postmessage (handle, správa, wparam, lparam)
každé okno má procedúru pre prijatie správy – jej telom je case – spracovanie podľa typu správy
wm.keydown – ak je stlač. kláves
pipe – v unixe
RPC – remote procedure call
- pokus zakryť komunikáciu medzi procesmi
- programátor napíše 1 aplikáciu, v prídavnej informácii je popis procesov, ktoré sa skladajú z procedúr A, B, C, D – A,B = proces P1 a C,D = proc P2
- systém: program (obsahuje proc al moduly) RPC (predkompilátor, prekompiluje volania procedúr na posielanie správ) 2 zdrojáky, 2 procesy
Klasické problémy / úlohy
Dining Philosophers // problém obedujúcich filozofov
máme n filozofov na konferencií, ktorý fungujú v dvoch režimoch – buď filozof rozmýšľa alebo je, najesť sa musí, ale trvá to konečnú (krátku) dobu
jedlo sa je 2 vidličkami, filozofovia sedia pri okrúhlom stole a počet vidličiek zodpovedá počtu filozofov
vidličky sú teda zdieľaný nástroj
riešenie:
každá vidlička má binárny semafor a filozofi procedúry uchop_vidličky(n) a uvoľni
uchop_vidličky(n..)
čakaj(ľavá)
čakaj(pravá)
zober(pravá, n)
Protokol Eternet
1 vodič
spätná odozva – keď je vysielanie zinterferované, treba prestať
Správa procesov vo Windows
32bit Win – preemptívne plánovanie
Delphi – Processes and Threads //pozri delphi help
- processes
- thread – vlákno, ... , zahŕňa info o vykonaní, momentálny stav registrov a zásobníka
- fiber = thread, ktorý neplánuje, má stav
- priority class
- priority level
- base priority
- priority boosts
- slúži na zlepšenie času odozvy, pre interaktívne thready
- dočasné zvýšenie priority bežných procesov (0-15) na vyššiu ako BG procesy
- postupne sa mu priorita znižuje až na pôvodnú
- po skončení čaká
- priority inversion – vedie k stavu podobnému deadlocku
- win 9x – aktívne detekuje a boostuje procesy
- win NT – náhodne zvyšuje prioritu ready threadom
Synchronizačné mechanizmy vo Windows
synchronizačné objekty:
mutax – binárny semafor (mutual exclusion)
semaphore – všeob. semafor
timer
event – oproti semaforu môže vyvolať viac „reagujúcich naraz“, je binárny
Pr: M:=CreateMutex();
...
...
WaitForSingleObject(n,infinite);
...
...
Release Mutex(M);
closehandle(M);
tieto objekty maj[ meno yn8me v celom syst0me
objekt Critical Section Object – funguje len v rámci jedného
Pr: var ks: TCriticalSection
InitializeCriticalSection(ks);
DeleteCriticalSection(ks);
EnterCriticalSection(ks);
LeaveCriticalSection(ks);
Správa pamäte
funkcie
- udržať informáciu o voľnej, použitej, ... pamäti
- prideľovať / uvoľňovať pamäť procesom
- ochrana pamäte procesu
- umožniť zdieľanie pamäte procesmi //nie je možné v 32bit Win – thready zdieľajú pamäť, segmentovanie
- vytvárať a udržiavať virtuálnu pamäť procesov
Jednoduchá správa pamäte
– operácie pridelenia a uvoľnenie každej jednej časti pamäte
GETMEM (smerník – netypový, n bytov) //N-bitový fyzický adresný priestor
FREEMEM (smerník, n bytov)
new (p) – smerník na typ vyššie definovaný
Pascal – postupne získava časti pamäte z OS, ktoré delí na menšie časti – pascalovské dáta
Metódy správy pamäte sa používajú nie len v OS, ale aj v knižniciach vyšších progr. jazykov, tam možno metódy doprogramovať.
Problém Externá fragmentácia
spôsobujú ju malé diery v lineárnej pamäti vznikajúce pri prideľovaní a uvoľňovaní vznikajú voľné segmenty medzi obsadenými úsekmi
Riešenie
čistý obraz pamäte – súbory .com
– bežné programovanie cez segmenty (DS, SS, CS) – – v pôvodných 16bit proc. – program .com <= 64B
Relokácia
- pri prekladaní program nevie, kam do pamäte bude nahraný
- pri zavádzaní alebo hocikedy použitím .com
- súbor .exe – obsahuje dvojakú informáciu – kód progr. a informáciu o tom, kde sú adresy (relatívne k zač. bloku)
- .exe súbor je ľahko relokovaný pri zavádzaní
- OS: CS 360 MFT
- Ochrana
- IBM 360 – 16 x 2kB častí
- pamäť sa dá rozdeliť na 2kB bloky, ku každému sa pridelia 4b mimo adresného priestoru zámok, kód
- zámok sa mení počas behu programu
- pri adresovaní stroj. kód kontroluje kľúče a zámky – porovnanie zámku s kľúčovým registrom
- Tvar vykonateľného programu obsahuje funkciu na relokáciu pamäte
teda: riešenie fragmentácie – – kompaktácia => relokácia
Algoritmy správy pamäte
Bitová mapa
- 1 bit pre každé najmenšie prideliteľné miesto – – 0 voľné / 1 obsadené
- 16B – minimálny prideliteľný úsek
- GETMEM (P, 256) // 256/16 = 16 – algoritmus musí hľadať 16 núl za sebou
- FREEMEM (P, 512)
- nevýhoda: – pomocná dát. štruktúra zaberá pamäť
– kvôli efektivite treba určiť prideliteľný úsek (16B)
Spájaný zoznam
záznam = record
obsadený: boolean;
veľkosť: cardinal;
adresa: pointer;
ďalší, predošlý: ^záznam;
end;
- spájanie pamäťových blokov – zlúčim prvky zoznamu a nastavím mu veľkosť súčtu veľkostí
- uvoľnenie pamäte = zrušenie a presmerníkovanie
- výhoda: rýchlosť – vyreťazenie trvá rovnako dlho bez ohľadu na veľkosť blokov
- nevýhoda: nevieme koľko bude naša štruktúra zaberať – zaberá miesto podľa počtu voľných vs. obsadených blokov
Modifikovaný spájaný zoznam
- ukladá sa len dĺžka bloku, netreba smerník na ďalšieho
- info sa ukladá rovno do pamäte – P, pointer na čítané miesto ( GETMEM(P) ) sa nastaví až za info
- info aj na konci – o obsadení a veľkosti // kvôli spojeniu s predošlými blokmi
- ak niekto žiada menej ako 4B – pridelí sa viac miesta // kvôli fragmentácii
Spôsoby nájdenia voľného úseku
First Fit – použije sa prvý voľný priestor s >= veľkosťou
Best Fit – hľadá sa priestor presne takej veľkosti, akú treba alebo o niečo väčší
– problém: zaručene zanedbáva malé nepoužiteľné zvyšky
Worst Fit – všetko ukladá do najväčšieho priestoru //teoretický spôsob
Circular First Fit – hľadá od miesta, kde sa naposledy prideľovalo
– obmedzí hľadanie v malých kúskoch na začiatku a vo veľkých na konci
Past Fit – más svoje „obľúbené“ dĺžky, napríklad: správa pamäte vyšš. progr. jazyka
Virtuálna pamäť
- riešenie ochrany
- spočiatku používaná kvôli cene pamätí – simulácia väčšej než reálnej
- 2 prístupy: segmentovanie a stránkovanie
1. Segmentovanie
- rôzne veľkosti segmentov, 2-rozmerná pamäť, adresovanie systémom segment–offset
- GetMem – vytvorí segment (z N1, N2 –> N3)
- v OS podporujúcom segmentovanie možno žiadať o zmeny veľkosti segmentov
- tabuľka segmentov
- výnimka typu výpadok segmentu
- posledná inštrukcia sa vykoná znova, medzitým sa potrebný segment nahrá z disku a upraví tabuľku so segmentami a offsetmi
- stroj. kód musí mať konkrétnu podporu pre túto operáciu
2. Stránkovanie
- vychádza z 1-rozmernej pamäte – mapuje do 1-rozmernej
- - - - tu má byť akýsi obrázok...ale ja to už proste nezvládam kresliť, nexeee sa mi :-P - - - - -
- fyzický priestor (0..M) rozdelíme na rámce napr. 4kB adr. konca
- virtuálny adresný priestor rozdelíme na stránky
- v adrese sa zmení číslo stránky na číslo rámca
- výnimka: ak adresa nie je v pamäti – prenos z disku – odznova
- bežný programátor nemusí vedieť o stránkovaní
- Algoritmy hľadania obete
Algoritmy hľadania obete
- obeť = stránka, ktorú rámec pošle preč z fyzického adr. priestoru, aby mohol urobiť priestor pre aktuálne adresovanie
- snaha minimalizovať počet výmen a výpadkov
- optimálny algoritmus – – najlepšia obeť by bola taká, čo sa nikdy nebude adresovať; ak taká nie je, tak je to stránka, čo sa bude adresovať najneskôr
- každý z algoritmov sa snaží k optimalizácii priblížiť
NRU – not recently used
A | D |
0 | 0 |
0 | 1 |
1 | 0 |
1 | 1 |
- stránka nebola v blízkej minulosti použitá
- podpora v procesore / stroj. kóde – 1bit v tabuľke T
- A /acces bit/ – keď procesor použije riadok tabuľky – nastaví A bit na 1.
Na začiatku nastaví OS tabuľku na 0 a cyklicky nuluje tie stránky, kde A bit na 1
a boli použité v poslednom „kvante“
- ďalší pomocný bit D /dirty bit/ - ukazuje, či bolo do stránky zapísané od momentu jej načítania do pamäte – ak nebolo, tak je na disku // ušetrí sa 1 operácia
FIFO – first in first out
stránka, ktorá je tam najdlhšie, druhá šanca
LRU – Least Recently Used //najdávnejšie použitý
Podpora virtuálnej pamäte v procesoroch Intel Pentium
8086/88 //16bit – žiadna podpora
80286 //16 bit – reálny a chránený režim (segmentovanie – segment 64kB)
80386 //32 bit – reálny režim
– chránený režim – 32b segmentovanie – segment 4GB
– stránkovanie – režim virtuálnej 86ky – adresovanie ako v reálnom režime 8086ky – DOS aplikácie pod Windows
Segmentovanie (jeho podpora v 386+) //obr. 5.2, 5.3
RPL – 00 – najvyššia ochrana, napr. OS
– 11 – bežné procesy
Ti (?) – 0 – GDT //Global descriptor table
1 – LDT //Local descriptor table
Báza segmentu 32b – – 4GB
LIMIT – B / 4k-bytové jednotky
G – berie sa limit v násobkoch 4kB //??
AVL – available to user // to OS
Prístupové práva //obr 5.4, 5.6, 5.8
Segmenty
- údajové
práva – bit p //je v pamäti?
bity DPL – ochrana segmentu
bity 43/ 1,0 – data segment, 1,1 – inštr. segment, 0,x – sys. segment
bit A – access bit
bit ED = 0 – normálny data segment 4GB 4GB
= 1 – zásobník nejakého procesu
bit W = 0 – read only segment LiM LiM
0 0
ED0 ED1
segmentovanie sa dá dobre využiť pri zdieľaní pamäte, 1 segment môže byť použitý vo viacerých virtuálnych adresných priestoroch
- inštrukčné
LDT alebo GDT
bit R – či sa dá čítať
zefektívnenie segmentovania
časti: báza | limit
ak sú v selektore samé nuly – odkazuje na nil
- systémový //napr. LOT
Systémový riadiaci register CRO //obr. 5.12
PE ak =1 – chránený režim / =0 reálny režim
PG stránkovanie – ON / OFF – lineárna pamäť – fyzická pamäť
31 22 11 0
4kB
str. adresár stránková Fyz. pamäť
tabuľka
8kB stránok
*************************************************************************************
Správa zariadení
HW – vstupno/výstupné zariadenia
typy:
Blokovo orientované
s priamym prístupom
napr. disk („vonkajšia pamäť“) – obsahuje adresovateľné bloky
Znakovo orientované
Sekvenčné
napr. znaková tlačiareň
Radič (controller) zariadenia
procesor pamäť radič
Prístupy
- špeciálnymi I/O inštrukciami
- mapovaním registrov radičov I/O zariadení do pamäte
- DMA prístup
– Direct Memory Access – procesor povie radičom, čo majú robiť, zatiaľ môže robiť niečo iné, nemusí dáta čítať z registrov po bytoch
– bez účasti procesora – hodnoty sa na začiatku zapíšu do radiča
- použitie po prerušení – preruší prácu, ak je úloha hotová
- rolling (spytovanie sa) – v cykle sa pýta, či je úloha hotová
Software správy zariadení
- sprístupnenie funkcií I/O zariadení (čo najviac) strojovo nezávislým spôsobom; tak, aby to nebolo veľmi závislé od zariadenia – cez volania OS, ktoré majú zakrývať druhy, vlastnosti zariadení
- pomenovanie zariadení
- spracovanie chýb – nehlási chyby rovno systému, nie sú fatálne, takže ich najprv, čo najviac, rieši sám daný SW (opakovaním, ....)
- prezentovanie asynchrónnych I/O operácií synchrónnym spôsobom (užívateľskému programu) – proces, ktorý funkciu vyvolá je počas behu v stave čakania, kým sa úloha neskončí
- prideľovanie zariadení procesom //blokovo orentované zariadenia možno zdieľať / serializovať znakovo orientované sa prideľujú (čakanie a pridelenie) na exkluzívne použitie
- ochrana zariadení (nie každý proces môže pracovať so všetkými zariadeniami)
- preruš. podprogramy
- ovládače/drivery
- strojovo nezávislý SW
- užívateľský I/O SW
Ovládač (driver)
- je strojovo nezávislý, dostáva relatívne jasný príkaz
- ak je rýchly, netreba prerušenie
- ak používa radič, musí sa dať do stavu čakajúci – čaká na radič, ak ten skončí – prerušenie podprogr. – berie dáta z radiča – driver sa odblokuje až keď je všetko zapísané
- ak je chybový kód – preruš. podprogr. sa snaží opraviť – následne aj driver, ak ide chyba ďalej aj za užívateľský SW výnimka, spracovanie chyby procesom
- zakrýva všetko strojovo závislé – snaha o čo najmenej strojovo závislé podanie
Preruš. podprogramy – čo najkratšie, možno v nich urobiť najviac chýb
Strojovo nezávislý SW
- jednotný SW interface pre drivery
- pomenovanie zariadení nezávislé od zariadenia – mapovanie zariadenia do jeho drivera
- strojovo nezávislé bloky – ukladanie údajov do buffera – cieľ: veľkosť zapisovaného bloku nezávislá od zariadenia
- Buffering – vyrovnávacia pamäť, zbieranie dát
//driver môže mať fixný počet bufferov mimo správy pamäte
- prideľovanie (pomenovaných) zariadení
- hlásenie chýb //z vyšších úrovní – pretvorených do unifikovaných chybových správ
Užívateľský I/O SW
- knižnice vyššieho programovacieho jazyka, nie je súčasťou OS
// vyš. progr. jazyky – nezávislé od OS – knižnice podľa OS
var i:integer;
writeln(tlac,i);
volanie podprogramu z knižnice prevedie z jazyka pascalu do pojmu OS – zavolá službu OS
- virtuálne zariadenia (zbieranie výstupu do súboru, až ten ide do I/O)
DeadLock v správe zariadení
A B orientovaný cyklus na orient. grafe
chyba nastáva nezávisle na programátoroch
Z S podmienky pre vznik deadlocku (Hoffman a spol.)
- zariadenie môže byť pridelené najviac 1 procesu
- proces vlastniaci zariadenia môže žiadať o ďalšie
- neexistuje preempcia (odoberanie nasilu) v správe zariadení – zariadenie pridelené procesu, až kým ho neuvoľní
- v orientovanom grafe sa nachádza orientovaný cyklus procesov a zariadení
Správa súborov
pohľad používateľa:
- sekvenčný prístup – napr. (?) File v Delphi
- priamy prístup – veta pevnej alebo premenlivej dĺžky
- operácie na súboroch
open(handle,...) F := open(meno, spôsob))
read(f, x, dĺžka, č. vety)
write
close(f)
- operácie na adresároch
vytvorenie, zrušenie, premenovanie súboru/adresára
nastavenie atribútov – ochrana súborov (prístupové práva), „vlastné“ atribúty
úlohy správy súborov
- vytvárať a udržiavať súbory
- ochrana súborov
- zdieľanie súborov
Implementácia – pohľad tvorcu
Lin. adr. priestor strom …. //no jo...tu uz aj Frankiemu dochádzajú invenčné poznámky
Štruktúra súborov „FileSystem“
( FAT, NTFS )
- FAT – file allocation table
- cluster = alokačný blok – 0 = voľný, iné číslo – pseudospájaný zoznam
- priestor na súbory
- koreňový adresár
- boot sector
master boot
record partitions extended partition
MBR MBR MBR
aktívna partícia
boot sector
**************************************************************************************
made by kik © 2005
THANKS TO: Ettelie, Frank
- 1 -