• Nie Znaleziono Wyników

Podstawy Pamięć wirtualna

N/A
N/A
Protected

Academic year: 2022

Share "Podstawy Pamięć wirtualna"

Copied!
7
0
0

Pełen tekst

(1)

9.1

Pamięć wirtualna

1.

Podstawy.

2.

Stronicowanie na żądanie.

3.

Zastępowanie stron.

4.

Algorytmy zastępowania stron

5.

Problem szamotania

6.

Model zbioru roboczego

Wykład 12, Systemy operacyjne (studia dzienne) PJWSTK, Adam Smyk, 2016/17

9.2

1. Logiczna przestrzeń adresowana może być dużo większa niż przestrzeń fizyczna.

2. Umożliwia to wykonanie programu, który tylko w części znajduje się w pamięci fizycznej – program nie jest ograniczony wielkością dostępnej pamięci fizycznej (może być od niej większy).

3. Zwiększa wieloprogramowość (więcej procesów może być wykonywanych w tym samym czasie) → lepsze wykorzystanie procesora i wyższa przepustowość.

4. Pozwala na wydajniejsze tworzenie i wymianę procesów – mniej potrzebnych operacji wejścia-wyjścia.

5. Uwalnia użytkownika od potrzeby znajomości organizacji i ograniczeń pamięci fizycznej → ułatwia programowanie.

9.3

Podstawy

Pamięć wirtualna jest techniką, która umożliwia wykonanie procesów, pomimo że nie są one w całości przechowywane w pamięci operacyjnej. Pozwala stworzyć abstrakcyjną pamięć główną w postaci olbrzymiej, jednolitej tablicy i odseparować pamięć logiczną od pamięci fizycznej.

 Pamięć wirtualna jest najczęściej implementowana w formie:

Stronicowania na żądanie (ang. demand paging) Segmentacji na żądanie (ang. demand segmentation)

9.4

Schemat pamięci wirtualnej

Odwzorowanie pamięci

Pamięć fizyczna

Dysk Pamięć

wirtualna Strona 0 Strona 1 Strona 2

. . .

Strona n

9.5

Stronicowanie na żądanie

 Procesy podzielone na strony przebywają w pamięci pomocniczej (zwykle dysk).

 Strona jest sprowadzana z pamięci pomocniczej do operacyjnej tylko wtedy, kiedy jest potrzebna.

Mniej operacji WE/WY.

Mniejsze zapotrzebowanie na pamięć.

Krótszy czas odpowiedzi.

Może pracować jednocześnie więcej użytkowników.

 Strona jest potrzebna kiedy następuje do niej odwołanie.

 Z każdą pozycją w tablicy stron związany jest bit poprawności (valid-invalid bit)

 Odwołanie do strony z bitem poprawności równym 0 powoduje pułapkę braku strony (page-fault trap), po czym następuje awaryjne przejście do systemu operacyjnego.

9.6

Pamięć logiczna

0 A

1 B

2 C

3 D

4 E

5 F

A B

C D E

F

Dysk

Przykład schematu tablicy stron z brakiem stron w pamięci fizycznej

Tablica stron

0 4 1

1 0

2 6 1

3 0

4 0

5 9 1

Pamięć fizyczna 0 1 2 3

4 A

5

6 C

7 8

9 F

10 11 12 13 14 15 ramka bit poprawności

(2)

9.7

Dysk Pamięć

fizyczna

Obsługa braku stron

1

3

2

4 Strona jest w pamięci pomocniczej

Pułapka

Sprowadzenie brakującej strony

Operacja M 0

Odniesienie

6 Wznowienie

wykonania

System operacyjny

5 Odnowienie tablicy stron

9.8

Obsługa braku strony

1. Sprawdzamy wewnętrzną tablicę (w bloku kontrolnym procesu), aby określić czy odwołanie do pamięci było dozwolone.

2. Jeżeli odwołanie było niedozwolone, kończymy proces. Jeżeli było dozwolone, lecz zabrakło właściwej strony w pamięci, to sprawdzamy tę stronę.

3. Znajdujemy wolną ramkę.

4. Zamawiamy wczytanie z dysku potrzebnej strony do wolnej ramki.

5. Po zakończeniu czytania modyfikujemy wewnętrzną tablicę procesu, oraz tablicę stron, zaznaczając, że strona jest w pamięci.

