76
ODGOVORI NA PITANJA IZ KOLEGIJA SISTEMSKO PROGRAMIRANJE 2008./2009. I. UVOD 1. Koje osnovne elemente ima Windows NT kao familija operacijskih sustava? - Memorija: velika, linearna, adresni prostor za virtualnu memoriju - Sustavi spremanja dadoteka (File System), konzolni rad i ostali I/O - Multitasking: proces i i niti - Komunikacija i sinkronizacija (zasebni i mrezni sustav) - Sigurnost 2. Nabrojite verzije Windows operacijskog sustava. - Windows XP (Home, Proffesional) – pojedinačni korisnici - Windows Server 2003 – poduzeća, serveri (Novi, Win64 standard nastaje baš iz ove implementacije) - Windows 2000 (Professional i neke druge server verzije) – više se ne prodaje, ali na njemu su nastali XP i buduće verzije - Windows Embedded, Windows CE, Tablet PC, Windows Mobile (palmtop, ugrađeni procesori, mobiteli itd.) - imaju veliki podskup osnovnih elemenata Windowsa - Prijašnje (već napuštene) verzije: Windows NT 3.5, 3.5.1, 4.0 datiraju još od 1993. godine. Windows 95, Windows 98, Windows ME (sve zajedno zvat ćemo Windows 9x) - osobna desktop i laptop računala, nemamo sigurnosne elemente kao NT 3. Što predstavlja Windows API i koje osnovne grupe API‐ja poznajete? Windows API je set programkih rutina, podatkovnih strukutra, objekata klasa i/ili protokola koje pružaju programske biblioteke i/ili servisi operacijskog sustava radi podrške prilikom stvaranja aplikacija. Osnove grupe API-a su: Rukovanje prozorima (Windows Management) GDI (Graphics Device Interface) Servisi OS-a (System Services)

Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Embed Size (px)

Citation preview

Page 1: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

ODGOVORI NA PITANJA IZ KOLEGIJA SISTEMSKO PROGRAMIRANJE 2008./2009.

I. UVOD

1. Koje osnovne elemente ima Windows NT kao familija operacijskih sustava?- Memorija: velika, linearna, adresni prostor za virtualnu memoriju- Sustavi spremanja dadoteka (File System), konzolni rad i ostali I/O- Multitasking: proces i i niti- Komunikacija i sinkronizacija (zasebni i mrezni sustav)- Sigurnost

2. Nabrojite verzije Windows operacijskog sustava. - Windows XP (Home, Proffesional) – pojedinačni korisnici- Windows Server 2003 – poduzeća, serveri (Novi, Win64 standard nastaje baš iz ove

implementacije)- Windows 2000 (Professional i neke druge server verzije) – više se ne prodaje, ali na

njemu su nastali XP i buduće verzije- Windows Embedded, Windows CE, Tablet PC, Windows Mobile (palmtop, ugrađeni

procesori, mobiteli itd.) - imaju veliki podskup osnovnih elemenata Windowsa- Prijašnje (već napuštene) verzije: Windows NT 3.5, 3.5.1, 4.0 datiraju još od 1993.

godine. Windows 95, Windows 98, Windows ME (sve zajedno zvat ćemo Windows 9x) - osobna desktop i laptop računala, nemamo sigurnosne elemente kao NT

3. Što predstavlja Windows API i koje osnovne grupe API‐ja poznajete? Windows API je set programkih rutina, podatkovnih strukutra, objekata klasa i/ili protokola koje pružaju programske biblioteke i/ili servisi operacijskog sustava radi podrške prilikom stvaranja aplikacija.Osnove grupe API-a su:

– Rukovanje prozorima (Windows Management)– GDI (Graphics Device Interface)– Servisi OS-a (System Services)– Multimedija– RPC (Remote Procedure Calls)

4. Navedite osnovne razlike između Windows NT i starijih 9x verzija. – Windows 9X radi samo na Intel x86 arhitekturi– Samo NT podržava SMP (symmetric multiprocessing)– Windows NT koristi UNICODE internacionalni skup znakova– Windows NT ima potpuno zaštićenu jezgru (kernel)– Windows NT podržava NTFS, robustni file system– Windows 9X i CE ne podržavaju jako puno resursa

• Otvorenih datoteka, procesa, itd.– Mnoge funkcije Windows 9X imaju ograničene implementacije

Općenito, Windows programi su portabilni između različitih platformi na nivou source-a, a u većini i na binarnom nivou.

Page 2: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

5. Objasniti osnovne principe rada Windows‐a. Što je HANDLE i kakve sve objekte jezgre on može predstavljati?

Skoro svaki resurs je “object” identificiran i adresiran preko rukovatelja (“handle”) tipa HANDL. Objektima jezgre (Kernel-a) manipulira se pomoću WindowsAPI funkcija.Tip podataka HANDLE uključuje objekte:

– datoteke pipes– procese mapiranje memorije– niti događaji (events), semafori

Windows je bogat i fleksibilan sustav. Više funkcija koje obavljaju iste ili slične poslove. Svaka funkcija ima brojne parametre i zastavice.

Windows nit (thread) je osnovna jedinica izvršavanja, osnovnija od procesa. Proces može imati jednu ili više niti. Svaki proces ima svoj kod i svoj adresni prostor. Niti dijele adresni prostor procesa. Niti su “laganije” i učinkovitije od procesa. Koriste se za servere, asinkroni I/O, ...

6. Navesti poznatije konvencije oko imenovanja funkcija, varijabli, struktura te konvencije kod programiranja za Windows u C/C++.

Duga i opisna imena WaitForSingleObject , WaitForMultipleObjects.

Preddefinirani opisni tipovi podataka uvijek velikim slovima BOOL, DWORD, LPDWORD,...

Kod preddefiniranih tipova izbjegava se operator *:

– LPTSTR (definira TCHAR *) i– LPCTSTR (definira const TCHAR *)

Imena varijabli kod API-ja koriste “Hungarian”-ovu notaciju - mi ćemo često izbjegavati ovu konvenciju

– lpFileName — long pointer [na string koji u C-stilu završava nulom]<windows.h> se uvijek uključuje.

Svi objekti identificirani su pomoću varijable tipa HANDLE. CloseHandle funkcija se primjenjuje na skoro sve objekte. Simboličke konstante i zastavice koje objašnjavaju njihovo značenje

– INVALID_HANDLE_VALUE i GENERIC_READ

ReadFile, WriteFile, i mnoge druge Windows funkcije vraćaju Boolean vrijednosti (TRUE/FALSE). Kodovi sistemskih greški se dobivaju pomoću GetLastError (). C biblioteka je uvijek dostupna, ali se s njome ne može u potpunosti iskoristiti Windows.

Page 3: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

II. I/O

7. Navedite osnovne četiri API funkcije za rad s datotekama. Osnovne Windows API funkcije za rad s datotekama: CreateFile, ReadFile, WriteFile, CloseHandle.

8. Navedite poznatije datotečne sustave koji se koriste kod Windows‐a. Windows File Systems - datotečni sustavi (Virtualni) File Allocation Table File System (FAT, VFAT) - jedino se još koristi na floppy-disketama i na Windows 9x

NTFS File System (NTFS) - Vrlo velike (“ogromne”) datoteke, siguran, robustan. Podržan je na Windows NT (sve verzije).

CD-ROM File System (CDFS)

Korisnički datotečni sustavi (Custom file systems). Razvijeni od software-skih proizvođača/dobavljača.

9. Objasniti kako se zadaju imena datoteka i direktorija u Windows datotečnom sustavu.

Puno ime putanje može početi s imenom uređaja (drive-a): A:, C:, … Ili imenom servera i dijeljenog resursa na mreži sljedećom sintaksom: \\servername\sharename

Znak za odvajanje unutar putanje je backslash — \

Windows podržava (a pogotovo u programskom jeziku C) znak forward slash ili samo slash — /

Ovo je uvedeno zbog još veće portabilnosti s UNIX-om, ali UNIX ne podržava imena uređaja, tamo sve počinje korijenskim direktorijom ‘/’

Imena direktorija i datoteka ne mogu koristiti ASCII 1–31. Ne smiju se koristiti ni znakovi  < > : " |, ali smiju se koristiti razmaci (space, blank). Windows je neosjetljiv na velika i mala slova (ali pamti originalno zadano ime), UNIX je u potpunosti osjetljiv na velika i mala slova. Imena datoteka i direktorija do 255 znakova duljine (250 u Windows 9x). Točka u imenu . razdvaja ime od nastavka (ekstenzije). Točka je dio imena; može biti više od jedne točke u imenu. .. (dvije točke) definiraju tekući i roditeljski direktorij.

10. Objasniti kreiranje/otvaranje datoteke koristeći CreateFile. Navesti i objasniti parametre.

. HANDLE CreateFile (LPCTSTR lpName,DWORD dwAccess, DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpsa, DWORD dwCreate,DWORD dwAttrsAndFlags, HANDLE hTemplateFile)

Vraća: HANDLE na otvoreni objekt datoteke, a INVALID_HANDLE_VALUE u slučaju greške.

Page 4: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Parametri

lpName - Pointer (pokazivač) na string koji je ime datoteke. Duljina je ograničena na 260. \\?\ je prefiks koji omogućava duga (NT) imena putanja

dwAccess - Pristup GENERIC_READ ili GENERIC_WRITE. Općenito: Ovakve zastavice možemo kombinirati s |

dwShareMode

– 0 — Ne može biti dijeljena; čak ni tekući proces ne može drugi handle ove datoteke

– FILE_SHARE_READ — Drugi procesi mogu čitati istovremeno ovu datoteku– FILE_SHARE_WRITE — Drugi procesi mogu pisati istoremeno u ovu

datotekulpsa - je pokazivač na SECURITY_ATTRIBUTES strukturu podataka. NULL, za sada ne koristimo

dwCreate - Kreira datoteku, prepisuje preko postojeće, itd.

CREATE_NEW — Pogreška ako datoteka već postoji

CREATE_ALWAYS — Postojeća datoteka bit će prepisana

OPEN_EXISTING — Pogreška ako datoteka ne postoji

OPEN_ALWAYS — Otvara ili kreira i ako ne postoji

TRUNCATE_EXISTING — Duljina datoteke će biti postavljena na 0

Primijetimo da nema “append” načina otvaranja (na koji smo navikli). Moramo se pozicionirati na kraj datoteke pa nastaviti s pisanjem.

dwAttrsAndFlags - 16 zastavica i atributa koji uključuju primjerice:

FILE_ATTRIBUTE_NORMAL — Nikakvi drugi atributi nisu postavljeni

FILE_ATTRIBUTE_READONLY — Ne može se pisati niti obrisati

FILE_FLAG_OVERLAPPED

FILE_FLAG_SEQUENTIAL_SCAN i FILE_FLAG_RANDOM_ACCESS omogućava bolju izvedbu, daje dobre upute za ‘cache’-ing

Atributi su svojstva samih datoteka (npr. FILE_ATTRIBUTE_HIDDEN). Zastavice su pridružene baš određenom HANDLE-u. Različiti HANDLE-ovi na isti objekt datoteke može imati različite zastavice. Primjerice: Jedan HANDLE je “overlapped” drugi ne, ili, jedan ima FILE_FLAG_SEQUENTIAL_SCAN a drugi FILE_FLAG_RANDOM_ACCESS.

Zastavice za procesiranje datoteke:

Page 5: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

FILE_FLAG_WRITE_THROUGH

FILE_FLAG_NO_BUFFERING

FILE_FLAG_DELETE_ON_CLOSE

hTemplateFile — Handle otvorene GENERIC_READ datoteke. Koristi template datoteku za iste atribute za novu datoteku.

11. Objasniti čitanje/pisanje datoteke pomoću ReadFile, WriteFile. Navesti i objasniti parametre.

BOOL ReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)

Vraća: TRUE ako je čitanje bilo uspješno. I onda kada se ni jedan byte ne pročita i pri pokušaju čitanja se pređe kraj datoteke.

FALSE indicira da je handle nevažeći, handle bez GENERIC_READ pristupa, itd.

Parametri

hFile — handle datoteke s obaveznim GENERIC_READ pristupom

lpBuffer — Memorijski spremnik (buffer) za spremanje pročitanih podataka (mora biti dovoljno veliki!)

nNumberOfBytesToRead - Broj byte-ova koji želimo pročitati

*lpNumberOfBytesRead - Stvarni broj pročitanih byte-ova. Nula nam označava kraj datoteke

lpOverlapped - Pokazivač na OVERLAPPED strukturu (NULL za sada)

BOOL WriteFile (HANDLE hFile, CONST VOID *lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)

Vraća: TRUE ako funkcija uspije, u suprotnom FALSE

Parametri su analogni parametrima kod čitanja datoteke

12. Usporediti ASCII i UNICODE skup znakova. Što znači generički skup znakova? Unicode je je računalni industrijski standard koji omogućava računalz dosljedno zastupanje i manipulacije teksta izraženog u većini svjetskih sustava pisanja. Unicode repertoar se sastoji od više od 100.000 znakova. Unicode može biti implementiran od različitog znakovnog kodiranja. Najčešće korišteni sustavi kodiranja su UTF-8 (koji koristi 1 bajt za sve ASCII znakove, koji imaju isti broj vrijednosti kao u standardnom ASCII kodiranje, i do 4 bytes za druge znakove), sada već zastarjelih-UCS-2 ( 2 byte koji koristi za sve znakove, ali ne

Page 6: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

uključuje svaki znak u Unicode standardu), i UTF-16 (koji nasleđuje UCS-2, koristeći 4 bajta za kodiranje znakova koji nedostaju iz UCS-2).

