14. Elementy systemu wykonawczego

Podobne dokumenty
Przydział pamięci. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Wykład 14. Środowisko przetwarzania

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Ada-95. Dariusz Wawrzyniak

kiedy znowu uzyska sterowanie, to podejmuje obliczenie od miejsca, w którym poprzednio przerwała, i z dotychczasowymi wartościami zmiennych,

ZASADY PROGRAMOWANIA KOMPUTERÓW

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

SYSTEMY OPERACYJNE WYKLAD 4 - zarządzanie pamięcią

Zarządzanie pamięcią operacyjną

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Materiały do laboratorium MS ACCESS BASIC

Wstęp do programowania 2

PRZYDZIAŁ PAMIĘCI OPERACYJNEJ

1.1 Definicja procesu

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Wykład VI PASCAL procedury i funkcje przekazywanie parametrów,

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Zarządzanie pamięcią w systemie operacyjnym

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy Programowania semestr drugi. Wykład czternasty

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 4: Klasy i Metody

Algorytmy i struktury danych

4. Procesy pojęcia podstawowe

Architektura komputerów

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Mikroprocesor Operacje wejścia / wyjścia

Podstawy programowania skrót z wykładów:

Kursory. A. Pankowska 1

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Zarządzanie pamięcią operacyjną

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Działanie systemu operacyjnego

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Systemy operacyjne. Wprowadzenie. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Działanie systemu operacyjnego

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

KONSTRUKCJA KOMPILATORÓW

Język programowania PASCAL

Metody Realizacji Języków Programowania

Projektowanie. Projektowanie mikroprocesorów

Programowanie współbieżne Wykład 2. Iwona Kochańska

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Podstawy programowania w języku C++

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI

Wykład 3 Składnia języka C# (cz. 2)

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

Wykład 8: klasy cz. 4

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Zarządzanie pamięcią operacyjną zagadnienia podstawowe

Podstawy programowania komputerów

DYNAMICZNE PRZYDZIELANIE PAMIECI

Działanie systemu operacyjnego

Java EE produkcja oprogramowania

Języki i techniki programowania Ćwiczenia 2

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Podstawy Programowania

Wprowadzenie do programowania w języku C

Metody Kompilacji Wykład 1 Wstęp

Działanie systemu operacyjnego

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

3 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK SP.06 Rok akad. 2011/ / 22

Zaawansowane programowanie w języku C++ Klasy w C++

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Podstawy Informatyki. Wykład 6. Struktury danych

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Ćwiczenie nr 6. Programowanie mieszane

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

4. Procesy pojęcia podstawowe

Zarządzanie pamięcią. Od programu źródłowego do procesu. Dołączanie dynamiczne. Powiązanie programu z adresami w pamięci

Od programu źródłowego do procesu

Język C++ zajęcia nr 2

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Język PL/SQL Procedury i funkcje składowane

Podstawy programowania w języku C++

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

System plików warstwa fizyczna

System plików warstwa fizyczna

System plików warstwa fizyczna

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

System plików przykłady. implementacji

Delphi Laboratorium 3

Kompilator języka C na procesor 8051 RC51 implementacja

Pascal. 1. Pliki tekstowe. Przykład 1.1. Zapis do pliku tekstowego

Pamięć. Jan Tuziemski Źródło części materiałów: os-book.com

Procesy pojęcia podstawowe. 1.1 Jak kod źródłowy przekształca się w proces

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Transkrypt:

14. Elementy systemu wykonawczego 14.1 Wprowadzenie system wykonawczy (ang. run-time system) stanowi zestaw danych i operacji realizujących tzw. maszynę wirtualną języka programowania (na maszynie tej można uruchamiać wygenerowane w trakcie kompilacji programy wynikowe): tekst źródłowy kompilator kod wynikowy system wykonawczy program gotowy do wykonania stopień złożoności systemu wykonawczego zależy od semantyki konstrukcji zawartych w języku źródłowym wpływ na kształt systemu wykonawczego mają: styl źródłowego języka programowania, struktura modularna i reguły widoczności identyfikatorów, istnienie konstrukcji zapewniających współbieżność, istnienie dynamicznych obiektów (programowanie zorientowane obiektowo), istnienie rekursji i in. składowe systemu wykonawczego to: system zarządzania pamięcią, system zarządzania przydziałem procesora oraz system obsługi operacji we/wy 43