6. Wznawiamy wykonanie rozkazu przerwanego brakiem strony i kontynuujemy wykonywanie procesu (czasami do wykonania rozkazu potrzeba sprawdzić więcej niż jedną stronę).

 Skrajny przypadek: czyste stronicowanie na żądanie (pure demand paging) – rozpoczynanie wykonywania procesu bez żadnej strony w pamięci (nigdy nie sprowadza się strony do pamięci, zanim, nie będzie potrzebna).

9.9

Sprawność stronicowania na żądanie

Czas dostępu do pamięci:  (nanosekundy)

Prawdopodobieństwo braku strony: p (0  p  1)

Czas obsługi braku strony: T

Efektywny czas dostępu: t_ef = (1-p)+pT

Główne składowe czasu obsługi braku strony:

1. Obsługa przerwania wywołanego brakiem strony.

2. Wczytanie strony z dysku do pamięci (zwykle najbardziej czasochłonne).

3. Wznowienie procesu.

9.10

Sprawność stronicowania na żądanie

Efektywny czas dostępu: t_ef = (1-p)+pT

Przykład:  = 100 ns,

T = 25 ms = 25 000 000 ns,

t_ef = (1 – p)  100 + p  25 000 000 [ns]

t_ef = 100 + 24 999 900  p [ns]

Aby pogorszenie szybkości dostępu do pamięci spowodowane brakiem stron było mniejsze niż 10%

potrzeba:

P < 0,0000004,

czyli mniej niż 1 brak strony na 2 500 000 odniesień do pamięci!

9.11

Problem z pamięcią wirtualną

Załóżmy że mamy „10-stronicowy” proces, który używa tylko połowy ze swych stron

 Stronicowanie na żądanie pozwala wówczas zaoszczędzić na operacjach WE/WY ponieważ nie wprowadza się stron, które nigdy nie będą użyte.

 Można zwiększyć stopień wieloprogramowości, wykonując podwójnie więcej procesów, np. mając 40 ramek, to zamiast 4 procesów (każdy po 10 ramek), moglibyśmy wykonać 8 procesów

Powiększenie stopnia wieloprogramowości może doprowadzić do nadprzydziału pamięci

 Może się z darzyć, że każdy z tych procesów dla szczególnego zestawu danych spróbuje użyć wszystkich 10 stron, co spowoduje zapotrzebowanie na 80 ramek, przy tylko 40 dostępnych.

9.12

Problem z pamięcią wirtualną

Nadprzydziałobjawi się w następujący sposób

Podczas wykonywania procesu użytkownika wystąpi brak strony

Sprzęt zaalarmuje SO, który sprawdzi swoje wewnętrzne tablice, aby rozstrzygnąć, że to jest brak strony.

SO określi miejsce przebywania strony na dysku, po czym okaże się, że na liście wolnych ramek nie ma ani jednej wolnej ramki (cała pamięć jest w użyciu).

 Co może zrobić SO w takiej sytuacji?

Mógłby zakończyć proces użytkownika (nie jest to najlepsze rozwiązanie)

Mógłby wymienić proces, zwalniając wszystkie jego ramki i zmniejszając poziom wieloprogramowości

Istnieje jednak bardziej interesująca możliwość: zastępowania stron

(3)

9.13

Zastępowanie stron

 Zasada zastępowania stron jest następująca:

 Jeżeli wszystkie ramki są zajęte, to znajduje się taką, która nie jest właśnie używana i zwalnia się ją.

 Ramkę można zwolnić poprzez zapisanie jej zawartości na dysku i zmianę tablicy stron.

 Zwolnioną ramkę można użyć do wprowadzenia strony, której brak spowodował przerwanie procesu

9.14

Zastępowanie stron

 Procedura obsługi braków stron ulega modyfikacji, aby uwzględnić zastępowanie stron:

1. Zlokalizowanie potrzebnej strony na dysku.

2. Odnalezienie ramki:

– Jeśli istnieje wolna ramka, to zostanie użyta;

– W przeciwnym razie trzeba wykonać algorytm zastępowania stron w celu wytypowania ramki-ofiary;

– Stronę-ofiarę zapisuje się na dysku (bit modyfikacji); towarzyszy temu stosowana zmiana tablic stron i ramek.

3. Wczytanie potrzebnej strony do świeżo zwolnionej ramki i zamiana tablicy stron i ramek

4. Wznowienie działania procesu.

9.15

2

3

Dysk Tablica stron

0

1

2 0 0

3 r 1

4

5

