Zad.1 Jeśli funckcje Wait i Signal nie są atomowe to przykładowy scenariusz może wyglądać tak. Pierwszy proces wykonuje funkcję Wait, dochodzi do pobrania wartości S.count i jej porównania, następuje przełączenie proces drugi także rozpoczyna funkcję Wait, ponieważ poprzedni proces nie zdążył zmodyfikować semafora (S.count nie zmienione) to wchodzi do swojej sekcji krytycznej, po przełączeniu także pierwszy proces wchodzi do swojej sekcji krytycznej. Jak widać brak atomowości powoduje, że na dowolnym momencie wykonania operacji semaforowych można przełączyć kontekst (czas kiedy może dojść do błędu to czas potrzebny na wykonanie operacji pomiędzy pobraniem wartości S.count a jej zmodyfikowaniem). Zad.2 Adres długości 24bit to 6 cyfr szesnastkowych 000000-ffffff Pamięć adresujemy z dokładnością do bajta Trochę skrótów: * 1KB pamięci adresujemy na 2^10bit * 4KB (4*1KB) upraszcza sprawę bo na adres trzeba 2^12bit (2^10 * 4 = 2^10*2^2) czyli trzy cyfry szesnastkowe, tak więc pierwsza ramka 000000-000fff, druga 001000-001fff, itd. :) i jak widać nie trzeba marnować czasu na konwertowanie między systemami zapisu ;) teraz w sumie nawet nie trzeba numerować ramek - bierzesz trzy pierwsze cyfry i już Mamy trzy ramki pamięci op. więc R:00A, W:01D, R:028, W:014, R:028, W:01D, R:032, W:03C, R:01D, W:00A Teraz będę wyliczał kolejne kroki i stan pamięci (wg. LRU): 1. 00A * (r) 2. 00A 01D * (r) 3. 00A 01D 028 * (wr) 4. 014 01D 028 * (wr) 5. 014 01D 028 6. 014 01D 028 7. 032 01D 028 * (wr) 8. 032 01D 03C * (wr) 9. 032 01D 03C 10. 00A 01D 03C * (wr) Czyli 7 błędów braku strony. :) Do tego mamy 7 odczytów z dysku i 5 zapisów. Dobra teraz jednak może przejdziemy na system dziesiętny 00A = 10 01D = 16 + 13 = 29 028 = 2*16 + 8 = 40 014 = 16+4 = 20 032 = 3*16 + 2 = 50 03C = 3*16 + 12 = 60 No i mamy numery bloków na dysku. Teraz jeszcze pozostaje problem odnajdowania konkretnego bloku na ścieżce. Przyznać się muszę, że nie wiem czy liczyć tak jakby istniało tylko opóźnienie związanie z odnajdowaniem ścieżki, czy uwzględniać przeszukiwanie bloków po przesunięciu... na wszelki wypadek będę liczył łącznie z przeszukiwaniem bloków. 1. 5ms*10 = 50ms 2. 5ms*9 (bo jesteśmy na 10bloku) + 10ms = 55ms 3. 10ms + 5ms*11 = 65ms 4. 10ms + ... itd. Dość pokraczna metoda liczenia - nie jestem nawet jej pewien... Zad.3 Też bym wpisał 2 (ilość zasobów zaspokajająca dwa procesy w całości) Zad.4 Nie można było odczytać? Szklanej kóli także się jeszcze nie dorobiłem. :D Zad.6 Nie wiem jak tobie, ale mi się zdaje, że im niższa liczba priorytetu tym ważniejszy proces. Zad.5 Mamy 128B pamięci, do jej zaadresowania jest potrzebnych 7bit, bo jeśli adresujemy z dokładnością do jednego bajta, to 2^7 = 128B, adres fizyczny odpowiada szerokości fizycznej magistrali adresowej procesora Adres wirtualny zależy tylko od tego jak wiele jest w stanie zaadresować procesor... może się pokrywać z adresem fizycznym ale nie musi, zazwyczaj jest jednak większy. Można przypuszczać, że adres wirtualny zostanie zaokrąglony do jednego bajta (8 bitów co daję możliwość zaadresowania 256B pamięci). Rozwiązanie podane w pdf-ie jest na pewno złe, kto widział kiedykolwiek adres fizyczny skłądający się z 1024bitów? Adres 64bitówy daje możliwość adresowania niewiarygodnie dużych pamięci... i do tego adres wirtualny mniejszy od adresu fizycznego uniemożliwiający wykorzystanie całego potencjału sprzętu... Ponieważ pamięć podzielona jest na ramki po 8B (3b na adres bajtu w ramce) to na adres samej ramki zostaje 4b dla adresu fizycznego. Jeśli więc najmniej istotne 3 bajty oznaczają numer bajtu a pozostałe numer ramki, to po zamianie adresu z systemu szesnastkowego na ósemkowy dostajemy wszystko ładnie ponumerowane, np. 0x03 (16) = 03 (8) - to mamy adres fizyczny to 0xC+3 = 0xF, dla 0x1d (16) = 035 (8) - 0x5+5 = 0xA 8b 9d (b i c jeśli ustawimy operacje na potoku w tryb blokujący)
sebas86