ASCII (od engl. American Standard Code for Information Interchange, još i kao Američki standardni znakovnik za razmjenu informacija, Američki standardni znakovnik za razmjenu obavijesti[) način je kodiranja znakova temeljen na engleskoj abecedi. ASCII kodovima predstavlja se tekst u računalima, komunikacijskoj opremi i drugim napravama koje obrađuju tekst. Kao standard je prvi put objavljen 1967., a dorađen je 1986. U kasnijoj inačici definira kodove za 33 većinom zastarjela kontrolna znaka koji djeluju na način ispisa teksta, te 95 navedenih znakova za ispis (počevši znakom razmaka).

ASCII za kodiranje znakova koristi samo 7 bita, ali se na njemu temelji i većina modernih znakovnika koji imaju veći raspon znakova od engleske abecede kao što su 8-bitni CP437, CP852, Windows-1250 i Windows-1252, te 16-bitni i 32-bitni Unicode.

13. Navesti neke funkcije koje koriste generički skup znakova. Po čemu se prepoznaju.

Funkcije: _tprintf, _stprintf, _tcslen, _itoa

14. Objasniti _tmain funkciju, te kada i zašto se ona koristi. Windows main je za ASCII; wmain je za Unicode. Umjesto int main (argc, char * argv[])

ili int main (argc, w_char * argv[]) koristiti:

#include <tchar.h>

int _tmain (int argc, LPTSTR argv[])

Makro _tmain se onda interpretira kao main ili wmain. Ovisno o definiciji _UNICODE. Ovo omogućava ispravan rad u svim okolnostima i svim mogućim kombinacijama.

15. Navesti i objasniti tri osnovna standardna uređaja. Windowsi imaju tri standardna uređaja za ulaz, za izlaz i za javljanje greške. Windows zahtjeva handlove na standardne uređaje, zatim te handlove dodjeljuje funkcijama.

Pozivamo postojeći handel:

HANDLE GetStdHandle (DWORD dwDevice)

Parametri:

DWORD dwDevice

Moraja imati jednu od ovih vrijednosti:

STD_INPUT_HANDLE

STD_OUTPUT_HANDLE

STD_ERROR_HANDLE

Page 7: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Vraća: Važeći handle ili INVALID_HANDLE_VALUE kod greške

Postavljamo handle na neku otvorenu datoteku koja će postati standardni uređaj

BOOL SetStdHandle (DWORD IDStdHandle,

HANDLE hHandle)

Parametri.

hHandle

Određuje otvorenu datoteku koja će biti standardni uređaj

IDStdHandle

Moraja imati jednu od ovih vrijednosti:

STD_INPUT_HANDLE

STD_OUTPUT_HANDLE

STD_ERROR_HANDLE

Vraća: TRUE ili FALSE koji pokazuje uspješno izvršenje ili grešku

16. Navesti osnovne API funkcije za upravljanje konzolom. BOOL SetConsoleMode (HANDLE hConsole,DWORD fdevMode)

Vraća: TRUE samo ako funkcija uspije

Parametri

hConsole - Mora imati GENERIC_WRITE pristup

fDevMode - Kako se procesiraju znakovi

– ENABLE_WINDOW_INPUT– ENABLE_LINE_INPUT– ENABLE_ECHO_INPUT– ENABLE_PROCESSED_INPUT– ENABLE_PROCESSED_OUTPUT– ENABLE_WRAP_AT_EOL_OUTPUT

BOOL ReadConsole (HANDLE hConsoleInput, LPVOID lpvBuffer, DWORD cchToRead, LPDWORD lpcchRead, LPVOID lpvReserved)

Vraća: TRUE samo ako uspije

BOOL WriteConsole - Potpuno analogni parametri kao kod ReadConsole

BOOL FreeConsole (VOID)

Page 8: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

BOOL AllocConsole (VOID)

17. Što je datotečni pokazivač? Objasniti kako on funkcionira. Prilikom otvaranja, datoteci je pridružen jedan pokazivač čitanja/pisanja, (File pointer).

DWORD SetFilePointer (HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh,

DWORD dwMoveMethod)

Vraća: U slučaju greške vraća vrijednost 0xFFFFFFFF.

Pokazivač je pridružen određenom HANDLE-u, a ne samoj datoteci. Sa svakim čitanjem i pisanjem pokazivač se automatski pomjera

Primjerice NTFS je 64-bitni datotečni sustav, zato su datotečni pokazivači u njemu dugački 64 bita. Datotečeni pokazivač određen je s dva dijela koji su 32-bitni.

18. Kako se može direktno upravljati datotečnim pokazivačem. SetFilePointer

Funkcija pomiče pointer određene datoteke.

DWORD SetFilePointer ( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod}

Parametri:

hFile

– handle od datoteke, mora biti napravljen tako da je moguće čitati/pisati (GENERIC_READ or GENERIC_WRITE)

lDistanceToMove

32-bitna(donja) vrijednost (signed),kojom određujemo za koliko će se pomakniti pokazivač

Ovaj parametar ovisi o stanju sljedećeg: lpDistanceToMoveHigh

lpDistanceToMoveHigh !=NULL – parmetri lpDistanceToMoveHigh i lDistanceToMove tvore jednu 64-bitnu vrijednosti za koju se pokazivač pomiče.

lpDistanceToMoveHigh ==NULL – parametar lDistanceToMove je 32-bitni(signed); za pozitivne vrijednosti pokazivač se pomiče naprijed a za negativne unazad

Page 9: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

lpDistanceToMoveHigh

32-bitna(gornja) vrijednost, kojom određujemo za koliko će se pomaknuti pokazivač(ako koristimo 64-bitni pokazivač)

Ako se ne koristi za gornja 32-bita mora bili postavljen na NULL

Kada nije NULL, ovaj parametar prima gornjih 32-bita od nove pozicijna na kojoj se pokazivač nalazi

dwMoveMethod

određujemo početnu točku(referencu) pokazivača

Može biti:

FILE_BEGIN – polazi od početka datoteke

FILE_CURRENT – polazi od trenutne vrijednosti pokazivača

FILE_END – polazi od završetka datoteke

Vraća:

Ako funkcija nije uspjela vraća vrijednost INVALID_SET_FILE_POINTER

Ako je funkcija uspjela i lpDistanceToMoveHigh==NULL, vraća vrijednost pokazivača odnosno donja 32-bita u obliku tipa DWORD

Ako je funkcija uspjela i lpDistanceToMoveHigh!=NULL, vraća donja 32-bita u obliku tipa DWORD i gornja 32-bita koja su zapisana u lpDistanceToMoveHigh u obliku DWORD

Ako pokazivač poprimi negativnu vrijednost, funkcija nije uspjela, pokazivač ostaje na vrijenosti koja je bila prije

Ako je lpDistanceToMoveHigh==NULL i nova pozicija pokazivača ne stane u 32-bita, funkcija je neuspješna i vraća vrijednosti INVALID_SET_FILE_POINTER

19. Kako se može postaviti, te kako odrediti veličina datoteke. Određivanje veličine datoteke:

DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh );

Vraća: 32-bitni donji dio veličine datoteke

Parametri:

hFile - Handle datoteke od koje određujemo veličinu

lpFileSizeHigh - Rezultat koji je 32-bitni gornji dio veličine datoteke

20. Opisati osnovne načine, te kako se manifestira zaključavanje datoteka.

Page 10: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Zaključavanje cijele ili samo dijela datoteke. Zaključavanje može biti samo za čitanje (read-only, sharable) ili za čitanje i pisanje (read-write, exclusive). Zaključavanje pripada procesu - svaki pokušaj pristupanja nekom dijelu datoteke (koristeći ReadFile ili WriteFile) će propasti ako je datoteka zaključana. Ne mogu se napraviti konfilikti prilikom zaključavanja. Može se odrediti da li će se čekati prilikom čitanja/pisanja da datoteka bude otključana ili se može trenutno prekinuti nakon pokušaja i ispisati odgovarajuću pogrešku.

21. Navesti API funkciju za zaključavanje datoteka, te objasniti njene parametre. BOOL LockFileEx (HANDLE hFile, DWORD dwFlags, DWORD dwReserved, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh, LPOVERLAPPED lpOverlapped)

Zaključava raspon byte-ova otvorene datoteke za shared pristup (više čitača) ili exclusive pristup (jedan čitač/pisač)

Parametri

hFile - Handle otvorene datoteka koja mora imati bar jedan od GENERIC_READ ili GENERIC_WRITE pristupa

dwFlags - Određuje način zaključavanja i da li da čekamo dok datoteka bude slobodna

- LOCKFILE_EXCLUSIVE_LOCK, ako je postavljen, traži se exclusivno zaključavanje čitanja i pisanja; u suprotnom, traži se shared (samo za čitanje) zaključavanje.

- LOCKFILE_FAIL_IMMEDIATELY, ako je postavljeno, određuje da funkcija mora završiti i vratiti FALSE ukoliko se takvo zaključavanje ne može dobiti; u suprotnom, zadržava (blokira) proces sve dok se ne dobije zahtjevano zaključavanje

dwReserved - mora biti nula

nNumberOfBytesToLockLow i nNumberOfBytesToLockHigh određuju duljinu raspona byte-ova

lpOverlapped - Pokazuje na OVERLAPPED strukturu podataka koja sadrži podatke o početku raspona byte-ova

- OVERLAPPED struktura sadrži dva člana koja se moraju postaviti (ostali članovi te strukture se ignoriraju), naime:- DWORD Offset i- DWORD OffsetHigh

Zaključavanje datoteke može se maknuti s odgovarajućom funkcijom UnlockFileEx, koristeći sve iste parametre osim parametra dwFlags.

22. Opisati razlike između zaključavanja datoteka kod Windows 9x i današnjih verzija.

Kod sadašnjih verzija se naviše koristi funkcija LockFileEx dok se kod win 9x koristila funkcija LockFile.

Page 11: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

LockFileEx funkcija je član proširenog(extended)I/O razreda. Ona zahtjeva da se navede 64-bitna pozicija datoteke i opseg koji će se zaključati.

BOOL LockFileEx ( HANDLE hFile, DWORD dwFlags, DWORD dwReserved, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh, LPOVERLAPPED lpOverlapped)}LockFileEx funkcija zaključava blok bitova otvorene datoteke za oba pristupa: dijeljeni(shared)-više od jednog čita

i ekskluzivni(exclusive)-jedan čita/piše

LockFile funkcija ima ograničenja. Kod nje je moguće koristiti smo ekskluzivni pristup i ona po završetku se odmah vraća. Zbog brzog povratka funkcija LockFile ne blokira.

23. Navesti svojstva zaključavanja datoteka. Kada „otključavamo“ zaključano, moramo koristiti isti raspon byte-ova s kojim smo i zaključali. Zaključavanjem se ne može preklapati već postojeće zaključane raspone unutar datoteke. Može se zaključavati raspone koji su veći od duljine datoteke. Zaključavanje se ne naslijeđuje u novo-kreiranim procesima.

24. Opisati logiku zaključavanja datoteka. Zahtjevani način zaključavanja

Postojeće zaključavanje shared zaključavanje ekskluzivno zaključavanjenema dopušteno dopuštenoshared zaklj. (jedno ili više) dopušteno zabranjenoekskluzivno zaklj. dopušteno zabranjeno

25. Objasniti ponašanje I/O operacija u slučaju zaključavanja datoteka. I/O operacije

Postojeće zaključavanje Read Writenema uspješno uspješnoshared zaklj. (jedno ili više) uspješno. Nije potrebno da

proces koji čita i posjeduje svoje zaključavanje na danom rasponu u datoteci

odbijeno

ekskluzivno zaklj. Uspjeno samo ako proces ima svoje zaključavanje nad datotekom, inače nije uspješno.

26. Kako se obavlja brisanje i micanje datoteka. Navesti API funkcije i njihove parametre.

Brisanje datoteke: BOOL DeleteFile (LPCTSTR lpFileName)

Page 12: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Ne može se obrisati trenutno otvorena datoteka pod Windows NT. (Ali pod Windows 9x se može).

Preimenovanje:

BOOL MoveFile (LPCTSTR lpExisting, LPCTSTR lpNew) - Izvorna i odredišna datoteka moraju biti na istom uređaju (drive-u).

BOOL MoveFileEx (LPCTSTR lpExisting, LPCTSTR lpNew, DWORD dwFlags) - Izvorna i odredišna datoteka mogu biti na različitim uređajima

Parametri:

lpExisting - Ime postojeće datoteke ili direktorija

lpNew - Ne smije postojati kod MoveFile

dwFlags:

MOVEFILE_REPLACE_EXISTING - Zamjenjujemo ako već postoji takva datoteka

MOVEFILE_COPY_ALLOWED - Kopiraj, onda pobriši izvornu datoteku

27. Kako se upravlja direktorijima. Navesti API funkcije i njihove parametre. . Kreiranje direktorija:

BOOL CreateDirectory (LPCTSTR lpPath, LPSECURITY_ATTRIBUTES lpsa)

Brisanje direktorija:

BOOL RemoveDirectory (LPCTSTR lpPath)

lpPath - Pokazivač na string s imenom direktorija

Postavljanje direktorija:

BOOL SetCurrentDirectory (LPCTSTR lpCurDir)

lpCurDir - Putanja na ime novog tekućeg direktorija

Zapravo postoji tekući direktorij koji se pamti za svaki uređaj (drive) posebno SetCurrentDirectory (TEXT("C:")); Ovako ćemo postaviti direktorij uređaja C: na njegovu tekuću vrijednost

DWORD GetCurrentDirectory (DWORD cchCurDir, LPTSTR lpCurDir)

Vraća:

Duljinu stringa vraćene putanje. Zahtjevanu veličinu spremnika ako ako spremnik nije dovoljno veliki

Ovo uključuje i još jedan znak za kraj stringa.Nulu ako funkcija ne uspije.

Page 13: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Windows koristi ovu tehniku kad god duljina rezultata nije poznata

Parametri

cchCurDir - Duljina znakova spremnika za putanju direktorija (cch - “Count in characters”)

lpCurDir - Pokazivač na spremnik u koji će se spremiti putanja tekućeg direktorija

28. Navesti funkcije za traženje datoteka unutar tekućeg direktorija. HANDLE FindFirstFile (LPCTSTR lpSearchFile, LPWIN32_FIND_DATA lpffd)

Vraća: “search handle” - Handle datoteke koja je pronađena. INVALID_HANDLE_VALUE nam govori da je došlo do greške

Parametri

lpSearchFile - Pokazivač na direktorij ili ime putanje. Mogu se koristiti i džokeri (* i ?)