Pamięć fizyczna 0 1 2 3

r Ofiara

12 13 14 15 ramka bit poprawności

Schemat zastępowania stron

1 3 2

4 Zmiana na

„niepoprawne 0”

Uaktualnienie tablicy stron dla nowej

strony

Sprowadzenie potrzebnej

strony Wysłanie strony-ofiary

9.16

Algorytm zastępowania stron

 Zależy nam na algorytmie, który minimalizuje częstość braków stron

 Algorytm ocenia się na podstawie wykonania go na pewnym ciągu odniesień do pamięci i zsumowania liczby braków stron

 Śledząc pewien proces moglibyśmy zanotować następujący ciąg adresów stron:

1, 4, 1, 6, 1, 6, 1, 6, 1, 6, 1

 Liczba braków stron dla danego ciągu odniesień zależy:

Od liczby ramek procesu dostępnych w pamięci

Od całkowitej liczby dostępnych ramek

9.17

Algorytm FIFO

 Numer każdej strony znajdująca się w pamięci operacyjnej, jest jednocześnie zapisywany do kolejki (FIFO)

 Kiedy trzeba zastąpić stronę, wtedy wybiera się stronę najstarszą – z czoła kolejki FIFO

 Liczba braków stron dla danego procesu i danego algorytmu: 15

 Algorytm nie zawsze działa zadowalająco

strona zastępowana może zawierać zmienną, będącą ciągle w użyciu od dawna, ale jest najstarsza i musi być usunięta

za chwilę trzeba będzie sprawdzić z powrotem aktywną stronę, a usunąć inną

zły wybór przy zastępowaniu zwiększa liczbę braków stron i spowalnia wykonanie procesu

9.18

Anomalia Belady’ego

 Rozpatrzmy ciąg odwołań do stron:

1 2 3 4 1 2 5 1 2 3 4 5

 Rysunek przedstawia krzywą braków stron w zależności od liczby dostępnych ramek

anomalia Balady’ego – liczba braków stron dla 4-ch ramek jest większa od liczby stron dla 3-ch ramek

wniosek: w niektórych algorytmach zastępowania stron współczynnik braków stron może wzrastać ze wzrostem wolnych ramek

(4)

9.19

Algorytm optymalny (OPT)

Skoro algorytm FIFO nie do końca spełnia wymagania zamiany stron to:

Jaki algorytm jest algorytmem optymalnym?

Jakieś propozycje?

9.20

Algorytm optymalny (OPT)

Algorytm optymalny (OPT):

zastępuje tą stronę, która najdłużej nie będzie używana

Liczba braków stron dla tego samego ciągu odniesień i optymalnego algorytmu: 9

Algorytm jest trudny do realizacji ponieważ wymaga wiedzy o przyszłej postaci ciągu odniesień

Używany jest więc głównie w studiach porównawczych, aby stwierdzić np. że jakiś algorytm odbiega od optymalnego w najgorszym razie o np.. 12,3%, a średnio jest gorszy od niego o 4,7%

9.21

Algorytm LRU (least recently used)

 Algorytm optymalny nie jest osiągalny, ale być może da się uzyskać jego przybliżenie???

 Do szacowania najbliższej przyszłości możemy użyć niedawnej przeszłości – zastąpić stronę, która była najmniej ostatnio używana

 Algorytm stosuje się często i uważa się za dość dobry – główna trudność: sposób implementacji zastępowania wg kolejności LRU wymaga zaplecza sprzętowego

 Kłopot sprawiają określenie porządku ramek na podstawie czasu ich ostatniego użycia.

 Stosuje się dwie implementacje: licznikową i stosową.

9.22

Algorytm LRU

Implementacja z użyciem liczników:

Do każdej pozycji w tablicy stron dołączamy rejestr czasu użycia, do procesora zaś dodajemy zegar logiczny lub licznik.

Wskazania zegara są zwiększane wraz z każdym odniesieniem do pamięci.

Ilekroć występuje odniesienie do pamięci, tylekroć zawartość rejestru zegara jest kopiowana do rejestru czasu użycia należącego do danej strony w tablicy stron.

Tak więc dysponujemy czasem ostatniego do niej odniesienia

Zastępujemy stronę z najmniejszą wartością czasu

Schemat wymaga:

Przeglądania tablicy stron w celu odnalezienia najdawniej używanej

Zapisywania w pamięci

Uaktualnianie rejestrów czasu użycia przy wymianie stron

