SYSTEMY OPERACYJNE
 
 


Wykład

Wykł.1 Wykł.2 Wykł.3 Wykł.4 Wykł.5 Wykł.6 Wykł.7 Wykł.8 Wykł.9 Wykł.10 Wykł.11 Wykł.12 Wykł.13 Wykł.14 Wykł.15 

Ćwiczenia

Ćw.1  Ćw.2  Ćw.3  Ćw.4  Ćw.5  Ćw.6  Ćw.7  Ćw.8  Ćw.9  Ćw.10  Ćw.11  Ćw.12  Ćw.13  Ćw.14  Ćw.15 

Egzamin

Zakres materiału: wykłady, warto poszerzyc o [1]-rozdziały: 1,2,3,4,5,6,7,8,9,11,12,13,21,22,23



Wykład 1

Wykład wprowadzający. Definicja systemu operacyjnego. Architektury komputerów. Wspolpraca ze sprzetem. Wspolpraca z uzytkownikami. Struktura S.O. Wielozadaniowosc. Uslugi S.O. Systemy scentralizowane, rozproszone. Systemy czasu rzeczywistego. Systemy wbudowane.

Wykład 2

Procesy i wątki w systemie operacyjnym. Definicje. Procesy i wątki. Stany procesów. Priorytety. Problem inwersji priorytetów. Wyznaczanie kolejności wykonywania procesów - algorytmy: FIFO, SJF , karuzelowy, kolejka priorytetowa, kolejka priorytetowa z algorytmem karuzelowym, EDF, MLF, RMS.

Wykład 3

Procesy cd. Szeregowanie procesów w systemie VxWorks. Szeregowanie procesów w systemie QNX. Szeregowanie procesów w systemie Linux. Algorytm szeregowania procesów w Linuxie. Ochrona przed zagłodzeniem. Współpraca z użytkownikiem. Szeregowanie zadań w systemie RTLinux. Szeregowanie procesów w systemie WinNT. Algorytm szeregowania procesów w systemie WinNT. Ochrona przed zagłodzeniem. Inwersja priorytetów w systemie WinNT.

Wykład 4

Synchronizacja procesów. Instrukcje atomowe. Błąd testowania, błąd aktualizacji. Sekcje krytyczne. Zdarzenia. Semafory. Oczekiwanie aktywne i pasywne. Implementacja sekcji krytycznej przy pomocy semafora. Klasyczne problemy synchronizacji procesów. Transakcje.

Wykład 5

Synchronizacja procesów cd. Zakleszczenia. Wykrywanie wystąpienia zakleszczenia. Graf przydziału zasobów. Wykrywanie wystąpienia zakleszczenia. Postępowanie z zakleszczeniami. Zapobieganie zakleszczeniom. Unikanie zakleszczeń. Sieci Petriego. Algorytmy wzajemnego wykluczania: algorytm Dekkera, Dijkstry, Lamporta, Petersona.

Wykład 6

Komunikacja międzyprocesowa. Model warstwowy OSI. Modele wymiany danych. Rozgłaszanie grupowe. Działania gwarantowane i niegwarantowane. Działania buforowane i niebuforowane.

Wykład 7

Komunikacja międzyprocesowa cd. Mechanizmy komunikacji. Mechanizmy komunikacji międzyprocesowej. Pamięć dzielona. Skrzynki. Potoki anonimowe i nazwane. Kolejki FIFO. Kolejki komunikatów. Kolejki komunikatów POSIX. Sygnały. Komunikaty systemowe. Schowek. Zdalne wywołanie procedury. COM/DCOM. Systemy wiadomości kolejkowanych.
Dodatkowe materiały do wykładu: SO-IDL.pdf

Wykład 8

Zarządzanie pamięcią. Adresacja pamięci fizycznej. Segmentacja pamięci. Przydział ciągły. Pamięć stronicowana. Obsługa pamięci wirtualnej. Obsługa pamięci w systemie Linux. Obsługa pamięci w systemie Windows NT.

Wykład 9

Zarządzanie urządzeniami wejścia - wyjścia. Podstawowe pojęcia. Dostęp do sprzętu w systemie MS-DOS. Dostęp do sprzętu w systemie QnX. Dostęp do sprzętu w systemie Linux. Dostęp do sprzętu w systemie Windows NT.

Wykład 10

Pamięci masowe. Struktura dysków twardych. Systemy plików. Alokacja plików na dysku. System FAT. System EXT2. System NTFS.


Materiały do wykładów: SO-wyklad.rar



Ćw. 1

Ćwiczenie 1 ma charakter inauguracyjno-organizacyjny. W trakcie zajęć należy zapoznać się z systemem operacyjnym Windows i kompilatorem DevC++. Wybór kompilatora jest związany z jego ceną ( 0$ :), ogolnodostępnością i niewielkim rozmiarem programu instalacyjnego (7,5MB). Posiada on zintegrowane środowisko, podobne do VisualC++. DevC++ pozwala na tworzenie programów Win32 trybu  konsola lub okienkowego (WIN API), co wystarcza na potrzeby przedmiotu.