lpffd - Pokazivač na WIN32_FIND_DATA strukturu podataka

BOOL FindNextFile (HANDLE hFindFile, LPWIN32_FIND_DATA lpffd

- FALSE kada više nema datoteka koje zadovoljavaju postavljeni kriterij

29. Opisati strukturu WIN32_FIND_DATA. Koje sve podatke o datoteci nalazimo u toj strukturi?

typedef struct _WIN32_FIND_DATA {DWORD dwFileAttributes; /* vidi CreateFile */FILETIME ftCreationTime; /* 64-bitni int */FILETIME ftLastAccessTime;FILETIME ftLastWriteTime;DWORD nFileSizeHigh;DWORD nFileSizeLow;DWORD dwReserved0;DWORD dwReserved1;TCHAR cFileName [MAX_PATH]; /* ime datoteke*/TCHAR cAlternateFileName [14]; /* 8.3 ime */

} WIN32_FIND_DATA;daje informacije o atributima, datumu kreiranja, vremenu zadnjeg prostupa i upisivanja u datoteku, veličinu datoteke, puno ime datoteke i skraćeno ime (stari 8.3 sustav).

30. Na koji način možemo pročitati vrijeme nastanka datoteke i kako ga možemo pretvoriti u prihvatljiv vremenski format?

Vrijeme očitavamo sa:

BOOL GetFileTime (HANDLE hFile, LPFILETIME lpftCreation, LPFILETIME lpftLastAccess, LPFILETIME lpftLastWrite)

Page 14: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Pretvaranje vremena u prihvatljivi format:

BOOL FileTimeToSystemTime(CONST FILETIME * lpFileTime, LPSYSTEMTIME lpSystemTime)

III. MEMORIJA 31. Skicirati shemu arhitekture upravljanja memorijom kod Windows-a

32. Definirati memorijski 'heap'. Veza između procesa i 'heap-a'.

Heap je memorijsko polje unutar virtualnog adresnog prostora procesa. Te iz njih proces dodijeljuje memoriju. Heap-ovi su windows objekti, pa tako imaju handle-ove, a handle-ovi su neophodni prilikom dodijeljivanja memorije. Svaki proces ima svoj default heap. Proces može sadržavati nekoliko heap-ova, a oni se mogu razdvojiti kako bi se postigle sljedeće prednosti (Pravednost - unutar niti i samog korištenja, Učinkovitost zauzimanja - blokovi fiksne veličine u svakom heapu, Učinkovitost oslobađanja - može se osloboditi čitava struktura podataka unutar jednog funkcijskog poziva, Lokalnost kod adresiranja ).

Page 15: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

33. Kreiranje i upravljanje memorijskim 'heap-ovima'. Navesti API Funkcije.

Slika pokazuje upravljanje memorijom kod heap-a.API FUNKCIJE:

1. Kreiranje Heap-a

HANDLE HeapCreate ( DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize)

Vraća: Handle od procesnog heapa; NULL u slučaju greške

flOptions -> kombinacija dvije zastavice: HEAP_GENERATE_EXCEPTIONS i HEAP_NO_SERIALIZE dwInitialSize -> određuje koliko je fizičkog spremišta dodijeljeno heap-u.dwMaximumSize -> određuje koliko velik heap može postati, 0 je rastući heap, a ako nije 0 onda je ne rastući heap.

2. Kreiranje procesnog heap-aHANDLE GetProcessHeap (VOID)

Vraća: Handle od procesnog heapa; NULL u slučaju greške

3. Unistavanje Heap-a BOOL HeapDestroy (HANDLE hHeap)

– hHeap — heap napravljen koristeći HeapCreate – Nikad ne uništavati procesni heap (dobiven koristeći GetProcessHeap)

4. Dohvaćanje memorijskih blokova iz heap-aLPVOID HeapAlloc (

Page 16: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

HANDLE hHeap, DWORD dwFlags,

SIZE_T dwBytes)

Vraća: Pokazivač na blok zauzete memorije (veličine dwBytes) ili NULL ako ne uspije (osim ako nije specifirano generiranje iznimki)

- hHeap — Handle od procesnog heapa dobivenog s GetProcessHeap ili našeg kreiranog heapa dobivenog s HeapCreate

- dwFlags — Kombinacija sljedećih zastavica:– HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE i

HEAP_ZERO_MEMORY — Zauzeta memorija postavlja se na nulu (ako stavimo ovo, onda izvođenje funkcije traje “malo” duže)

5. Oddjeljivanje memorije u heap-uBOOL HeapFree (

HANDLE hHeap, DWORD dwFlags, LPVOID lpMem)

- dwFlags — Treba biti nula (ili HEAP_NO_SERIALIZE)- lpMem — Treba imati vrijednost koju vraća funkcija HeapAlloc ili HeapReAlloc - hHeap — Treba biti heap iz kojeg je zauzet lpMem

6. premještanje memorijskih blokova iz heap-aLPVOID HeapReAlloc ( HANDLE hHeap, DWORD dwFlags, LPVOID lpMem,

SIZE_T dwBytes)

Vraća: Pokazivač na blok memorije koji će biti nanovo zauzet. Kod greške vraća se NULL ili se pojavljuje iznimka.

- hHeap — Handle od procesnog heapa dobivenog s GetProcessHeap ili našeg kreiranog heapa dobivenog s HeapCreate

- dwFlags — Neke osnovne kontrolne opcije:– HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE,

HEAP_ZERO_MEMORY ( Samo novo-zauzeta memorija je incijalizirana) i HEAP_REALLOC_IN_PLACE_ONLY ( Ne treba micati blok )

- lpMem — Postojeći blok u heapu hHeap za koji treba zauzeti memoriju ponovno - dwByte — Nova veličina bloka

7. Određivanje veličine dodijeljenog blokaDWORD HeapSize (

HANDLE hHeap, DWORD dwFlags,

LPCVOID lpMem)

Page 17: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Vraća: Veličina bloka ili nula prilikom greške.

8. Ostale funkcije- HeapValidate (Određuje da li je heap oštećen)- HeapCompact (Sažima povezane slobodne blokove; vraća veličinu u byte-ima )- HeapWalk (Pobrojava sve blokove zauzete unutar heapa)

34. Objasniti memorijski mapirane datoteke. Što se može postići njima, te koje su prednosti mapiranja datoteka.

Dinamička memorija u heap-ovima mora se fizički dodijeliti u mapiranu datoteku. Operacijski sustav kontrolira pomak te memorije u mapiranu datoteku i odmah zaopisuje virtualni adresni prostor procesa u mapiranu datoteku, a kad se proces prekine prostor u mapiranoj datoteci se oddjeljuje. Dodijeljivanje memorije u obične datoteke, umjesto u datoteke za straničenje povlači neke prednosti:

– Nikada ne treba raditi direktni datotečni I/O

– Strukture podataka koje kreirate sačuvane unutar datoteke

– Mogu se koristiti algoritmi koji se koriste unutar memorije (procesiranje stringova, sortiranja, pretraživanja) za procesiranje podataka iako datoteka može biti puno veća nego što je ukupna fizička memorija

– Nema potrebe za upravljanjem spremnicima (bufferima) i podacima datoteke koje spremnici sadrže

– Višestruki procesi mogu dijeliti memoriju (to je jedini način), a prikazi datoteke bit će koherentni (sukladni)

– Nema potrebe da se zauzima prostor u datoteci za straničenje

Na slici mozemo vidjeti adresni prostor procesa mapiran u datoteku.

35. Navesti funkcije za rad s objektima mapirane datoteke

Prvi korak je da kreiramo objekt mapirane datoteke, to možemo sa sljedećom funkcijom:

Page 18: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

HANDLE CreateFileMapping ( HANDLE hFile, LPSECURITY_ATTRIBUTES lpsa, DWORD dwProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpMapName)

Vraća: Handle mapirane (preslikane) datoetke ili NULL

– hFile — handle otvorene datoteke; zastavice zaštite kompatibilne s dwProtect – LPSECURITY_ATTRIBUTES — NULL za sada – dwProtect — Kako se može pristupiti mapiranoj datoteci:

• PAGE_READONLY — Stranice u mapiranom području su samo za čitanje

• PAGE_READWRITE — Puni pristup ako i hFile ima obadva GENERIC_READ i GENERIC_WRITE pristup

• PAGE_WRITECOPY — Kada se napravi neka promjena u mapiranoj memoriji, kopija će biti zapisana u datoteku za straničenje

– dwMaximumSizeHigh i dwMaximumSizeLow — Određuju veličinu mapiranog objekta; 0 za trenutnu veličinu datoteke. Datoteka će biti proširena ako je tekuća veličina datoteke manja od veličine mapiranog objekta (tj. preslika).

– lpMapName — Imenuje mapriani objekt, s time dopuštajući drugim procesima da dijele isti taj objekt

Handle na mapiranu datoteku može se dobiti isto tako ako zadamo već postojeće ime mapiranog objekta, sljedećom funkcijom:

HANDLE OpenFileMapping ( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpMapName)

Vraća: Handle mapirane datoteke ili NULL

CloseHandle uništava handle mapriane datoeke (kao i handle-ove druge vrste)

36. Usporediti upotrebu statičkih i dinamičkih biblioteka funkcija.Najjednostavniji način stvaranja programa je sljedeći, skupimo sav izvorni kod svih

potrebnih funkcija programa, prevedemo ga, te povežemo sve cijeline u jedan izvršni image. Kako bi pojednostavili izgradnju programa koristili smo statičke biblioteke iz kojih smo jednostavno pozivali funkcije kao što je npr. ErrorReporting. Ovakav "single-image" način programiranja je jednostavan no ima nekoliko mana kao što su:

izvršni image može zauzimati jako puno diskovnog prostora i fizičke memorije te kao takav zahtjeva dulje vrijeme izvođenja i usporava distributivnost.

Svaki update zahtjeva ponovnu izgradnju cijele izvršne datoteke. Performanse programa ne ovise samo o performansama sustava, već i o verziji

programa koja je najbolja za pojedini sustav. Program je ovisan o postavkama sustava.Kako bi izbjegli gore navedene nedostatke, koristimo dinamički povezane biblioteke

(DLL). Rukovanje memorijom i mapiranje datoteka su važne tehnike u irokom spektru

Page 19: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

izgradnje programa. Operacijski sustav sam kotisti rukovanje memorijom, a DLL-ovi predstavljaju metodu mapiranja datoteka. Neke od prednosti dinamički povezanih biblioteka su:

Funkcije pojedine biblioteke se povezuju pri: učitavanju programa – implicitno povezivanje izvođenju programa – eksplicitno povezivanje

Image programa je znatno manji:- ne uključuje funkcije iz biblioteke

Više programa može koristiti jedan DLL:- samo jedna kopija će biti učitana u memoriju

- svi programi preslikavaju svoj adresni prostor za DLL kod

- svaka nit će imati svoju kopiju ne djeljenog prostora na stogu

DLL ovi se, u ograničenoj formi, koriste u svakom operacjskom sustavu. Npr. UNIX koristi termin dijeljene biblioteke ("shared libraries") kao alternativa dinamički povezanim bibliotekama. Među ostalim, Windows koristi dinamički povezane datoteke za implementaciju grafičkog sučelja.

37. Objasniti implicitno povezivanje kod DLL-ova. Kako se funkcije eksportiraju/importiraju?

Implicitno, ili prilikom učitavanja, povezivanje je lakša od dviju tehnika. Koraci:

–Prikupiti i napraviti izvorni kod funkcija kao DLL–Proces pravljenja (Build) projekta stvara .LIB datoteku–Staviti .LIB u projektni ‘library’ direktorij–Proces pravljenja također stvara .DLL datoteku–Sadrži aktuelnu izvršnu sliku–Stavljena je u isti direktorij kao i aplikacija koja ju koristiTekući radni direktorij je sekundarna lokacija–Nakon toga sistemski direktorij, Windows direktorij, PATH–Program učitava DLL tijekom svoje incijalizacije–Mora se “eksportirati” funkcijsko povezivanje unutar DLL izvornog koda

DLL ulazna točka mora biti deklarirana- Microsoft C, koristi _declspec (dllexport) modifikator smještaja:

_declspec (dllexport) DWORD MyFunction (...);

Program koji poziva funkciju, deklarira ju kao funkciju koju treba importirati–Koristi se _declspec (dllimport) modifikator smještaja

Standardna tehnika unutar ‘include’ datoteke–Treba koristiti preprocesorsku varijablu kao što je primjerice “MYPROJ_EXPORTS“–“MYPROJ” je ime vašeg projekta

#ifdef MYPROJ_EXPORTS

Page 20: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

#define LIBSPEC _declspec (dllexport)#else#define LIBSPEC _declspec (dllimport)#endifLIBSPEC DWORD MyFunction (...);

–Unutar DLL projekta definiramo MYPROJ_EXPORTS–Aplikacija koja poziva ostavlja MYPROJ_EXPORTS nedefiniran

Mogu se eksportirati i importirati i varijable isto kao funkcijske ulazne točke.

38. Objasniti eksplicitno povezivanje kod DLL-ova. Koje API funkcije i koje tehnike se koriste?

Eksplicitno (prilikom izvođenja) povezivanje zahtjeva:

–Program može učitati DLL — LoadLibrary

–Traženje adrese ulazne točke funkcije — GetProcAddress

–Prevođenje (cast) adresnog pokazivača na tip funkcije

–Pozivanje funkcije koristeći pokazivač

–Opcionalno oslobađanje biblioteke — FreeLibrary

–Primjedba: Funkcija nije deklarirana u programu koji poziva DLL; zato se definira varijabla kao pokazivač na funkciju

–Zbog toga, nije potrebna .LIB datoteka prilikom povezivanja (znači linkanja programa koji koristi DLL)

HINSTANCE LoadLibrary (LPCTSTR lpLibFileName)

Vraćeni handle je NULL ako dođe do greške.

HINSTANCE, radije nego konvencionalni HANDLE

–Sadrži drugačiju informaciju

BOOL FreeLibrary (HINSTANCE hLibModule)

Gotovi smo s upotrebom biblioteke ili želimo neku drugu verziju.

LoadLibraryEx je slična funkcija

–Nekoliko zastavica koje određuju alternativne putanje traženja biblioteke te učitavanje biblioteke kao datoteke s podacima

Za dobivanje ulazne točke funkcije:

FARPROC GetProcAddress (HMODULE hModule,LPCSTR lpProcName)

hModule jest primjerak (instance) dobiven od LoadLibrary

–Ili GetModuleHandle (ovu funkciju ovdje ne opisujemo)

lpProcName jest ime ulazne točke funkcije

–Ne može biti Unicode.

NULL se vraća u slučaju greške

FARPROC, nešto kao “dugački pokazivač” - zastarjelo (vuče korjene još od 16-bitnih pokazivača)

IV. PROCESI

Page 21: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

39. Skicirati shemu procesa i njegovih niti. Što sve ima proces? Process

–Windows procesi sadrže svoje neovisne virtualne adresne prostore gdje se nalaze i kod i podaci–Svaki proces sadrži jednu ili više neovisno izvršavanih niti–Windows nit (thread) je osnovna izvedbena jedinica

40. Kako se kreira proces? Navesti funkciju i objasniti njene parametre.Osnovna Windows funkcija za kreiranje procesa je CreateProcess. Funkcija kreira proces s jednom niti. Osnovna sintaksa funkcije je:

BOOL CreateProcess ( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpsaProcess, LPSECURITY_ATTRIBUTES lpsaThread, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurDir, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcInfo)Parametri funkcije:

lpApplicationName i lpCommandLine zajedno definiraju izvršni program i postavljaju argumente izvršne linije.

lpsaProcess i lpsaThread pokazuju na proces i na zaštitu niti postavljanjem struktura

Kod

Globalne varijable

Procesni heap

Resursi procesaO tv o rene da to etk e, H ea po v i ,

· · ·

Blok okruženja (environm ent)

· · ·

Nit 1

T LS

Stog

Nit N

T LS

Stog

Page 22: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

koje opisuju sigurnosne atribute funkcije. Ako je NULL, parametar opisuje default sigurnost zadanu operacijskim sustavom.

binheritHandles pokazuje da li novi proces nasljeđuje handle-ove starih procesa. dwCreationFlags uključuje sljedeće zastavice:

CREATE_SUSPENDED – pokazuje da je primarna nit u suspend načinu rada i da se će se nastaviti s radom kad se pozove ResumeThread funkcija.

DETACHED_PROCESS i CREATE_NEW_CONSOLE su međusobno isključive. Nikad se ne postavljaju obje. Prva zastavica kreira proces bez konzole, druga kreira proces sa konzolom. Ako ne postavimo zastavicu, proces nasljeđuje postavke roditeljske konzole.

CREATE_NEW_PROCESS_GROUP ukazuje da je novi proces korijenski proces za cijelu grupu novih procesa. Svi procesi u toj grupi dijele istu konzolu.

lpEnvironment ukazuje na postavke okoline novog procesa kao npr. imena i zadane stringove kao što su putanje za pretraživanja. Ako je parametar NULL tada parametar nasljeđuje postavke roditeljskog procesa.

lpCurDir ukazuje na postavke direktorija za nove procese. Ako je NULL nasljeđuje mjesto koje sadrži roditeljski proces.

lpStartupInfo ukazuje na postavke prozora i standardne postavke uređaja za novi proces.

lpProcInfo ukazuje na strukturu povratnih procesa, thread handleova i identifikacije.

41. Kada startamo proces samo s imenom izvršne datoteke, kojim će se redoslijedom tražiti takva izvršna datoteka u datotečnom sustavu Windows‐a?

Ime izvršne datoteke navedeno je ili u lpApplicationName ili u lpCommandLine.

Ako lpApplicationName nije NULL, onda određuje ime izvršne datoteke. Navodi se

puna putanja i ime datoteke ili se koristi djelomično ime a uzima se tekući disk i

tekući direktorij, nema dodatnog traženja.

Ako je lpApplicationName string NULL, uzima se prvi token iz lpCommandLine kao

ime programa. Ako ne sadrži punu putanju pretražuje se na slijedeći način:

1. Direktorij trenutne slike procesa

2. Tekući direktorij

3. Windows system direktorij, koji se može dobiti sa GetSystemDirectory

4. Windows direktorij koji se može dobiti sa GetWindowsDirectory

5. Direktoriji navedeni u okolišnoj varijabli PATH

42. Mogu li različiti procesi dijeliti iste resurse? Objasniti pojam 'nasljedivosti' handle‐ova.

Različiti procesi mogu dijeliti resurse, ali ne eksplicitno, za razliku od niti. Procesi imaju

vlastiti adresni prostor, svaki proces ima vlastitu kopiju segmenta podataka roditeljskog

procesa te za međusobnu komunikaciju moraju koristiti mehanizme za međuprocesnu

Page 23: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

komunikaciju. Čak i kad se memorija eksplicitno dijeli, kod memorijski mapiranih datoteka,

procesi koji ju dijele pristupaju takvoj datoteci koristeći različite virtualne adrese.

Proces dijete često mora dobiti pristup objektu koji je referenciran handleom u roditeljskom

procesu. Ako je ovaj handle nasljediv tada dijete može dobiti kopiju roditeljeva otvorenog

handlea. Često se na ovaj način dijele standardni handleovi za ulaz i izlaz. Kako bismo handle

učinili nasljedivim potrebno je nekoliko koraka.

bInheritHandles zastavica pri pozivu CreateProcess određuje hoće li dijete naslijediti

kopije nasljedivih handleova na otvorene datoteke itd. Ona se može smatrati glavnim

prekidačem, koji se odnosi na sve handleove

Potrebno je također svaki pojedini handle učiniti nasljedivim, jer po defaultu oni to

nisu. Za to se koristi SECURITY_ATTRIBUTES struktura pri stvaranju koja također

ima onaj flag koji sse treba postaviti u 1.

HANDLE h1, h2, h3;SECURITY_ATTRIBUTES sa ={sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };...h1 = CreateFile (..., &sa, ... ); /* Inheritable. */h2 = CreateFile (..., NULL, ... ); /* Not inheritable. */h3 = CreateFile (..., &sa, ...);/* Inheritable. sa can be reused. */

Proces dijete također mora znati vrijednost handlea, pa mu to roditelj mora prenijeti koristeći mehanizme za međuprocesnu komunikaciju.

Naslijeđeni handleovi su odvojene kopije, stoga proces dijete i proces roditelj mogu pristupati istoj datoteci koristeći različite pokazivače. Svaki od procesa može i treba zatvoriti svoje handleove.

Page 24: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

43. Što znači 'identitet' procesa i možemo li iz drugih procesa upravljati već kreiranim procesom?

Identitet procesa je zapravo broj koji koristi operacijski sustav kako bi jedinstveno identificirao proces. Pomoću process id-a može se dobiti handle na taj proces korištenjem open process funkcije. Da se dobije identitet tekućeg procesa koriste se dvije funkcije.

HANDLE GetCurrentProcess (VOID)

DWORD GetCurrentProcessId (VOID)GetCurrentProcess zapravo vraća pseudohandle koji nije nasljediv, a ta vrijednost može se

upotrijebiti uvijek kada je procesu potreban vlastiti handle.

GetCurrentProcessId vraća ID - identifikacijski broj tekućeg procesa

Upravljanje već kreiranim procesom:

OPEN PROCESS:HANDLE OpenProcess ( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId)

Vraća nam handle procesa (nije ograničeno na pseudohandle) ili null u slučaju greške.

dwAccess — Određuje operacije koje se mogu izvoditi nad handle-om, to uključuje:

– SYNCHRONIZE

• Omogućuje procesima da čekaju dok proces ne završi

– PROCESS_ALL_ACCESS

• Sve zastavice pristupa su postavljene

– PROCESS_TERMINATE

• Proces se može završiti pozivom funkcije TerminateProcess

– PROCESS_QUERY_INFORMATION

• Handle se može koristiti kod GetExitCodeProcess i GetPriorityClass da

se dobiju informacije o procesu

bInheritHandle Određuje da li je novi handle nasljediv

ProcessID Identifikacijski broj procesa koji treba handle.

UNIX

PID ekvivalent process ID-u, getpid sličan GetCurrentProcessID-u. exit je sličan Exitprocess a za završavanje drugog procesa koristi se SIGKILL

44. Na koje načine možemo završiti proces? Kako čekati da proces završi

Page 25: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Nakon što je proces završio, on (ili točnije nit koja se unutar njega izvodi) može pozvati ExitProcess sa izlaznim kodom koji je povezan sa procesom. Ova funkcija ne vraća ništa nego završava pozivajući proces i sve njegove niti.

VOID ExitProcess (UINT nExitCode)

Drugi proces može koristiti GetExitCodeProcess kako bi odredio izlazni kod.

BOOL GetExitCodeProcess ( HANDLE hProcess, LPDWORD lpExitCode)

Proces određen sa hProcess mora imati pristup PROCESS_QUERY_INFORMATION.

lpExitCode pokazivač je na DWORD koja prima vrijednost a jedna jedna od mogućih vreijednosti je STILL_ACTIVE što znač da proces nije još završio. Jedan proces može završiti drugoga ako handle ima PROCESS_TERMINATE pristup.

BOOL TerminateProcess ( HANDLE hProcess,

UINT uExitCode)

Prije izlaska iz procesa treba osloboditi sve resurse koje je možda dijelio as drugim procesima.

Na završavanje procesa čeka se Windows wait funkcijama koje ovdje imaju nekoliko zanimljivih odlika.

Funkcije mogu čekati na mnogo različitih tipova objekata, handleovi procesa su samo prva uporaba wait funkcija

Funkcije mogu čekati na jedan proces, prvi od nekoliko navedenih procesa ili sve procese u grupi.

Postoji vrijeme TIME-OUT-a odnosno koliko dugo će se čekati prije odustajanja.

Dvije osnovne funkcije za čekanje:

DWORD WaitForSingleObject ( HANDLE hObject, DWORD dwMilliseconds)

DWORD WaitForMultipleObjects ( DWORD nCount, CONST HANDLE *lpHandles, BOOL fWaitAll, DWORD dwMilliseconds)

Navodi se ili handle na jedan proces (hObject) ili vektor handleova referenciran sa

Page 26: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

lpHandles.nCount, veličinom vektora koja ne bi trbala prijeći MAXIMUM_WAIT_OBJECTS (64 kod WinNT)

dwMilliseconds je vrijeem time-outa u milisekundama. Vrijednost 0 znači da funkcija vraća rezultat odmah nakon testiranja stanja navedenih objekata. Infinite je da čeka neograničeno.

fWaitAll,parametar u drugoj funkciji navodi da je potrebno čekati sve procese

GetExitCodeProcess Određuje izlazni kod procesa

Moguće vrijednosti koje funkcija vraća:

WAIT_OBJECT_0 znači da je proces završen u slučaju WaitForSingleObject ili je svih nCount objekata istovremeno završeno u posebnom slučaju WaitForMultipleObjects gdje je fWaitAll postavljen u trUE.

WAIT_OBJECT_0+n, gdje +<=n < nCount. Oduzme li se WAIT_OBJECT_0 od vraćene vrijednosti doznajemo koji je proces završio dok čekamo na završavanje bilo kojeg procesa iz grupe. Ako ih završi nekoliko istovremeno vraćena vrijednost je najmanjamoguća.

WAIT_TIMEOUT označava da je isteklo vrijeme čekanja prije nego je i jedan proces završio.

WAIT_FAILED označava da je došlo do greške u pozivu.

WAIT_ABANDONED nije moguće kod procesa već se koristi kod drugih objekata

V. NITI

45. Kako se kreira nit? Navesti funkciju i objasniti parametreKao i procesi, niti koriste handleove i postoji sistemski poziv CreateThread koji će napraviti nitu adresnom prostoru pozivajućeg procesa.Potrebno je:

Navesti početnu adresu niti u kodu procesa Navesti veličinu stoga koji će zauzeti mjesto u virtualnom adresnom prostoru procesa.

Defaultna veličina jednaka je veličini stoga virtualne memorije procesa.

Odrediti parametar za pokazivač na nit, može biti bilo što a interpretira ga sama nit

Create Thread vraća kao rezultat ID vrijednost niti i njen handle, NULL vrijednost handlea označava da je došlo do pogreške.

HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpThreadParm, DWORD dwCreationFlags, LPDWORD lpThreadId)