9.23

Algorytm LRU (least recently used)

Implementacja stosowa : utrzymywanie stosu numerów stron

Przy każdym odwołaniu do strony jej numer wyjmuje się ze stosu numerów stron i umieszcza na jego szczycie

Na szczycie stosu jest więc zawsze stron użyta ostatnio a na spodzie są strony najdawniej używane

Do implementacji używa się dwukierunkowej listy – uaktualnianie listy jest dość pracochłonne

Zastępowanie optymalne, metoda LRU oraz tzw.

algorytmy stosowe nie są dotknięte anomalią Belady’ego.

9.24

Algorytmy przybliżające metodę LRU

 Niewiele systemów posiada odpowiedni sprzęt do realizacji prawdziwego algorytmu LRU -> często stosowane są algorytmy przybliżające zastępowanie stron metodą LRU.

Algorytm bitów odniesienia:

bit odniesienia (reference bit) jest ustawiany dla danej strony przez sprzęt zawsze wtedy, gdy występuje do niej odniesienie (pisanie/

czytanie)

na początku wszystkie bity odniesienia są zerowe

w trakcie wykonania procesu odpowiednie bity odniesienia są ustawione na 1

wiadomo więc, które strony były użyte, ale nie wiadomo w jakim porządku

w miarę upływu czasu, bity mogą być wyzerowane, oznaczając że strona nie była używana przez ileś ostatnich odwołań

(5)

9.25

Algorytmy przybliżające metodę LRU

Algorytm dodatkowych bitów odniesienia:

Z każdą stroną związany jest 8-bitowy rejestr, na początku:

0000000

W regularnych odstępach czasu (np.. co 100 ms) system operacyjny wprowadza bit odniesienia na najbardziej znaczącą pozycję rejestru

Jako strona-ofiara przy zastępowaniu wybierana jest strona zawierająca najmniejszą liczbę w rejestrze.

9.26

Algorytmy przybliżające metodę LRU

Algorytm dodatkowych bitów odniesienia:

Przykład

warość rejestru dla strony 0 >01110100>

warość rejestru dla strony 1 >11000101>

warość rejestru dla strony 2 >10000000>

 Ostatnio były użyte strony 1 i 2, natomiast strona 0 nie była ostatnio użyta i ona zostanie przeznaczona do zamiany.

 Jeżeli nie bierzemy pod uwagę strony 0 to do zamiany przeznaczona będzie strona 2, jako rzadziej używana niż strona 1.

9.27

Algorytmy przybliżające metodę LRU c.d.

Algorytm drugiej szansy (zegarowy):

jego podstawą jest algorytm FIFO

jeżeli bit odniesienia = 0, to strona zostaje wybrana do zastąpienia.

jeżeli bit odniesienia = 1, to bit ten jest zerowany, a strona dostaje „drugą szansę”, tzn. do zastąpienia bierze się pod uwagę następną stronę itd..

przeglądanie stron wykonuje się cyklicznie.

Ulepszenie – branie pod uwagę pary: (bit odniesienia, bit modyfikacji).

9.28

Algorytm drugiej szansy (zegarowy)

0

1

1

0

1

Strony Bit odniesienia

Następna ofiara

0

0

0

0

1

Strony Bit odniesienia

Cykliczna kolejka stron

9.29

Algorytmy zliczające

 Wprowadzenie liczników odwołań do każdej strony.

 Algorytm LFU – najrzadziej używanej strony (ang. least fequently used):

do zastąpienia wybiera się stronę o najmniejszej wartości licznika.

Może być obarczony błędami wynikającymi z tego, że strona była na początku intensywnie używana, a potem nie jest wcale potrzebna.

Rozwiązanie: przesuwanie liczników w prawo o 1 bit w regularnych odstępach czasu

 Algorytm MFU – najczęściej używanej strony (ang. most fequently used):

do zastąpienia wybiera się stronę o największej wartości licznika.

Uzasadnienie: Strona o najmniejszej wartości licznika prawdopodobnie została niedawno wprowadzona do pamięci i będzie jeszcze używana

 Niestety implementacja tych algorytmów jest kosztowna, a nie przybliżają one dobrze algorytmu optymalnego.

9.30

Przydział ramek do procesów

