Ile pamięci może zaalokować mój program?

0

Cześć :)
Mam pytanie odnośnie przydzielania pamięci:( Rozważamy oczywiście stertę. )

  1. Jak dużo pamięci może zażądać mój program, tzn. ile pamięci może mi dać system w kawałkach ( tzn. nie w jednym ciągu). - tyle ile obecnie komputer dysponuje czy w jakiś sposób jest to ograniczone? ( wiem co to wirtualizacja pamięci ).
  2. Ile mogę dostać pamięci w jednym kawałku. Załóżmy, że chcę posortować 1000000000 liczb. ( intów). I pojawia się tu problem, bo zasadniczo nie mogę tego posortować standardowym qsortem np. z c++. Muszę się bawić w inne sortowania typu polifazowe. Czy mogę w jakis sposob zażądać więcej pamięci w jednym kawałku, ile maksymalnie, od czego to zależy/
0
  1. Jak dużo pamięci może zażądać mój program, tzn. ile pamięci może mi dać system w kawałkach ( tzn. nie w jednym ciągu).

Zależy od systemu. 32-bitowy Windows bez specjalnych zabiegów daje procesowi coś koło 2 gigabajtów.
64-bitowy proces może dostać więcej. oczywiście pamięć musi być dostępna, czy to w RAMie czy w swapie.

Czy mogę w jakis sposob zażądać więcej pamięci w jednym kawałku, ile maksymalnie, od czego to zależy

Od tego jaki to system operacyjny, jaka architektura.

0

Dobrze,
to jak to wygląda na architekturach x86, na systemach:

  1. Linux 32
  2. Windows 32
  3. Linux 64
  4. Windows 64
0

Jedyne sensowne rozwiązanie to 64-bitowy program, odpowiednio dużo RAM-u i robisz normalne malloc/new

0

@Azarien Co masz na myśli mówiąc: 64-bitowy program?

0

Co masz na myśli mówiąc: 64-bitowy program?

Taki, w którym sizeof(void*) wynosi 8.

#include <stdio.h>
int main()
{
  printf("Ten program jest %d-bitowy.\n", sizeof(void*)<<3);
}

Będzie oczywiście wymagał 64-bitowego systemu.

Pod 64-bitowym Linuksem systemowy GCC powinien taki domyślnie generować. Pod Windowsem - zależnie od kompilatora - odpowiednia wersja GCC albo w Visual Studio ustawione "solution platform" na x64.

0

Na Linuksie, jeśli nie masz ustawionego limitu, to możesz dostać dowolnie dużo, nawet więcej niż dostępnej pamięci wirtualnej, ale jak spróbujesz wszystkiego użyć na raz, to OOM killer Ci proces ubije.

Po co kombinować tak pod górkę z pamięcią? Nie lepiej użyć sortowania zewnętrznego, tak jak to robią systemy baz danych?

0

Po co kombinować tak pod górkę z pamięcią? Nie lepiej użyć sortowania zewnętrznego, tak jak to robią systemy baz danych?

Rozwiń proszę.

1

Jest kilka ograniczeń w tym temacie:

  • bitowość CPU+OS: 32-bitowy to maks 4 GB, w praktyce (Windows) 3 z kawałkiem
  • fragmentacja pamięci: może doprowadzić do tego że dostaniesz znacznie mniej pamięci niż masz fizycznie / wirtualnie
  • rozmiar pamięci wirtualnej (nie da się zaalokować więcej pamięci niż rozmiar RAM + swap)

Artykuł: http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html

0
vpiotr napisał(a):

Jest kilka ograniczeń w tym temacie:

  • bitowość CPU+OS: 32-bitowy to maks 4 GB, w praktyce (Windows) 3 z kawałkiem

Ograniczenie całego systemu to nie to samo co ograniczenie procesu. Nie wyciągniesz "3 z kawałkiem" w 32-bitowym programie pod Windows, bo domyślnie proces dostaje tylko 2 GB przestrzeni adresowej na własny użytek (drugie 2 GB zajmuje system; niby można przekonfigurować system by było 3+1 ale nigdy tego nie testowałem). Cały system to rzeczywiście te 3 z kawałkiem1.

No i jest też kwestia swapa: rozmiar wszystkich plików wymiany może przekroczyć nawet 4 GB (można mieć swapa na kilku dyskach), i odpalając kilka pamięciożernych programów na raz można całą tę przestrzeń wykorzystać (oczywiście będzie muliło).