14.2 Zarządzanie pamięcią pamięć operacyjna przydzielona programowi podczas jego wykonywania może zawierać: kod programu dane statyczne stos sterta dane statyczne to zadeklarowane w programie statyczne (tzn. nie zmieniające wielkości w trakcie działania programu) zmienne globalne struktura stosu (pamięć i procedury obsługi) jest niezbędnym elementem systemu wykonawczego języka programowania dopuszczającego rekurencyjne wywoływanie procedur (funkcji) sterta (ang. heap) jest strukturą umożliwiającą realizację dynamicznego przydziału pamięci (ang. DSA-dynamic storage allocation) w sytuacji, gdy strategia przydziału pamięci na stosie nie wystarcza (nie daje się przedstawić w postaci drzewa). 44

14.2.1 Pojęcie rekordu aktywacji elementami umieszczanymi na stosie (i zdejmowanymi z niego) są reprezentacje wywoływanych modułów (procedur lub funkcji) zwane rekordami aktywacji, mogące zawierać następujące pola: obliczony wynik parametry aktualne łącze dynamiczne (DL) łącze statyczne (SL) stan maszyny zmienne lokalne zmienne tymczasowe top 45

rekord aktywacji jest umieszczany na szczycie stosu w momencie wywołania modułu i zdejmowany ze szczytu w momencie powrotu z wywołania (przekazania sterowania modułowi wywołującemu) obliczony wynik reprezentuje wartość obliczoną w trakcie wykonania (głównie) funkcji; często wynik ten jest przekazywany w rejestrze w polu parametrów aktualnych moduł wywołujący przekazuje dane modułowi wywoływanemu łącze dynamiczne (ang. dynamic link) służy do wskazywania początku rekordu aktywacji modułu wywołującego (w celu odtworzenia stanu stosu po powrocie z modułu wywołanego) łącze statyczne (ang. static link) umożliwia realizację dostępu do nazw nielokalnych (np. w Pascalu) pole stanu maszyny przechowuje m. in. zawartość rejestrów i licznika rozkazów, pozwalając odtworzyć stan maszyny, gdy sterowanie powróci z modułu wywołanego pole zmiennych lokalnych służy do przechowywania wartości zmiennych zadeklarowanych w treści wywoływanej procedury (funkcji) zmienne tymczasowe są generowane w trakcie przekładu wyrażeń wielkość rekordu aktywacji, w większości przypadków może być obliczona podczas kompilacji programu adresy zmiennych umieszczonych na stosie obliczane są względem (ang. variable offset) wskaźnika szczytu stosu. 46

14.2.2 Strategia statycznego przydziału pamięci przydział statyczny (ang. static allocation): kod programu dane statyczne dane statyczne obejmują zmienne globalne oraz rekordy aktywacji modułów; kompilator oblicza i umieszcza w kodzie programu adresy wszystkich zmiennych niedopuszczalne są: rekurencyjne wołania modułów, dynamiczny przydział pamięci strategię statyczną zastosowano w kompilatorach języka Fortran 47

14.2.3 Strategia przydziału pamięci na stosie (ang. stack allocation) rozważmy przykładowy program: program s; var a : integer; procedure r; var i:integer; begin... end; function p (x,y:integer):integer; var i,j,x,v:integer; begin... end; procedure q(m,n:integer); var i:integer; begin if(n>m) then begin i:=p(m,n); q(m,i-1); q(i+1,n); end end; begin... r; q(1,9) end. 48

oraz drzewo rekordów aktywacji: s r q(1,9) q(5,9) p(1,9) q(1,3) p(5,9) q(5,5) q(7,9) p(1,3) q(1,0) q(2,3) p(7,9) q(7,7) q(9,9) p(2,3) q(2,1) q(3,3) 49

zawartość stosu rekordów aktywacji po dojściu do wywołania q(2,3): s s a:integer s s a:integer r r i:integer s s a:integer r q(1,9) q(1,9) i:integer s s a:integer r q(1,9) q(1,9) i:integer p(1,9) q(1,3) q(1,3) i:integer p(1,3) q(1,0) 50