Problem: Jak dzielić stałą ilość wolnej pamięci między różne procesy?

 Minimalna liczba ramek przypadających na proces jest zdefiniowana przez architekturę logiczną komputera ( określona jest przez zbiór rozkazów komputera).

 Jeśli brak strony wystąpi przed dokończeniem wykonywania rozkazów, to rozkaz niestety musi być powtórzony.

 Oznacza to, że należy mieć wystarczającą liczbę ramek do przechowania wszystkich stron, do których może się odnosić pojedynczy rozkaz

 Maksymalna liczba ramek wynika z ilości dostępnej pamięci fizycznej

 Rzeczywista liczba ramek przydzielonych dla danego procesu jest określona stosowanym algorytmem przydziału

(6)

9.31

Algorytm przydziału ramek

Przydział równy (ang. equal allocation): każdy proces dostaje tyle samo ramek, jeżeli jest m ramek oraz n procesów, to każdemu procesowi przydziela się  m/n ramek

Przydział proporcjonalny (ang. proportional allocation): każdemu procesowi przydziela się dostępną pamięć odpowiednio do jego rozmiaru

niech si oznacza wielkość pamięci wirtualnej procesu pi; sumą pamięci wirtualnej wszystkich procesów określamy jako S=si

gdy ogólna liczba ramek wynosi m, procesowi pi przydzielamy i ramek, które w przybliżeniu wynosi i=(si/S)m

Przydział priorytetowy (ang. priority allocation): liczba przydzielonych ramek jest proporcjonalna do priorytetu procesu albo kombinacji rozmiaru i priorytetu (proces o wyższym priorytecie dostaje więcej ramek).

9.32

Problemy z brakującymi ramkami

Gdy wiele procesów rywalizuje o ramki w pamięci, algorytmy zastępowania stron można zakwalifikować do dwu kategorii:

zastępowania globalnego: procesy mogą wybierać brakujące im ramki ze zbioru wszystkich ramek, nawet gdy ramka jest w danej chwili przydzielona do innego procesu; w ten sposób proces o wyższym priorytecie może zwiększać liczbę swoich ramek kosztem procesu o niższym priorytecie

zastępowania lokalnego: liczba ramek przydzielonych procesowi nie zmienia się; proces wybiera do zastąpienia brakującą ramkę ze zbioru swoich ramek

9.33

Szamotanie

Proces, który ma w pamięci minimalną liczbę ramek i którego strony są aktywnie używane, spotyka się z problemem szamotania

Szybko następuje brak strony i trzeba zastąpić jakąś stronę, która za chwilę okaże się potrzebna – proces szamoce się spędzając więcej czasu na stronicowaniu niż na wykonaniu.

Szamotanie powoduje poważne zaburzenia wydajności.

9.34

Przyczyny szamotania

 SO nadzoruje wykorzystanie jednostki centralnej i w przypadku gdy jest ono za małe to zwiększa się stopień wieloprogramowości wprowadzając nowy proces do systemu.

 Strony są zastępowane według globalnego algorytmu zastępowania stron

 Załóżmy, że proces w pewnej chwili wchodzi w nową fazę działania i potrzebuje więcej ramek

zaczyna wykazywać braki stron i powoduje utratę stron przez inne procesy

one też potrzebują tych stron, wykazują zatem ich braki i przyczyniają się do odbierania stron innym procesom

rośnie więc kolejka procesów do urządzenia stronicującego i jednocześnie opróżnia się kolejka procesów gotowych do wykonania

 Planista przydziału procesora dostrzega spadek wykorzystania procesora, więc zwiększa stopień wieloprogramowości

Nowy proces, aby wystartować, zabiera ramki wykonywanym procesom, sytuacja się powtarza...

Powstaje szamotanina, przepustowość systemu gwałtownie maleje

9.35

Zjawisko szamotania ilustruje poniższy wykres

 Jak widać, aby zwiększyć wykorzystanie procesora i powstrzymać szamotanie należy zmniejszyć stopień wieloprogramowości

 Efekt szamotania można ograniczyć za pomocą lokalnego algorytmu zastępowania

Przy zastępowaniu lokalnym, gdy jakiś proces zaczyna się szamotać, wówczas nie wolno mu zabierać ramek innego procesu i doprowadzać go także do szamotania, czyli:

Zastępowaniu stron powinno towarzyszyć zwracanie uwagi na to, którego procesu są one częściami

Jeśli jednak jakieś procesy się szamocą, to będą one pozostawać przez większość czasu w kolejce do urządzenia stronicującego, czyli:

wzrasta więc czas dostępu również dla procesów, które się nie szamocą

