Zgłaszanie | Wszystkie zgłoszenia | Najlepsze | Lista |
WI_KLAST - Przydział klastrów |
Jednym z angielskich słów, z którym komputerowa polszczyzna nie dała sobie rady, jest termin cluster. Próbowano wielokrotnie zastąpić tego Anglosasa jakimś zgrabnym polskim odpowiednikiem, ale się nie udało – jedyny widoczny efekt to taki, że spolszczono pisownię tego słowa, dzięki czemu możemy w różnych miejscach natknąć się na niezbyt piękne i zupełnie niepolskie słowo klaster.
Klaster pojawia się w wielu różnych dziedzinach informatyki (i nie tylko informatyki), my jednak zajmiemy się dzisiaj tylko jednym jego obliczem, związanym niepodzielnie ze sposobem, w jaki system operacyjne zarządza przestrzenią dyskową.
Pliki rozmieszczone na dysku rzadko kiedy zajmują na nośniku dokładnie tyle miejsca, ile wynosi ich rozmiar. Zazwyczaj zajmują go znacznie więcej, a dzieje się tak dlatego, że system operacyjny przydziela nośnik plikowi nie pojedynczymi bajtami, a tylko i wyłącznie całymi klastrami (które w tym zastosowaniu czasem nazywa się jednostkami przydziału). Jeśli np. założymy na dysku plik, w którym zapiszemy dokładnie jeden bajt, to i tak system operacyjny przydzieli temu plikowi cały klaster. Wynika z tego niezbicie, że klaster powinien być jak najmniejszy, by marnotrawstwo przestrzeni dyskowej było jak najmniejsze. Niestety, mały klaster w konsekwencji zaowocuje wielką liczbą klastrów, a przecież informacje o przydziałach system operacyjny musi efektywnie pamiętać i przetwarzać. Z tego powodu rozmiar klastra jest zwykle kompromisem pomiędzy wydajnością systemu operacyjnego i akceptowalną wielkością dyskowych nieużytków.
Twoim zadaniem będzie napisanie fragmentu kodu, który posłuży systemowi operacyjnemu WIZUT 2009 do poprawnego zarządzania przestrzenią dyskową.
Zakładamy, że całkowity dostępny rozmiar dysku wynosi n klastrów, a sam klaster ma rozmiar r bajtów. W stanie początkowym na dysku nie istnieje żaden plik, więc wszystkie klastry są dostępne. System WIZUT 2009 umożliwia wykonanie na dysku następujących operacji:
-
CREATE – zakłada nowy plik o podanej nazwie i zerowym rozmiarze
-
WRITE – dopisuje do pliku o podanej nazwie wskazaną liczbę bajtów
-
TRUNCATE – usuwa z pliku o podanej nazwie wskazaną liczbę bajtów
-
DELETE – kasuje plik o podanej nazwie
Jeśli wykonanie pewnej operacji jest niemożliwe (z dowolnego powodu), system WIZUT 2009 ignoruje ją kompletnie.
Polecenie: napisz program, który symuluje działanie systemu operacyjnego WIZUT 2009, śledząc efekty wykonania podanego na standardowym wejściu ciągu poleceń
Dane wejściowe: nieznana z góry liczba wierszy tekstu zawierających kolejno:
-
wiersz 1: liczba klastrów dostępnych na dysku (całkowite n: n >=1 i n < 100000)
-
wiersz 2: rozmiar klastra na dysku w bajtach ( całkowite r: n >=1 i n < 1000)
-
w kolejnych wierszach: polecenia dla systemu - w każdym wierszu jedno z poniższych:
-
polecenie utworzenia pliku postaci:
CREATE nazwa_pliku
gdzie:
nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków
powoduje utworzenie pliku o podanej nazwie i zerowej długości;
jeśli plik o takiej nazwie już istnieje, polecenie jest ignorowane.
-
-
- polecenie dopisania do pliku wskazanej liczby bajtów: WRITE nazwa_pliku liczba_bajtów
gdzie:
nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków;
liczba_bajtów jest liczbą całkowitą z przedziału od 1 do 10000;
powoduje, że plik o nazwie nazwa_pliku powiększa swój rozmiar o liczbę_bajtów, czemu może towarzyszyć przydzielenie plikowi nowych klastrów;
jeśli plik o podanej nazwie nie istnieje, polecenie jest ignorowane;
jeśli na dysku nie ma miejsca na dopisanie wskazanej liczby bajtów, polecenie jest ignorowane;
- polecenie usunięcia z pliku wskazanej liczby bajtów:
TRUNCATE nazwa_pliku liczba_bajtów
gdzie:
nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków;
liczba_bajtów jest liczbą całkowitą z przedziału od 1 do 10000;
powoduje, że plik o nazwie nazwa_pliku zmniejsza swój rozmiar o liczbę_bajtów, czemu może towarzyszyć zwolnienie przez plik pewnej liczby klastrów;
jeśli plik o podanej nazwie nie istnieje, polecenie jest ignorowane;
jeśli plik ma rozmiar mniejszy niż wskazano liczba bajtów, polecenie jest ignorowane.
- polecenie skasowania pliku postaci:
DELETE nazwa_pliku
gdzie:
nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków
powoduje usunięcie pliku o podanej nazwie i zwolnienie zajmowanych przez niego klastrów;
jeśli plik o takiej nazwie nie istnieje, polecenie jest ignorowane.
- polecenie dopisania do pliku wskazanej liczby bajtów: WRITE nazwa_pliku liczba_bajtów
Dane wyjściowe:
-
jeden wiersz, zawierający jedną daną całkowitą, będącą liczbą wolnych klastrów na dysku po wykonaniu wszystkich poleceń ze standardowego wejścia.
Przykład:
Wejście:
4
512
CREATE PLIK1
CREATE PLIK2
CREATE PLIK3
CREATE PLIK4
WRITE PLIK1 1
WRITE PLIK1 511
WRITE PLIK2 1024
WRITE PLIK3 100
WRITE PLIK4 1024
TRUNCATE PLIK4 1024
DELETE PLIK3
Wyjście:
1
Dodane przez: | Sławomir Wernikowski |
Data dodania: | 2009-09-22 |
Limit czasu wykonania programu: | 2s |
Limit długości kodu źródłowego | 5000B |
Limit pamięci: | 1536MB |
Cluster: | Cube (Intel G860) |
Języki programowania: | C CSHARP CPP C99 JAVA PAS-GPC PAS-FPC |
Pochodzenie: | Konkurs o nagrodę Dziekana WI ZUT w Szczecinie (2009) |