Page 27: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Parametri

lpsa struktura sa sigurnosnim atributima.

dwStackSize veličina stoga nove niti u bytima, 0 za default.

lpStartAddr Pokazivač na adresu funkcije (unutar pozivajućeg procesa) koja se izvršava .Ta funkcija prihvaća jedan pokazivač kao parametar i vraća 32-bitni DWORD izlazni kod niti. Nit može interpretirati argument kao DWORD ili kao pokazivač

lpThreadParm pokazivač koji se prenosi kao argument niti, i interpretira ga sama nit.

dwCreationFlags, Ako 0, nit se izvršava odmah Ako je dwCreationFlags CREATE_SUSPENDED, nova nit bit će u stanju čekanja, i čekat će na ResumeThread da bi nastavila izvršavanje.

lpThreadId pokazivač na DWORD koji prima ID nove niti. Može biti null kod W2000/NT.

46. Kako mora izgledati funkcija koja je ulazna točka u nit, te na koje načine možemo završiti s izvođenjem niti?

Funkcija koja predstavlja ulaznu točku u nit ima sljedeći oblik:

DWORD WINAPI imefunkcije(PVOID parametar) {...ExitThread(IzlazniKod); //ilireturn IzlazniKod;

}

Načini na koje možemo završiti izvođenje niti:

a) Pozivom funkcije ExitProcess sve niti završavaju kao i sam proces. Izlazni kod koji je vraćen od primarne niti procesa je isti kao izlazni kod cijelog procesa. Nit može jednostavno završiti i vratiti svoj izlazni kod.

b) Pozivom funkcije ExitThread (VOID ExitThread(DWORD IzlazniKod);) završava nit te se oslobađa sav zauzet memorijski prostor. Ovo je preferirani način završavanja niti.