ciąg operacji związanych z umieszczaniem rekordów aktywacji na stosie i ze zdejmowaniem ich ze stosu nosi nazwę calling sequences ; jego wykonanie podzielone jest między moduł wywołujący a moduł wywoływany wywołanie: 1) moduł wywołujący wyznacza i umieszcza na stosie wartości parametrów aktualnych 2) moduł wywołujący składuje na stosie wartość licznika rozkazów i wskaźnika szczytu stosu oraz zwiększa zawartość wskaźnika szczytu stosu tak, by wskazywał początek rekordu aktywacji modułu wywoływanego, sterowanie przejmuje moduł wywołany 3) moduł wywołany składuje w rekordzie informacje o stanie maszyny 4) moduł wywołany inicjuje wartości zmiennych lokalnych i rozpoczyna wykonanie swego kodu. powrót: 1) moduł wywołany umieszcza obliczoną wartość poniżej rekordu aktywacji modułu wywołującego 2) moduł wywołany odtwarza stan maszyny i wartość wskaźnika szczytu stosu i przekazuje sterowanie do modułu wywołującego 3) moduł wywołujący odczytuje obliczoną wartość. obsługa stosu rekordów aktywacji jest niezbędnym elementem systemu wykonawczego w maszynach języków zawierających rekurencyjne wywołania modułów (np. Pascal, C, Java i in.). 51

14.2.4 Strategia przydziału pamięci na stercie (ang. heap allocation) jest niezbędna, gdy przepływu sterowania między modułami nie można opisać za pomocą drzewa rekordów aktywacji (np. obiekty, które nie są automatycznie usuwane z pamięci przykład operacji new i dispose w Pascalu) zarządzanie pamięcią na stercie nosi nazwę dynamicznego przydziału pamięci (DPP) podstawowe operacje DPP to: alokacja segmentu pamięci allocate(size, address), zwolnienie segmentu o wskazanym adresie deallocate(address) oraz dostęp do wskazanej komórki wskazanego segmentu access(address, offset) segmenty są pamiętane w blokach pamięci; istnieją różne metody reprezentacji bloków i strategii zarządzania nimi: 1) wolna pamięć może być podzielona na bloki o jednakowych rozmiarach, połączone w listę, której początek jest przechowywany w zmiennej AVAIL: AVAIL... alokacja pamięci polega na odłączeniu bloku z listy bloków wolnych, dealokacja zaś na dołączeniu; problem fragmentacji wewnętrznej 2) DPP może zawierać bloki wolne i zajęte o różnych rozmiarach: A wolny B C wolny D wolny 52

bloki o różnych rozmiarach mogą być reprezentowane metodą znacznikowania (ang. tag): t tag<0 : blok zajęty a tag>0 : blok wolny g tag = rozmiar bloku bloki mogą być między sobą powiązane; bloki wolne można przydzielać np. metodami: pierwszy pasujący (ang. first-fit), najlepszy pasujący (ang. best fit); powstają problemy fragmentacji zewnętrznej; sposobem rozwiązania jest skupianie bloków (ang. compaction) przesuwanie wszystkich bloków zajętych tak, aby stanowiły zwarty segment (problem uaktualnianie referencji), problem wiszących referencji (ang. dangling references): x y z a dispose(x); write(y^.a); rozwiązania: lista zmiennych referencyjnych, nagrobki (z licznikami, sygnaturowe) 53

x y z blok zawierający a x licznik blok y obszar obszar nagrobków bloków 54

zbieranie nieużytków (ang. garbage collection), to procedura automatycznego zwalniania bezużytecznej pamięci w systemach, w których nie ma operacji typu dispose (np. Lisp): y x: = y x y x nieużytki rozwiązania: zliczanie referencji, techniki markowania 55

14.2.5 Realizacja dostępu do nazw nielokalnych wynika ze struktury modularnej programu i przyjętych reguł widoczności nazw reguły widoczności dzielą się ogólnie na: statyczne (ang. lexical scope) i dynamiczne (ang. dynamic scope) reguły statyczne wynikają z tekstowej struktury deklaracji modułów i reguł przesłaniania nazw (np. Pascal, C, Java, Fortran) reguły dynamiczne określają znaczenie nazwy w czasie wykonania programu na podstawie bieżących rekordów aktywacji (np. Lisp, APL, Snobol) metodą realizacji reguł statycznych są: łącza statyczne lub wektory display 56