1 jest to sztuczne ograniczenie. istnieje hack na 32-bitowy Windows 7 dający dostęp do 16 GB RAM — łącznie dla systemu, bo pojedynczy proces ma nadal przestrzeń adresową 4 GB, i tylko 2 GB na własny użytek.

1

32-bit Linux adresuje 4 GB. Część z tej przestrzeni zajmuje kernel. Możliwy jest podział 2:2, 3:1 oraz całość:całość (to ostatnie z konsekwencjami dla wydajności). Podział ten "wkompilowany" jest w kernel na etapie jego budowy. Większość dystrybucji definiuje to jako 3:1.
Z rozszerzeniem PAE, możliwe jest adresowanie większej ilości pamięci. Żaden jednak proces nie otrzyma więcej niż 4GB, ale kilka procesów może mieć po 4GB (jeśli starczy pamięci). Takie prawa obowiązują dla 32-bit.
64-bit to pamięć ograniczona do całej przestrzeni adresowej.

Windows 32-bit domyślnie dzieli pamięć w proporcji 2:2. 2GB dla procesu i 2GB dla jądra. Przy starcie w boot.ini można ustawić opcję /3GB która powoduje że jądro dostaje 1GB a procesy 3GB.
W wersjach 64-bit obowiązują ograniczenia narzucane przez MS w zależności od wersji systemu (Server, Enterprise.. czy inne). Nie są one determinowane ograniczeniami technicznymi. Tu już zerknij do dokumentacji producenta.

Sortować możesz także z użyciem algorytmów sortowania zewnętrznego. https://en.wikipedia.org/wiki/External_sorting algorytmy z łatwością znajdziesz (jak kolega napisał). Można jeszcze przemyśleć stosowanie pamięci współdzielonej która jako sposób komunikacji między 2 procesami pozwoli ograniczyć pisanie po powolnym urządzeniu dyskowym (o ile masz RAM). Sprawdź jednak czy naprawdę potrzebujesz sortowania. Być może inna struktura w Twoim przypadku będzie wystarczająca...

0
C napisał(a):

Cześć :)
Mam pytanie odnośnie przydzielania pamięci:( Rozważamy oczywiście stertę. )

  1. Jak dużo pamięci może zażądać mój program, tzn. ile pamięci może mi dać system w kawałkach ( tzn. nie w jednym ciągu). - tyle ile obecnie komputer dysponuje czy w jakiś sposób jest to ograniczone? ( wiem co to wirtualizacja pamięci ).
  2. Ile mogę dostać pamięci w jednym kawałku. Załóżmy, że chcę posortować 1000000000 liczb. ( intów). I pojawia się tu problem, bo zasadniczo nie mogę tego posortować standardowym qsortem np. z c++. Muszę się bawić w inne sortowania typu polifazowe. Czy mogę w jakis sposob zażądać więcej pamięci w jednym kawałku, ile maksymalnie, od czego to zależy/

miliard int32 = 4GB, zatem takie coś nie wymaga sortowania, bo wystarczy wprost indeksować te 4GB...

BTW. urojone problemy, generowane przez naiwnych głupków, nie wymagają rozwiązywania w ogóle. :)

0

Po co kombinować tak pod górkę z pamięcią? Nie lepiej użyć sortowania zewnętrznego, tak jak to robią systemy baz danych?

Rozwiń proszę.

Np. merge-sort zewnętrzny. Czyli dzielisz plik na mniejsze kawałki, kawałki sortujesz w pamięci, zapisujesz na dysk, a następnie scalasz wszystkie kawałki w jeden posortowany.

https://en.wikipedia.org/wiki/External_sorting#External_merge_sort

0
Krolik napisał(a):

Po co kombinować tak pod górkę z pamięcią? Nie lepiej użyć sortowania zewnętrznego, tak jak to robią systemy baz danych?

Rozwiń proszę.

Np. merge-sort zewnętrzny. Czyli dzielisz plik na mniejsze kawałki, kawałki sortujesz w pamięci, zapisujesz na dysk, a następnie scalasz wszystkie kawałki w jeden posortowany.

https://en.wikipedia.org/wiki/External_sorting#External_merge_sort

To oczywiście jeśli się rozważa to edukacyjnie.

W rzeczywistości stosuje się po prostu odpowiednie narzędzie.
Na mainframe (z/OS): DFSORT
Na Linux (w typie CSV): sort
Na Linux/Unix (stała długość rekordu): msort, uvsort

Wydajność DFSORT wymiata, nie wiem jak podane narzędzia Unixowe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1