Jak Windows zarządza pamięcią?



Podobne dokumenty
STL: Lekcja 1&2. Filozofia STL

Język C++ wykład VIII

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Programowanie w języku C++

Programowanie i struktury danych

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

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

Programowanie komputerowe. Zajęcia 5

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Wstęp do Programowania 2

Zadania z podstaw programowania obiektowego

Lab 9 Podstawy Programowania

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Szablon klasy std::vector

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python.

Listy powiązane zorientowane obiektowo

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Szablony klas, zastosowanie szablonów w programach

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Algorytmy i Struktury Danych.

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Podstawy programowania w języku C++

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Zmienne i struktury dynamiczne

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

STL Standardt Template Library (wprowadzenie)

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

r. Tablice podstawowe operacje na tablicach

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Operatory na rzecz typu TString

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Część 4 życie programu

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie obiektowe W3

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

KURS C/C++ WYKŁAD 6. Wskaźniki

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

Podstawy programowania w języku C++

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie i struktury danych

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

dr inż. Jarosław Forenc

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Dynamiczne struktury danych

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Podstawy programowania komputerów

Programowanie komputerowe. Zajęcia 1

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Techniki Programowania wskaźniki

Wskaźniki. Informatyka

Wskaźniki w C. Anna Gogolińska

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

Techniki Programowania wskaźniki 2

Stałe, tablice dynamiczne i wielowymiarowe

Programowanie - wykład 4

Język C++ zajęcia nr 2

Pojemniki Pojemnik to obiekt, którego zadaniem jest przechowywanie innych obiektów.

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Programowanie, część I

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

tablica: dane_liczbowe

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

Wstęp do programowania

Podstawy programowania w języku C++

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Paradygmaty programowania

Biblioteka standardowa C++

Transkrypt:

Jak Windows zarządza pamięcią? System Windows definiuje dwa typy pamięci, często mylone przez użytkowników. Pamięć fizyczna (pamięc RAM zainstalowana w komputerze) Pamięć widziana przez daną aplikację (pamięć wirtualna procesu) Do pamięci fizycznej dostęp ma tylko system operacyjny.

Jak Windows zarządza pamięcią? Na systemie 32-bitowym możemu zaadresować maksymalnie 4GB pamięci wirtualnej. Pamięć jest podzielona na strony (strona ma 4096 bajtów)

Jak Windows zarządza pamięcią? Kolor zielony-strona zamapowana, ma odzwierciedlenie w pamięci fizycznej Kolor pomarańczowy-strona zarezerwowana, nie ma jeszcze swojego odzwierciedlenia w pamięci fizycznej Kolor szary-strona nieistniejąca

Jak Windows zarządza pamięcią? Mimo że przestrzeń adresowa pozwala zaadresować 4GB, proces może wykorzystać jedynie 2GB. Do drugiej części pamięci, w ktorej znajduje się kernel, nie mamy dostępu.

Jak Windows zarządza pamięcią? Istnieje możliwość zwiększenia pamięci dla procesu do 3GB. Aby tego dokonać, należy w pliku boot. Ini podać przełącznik /3G oraz ustawić plikowi wykonalnemu flagę IMAGE_FILE_LARGE_ADDRESS_AWARE Inną możliwością jest na zwiększenie pamięci dla procesu jest funkcja CreateFileMapping.

Do zarządzania pamięcią w języku C++ służa operatory new i delete. Można używać operatorów malloc i free, ze względu na to, że C++ jest zgodny wstecz z językiem C. Nie należy mieszać operatorów, np zwalniać obiektów utworzonych przy pomocy new uzywając komendy free!

Porównanie operatorów new i malloc

Porównanie operatorów new i malloc Tworzenie wektora przy pomocy malloca: int *Wektor = (int*)malloc(sizeof(int)*10); free(wektor); Oraz przy pomocy new int *Wektor = new int[10]; delete [ ] Wektor;

Operator new oprócz przydzielania miejsca w pamięci obiektom, może je również inicjalizować X *p = new X inicjalizator; inicjalizator może być dowolnym wyrażeniem inicjalizującym

Istnieje kilka wersji funkcji operator new() Forma placement-nie przydziela pamięci, umieszcza obiekt w określonym miejscu w pamięci void* operator new(std::size_t size, void* ptr) throw() {return ptr;};

Druga forma przydziela pamięć obiektowi. Jeśli pamięc zostanie przydzielona, to funkcji zwraca wskaźnik na obiekt, a jeśli pamięć nie zostanie przydzielona, to funkcja zwraca wyjątek std::bad_alloc. void* operator new(std::size_t size) throw(std::bad_alloc) ;

Trzecia forma operatora new dostarczonego w bibliotece standardowej to wersja no_throw. Jeśli pamięć zostanie przydzielona, to funkcja zwraca wskaźnik na obiekt, a jeśli operacja się nie powiedzie, to zwraca wskaźnik zerowy. void* operator new(std::size_t size, const std::nothrow_t&) throw();