przykładowy program: program s; procedure r; begin... end; procedure e (i,j:integer); begin... end; procedure q(m,n:integer); function p(y,z:integer):integer; begin... e(i,j)...end; begin... end; begin... end; s s s s q(1,9) q(1,9) q(1,9) q(1,9) q(1,3) q(1,3) q(1,3) p(1,3) p(1,3) e(1,3) 57

łącza statyczne (zasady obliczania adresu zmiennej nielokalnej): s poziom 1 r e q poziom 2 p poziom 3 np. sterowanie jest w module p (poziom n p =3, rekord aktywacji jest na szczycie stosu), odwołanie do zmiennej x zadeklarowanej w module s (poziom n x =1); wykonaj n p n x przejść łańcuchem SL osiągając początek rekordu aktywacji modułu zawierającego deklarację zmiennej x; oblicz adres względny zmiennej względem początku rekordu aktywacji (offset); wektor display tablica wskaźników rekordów aktywacji na stosie; dla każdego poziomu w drzewie deklaracji wektor zawiera jedno pole; liczba pól wektora obliczana jest na etapie kompilacji: d[1] s d[3] q(1,9) 58

d[1] s d[3] q(1,9) q(1,3) d[1] s d[3] q(1,9) q(1,3) p(1,3) d[3] 59

d[1] s d[3] d[3] q(1,9) q(1,3) p(1,3) e(1,3) dostęp dynamiczny: dostęp głęboki (ang. deep access) i dostęp płytki (ang. shallow access), przykład programu: program prog; var r: real; procedure show; begin write(r:5:3) end; procedure proc; var r:real; begin r:=0.1; show end; begin r:=0.2; show; proc; end. 60

(zakres statyczny 0.2 0.2 zakres dynamiczny 0.2 0.1) prog prog r = 0.2 DL r = 0.2 DL show proc show r = 0.1 DL realizacja dostępu głębokiego wykorzystanie łączy dynamicznych (DL) na stosie do obliczania adresu zmiennej; prog r 0.2 show tablica asocjacji zmienna/wartość 61

prog proc tablica asocjacji zmienna/wartość r r 0.1 0.2 show 14.2.6 Przekazywanie parametrów tryby przekazywania parametrów: przez wartość, przez referencję, copy-restore, przez nazwę (rzadko stosowane) przekazywanie parametrów przez wartość wyznaczenie wartości parametrów przez moduł wywołujący, umieszczenie wyznaczonych wartości w rekordzie aktywacji modułu wywoływanego (po usunięciu ze stosu rekordu aktywacji modułu wywoływanego, wartości parametrów są tracone): 62

procedure proc1; var x, y:integer; begin x:=1; y:=2; proc2(x, y) end; procedure proc2(p1, p2:integer); begin :=p1+p2 end; proc1 x, y proc2 p1=1 p2=2 szczyt przekazywanie parametrów przez referencję wyznaczenie adresów parametrów aktualnych (także wyrażeń) przez moduł wywołujący i umieszczenie ich w rekordzie aktywacji modułu wywoływanego; moduł wywoływany działa na zmiennych dostępnych za pomocą tych adresów, zatem po usunięciu ze stosu rekordu aktywacji modułu wywoływanego, zmiany dokonane przez ten moduł są widoczne: procedure proc1; var x, y:integer; begin x:=1; y:=2; proc2(x, y) end; 63

procedure proc2(var p1, p2:integer); begin p1:=3; p2:=4 end; proc1 x = 1/3 y = 2/4 proc2 p1 p2 szczyt przekazywanie parametrów typu copy-restore wyznaczenie wartości parametrów aktualnych (z zachowaniem adresów zmiennych będących parametrami) przez moduł wywołujący i przekazanie ich do rekordu aktywacji modułu wywoływanego; moduł wywoływany działa na tych wartościach; w momencie powrotu do modułu wywołującego te wartości, które odpowiadają parametrom będącym zmiennymi są do tych zmiennych kopiowane 64