Szamotanie cd…..

9.36

Unikanie szamotania

1.Aby zapobiec szamotaniu należy dostarczyć procesowi tyle ramek ile potrzebuje

2.Istnieje kilka sposobów aby dowiedzieć ile ramek proces będzie potrzebować

Wykorzystuje się tzw. model strefowy zachowania się procesu podczas jego wykonywania

Tworzy się następnie model zbioru roboczego 3. Model strefowy procesu

Zakłada się, że w trakcie wykonania proces przechodzi z jednej strefy programu do innej

Przez strefę programy rozumie się pewien deterministyczny zbiór stron pozostających we wspólnym użyciu

Program składa się z wielu różnych stref, które mogą na siebie zachodzić

Strefy programu są określone przez jego strukturę i struktury danych

Proces będzie się szamotać jeśli otrzyma mniej ramek niż wymagane jest do obsługi bieżącej strefy

(7)

9.37 9.38

Model zbioru roboczego

 Model zbioru roboczego (ang. working-set model) opiera się na założeniu, że program ma charakterystykę strefową (a tym samym zapewniona jest pewna lokalność odwołań)

 ∆ - rozmiar okna zbioru roboczego

 za zbiór roboczy przyjmuje się zbiór stron, do których nastąpiło ostatnich ∆ odniesień

jeśli strona jest aktywnie używana , to będzie znajdować się w zbiorze roboczym

gdy przestanie być używana, to wówczas wypadnie ze zbioru roboczego po

∆ jednostkach czasu odliczonego od ostatniego do niej odwołania

zbiór roboczy przybliża więc strefę programu

np. ∆=10 odniesień do pamięci (patrz rysunek )

zbiór roboczy w chwili t1 będzie równy {1,2,5,6,7}

do chwili t2 zbiór roboczy zmieni się na {3,4}

9.39

Model zbioru roboczego

 Dokładność zbioru roboczego zależy od wyboru parametru ∆

Jeśli zbyt mały to nie obejmie całego zbioru roboczego

Jeśli zbyt duży, to może zachodzić na kilka stref programu

 Najważniejszą cechą zbioru roboczego jest jego rozmiar

Jeśli dla procesu i rozmiar jego zbioru roboczego jest ∆i , to łączne zapotrzebowanie na ilość ramek (Z) można określić wzorem

Z=∑ ∆i ,

Jeśli łączne zapotrzebowanie jest większe niż ogólna liczba dostępnych ramek to powstanie szamotanie; SO musi wybrać proces, którego wykonanie wstrzymać, a strony procesu usunąć z pamięci i zwolnione ramki przydzielić innym procesom.

9.40

Częstość braku stron

 Model zbioru roboczego daje zadowalające rezultaty, ale wygodniejszą metodą nadzorowania szamotania jest mierzenie częstości braków stron.

 Szamotanie odznacza się dużą częstością występowania braków stron – dąży się, zatem do nadzorowania częstości tych braków

Za duża jej wartość świadczy o tym, że proces potrzebuje więcej ramek;

po przekroczeniu wartości granicznej przydziela się procesowi dodatkową ramkę

Przy spadku częstości poniżej pewniej granicy usuwa się ramkę z procesu

Cytaty

Powiązane dokumenty

Sąd ma takie uprawnienie, jeżeli jest to konieczne dla zabezpieczenia prawidłowego toku postępowania. Sąd orzeka, że oskarżyciel posiłkowy nie może brać udziału

- w sprawach o przestępstwa ścigane na wniosek postępowanie z chwilą złożenia wniosku toczy się z urzędu, czyli jest publicznoskargowe. - przestępstwa bezwzględnie wnioskowe

Eon (przemytnik) ma 50 par zwierząt, 10 par psów, 8 kotów, 12 zajęcy, 20 hoholi, musi je przemycić na tratwie, ta jednak jest lipna bo zabiera tylko 9 par zwierząt... Sieć ma

Jaki jest warunek konieczny i dostateczny istnienia cyklu Eulera w spójnym grafie

Jeśli MMU stwierdzi, że dana strona nie znajduje się w pamięci, generuje przerwanie braku strony, które musi zostad obsłużone przez zarządcę.. pamięci

[r]

[r]

Zadania proszę robić w zeszycie przedmiotowym, jak wrócimy do normalnych lekcji, to do tych zadań jak trzeba będzie to się cofniemy (nie przesyłajcie mi rozwiązań zadań ze