Aby zwolnić pamięć, używamy operatora delete Operator delete najpierw wywołuje destruktor klasy, a następnie zwalnia pamięć. Jeśli wywołanie destruktora nie powiedzie się, to pamięc nie zostanie zwolniona!

Funkcja new pozwala też przydzielać pamięć tablicom. X *px = new X[10]; Jeśli chcemy zwolnić pamięć przydzieloną dla tablicy, nie musimy wywoływać oepratora delete dla każdego elementu. Następująca konstrukcja zwolni całą tablicę: Delete [ ] X;

Przykładowy program, który pyta użytkownika o rozmiar tablicy, następnie wczytuje jej elementy, wypisuje je, i zwalnia pamięć. #include <iostream> #include <new> using namespace std; int main () { int i,n; int * p; cout << "Ile licz chcesz podać? " << endl; cin >> i; p= new (nothrow) int[i];

if (p == 0) cout << "Błąd. Pamięć nie została przydzielona"; else { for (n=0; n<i; n++) { cout << "Podaj liczbę: " << endl; cin >> p[n]; } cout << "Wprowadziłeś następujące liczby: "; for (n=0; n<i; n++) cout << p[n] << ", "; delete[] p; } return 0; }

Istnieje jednak znacznie łatwiejszy sposób tworzenia dynamicznych tablic i zarządzania nimi-jest to tzw. Wektor, wchodzący w skład biblioteki STL. Klasa vector reprezentuje obudowaną, zwykłą tablicę znaną z C, wyposażoną w kilka dodatkowych mechanizmów. Elementy wektora mogą być dowolnego typu.

Obiekt vector możemy tworzyć przy pomocy kilku różnych konstruktorów. Konstruktor tworzący wektor pusty: vector < typ_elemetow > nazwa_tablicy; Możemy też podać wielkość, co wcale nas nie ogranicza do tej wielkości. Może to być zabieg optymalizacyjny. vector < int > tab(20); Wektor tworzący tablicę o określonym rozmiarzę i inicjalizujący ją podaną wartoscią: vector < int > tablica( 20, 0 );

Podstawowe metody klasy wektor: void push_back(const T obj) -dodaje na końcu wektora kopię przekazanego argumentu void swap(vector<t>& vec) -zamienia zawartości dwóch wektorów miejscami void pop_back() -usuwa ostatni element z wektora void clear() usuwa wszystkie elementy z wektora iterator insert(iterator pos, T obj) -wstawia element obj przed wskazywaną przez iterator pos pozycją i zwraca iterator do dostawionego elementu

Metoda push_back() dodając nowy element do tablicy, dba o to, aby tablica była odpowiedniego rozmiaru. Za każdym razem, gdy brakuje miejsca, tablica jest powiększana - rezerwowana jest nowa, większa przestrzeń, stare elementy są kopiowane, aby do większej tablicy móc dodać dany element. Z reguły rezerwowana jest pamięć dwa razy większa od poprzedniej. W skrajnej sytuacji, może się zdarzyć, że zarezerwowana pamięć jest prawie dwa razy większa niż ilość elementów znajdujących się w niej! Ponieważ kopiowanie tablicy jest powolnym procesem, w przypadku tablicy dużych struktur, na przykład klas, warto zastanowić się nad utworzeniem tablicy wskaźników na te struktury.

Kolejnym kontenerem udostępnianym przez STL jest klasa list,będąca listą dwukierunkową. Oto główne różnice między wektorami a listami: aspekt vector list dostęp przez podanie indeksu lub przez iteratory tylko przez iteratory dodawanie/usuwanie adresy elementów jeśli nie chodzi o końcowy element - powolne ulegają zmianom, wskaźniki często tracą ważność dodawanie i usuwanie elementów jest bardzo szybkie i odbywa się w stałym czasie niezmienne

Metody klasy list: void push_back(const T obj) -dodaje na końcu listy kopię przekazanego argumentu void pop_back() -usuwa ostatni element z listy void push_front(const T obj) -dodaje na początku listy kopię przekazanego argumentu void pop_front() -usuwa pierwszy element listy void clear() -usuwa wszystkie elementy z listy

void remove(const T& wartosc) -usuwa wszystkie elementy równe argumentowi wartosc void merge(list<t> ls) -dostawia zawartość ls do obecnej listy i całość sortuje rosnąco

Memory Mapped Files Rozmiar pamięci, ktorą dysponuje proces, możemy zwiększyć przy pomocy funkcji CreateFileMapping HANDLE WINAPI CreateFileMapping( in HANDLE hfile, in_opt LPSECURITY_ATTRIBUTES lpattributes, in DWORD flprotect, in DWORD dwmaximumsizehigh, in DWORD dwmaximumsizelow, in_opt LPCTSTR lpname );

Memory Mapped Files Funkcja zwracająca wskaźnik do zamapowanej pamięci LPVOID WINAPI MapViewOfFile( in HANDLE hfilemappingobject, in DWORD dwdesiredaccess, in DWORD dwfileoffsethigh, in DWORD dwfileoffsetlow, in SIZE_T dwnumberofbytestomap );