Strona DevC++:  http://www.bloodshed.net

Korzystanie z debbugera w DevCpp: devdebug.pdf.
Preferowane formatowanie: formatowanie.pdf.
Wcięcia w VC++: VC++: File-New-File-VisualC++-cpp file, wkleic, zaznaczyc wszystko lub czesc, Edit-Advanced-Format Selection

W ramach ćwiczeń należy stworzyć aplikację typu konsola i typu okno.

Uwaga! Podczas tworzenia aplikacji Win32 przydatne mogą być książki  [4], [6], [7] oraz wsparcie z internetu  [5].

W ramach cwiczen należy zapoznac sie z nastepujacymi funkcjami:
- printf(), sprintf(), liczne formatowania, min. %c, %s, %d, %f, %lf, %x, %u
- getch(), getchar(), gets(), scanf(), kbhit() (roznice!),
- fopen(), fputc(), fputs(), fprintf(), fscanf(), fgets(), fclose()  

Ćw. 2

Operacje na procesach w systemie.
Przed ćwiczeniem należy zapoznać się w [5] z funkcjami API dotyczącymi sterowania procesami:

- WinExec();
- OpenProcess();
- TerminateProcess();
- CloseHandle();

oraz informacjami statystycznymi:
- EnumProcesses();
- EnumProcessModules();
- GetModuleBaseName();
- GetProcessMemoryInfo();
- GetProcessTimes();
- GetPerformanceInfo();