c) Pozivom funkcije TerminateThread (BOOL TerminateThread(HANDLE hnit, DWORD IzlazniKod);)moguće je iz tekuće niti završiti neku drugu nit. Nedostatak je to što memorijski prostor stoga prekinute niti neće biti oslobođen kao i druge resurse koje je zauzela prekinuta nit.

47. Objasniti kako se može privremeno zaustavljati i ponovno nastavljati s izvođenjem niti.

Svaka nit ima brojač suspenzije, a nit se može izvoditi samo ako je taj brojač 0. Nit može uvećavati ili smanjitati brojač suspenzije neke druge niti pomoću funkcija SuspendThread i ResumeThread. Također se svaka nit može stvoriti u suspendiranom stanju, tj. s brojačom suspenzije jednakim 1.

Page 28: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Prototipovi funkcija za privremeno zaustavljanje i ponovno nastavljanje izvođenja niti:

DWORD SuspendThread(HANDLE hnit);

DWORD ResumeThread(HANDLE hnit);

Obje funkcije, ako su uspješne vraćaju prethodnu vrijednost brojač suspenzije, dok u suprotnom 0xFFFFFFFF označava neuspjeh.

Na ovaj način je moguće postići istovremeni start više niti, dok je nepogodan za opću sinkronizaciju niti.

48. Na koji način možemo čekati da jedna ili više niti završe s radom? Opisati funkcije za čekanje i njihove parametre.

Nit može čekati da druga nit završi na isti način kao što niti čekaju da završi proces. Funkcije koje se koriste za čekanje završetka niti ali ne samo niti su: WaitForSingleObject i WaitForMultipleObjects. Obje funkcije koriste handleove niti. Handleovi koje se predaju u polju funkciji WaitForSingleObject mogu biti različitih tipova, tako primjerice mogu se u istom polju nalaziti handleovi niti, procesa i drugi tipovi handleova.

Funkcija WaitForMultipleObjects može čekati na najviše MAXIMUM_WAIT_OBJECTS (64) handleova istovremeno, međutim u slučaju većeg broja handleova moguće je više puta pozivati ovu funkciju.

Funkcija WaitForSingleObject služi za čekanje samog jednog objekta.

Funkcije za čekanje čekaju da objekti, naznačeni handleovim budu signalizirani (prelaze u signalizirano stanje). Nit postaje signalizirana kada završi s izvođenjem. Jednom signalizirana nit više ne postaje ne-signalizirana.

Prototipovi funkcija WaitForSingleObject i WaitForMultipleObjects za čekanje su:

DWORD WaitForSingleObject(HANDLE hObjekta, DWORD dwVrijemeCekanja);

Parametri: hObjekta – handle objekta (proces, nit itd.). dwVrijemeCekanja – vrijeme čekanja na završetak izvođenja nit u milisekundama. U slučaju da je vrijednost tog parametra 0 ne čeka se, a u slučaju da je INFINTE čeka se sve dok nit ne završi s izvođenjem.

DWORD WaitForMultipleObjects(DWORD nBrojac, CONST HANDLE *lpHandle, BOOL fCekajSve, DWORD dwVrijemeCekanja);

Parametri: nBrojac – broj handleova u polju na koji pokazuje lpHandle. fCekajSve – u slučaju da je ta vrijednost true kazuje da treba čekati na sve objekte (koji su u polju handleova), dok kada je false samo se čekan da jedan objekt završi. dwVrijemeCekanja – isto kao kod funkcije WaitForSingleObject.

49. Da li C-biblioteka nudi funkciju za startanje niti? Kako se zove ta funkcija i koji su joj parametri?

Page 29: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Postoje funkcije C-biblioteke koje nude startanje niti. To su _beginthreadex i _beginthread. Uglavnom se koristi funkcija _beginthreadex jer funkcija _beginthread nema sigurnosnih atributa ili zastavica i ne vraća ID niti. Parametri funkcije _beginthreadex su jednaki kao i Windows funkcije CreateThread. Potrebno je vršiti “kastanje” (engl. cast) povratne vrijednosti na HANDLE kako bi se izbjegle poruke upozorenja.

Kako bi koristila funkcija _beginthreadex potrebno je:

Definirati _MT prije svih “include” datoteka.

Povezati LIBCMT.LIB te tako preopterititi standardnu biblioteku.

Uključiti (engl. include) <process.h>

50. Kako se upravlja s prioritetima izvođenja niti?Nit nije spremna ako čeka, suspendirana je ili blokirana iz nekog razloga. Niti dobivaju prioritet prema procesu koji ih poziva. Četiri razreda prioritet mogu se početno postaviti s funkcijom CreateProcess a svaki ima osnovni prioritet (dan u zagradi) a to su:

IDLE_PRIORITY_CLASS (4) NORMAL_PRIORITY_CLASS (7 ili 9)

HIGH_PRIORITY_CLASS (13)

REALTIME_PRIORITY_CLASS (24)

Proces može promjeniti ili odrediti svoj prioritet ali i nekog drugog procesa ako to sigurnosne postavke dopuštaju. To se čini pomoću funkcija čiji su prototipovi:

BOOL SetPriorityClass(HANDLE hProces, DWORD dwPrioritet);

DWORD GetPriorityClass(HANDLE hProces);

Prioriteti niti se postavljaju relativno na osnovu prioriteta procesa i to prilikom stvaranje niti. Prioriteti niti su u intervalu ±2 u odnosu na osnovni prioritet procesa. To rezultira s pet prioriteta niti:

THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL

THREAD_PRIORITY_NORMAL

THREAD_PRIORITY_ABOVE_NORMAL

THREAD_PRIORITY_HIGHEST

Prioritet niti se automatski mijenja s promijenom prioriteta procesa.

Page 30: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Najviše prioritete treba korisiti s oprezom, dok prioritete stvarnog vremena (engl. real time) treba izbjegavati jer u tim slučajevima mogu korisničke nit nadvladati neke važne izvršne niti.

51. Navesti osnovna stanja niti. Skicirati shemu prijelaza iz jednog stanja u drugo.Nit se može nalaziti:

a) U izvođenju (running) kada je na procesoru

b) U stanju čekanja (wait) – kada ju izvršitelj stavi u to stanje

-može biti blokirana (blocked) ili u stanju spavanja (sleeping)

c) U stanju spremna (ready)- ako se može izvoditi

Sustav može postaviti nit koja je spremna na bilo koji od mogućih procesora Sistem postavlja nit koja se izvodi u stanje spremna kada istekne vremenski odsječak za izvođenje

– Sleep(0) stavlja nitk koja se izvodi u stanje spremna Sistem postavlja nit koja čeka u stanje spremna čim to signaliziraju odgovarajući handle-ovi (nit se “budi”)Nit se može suspendirati (privremeno zaustaviti njeno izvođenje) ili ponovno startati (resume)

Nit je u stanju završena nakon što je završena s ExitThread ili TerminateThread ali još uvijek može imati otvorenih handle-ova

– Druge niti mogu dobiti stanja drugih niti ili njihov izlazni kod

VI. SINKRONIZACIJA

Page 31: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

52. Opisati upotrebu i rad s kritičnim odsječcima u svrhu sinkronizacije niti.

Dok se jedna nit izvodi druga ne radi ništa ili je blokirana. Dvije niti ne mogu se početi izvoditi istovremeno.

Funkcije koje se koriste u radu s kritičnim odsječcima su:VOID InitializeCriticalSection (LPCRITICAL_SECTION lpcsCriticalSection)

VOID DeleteCriticalSection (LPCRITICAL_SECTION lpcsCriticalSection)

VOID EnterCriticalSection (LPCRITICAL_SECTION lpcsCriticalSection) - blokira nit ako je druga nit već u kritičnom odsječku

VOID LeaveCriticalSection (LPCRITICAL_SECTION lpcsCriticalSection) - Nit mora napustiti kritični odsječak svaki puta kada je ušla u njega

BOOL TryCriticalSection (LPCRITICAL_SECTION lpcsCriticalSection) - izbjegava se blokiranje, nit može ući u kritični odsječak više puta (“rekurzivno”)

__finally je metoda koja osigurava napštanje kritičnog odsječka čak I ako netko kasnije modificira kod (metoda radi I kod drugih sinkronizacijskih objekata)