Uwaga!
Ww. funkcje wymagają:

  • włączenia pliku nagłówkowego: #include "psapi.h"
  • dołączenia biblioteki libpsapi.a (MENU: Projekt->Opcje projektu, zakładka Parametry, przycisk 'Dodaj plik' - plik należy znaleźć w katalogu DevCpp/lib


  • Powyzsze ustawienia tylko na potrzeby cwiczenia 2 !!!

    Ćw. 3

    Ćwiczenie poświęcone procesom i wątkom w systemie, ich współdziałaniu, priorytetom.
    Przed ćwiczeniem należy zapoznać się w [5] lub [4, rozdz.15,  PO POLSKU!] z funkcjami API dotyczącymi sterowania procesami i wątkami:

    - CreateProcess();
    - CreateThread();
    - SetThreadPriority();
    - GetThreadPriority();
    - SetPriorityClass();
    - GetCurrentProcess();
    - GetPriorityClass();
    - OpenThread();
    - GetCurrentThread();
    - SuspendThread();
    - ResumeThread();
    - TerminateThread();
    - Sleep();
    - timeGetTime();     ( winmm.lib (DevCpp: libwinmm.a) )

    Ćw. 4

    Cel ćwiczenia to realizacja dostępu wielu wątków do wspólnych zmiennych. Rozważane są  instrukcje atomowe.
    Przed ćwiczeniem należy przypomnieć sobie, co daje zmiennej atrybut volatile (np. tutaj [5]) oraz zapoznać się w [5]  z funkcjami API:

    - InterlockedIncrement();
    - InterlockedDecrement();
    - InterlockedExchange();
    - InterlockedExchangeAdd();
    - InterlockedExchangePointer();

    Ciekawe mogą też być:
    - InterlockedIncrementAcquire();
    - InterlockedIncrementRelease();
    - InterlockedCompareExchange();
    - InterlockedCompareExchangePointer();

    Ćw. 5

    Sekcje krytyczne - bardzo ważne ćwiczenie, ukazujące zasady ograniczonego dostępu wielu wątków do obszaru operacji na wspólnych danych.
    Przed ćwiczeniem należy dowiedzieć się, co to jest sekcja krytyczna, jak się z niej korzysta oraz zapoznać się w [5] z funkcjami API :

    - InitializeCriticalSection();
    - TryEnterCriticalSection();
    - EnterCriticalSection();
    - LeaveCriticalSection();
    - DeleteCriticalSection();
     

    Ćw. 6

    Obiekty synchronizacji między procesami: semafory zliczające i binarne (+mutex), semafory globalne.
    Przed ćwiczeniem należy  dowiedzieć się, co to jest semafor, jak się z niego korzysta oraz zapoznać się w [5] lub [4, rozdz.15,  PO POLSKU!] z funkcjami API :

    - CreateSemaphore();
    - OpenSemaphore();
    - ReleaseSemaphore();
    - CreateMutex();
    - OpenMutex();
    - ReleaseMutex();
    - WaitForSingleObject();
    - WaitForMultipleObjects();

    Ćw. 7

    Celem ćwiczenia jest zapoznanie się z mechanizmem przekazywania danych między procesami, jakim jest pamięć dzielona.
    Przed ćwiczeniem należy dowiedzieć się, jak się korzysta z pamięci dzielonej oraz zapoznać się w [5] z funkcjami API :

    - CreateFileMapping();
    - OpenFileMapping();
    - MapViewOfFile();
    - MapViewOfFileEx();
    - CopyMemory();
    - UnmapViewOfFile();

    Ćw. 8

    Komunikacja między procesami: skrzynki (mailslot). Przygotowanie do ćwicznienia wiąże się z zapoznaniem się z funkcjami:
    - CreateMailslot();
    - GetMailslotInfo();
    - ReadFile();
    - CreateFile();
    - WriteFile();
    - CloseHandle();

    http://support.microsoft.com/kb/137143

    Ćw. 9

    Komunikacja między procesami - potoki (pipe). Potoki moga byc anonimowe (komunikacja międzywątkowa)  lub nazwane (międzyprocesowa). Przekazywane przez nie dane mają zachowaną kolejność, nie giną ani nie są duplikowane. Przed przystąpieniem do zajęć należy przygotować sobie informacje o funkcjach,  które będą używane na zajęciach:

    - CreatePipe();
    - WriteFile();
    - ReadFile();
    - CloseHandle();

    - CreateNamedPipe();
    - ConnectNamedPipe();
    - DisconnectNamedPipe();
    - WaitNamedPipe();

    Ćw. 10

    Procesy, wątki i semafory w systemie Unix (Linux).

    Przed przystąpieniem do zajęć należy przygotować sobie informacje o funkcjach, które będą używane na zajęciach:
    - fork();
    - clone();

    - pthread_create();
    - pthread_exit();
    - pthread_join();
    - pthread_detach();
    - pthread_attr_init();

    - sleep();
    - usleep();

    - semget();
    - semctl();
    - semop();

    - ftok();
    - struct sembuf

    Ćw. 11

    Komunikacja międzyprocesowa w systemie Unix(Linux).

    Przed przystąpieniem do zajęć należy przygotować sobie informacje o funkcjach, które będą używane na zajęciach:
    - fork();
    - clone();

    - shmget();
    - shmctl();
    - shmat();
    - shmdt();

    - pipe();
    - read();
    - write();

    - mknod();
    - mkfifo();
    - open();
    - close();
    - read();
    - write();
    - unlink();

    Ćw. 12

    Komunikacja międzyprocesowa w systemie Unix(Linux).

    Przed przystąpieniem do zajęć należy przygotować sobie informacje o funkcjach, które będą używane na zajęciach:

    - msgget();
    - msgctl();
    - msgsnd();
    - msgrcv();

    - signal();
    - raise();
    - kill();

    - atomic_inc(),
    - atomic_dec(),
    - atomic_add(),
    - atomic_set(),

    Ćw. 13

    Algorytmy wzajemnego wykluczania (alg. Dekkera, Lamporta, Petersona).

    Ćw. 14

    Problem 5-ciu filozofów - wersja z widelcami podnoszonymi naraz.
    Prosze zapoznać się z funkcją WaitForMultipleObjects();

    Ćw. 15

    Problem 5-ciu filozofów - wersja z widelcami podnoszonymi kolejno.
     
     



    Literatura i zasoby:

    [1]  Silberschatz A., Peterson L... : Podstawy systemów operacyjnych, WNT, wydanie piąte, (1998-)2002
    [2]  Ben-Ari M.: Podstawy programowania współbieżnego i rozproszonego, WNT
    [3]  Tannenbaum A.: Rozproszone systemy operacyjne, PWN
    [4]  Karmański J. : Praktyczny kurs programowania pod Windows 95, Helion
    [5]  MSDN,  http://msdn.microsoft.com
    [6]  Richter J. :Programowanie aplikacji dla Microsoft Windows, RM 2000
    [7]  Petzold Ch.: Programowanie Windows 95 (kompletny przewodnik programisty po API Windows 95), RM 1997
    [8]  Bovet D. P., Cesati M.: Understanding the Linux Kernel,O'Reilly
    [9]  Russinovich M.: Inside the Windows NT Scheduler,Windows NT Magazine 07.1997
    [10]  Wyklady z przedmiotu Systemy Operacyjne (Politechnika Czestochowska)
    [11]  Wykład z programowania w WinAPI 32: http://alan.umcs.lublin.pl/~dotnet/wyklad.pdf (znalazła p. M. Piskorz - dziękuję)
    [12]  Stallings W.: Systemy operacyjne, Robomatic, 2004
    [13]  Richter J., Nasarre Ch.: Windows via C/C++. Microsoft Press, wersja polska APN Promise Warszawa 2007



    opr. Adam Piórkowski, 2004-2006
     pioro(at)agh.edu.pl