Primjer:_finally { LeaveCriticalSection (&cs);

Nitima se dopušta pristup globalnim varijablama koje se deklariraju kao volatile

Kritični odsječci testiraju se u korisničkom prostoru (ne koristi se jezgra, ali se čeka u prostoru jezgre). Obično su brži nego muteksi, ali ne moraju biti (ovisno o broju niti, broju procesora I količini istog sadržaja niti). Kritični odsječci rade tako da koriste prozivanje (cikličko ispitivanje), i ekvivalent međusobno zaključanih funkcija 53. Opisati upotrebu i rad s muteksima u svrhu sinkronizacije niti. Muteksi su objekti jezgre (kernela) koji se koriste za spriječavanje istovremenog pristupa različitih niti istom resursu. Oni se mogu imenovati i imaju svoj HANDLE. Vlasnik Muteksa

Page 32: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

je nit, a ne proces. Sve niti obvezuju se da zaključaju muteks prije nego što pristupe resursu i da ga otključaju po završetku korištenja. Tek kada nit koja posjeduje resurs završi sa korištenjem i otključa muteks, nit koja je čekala resurs može mu pristupiti. Muteksi dijele isti prostor imena sa semaforima, događajima, objektima za memorijsko mapiranje i tajmerima za čekanje. Nije potrebno imenovati muteks koji se koristi unutar jednog procesa. Niti dobivaju vlasništvo nad muteksom čekajući na handle muteksa i to

koristeći WaitForSingleObject ili WaitForMultipleObjects

. Niti oslobađaju vlasništvo pozivom ReleaseMutex. Muteksi se kreiraju API funkcijom: HANDLE CreateMutex (LPSECURITY_ATTRIBUTES lpsa,

BOOL fInitialOwner,

LPCTSTR lpszMutexName)

fInitialOwner – zastavica koja, ako ima vrijednost TRUE, daje trenutno pozivajućoj niti vlasništvo nad novim nuteksom. To ne vrijedi ako imenovani muteks već postoji.

LpszMutexName – pokazivač na ime putanje. Imena su osjetljiva na veliko i malo slovo i 0-terminirani su. Ako je ovaj parametar NULL muteksi su neimenovani

Muteksi se oslobađaju koristeći funkciju BOOL ReleaseMutex (HANDLE hMutex). U slučaju da nit ne posjeduje muteks javlja se greška. Ako je muteks napušten čekanje na njega će vratiti WAIT_ABANDONED_0.

Muteksi, koji su već imenovani, otvaraju se funkcijom OpenMutex. I to dopuštajući nitima u različitim procesima da se sinkroniziraju. 54. Opisati upotrebu i rad s događajima u svrhu sinkronizacije niti. Događaji (events) služe kako bi se odjednom oslobodilo više niti, ukoliko one to signaliziraju. Događaj manual-reset može signalizirati više niti istovremeno i mora biti postavljen od niti. Dok događaj auto-reset signalizira jedna nit i postavlja se automatski. Signalizacije događaja odvijaju se uz pomoć funkcija PulseEvent ili SetEvent. Događaj se stvara pomoću funkcije: HANDLE CreateEvent (LPSECURITY_ATTRIBUTES lpsa,

BOOL fManualReset,

BOOL fInitialState,

LPTCSTR lpszEventName)

fManualReset – ukoliko želimo upotrebljavati manual-reset onda postavimo na TRUE

fInitialState – inicijalno postavlja događaj na signaliziran.

Događaj otvaramo funkcijom OpenEvent. Za kontroliranje događaja nam služe tri funkcije: BOOL SetEvent (HANDLE hEvent)

BOOL ResetEvent (HANDLE hEvent)

Page 33: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

BOOL PulseEvent (HANDLE hEvent)

SetEvent služi za signaliziranje događaja. Ako je događaj auto-reset vjerojatno će biti oslobođena jedna nit. Događaj se automatski vraća u nesignalizirano stanje. Ukoliko niti jedna nit nije u stanju čekanja događaj ostaje u signaliziranom stanju sve dok neka nit ne počne čekati na taj događaj. Takva nit će biti trenutno slobodna čekanja.

ResetEvent također služi za signaliziranje događaja. Ukoliko je događaj manual-reset, ostaje signaliziran sve dok neka nit ne pozove ovu funkciju. Tijekom vremena sve niti će biti oslobođene čekanja. Moguće je da će druge niti čekati i biti otpuštene prije reseta.

PulseEvent dopušta da oslobodimo sve niti koje trenutno čekaju na manual-reset. Nakon toga događaj se automatski resetira.

Ukoliko se koristi funkcija WaitForMultipleEvents, čeka se na sve događaje da budu signalizirani. Nit koja čeka će biti oslobođena tek kada se svi događaji simultano nađu u signaliziranom stanju. Neki se signalizirani događaji mogu osloboditi i prije nego je nit oslobođena. Pregled događaja:

AutoReset

ManualReset

SetEvent Točno jedna nit je oslobođena. Ako nijedna nit trenutno ne čeka na događaj, sljedeća nit koja će čekati bit će oslobođena.

Sve niti koje trenutno čekaju se oslobađaju. Događaj

ostaje signaliziran sve dok se ne resetira od neke druge niti.

PulseEvent Točno jedna nit je oslobođena, ali samo u slučaju da nit trenutno čeka na događaj.

Sve niti koje trenutno čekaju se oslobašđaju, a događaj se nakon toga resetira.

55. Opisati upotrebu i rad sa semaforima u svrhu sinkronizacije niti.Semafor kombinira ponašanje muteksa i događaja. Njime se može postići međusobno isključivanje niti, ali treba biti oprezan. Može se emulirati sa jednim semaforom, muteksom i brojačem. Semafori održavaju brojač. Nema koncepta vlasništva. Kada je brojač veći od nule objekt semafora je signaliziran, a kada je brojač jednak nula onda objekt nije signaliziran. Niti i procesi čekaju na normalan način, koristeći neku od funkcija za čekanje. Kada se nit koja čeka oslobodi brojač semafora se uveća za jedan. Može se osloboditi bilo koja nit jer nije ograničen samo na nit koja je napravila semafor. Semafor se stvara sljedećom funkcijom:HANDLE CreateSemaphore (LPSECURITY_ATTRIBUTES lpsa,

LONG cSemInitial,

LONG cSemMax,

LPCTSTR lpszSemName)

Page 34: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

cSemMax - najveća vrijednost za semafor. Ne može biti manja od jedan. Početna vrijednost je 0 <= cSemInitial <= cSemMax.

Brojač semafora se može dekrementirati s bilo kojom operacijom za čekanje. Dok se semafor može otpustiti i uvećati njegov brojač za bilo koju vrijednost, sve do maksimalne vrijednosti.

Semafor se otpušta funkcijom: BOOL ReleaseSemaphore (HANDLE hSemaphore,

LONG cReleaseCount,

LPLONG lpPreviousCount)

Vrijednost brojača se može naći za trenutak prije otpuštanja semafora, međutim ukoliko nam ta vrijednost nije potrebna pokazivač na nju može biti NULL. Brojač koji se oslobađa mora biti veći od nule. Međutim ukoliko brojač prijeđe vrijednost maksimuma poziv će vratiti FALSE i brojač će ostati nepromijenjen. Postoji i OpenSemaphore funkcija koja radi po istom principu kao i ostale open funkcije. Ne postoji jednostavno čekanje na više semaforskih objekata, ali se odjednom može jednostavno otpustiti više objekata. Potencijalni zastoj unutar niti: for (i = 0; i < NumUnits; i++)

WaitForSingleObject (hSem, INFINITE);

Rješenje je da se petlja gleda kao kritični odsječak koji se čuva pomoću CRITICAL_SECTION ili muteksa ili da se višestruki semafor kreira koristeći događaj, muteks i brojač.

Kratki pregled:

Page 35: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

VII. POUZDANI MODELI ZA RAD S NITIMA

56. Navesti tri osnovna pouzdana modela za rad s nitima, kratko opisati svakog od njih.Tri osnovna pouzdana modela za rad s nitima su gazda/šljaker, tekuća vrpca (cjevovod,

pipeline) i klijent/server.Model gazda/šljaker

Page 36: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Ova slika ilustrira gazda/šljaker model za rad s nitima. Nit gazda (glavna nit u ovom slučaju) dodjeljuje zadatke koje će obavljati šljakerske niti. Primjerice, svaka šljakerska nit ima zadatak naći određenu datoteku te nakon toga rezultat pretrage proslijediti niti gazdi.Postoje različite varijacije, kao što je work-crew model gdje šljakeri surađuju na istom zadatku, gdje svaki pritom obavlja određeni dio. Šljakeri mogu čak podijeliti posao međusobno bez upute gazde.

Model tekuće vrpce

Model klijent/server

Page 37: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Preostala dva osnova modela za rad s nitima su model tekuće vrpce te model klijent/server gdje se rad s jedne niti proslijeđuje na drugu.Postoje mnoge prednosti korištenja ovih modela kada dizajniramo višenitni sustav, a neke od njih su:

Većina problema kod višenitnog programiranja može se riješiti korištenjem jednog od standardnih modela, ubrzavajući napredak dizajna, razvoja te debugginga

Ne samo da korištenje dobro razumljivih i testiranih modela izbjegava mnoge od grešaka koje se javljaju kod višenitnih programa, nego ti modeli pomažu i postići najbolje performanse

Modeli prirodno odgovaraju strukturama većine problema programiranja

Programeri koji održavaju program mogu lakše razumjeti problem ako je dokumentacija koja opisuje program opisana na način koji svatko razumije

Veliki sustavi su rijetko čisti primjerci jednog od modela • Faze u tekućoj vrpci često su implementirane kao gazda/šljaker sistemi • Server može posluživati zahtjeve klijenata po modelu tekuće vrpce • Uvijek koristiti dobre implementacije dokumentirajući pojedinačne module u

terminima ovih modela – Lakše za održavanje, razumijevanje i otklanjanje grešaka

57. Model uvjetne varijable. Od čega se sastoji? Opisati jedan način korištenja modela uvjetne varijable. • Uvjetne varijable (conditional variable, CV)• Programiranje “u malom”• Koncepti preuzeti iz Pniti (POSIX niti)

– Struktura podataka tipa STATE_TYPE

Page 38: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

• Sadrži sve podatke kao što su poruke, sume za provjeru (checksums), itd.

– Mutex i jedan ili više pridruženih događaja • Mutex štiti strukturu podataka • Događaji signaliziraju “bitne” promjene stanja strukture podataka

– Boolove funkcijske izračune - “predikati uvjetne varijable”• Primjerice, “nova poruka je spremna”• Događaj je pridružen svakom predikatu slučajne varijable • Događaj se signalizira kada predikat uvjetne varijable postane istina

Komentari modela uvjetne varijable• Moramo ponavljati petlju i testirati

– Timeout je konačan – parametar za podešavanje izvedbe • Ovaj model izbjegava propuštene signale i druge probleme • Ovo je verzija koja “odašilje” (“broadcast”)

– Više potrošača otpušta se s jednim proizvođačevim SetEvent() – Ponašanje u stvarnoj primjeni ovisi o cvp() i značenju proizvodnje/potrošnje – Koristi se auto-reset događaj i SetEvent()

• “Signalna” verzija koristi manual-reset događaj i PulseEvent()– Samo jedan potrošač je otpušten

SignalObjectAndWait• Tri osnovna koraka petlje kod potrošača

– Otključaj muteks – Čekaj na događaj – Zaključaj muteks ponovno

• Prva dva nisu potpuno jednostavna – Proizvođač može signalizirati prije nego potrošač čeka – Rizik: propušteni signal – zbog toga imamo timeout (točno vrijeme čekanja)

• SignalObjectAndWait() kombinira prva dva koraka – Jedna jednostavna funkcija – Pniti kombiniraju sva tri koraka – >= NT 4.0 (nema na Win 9x, Me)

DWORD SignalObjectAndWait( HANDLE hObjectToSignal, // Muteks HANDLE hObjectToWaitOn, // Događaj DWORD dwMilliseconds, // timeout u ms BOOL bAlertable ) // Koristiti FALSE

• SOAW je opće namjene – Ovdje pokazujemo samo upotrebu muteks-događaj

• Timeout često puta može biti i beskonačan • Treba biti siguran da je:

#define _WIN32_WINNT 0x400 // WINBASE.H

Korištenje modela uvjetne varijable • Proizvođač zaključa muteks, promjeni stanje, postavi događaj i otključa muteks • Događaj se mora postaviti sa zaključanim muteksom • Potrošač testira predikat uvjetne varijable sa zaključanim muteksom

Page 39: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

– Ako predikat nije istina, potrošač mora otključati muteks prije čekanja na događaj

• Čekanje na događaj mora imati timeout – da se izbjegne propušteni signal– Osima ako koristite SOAW!

• Potrošač uvijek resetira predikat nakon čekanja na događaj • Potrošač je uvijek vlasnik muteksa kada izlazi iz petlje

– i ako se tijelo petlje izvodi i ako ne

58. Kako izbjegavati pogreške u kodu kod modeliranja višenitnih aplikacija. Navesti koji su osnovni savjeti u tom pogledu.

Izbjegavanje pogrešnog koda• Obratiti pažnju na dizajn, implementaciju i korištenje poznatih programskih modela • Najbolja tehnika za ‘debagiranje’ : otpočetka ne kreirati bagove • Mnogi ozbiljni defekti će prouzrokovati najšire i najskuplje testiranje • Debagiranje mijenja vremensko ponašanje

– Tako se maskiraju “uvjeti utrke” koji mi želimo postići, tj. ne vidimo ono što želimo vidjeti

• Izbjegavati oslanjanje na unutarnju strukturu niti • Nikada se ne treba kladiti “koja će nit prije”• Zakazivanje za izvršenje (Scheduling) nije isto što i sinkronizacija • Mogu se pojaviti višestruke “utrke” za podacima

– I onda kada koristimo muteksa za zaštitu zajedničkih podataka • Izbjegavati totalne zastoje misleći kakvo će biti zajedničko funkcioniranje • Nikada ne dijeliti događaje između predikata • Oprez kod dijeljenja stogova i s time vezane korupcije memorijskog prostora • Oprez: nema upozorenja kada se stog niti prepuni • Treba koristiti volatile modifikator spremanja varijabli • Koristiti model uvjetnih varijabli kako treba • Razumjeti invarijante i predikate uvjetne varijable • Neka bude što jednostavnije • Testirati na više sistema (jedno- i više-procesorskim)• Testiranje je neophodno ali ne i dovoljno • Treba biti spreman na neugodna iznenađenja

Primjedbe oko blokiranja niti • U bilo kojem trenutku nit može otići u stanje “spavanja” na neograničen vremenski

period• Ne postoji uređenje između niti, osim ako ga mi ne uvedemo • Zakazivanje niti za izvršavanje može biti jako različito

– Različite izvedbe operacijskih sustava – Različiti modeli istog sustava – Sustavi s različitim brzinama procesora

• Eksplicitno sinkroniziranje je uvijek potrebno • Nema vremena čekanja (timeout) kod poziva pthread_join()

Cijepanje riječi• Jedan muteks treba koristiti u svakom kritičnom odsječku povezanim s dijeljenim

resursom – poznato i kao “borba oko cache linije” - SMP– Primjer: procesor može pristupiti četveroriječnoj memorijskoj jedinici

Page 40: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

• 64 bita, jer je riječ 16 bitna • 16-bitne riječi nisu odvojeni resursi • kad različite niti pristupaju različitim vrijednostima koje leže u istim

četveroriječnim jedinicama memorije, tada imamo cijepanje, tj. borbu za riječ

• Cijela četvero-riječ treba biti zaštičena s jednim muteksom

Izbjegavanje totalnog zastoja, hijerarhija zaključavanja • Izbjegavati totalni zastoj koristeći hijerarhiju zaključavanja gdje ćemo mutekse uvijek

zaključavati po istom redoslijedu – Otključavati treba u obrnutom redosljedu

• Dodatne primjedbe kod totalnog zastoja – Tijekom razvoja i otklanjana grešaka

• Osigurati da je višestruko zaključavanje uvijek u istom redoslijedu – Dokumentirati hijerarhiju zaključavanja – Hijerahija zaključavanja je dokazano bez totalnog zastoja

Nema totalnog zastoja s hijerahijskim zaključavanjem

Page 41: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

59. (VII.a) Što su to Pniti? Navesti neke funkcije iz API‐ja za Pniti. • POSIX niti ili Pniti je industrijski standard za rad s modelima niti i modelima

sinkronizacije podržane dostupne za UNIX, Linux te ostale ne-Windows distribucije• slično kao kod Windows-a ali postoje razlike (Primjerice: događaji) • Postoji i open source Windows bibilioteka za rad s Pnitima, i, koristeći tu biblioteku

moguće je napisati portabilne aplikacije sa nitima koje bi se mogle koristiti na raznim sustavima

Kreiranje i upravljanje nitima • Nadređena nit kreira podređenu nit koristeći:

int pthread_create (pthread_t *thread,const pthread_attr_t *attr void *(*start) (void *), void *arg);

• Primjedbe kod kreiranja niti:– pthread_attr_t je NULL (za našu upotrebu)

• Koristiti druge vrijednosti samo kada je to eksplicitno potrebno – Koncept “podređene” i “nadređene” niti su samo da nam bude jasniji odnos

između niti • Operacijski sustav nigdje ne podržava niti pamti takve odnose

– Glavna nit main() je inicijalna nit i ona je specijalna • Ponaša se drugačije nego druge niti

Pokretanje niti • Podređena nit se kreira u stanju spremna

– Može se trenutno izvoditi • Primjedbe kod pokretanja niti:

– Nadređena i podređene niti se izvode bilo kojim redom – Podređena nit može završiti prije (ili poslije) bilo koje druge – Treba završiti sa svakom inicijalizacijom prije poziva pthread_create() – Svaka podređena nit treba imati svoju strukturu podataka

• za parametre • svoj radni spremnik • nadređena nit inicijalizira strukturu i šalje njenu adresu preko arg

Page 42: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Izvođenje i blokiranje niti• Operacijski sustav zakazuje izvođenja niti preko svojih politika zakazivanja i

pripadajućih prioriteta – Nit se može izvoditi bilo kada – Nit se može izvoditi sve dok se ne desi:

• Istekne zakazano vrijeme i OS je stavlja u stanje spremna • Nit se blokira zbog greške s radom memorije • Nit se završava ili je završena • Nit ne treba više procesor i prelazi u stanje spremna

int sched_yield (void); • Nit se blokira pozivom blokirajuće funkcije

int pthread_join (pthread_t thread,void **value_ptr);

Završavanje niti • Normalni način da nit završi je da se koristi return i normalno završi ili da se pozove

int pthread_exit (void *value_ptr);• Vraćena return vrijednost je izlazni kod niti

– Izlaznom kodu može se pristupiti preko pthread_join()• Resursi kreirani od strane niti moraju se eksplicitno osloboditi

60. (VII.a) Koje sve načine sinkronizacije Pniti podržavaju? Opisati rad sa svakim od tih načina.

Muteksi • Muteks, objekt tipa pthread_mutex_t, može se inicijalizirati pridruživanjem ili

funkcijskim pozivom pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex_init (pthread_mutex_t *mutex, pthread_mutexattr_t *attr);int pthread_mutex_destroy (pthread_mutex_t *mutex);

Upravljanje muteksima • pthread_mutex_t

– Ne smije se kopirati varijabla tipa pthread_mutex_t – Ako je deklarirana izvan glavne (main) funkcije, treba imati klasu spremanja

extern ili static • Svaki muteks mora biti inicijaliziran prije upotrebe • Statička inicijalizacija s PTHREAD_MUTEX_INITIALIZER • Dinamička inicijalizacija s funkcijom pthread_mutex_init()• Kada više nije potreban, treba ga uništiti da se oslobodi jezgra i korisnički resursi

Zaključavanje i otključavanje muteksa • Nit može zaključati ili posjedovati muteks

– Nit pokušava dobiti vlasništvo s pokušajem poziva int pthread_mutex_trylock (

pthread_mutex_t *mutex);• Vraća 0 ako je uspješno • Vraća EBUSY ako je muteks vlasništvo druge niti

– Nit čeka da dobije vlasništvo s pozivom zaključavanja int pthread_mutex_lock (pthread_mutex_t *mutex);

• Blokirajući pozivl; završit će tek kad nit dobije vlasništvo

Page 43: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

• Vraća EINVAL ako parametar nije važeći – Otključavanje muteksa

int pthread_mutex_unlock (pthread_mutex_t *mutex);

Primjedbe oko zaključavanja i otključavanja muteksa • Nema vrijednsoti timeout-a kod pthread_mutex_lock() • Ako nit završi prije otključavanja muteksa, on ostaje zaključan • Muteks može imati rekurzivno svojstvo • Ako pthread_mutex_trylock() ne uspije, ne smije se pristupati zaštićenim resursima i

ne smije se otključavati muteks • Ne smije se dopustiti da nit zaključa muteks koji ne posjeduje • Samo jednoj blokiranoj niti će biti dano vlasništvo nad muteksom

– Ne može se predvidjeti kojoj

Uvjetne varijable • Uvjetna varijabla se koristi da signalizira neki događaj ili promjenu stanja

– Muteks štiti cjelokupno stanje strukture podataka – Više uvjetnih varijabli povezano je s jednim muteksom – Uvjetne varijable predstavljaju različita stanja

• Novi podaci spremni u bufferu • Buffer prazan, buffer pun, itd.

– Signalizirano da se probudi samo jedna nit– “Broadcast” ili odašiljanje za buđenje svih niti koje čekaju

• Kombinira: Signal, Čekanje, Niz čekanja od modela uvjetne varijable

Upravljanje uvjetnim varijablama pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int pthread_cond_init (

pthread_cond_t *cond,pthread_condattr_t *condattr);

int pthread_cond_destroy (pthread_cond_t *cond);

Čekanje na uvjetnu varijablu • Čekaj na blokirajući način ili čekaj s timeout vrijednosti

– Oba načina moraju koristiti muteks – Pozivajuća nit mora posjedovati muteks prije čekanja na uvjetnu varijablu

int pthread_cond_wait (pthread_cond_t *cond,pthread_mutex_t *mutex);

int pthread_cond_timedwait (pthread_cond_t *cond,pthread_mutex_t *mutex,struct timespec *expiration);

Vraća ETIMEOUT ako istekne period čekanja – timeout

Primjedbe kod čekanja uvjetnih varijabli • Nit “čeka” na uvjetnu varijablu • Sve niti koje čekaju na uvjetnu varijablu u bilo kojem trenutku moraju zadati isti

muteks • Različiti predikati moraju imati različite uvjetne varijable

Page 44: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

• Pridružiti uvjetnu varijablu stanju predikata • Muteks treba štititi stanja varijabli koje određuju predikat • Uvjetne varijable su za signaliziranje, ne za međusobno isključivanje

Signaliziranje i “odašiljanje” uvjetne varijable • Probuditi jednu nit koja čeka s

int pthread_cond_signal (pthread_cond_t *cond);

– Ne možemo direktno kontrolirati koja će od više niti koje čekaju biti oslobođena

• Probuditi sve niti sint pthread_cond_broadcast (

pthread_cond_t *cond);– Sve niti koje čekaju se odmah bude i odmah blokiraju na muteksu – Samo jedna nit, najviše, dobiva odmah vlasništvo nad muteksom

VIII. MEĐUPROCESNA KOMUNIKACIJA

61. Navesti i kratko opisati sve moguće načine na koje procesi mogu komunicirati međusobno.

Međuprocesna komunikacija (Interprocess Communication-IPC) u Windowsima je omogućena kroz anonimne (bezimene) i imenovane pipe kojima se pristupa funkcijama ReadFile i WriteFile. Također postoje i mailslotovi koji omogućuju jedan-na-više odašiljanje poruka. Anonimne pipe su jednosmjerne i zasnovane na znakovima, dok su imenovane pipe dvosmjerne i zasnovane na porukama, a omogućavaju stvaranje klijent/server sustava.

62. Osnovna svojstva anonimnih pipa. Na koji se način koriste. Funkcije koje koristimo za rad s njima.

Anonimne (bezimene) pipe bazirane su na znakovima i dopuštaju jednosmjernu (half-duplex) komunikaciju. Kao takve, dobre su za preusmjeravanje izlaza iz jednog programa na ulaz drugog (najčešće u UNIX programima). Svaka pipa ima dva handle-a: za čitanje i za pisanje. Handlovi su često nasljedivi. Kako bi se pipa mogla koristiti u međuprocesnoj komunikaciji, mora postojati drugi proces koji zahtjeva jedan od handleova te pipe.

Na slici je prikazano roditeljski proces Pipe koji kreira dva procesa preko komandne linije i spaja ih preko pipe. Roditeljski proces definira pipu i preusmjerava standardni ulaz i izlaz u

Page 45: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

dva procesa djeteta. Handlovi pipe i niti zatvaraju se u najranijoj mogućoj točci. Potrebno je da roditeljski proces završi (zatvori) handle standardnog izlaza odmah nakon stvaranja prvog procesa djeteta tako da drugi proces može prepoznati kraj datoteke kada prvi proces završi. Ukoliko postoji otovreni handle, drugi proces možda neće završiti jer sustav neće naznačiti kraj datoteke.

BOOL CreatePipe (PHANDLE phRead,

PHANDLE phWrite,

LPSECURITY_ATTRIBUTES lpsa,

DWORD cbPipe)

- cbPipe: Veličina pipe u byte-ima; koristiti 0 za preddefiniranu vrijednost;

- phRead: Adresa handlea;

- CreatePipe će postaviti *phRead;

- phWrite se koristi za handle za pisanje nove pipe;

- Čitanje blokova ako je pipa prazna; u suprotnom čitanje će prihvatiti onoliko byte-ova

koliko ih ima u pipi, sve do broja određenog pozivom ReadFile; Pisanje u punu pipu

će blokirati.

63. Kreiranje imenovanih pipa. Opisati način uporabe pipa za kreiranje server-klijent aplikacije.

Funkcijom CreateNamedPipe kreira se prva instanca imenovane pipe i vraća handle. Funkcija također određuje maksimalan broj instanci pipe i broj klijenata s kojima se može istovremeno komunicirati (ovaj proces je proces na serveru. Klijentov proces se stvara pipom funkcijom CreateFile).

Server kreira višestruke niti na istoj pipi, a svaka od njih može podržati jednog klijenta. Server također kreira nit za svaku instancu imenovane pipe, tako da svaki klijent ima svoju nit i instancu imenovane pipe.

Page 46: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Parametri CreateNamedPipe funkcije:

HANDLE CreateNamedPipe ( LPCTSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut,

LPSECURITY_ATTRIBUTES lpSecurityAttributes)

– lpszPipeName je ime pipe.

– Mora biti oblika \\.\pipe\[path]pipename.

– Ne može se kreirati pipa na udaljenom (drugom) stroju.

– fdwOpenMode određuje jedan od načina:

– PIPE_ACCESS_DUPLEX

– Ekvivalentno GENERIC_READ | GENERIC_WRITE

– PIPE_ACCESS_INBOUND — Tok podataka je samo od klijenta prema serveru

– Ekvivalentno GENERIC_READ

– PIPE_ACCESS_OUTBOUND

Page 47: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

– Način može također odrediti FILE_FLAG_WRITE_THROUGH (ne koristi se kod pipa s porukama) i FILE_FLAG_OVERLAPPED

– fdwPipeMode ima tri međusobno isključiva para zastavica koji pokazuje je li pisanje bajtno orijentirano ili na poruke, je li čitanje preko poruka ili blokova, i blokira li operacija čitanja

– PIPE_TYPE_BYTE i PIPE_TYPE_MESSAGE

– Međusobno isključive.

– Pisanje niza byte-ova ili poruka.

– Treba koristiti isti tip za sve primjerke pipe.

– PIPE_READMODE_BYTE i PIPE_READMODE_MESSAGE

– Čitanje niza byte-ova ili poruka.

– PIPE_READMODE_MESSAGE zahtjeva PIPE_TYPE_MESSAGE

– PIPE_WAIT i PIPE_NOWAIT određuje da li će ReadFile blokirati ili ne

– Koristiti PIPE_WAIT jer je to bolji načina za postizanje asinkronog I/O.

– nMaxInstances — broj primjeraka pipe, što određuje broj simultanih klijenata

– Odrediti uvijek istu vrijednost za svaki poziv CreateNamedPipe za određenu pipu.

– PIPE_UNLIMITED_INSTANCES dopušta OS-u da odredi broj mogućih sistemskih resursa.

– cbOutBuf i cbInBuf savjetuju OS za zahtjevanu veličinu buffer-a za ulazi i izlaz.

– dwTimeOut — predefinirani time-out period (u milisekundama) za WaitNamedPipe funkciju.

– lpsa je kao i u svim drugim “Create” funkcijama.

64. Navesti funkcije za rad s imenovanim pipama. Imena funkcijama i za što služe.Kada imamo konekciju koja ima dugo trajanje, možemo kombinirati WriteFile, ReadFile sekvencu kod klijenta

- Također postoje prednosti u izvedbi, jer konekcija nije potrebna (stalno je prisutna).

BOOL TransactNamedPipe (HANDLE hNamedPipe,

LPVOID lpvWriteBuf, DWORD cbWriteBuf,

Page 48: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

LPVOID lpvReadBuf, DWORD cbReadBuf,

LPDWORD lpcbRead, LPOVERLAPPED lpa)

– Oba buffera i za ulaz i za izlaz su zadana

– *lpcbRead — Duljina poruke

BOOL CallNamedPipe (LPCTSTR lpszPipeName,

LPVOID lpvWriteBuf, DWORD cbWriteBuf,

LPVOID lpvReadBuf, DWORD cbReadBuf,

LPDWORD lpcbRead, DWORD dwTimeOut)

• Sinkronizirana: Create/Write/Read/Close konekcija “kratkog života” s klijentom

– Smanjuje upotrebu primjerka ali uvećava broj konektiranja

• Određen je time-out period za konekciju, u milisekundama ili:

– NMPWAIT_NOWAIT

– NMPWAIT_WAIT_FOREVER

– NMPWAIT_USE_DEFAULT_WAIT

BOOL WaitNamedPipe

(LPCTSTR lpszPipeName,

DWORD dwTimeOut)

• Klijent može čekati na primjerak imenovane pipe dok ne postane dostupan

BOOL ConnectNamedPipe

(HANDLE hNamedPipe,

LPOVERLAPPED lpo)

BOOL DisconnectNamedPipe

(HANDLE hNamedPipe)

• S lpo postavljenim na NULL, ConnectNamedPipe će završiti čim server dobije konekciju s klijentom

• Normalno vraća vrijednost TRUE

• Vraćena vrijednsot je FALSE ako je klijent spojen između serverovog poziva CreateNamedPipe i poziva ConnectNamedPipe

Page 49: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

• U tom slučaju, GetLastError vraća ERROR_PIPE_CONNECTED

• Izvoditi ReadFile, WriteFile operacije između konekcije i završetka konekcije (disconnect)

Tema Windows UNIX C biblioteka

Komentar

Međuproc. komunik.IPC(Interproc.commun.)

CallNamedPipe (nema) (nema) CreateFile;WriteFile;ReadFile;CloseHandle

CloseHandle (handle od pipe)

close, msgctl

pclose

ConnectNamedPipe (nema) (nema)CreateMailSlot (nema) (nema)CreateNamedPipe mkfifo,

msgget(nema)

CreatePipe pipe popenDuplicateHandle dup,

dup2, fcntl

(nema) ili koristiti imena CONIN$, CONOUT$

GetNamedPipeHandleState stat, fstat, lstat64

(nema)

GetNamedPipeInfo stat, fstat, lstat

(nema)

ImpersonateNamedPipeClient (nema) (nema)PeekNamedPipe (nema) (nema)ReadFile(handle od imenovane pipe)

read (fifo), msgsnd

(nema)

RevertToSelf (nema) (nema)SetNamedPipeHandleState (nema) (nema)TransactNamedPipe (nema) (nema) WriteFile; ReadfileWriteFile (handle od imenovane pipe)

write (fifo), msgrcv

(nema)

Različito GetComputerName uname (nema)SetComputerName (nema) (nema)

65. Opisati način rada mailslotova i navesti osnovne funkcije za rad s mailslotovima.Mailslotovi imaju imena koja nepovezani procesi mogu koristiti za komunikaciju. Oni su mehanizmi za odašiljanje (broadcast) koji se ponašaju drugačije nego imenovane pipe. Koriste se datagramima. Mailslotovi su jednosmjerni, mogu imati više čitača i pisača, ali često se koriste na način “jedan-na-više”. Pisač (klijent) ne zna primaju li čitači (serveri) zaista poruku. Mailsslotovi mogu biti locirani preko mrežne domene, a duljine poruka su ograničene.

Svaki mailslot server (nemojte ih pomiješati s aplikacijskim serverima ili sa serverima imenovane pipe) kreira mailslot handle s funkcijom CreateMailslot. Server čeka da primi mailslot poruku s pozivom funkcije ReadFile. Klijent koji samo piše treba otvoriti mailslot s

Page 50: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

funkcijom CreateFile i pisati poruku s WriteFile. Otvaranje neće uspjeti (ime nije pronađeno) ako nema čitača koji čekaju.

Poruku klijenta mogu pročitati svi server; svi oni primaju istu poruku.

Klijent koji poziva CreateFile, može koristiti oblik

\\*\mailslot\mailslotname

da se spoji na sve mailslotove s danim imenom.

HANDLE CreateMailslot (LPCTSTR lpszName,

DWORD cbMaxMsg, DWORD dwReadTimeout,

LPSECURITY_ATTRIBUTES lpsa)

- lpszName — Pokazivač na ime mailslota oblika:

\\.\mailslot\[path]name – ime mora biti jedinstveno.

• cbMaxMsg - Maksimalna veličina (u byte-ima) za poruke koje klijent može pisati (0 znači da nema ograničenja);

• dwReadTimeout — Broj milisekundi koliko će operacija čitanja čekati; 0 znači trenutan povratak iz funkcije;

– MAILSLOT_WAIT_FOREVER je beskonačno čekanje (nema timeouta)

• Klijent mora zadati FILE_SHARE_READ zastavicu;

• Funkcije GetMailslotInfo i SetMailslotInfo su slične odgovarajućim kao kod imenovanih pipa;

• Klijent (pisač), kada otvara mailslot s funkcijom CreateFile, koristi sljedeće oblike imena:

– \\.\mailslot\[path]name

• da dobije handle lokalnog mailslota (na istom stroju);

– \\computername\mailslot\[path]name

• da dobije handle mailslota na određenom stroju;

– \\domainname\mailslot\[path]name

• da dobije handle koji predstavlja sve mailslotove na svim strojevima na domeni;

– \\*\mailslot\[path]name

Page 51: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

• da dobije handle koji predstavlja mailslotove na strojevima u sistemskoj primarnoj domeni.

IX. WINSOCK

66. Opisati što su to socketi. Što je sve potrebno da ih koristimo pod Windows‐om?Socket je komunikacijski kanal između servera i klijenta, kreiramo ga pozivamo funkciju socket(...) kako bi otvorili socket spreman za komunikaciju.

Za korištenje socketa pod Windows-om potrebno je uključiti biblioteku (wsock32.lib) kako bi Visual Studio prepoznao funkcije koje koristimo za rad sa socketima.

67. Navesti koje sve funkcije za socket‐e trebamo za izgradnju aplikacijskog servera.socket, WSADATA, WSAStartup, SOCKADDR, select, accept, send, recv

68. Objasniti kako se izgrađuje aplikacijski klijent koristeći sockete. Navesti detaljno koje funkcije i koji su svi podaci potrebni

Klijent koji bi se spajao na server mora imati deklariran socket, IP adresu na koju se spajamo i port. Ako socket nije povezan s adresom, Windows Socketi će mu pridjeliti jedinstvenu adresu koja će se koristiti prilikom trajanja konekcije.

int connect(SOCKET s, LPSOCKADDR lpName, int nNameLen);

primjer funkcije connect koja prima naš socket, lpName je pokazivač na strukturu SOCKADDR u kojoj je upisana adresa servera, a također i port na kojem server sluša.

69. Objasniti kako se vrši razmjena podataka, te kako se prekida konekcija u komunikaciji preko socketa.

Dvije strane koje komuniciraju razmjenjuju podatke koristeći funkcije send() i recv() koje imaju jednake parametre

int send (SOCKET s, LPSTR lpBuffer, int nBufferLen, int nFlags);

int recv (SOCKET s, LPSTR lpBuffer, int nBufferLen, int nFlags);

Ima više načina za prekid komunikacije navest ćemo neke:

Kod standardnih Berkeley-evih Socketa, pozivamo close()

Kod Windows Socketa pozivamo void closesocket(SOCKET s);

Za konekcijski orijenitranu komunikaciju, server zatvara samo socket kreiran s accept()

Naposljetku, poziva se void WSACleanup(void); da prekinemo rad s WSOCK32.DLL

70. Usporediti osnovne sličnosti i razlike između Berkley-evih i Windows socketa.Standardni Berkeley-evi Socketi će biti portabilni s Windows Socketima, sa slijedećim iznimkama:

Page 52: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

Mora se pozvati WSAStartup() kako bi inicijalizirali odgovarajući DLL

Iako se mogu koristiti UNIX-ovski read() i write() za primanje i slanje podataka, mora se prvo konvertirati Windows socket na handle operacijskog sustava pozivom _open_osfhandle()

Kod verzije socketa 1.1, također se mora pozvati setsockopt() kako bi prisilili sockete da se otvore kao handle-ovi koji nemaju “overlapped” svojstvo

Mora se koristiti closesocket() (ova funkcija nije portabilna), radije nego close() (koja jeste portabilna), kako bi zatvorili socket

Moramo pozvati WSACleanup() kako bi završili rad s DLL-om

71. Windows Socket 2. Što su sve novog donijeli?– Windows Sockets 2, omogućeni u NT 4.0, dodaju još nekoliko područja funkcionalnosti– Mogućnost da zahtjevamo kvalitetu usluge (QoS - quality of service) od sloja za

podršku socketa, odnosno brzinu i pouzdanost kod prijenosa podataka– Mogućnost da organiziramo sockete u grupe

– može se konfigurirati QoS za cijelu grupu socketa– to se ne mora raditi na bazi socket-po-socket– možemo uvesti prioritete za sockete koji pripadaju nekoj grupi

– Višestruke konekcije (npr. konferencijski pozivi)– Najvažniji dodatak kod Windows Socketa 2 je standardizacija preklapajućeg I/O

– Ako želimo kreirati preklapajući socket, moramo pozvati WSASocket() i eksplicitno ga zahtjevati

– Npr.:SOCKET WSAAPI WSASocket(

int iAddressFamily,int iSocketType,int iProtocol,LPWSAPROTOCOL_INFO lpProtocolInfo,GROUP g,DWORD dwFlags);

– Kod WinSock 2 imamo dodatnu mogućnost da skupljamo i distribuiramo podatke za slanje ili primanje iz nekontinuiranih memorijskih spremnika (buffera) - Scatter/Gather I/O

X. ASINKRONI I/O

72. Navesti i kratko opisati tri osnovna načina izvođenja asinkronog I/O.– 1. način: Niti i procesi

- Svaka nit unutar procesa (ili u različitim procesima) izvodi normalni sinkroni I/O. Svaka nit treba imati svoj handle na datoteku ili pipu

– 2. način: Preklapajući (overlapped) I/O- omogućava jednoj niti da izvodi asinkrone operacije na jednom

handle-u datoteke- Nit nastavlja izvođenje nakon izvođenja čitanja (read), pisanja

(write) ili neke druge I/O operacije

Page 53: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

- Nit nakon toga čeka ili na handle ili na određeni događaj kada joj je potreban rezultat izvođenja I/O operacije prije daljnjeg nastavka

– 3. način: Prošireni I/O- Prošireni I/O automatski izvodi kôd koji se izvodi prilikom

završetka

73. Opisati preklapajući I/O. Osnovna svojstva i izgled preklapajuće strukture. • Preklapajuće strukture su moguća opcija kod 4 I/O funkcije koje mogu potencijalno

blokirati sve dok se operacija ne dovrši:– ReadFile– WriteFile– TransactNamedPipe– ConnectNamedPipe– Vrijednost koju ove funkcije vraćaju ne može se koristiti kako bi pokazivala je

li operacija bila uspješna ili se dogodila greška• Preklapajuća struktura:

– Ukazuje na poziciju u datoteci (64 bitno)– Ukazuje na događaj koji će biti signaliziran kada operacija završi– Određuje se preko lpOverlapped parametra kod ReadFile

74. Opisati prošireni I/O. Kako mora izgledati funkcija koja se izvršava nakon završetka I/O operacije.– Prošireni I/O automatski izvodi kod koji se izvodi prilikom završetka

• Nisu potrebni dodatni događaji• Radije nego da nit čeka na signal prilikom završetka, tj. na događaj ili handle, sistem

može pozvati korisnički određenu “funkciju koja se izvodi pri završetku” onda kada I/O operacija bude gotova

• Prošireni I/O funkcije prepoznajemo po sufiksu Ex:ReadFileEx

WriteFileEx

WaitForSingleObjectEx

WaitForMultipleObjectsEx

SleepEx

Izvršavanje funkcija koje se izvršavaju prilikom završetka I/O operacije

– Čim se završi proširena I/O operacija, njezina funkcija koja se izvršava prilikom završetka se stavlja u red za izvršavanje

– Sve zakazane funkcije koje se izvršavaju prilikom završetka od dane niti će se izvršiti kada nit uđe u stanje čekanja na znak za uzbunu, a funkcija koja čeka na znak za uzbunu završi tek kada te spomenute funkcije završe

XI. Win64 

Page 54: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

75. Opisati današnju podršku za Win64 i navesti zašto je prelazak na 64-bitnu platformu već danas nužan.

Imamo: Procesorsku podršku:

- Intel Itanium procesorska familija (128-bitni regsitri, 64-bitno adresiranje, višenitno izvršavanje, 3-level cache na čipu, ...)

- AMD64, Opteron i Athlon- Intelovi 32/64 procesori

Windows podrška:

– Windows XP 64-bit, Server 2003 (za Itanium familiju), Vista 64-bit

Linux podrška:

– Različite distribucije 64-bitnih linuxaPrelazak na 64-bitnu platformu je nužan što mnoge aplikacije zahtijevaju mogućnost pristupa većim adresnim prostorima, primjerice:

– Video aplikacije, sistem s 4GB može spremiti u memoriju samo 20 sekundi HDTV (true colors)

– Mehanički i elektronički CAD, neki dijelovi ili složene komponente trebaju nekad i više od 4GB prostora za spremanje, a simulaicje kod dizajna čipova su ekstremno memorijski zahtjevne

76. Opisati Win64 programski model. Usporediti taj model s UNIX-ovim 64-bitnim modela

WIN64:

Tri osnovne familije procesora podržavaju Win64:

Intel Itanium procesorska familija, koristi sasvim drugačiju arhitekturu nego klasična x86

128-bitni regsitri, 64-bitno adresiranje, višenitno izvršavanje, 3-level cache na čipu.

AMD64, Opteron i Athlon, x86 arhitektura s proširenjem za virtuelno 64-bitno adresiranje, te izvršavanje 32bitnih i 64 bitnih operacija.

Intelovi 32/64 procesori, direktno uspredivi s AMD64, najprije se pojavio Xeon

Microsoft je odabrao LLP64 model (dugi tip podataka i 64-bitni pokazivači), kraće ga zovemo P64 model.

Tipovi podataka kod P64:

Svi pokazivači su 64-bitni. (Npr. pokazivač na PVOID)

Ostali tipovi:

char je 8-bitni, a wchar_t je 16-bitni

short je 16-bitni

Page 55: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

int je 32-bitni

long int je 32-bitni

Dodatni tipovi podataka kod Microsoft prevodioca: _int16, _int32 i _int64

Neki posebni definirani tipovi pokazivača

DWORD_PTR

HALF_PTR

INT_PTR

LONG_PTR

SIZE_T

SSIZE_T

SIZE_T je jedan od važnijih tipova. HANDLE-ovi su 64-bitni kod Win64.

Ne treba očekivati da imamo cijelokupni 64-bitni virtualni adresni prostor . On može biti ograničen primjerice na određenu vrijednost od 512GB, što ukazuje na ograničenje od 39 bita. S vremenom ovo ograničenje će se proširivati kako procesori i sustavi budu evoluirali.

UNIX-om

PC sistemi su uvijek zaostajali za UNIX i mainframe sistemima u pogledu funkcionalnosti i skalabilnosti. To isto je slučaj i sa 64-bitnom platformom.

Još ranih 90-tih, UNIX je podržavao 48-bitne i 64-bitne procesore, a također i 64-bitne API-je

UNIX zajednica je standardizirala tzv. LP64 model, koji je drugačiji nego Win64 model

Prelazak sa 32 na 64 bita je relativno jednsotavan, skoro uvijek trivijalan, a to možemo očekivati i kod prelaska s Win32 na Win64

Windows i UNIX razlike

UNIX najčešće implementira LP64 model, koji znači da su i long tipovi i pokazivači 64-bitni. Ovaj sustav se nekad zove i I32,LP64, kako bi se naznačilo da je int tip i dalje 32-bitan. Dakle, razlika je u long integer tipu podataka.

77. NAVESTI sve najvažnije oko prebacivanja 32-bitnog koda u 64-bitni

Prelazak koda

Definicije tipova podataka koje su prethodno pokazane su napravljene da se minimiziraju promjene u kodu. Ipak, promjene u kodu se nekad ne mogu izbjeći. Poseban problem su funkcije koje rade sa zauzimanjem memorije (primjerice HeapCreate, HeapAlloc). Osim ovih

Page 56: Odgovori Na Pitanja Iz Kolegija Sistemsko Programiranje 2008

funkcija, uvijek treba oprezno pregledati cijeli kod da se negdje ne bi sakrile krive pretpostavke o veličini nekih pokazivača ili struktura u kojima su pokazivači, itd.

Najznačajnije promjene su kod API-ja za upravljanje memorijom, primjerice funkcija

LPVOID HeapAlloc( HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes );Treći parametar je novodefiniranog tipa SIZE_T, i zato je 64-bitni ili 32-bitni bezpredznačni cijeil broj. Prije je ovaj parametar bio tipa DWORD (koji je uvijek 32-bita).

Postoje brojni potencijalni problemi oko pretpostavljene veličine podataka, evo nekoliko primjera:

DWORD više nije primjeren za veličinu memorijskog bloka. Koristiti SIZE_T umjesto njega.

Komunikacija između procesa (bilo na jednom ili na različitim sistemima) mora jasno definirati veličine podataka. Npr. poruke koje se prenose preko socketa-a imaju duljinu LONG32 kako bi se osiguralo da to ne bude 64-bitna vrijednost.

Koristiti sizeof kako bi izračunali veličinu strukture, jer ove veličine će se razlikovati kod Win32 i Win64 ako struktura sadrži pokazivač ili primjerice podatak tipa SIZE_T.

Unije koje mješaju pokazivačku i cjelobrojnu aritmetku trebaju biti pregledane radi korektnosti.

Svaki cast operator koji vrši pretvorbu iz pokazivača u aritmetički tip treba biti pregledan s oprezom.

Treba biti oprezan kada prenosimo 32-bitni parametar u funkciju koja ga prihvaća kao 64-bitni parametar, jer viših 32 bita možda nisu postavljeni na nulu, pa funkcija može primiti vrijednost puno veću nego što mi mislimo.

koristiti format %p kod ispisa pokazivača radije nego %x, te format %ld kada ispisujemo platformski ovisni tip poput SIZE_T