2011-09-01 13 views
9

Biorąc pod uwagę następujący kod:W jaki sposób jest przydzielana dynamicznie przydzielona przestrzeń, gdy program jest przerywany za pomocą Ctrl-C?

#include <stdio.h> 

int main() 
{ 
    int *p; 
    p = (int *)malloc(10 * sizeof(int)); 

    while(1); 
    return 0; 
} 

Kiedy powyższy kod jest kompilowany i uruchomić, a zostanie przerwany, gdy w wykonaniu naciskając Ctrl + C, jak pamięć jest alokowana do p uwolniony? Jaka jest rola systemu operacyjnego? A czym się różni od tego w przypadku C++, wykonanym za pomocą operatora new?

+7

System operacyjny odzyskuje wszystko po zakończeniu procesu, bez względu na sposób jego zakończenia. –

+0

Co jest takiego specjalnego w 'Ctrl + C'? –

+0

W jaki sposób system operacyjny odzyskuje pamięć? Dokładniej, jaki element systemu operacyjnego jest odpowiedzialny za to? – 4sh1sh

Odpowiedz

13

Po zakończeniu procesu system operacyjny odzyskuje całą pamięć używaną przez proces.

Powodem, dla którego ludzie mają duży problem z przeciekami pamięci, nawet gdy system operacyjny odzyskuje pamięć używaną przez aplikację po jej zakończeniu, jest to, że zazwyczaj nietrywialne aplikacje będą działać przez długi czas powoli grzebiąc całą pamięć na system. Jest to mniejszy problem dla programów o bardzo krótkiej żywotności. (. Ale nigdy nie można powiedzieć, kiedy jeden-liner będzie ogromnym programem, więc nie ma żadnych wycieków pamięci nawet w małych programów)

+0

Czy możesz wyjaśnić nieco więcej o tym, jak system operacyjny odzyskuje pamięć używaną w procesie? Każdy konkretny proces, który robi to dla systemu operacyjnego? – 4sh1sh

+0

@ 4sh1sh każdy program otrzymuje własny stos i wolny sklep (stertę). Kiedy program wywołuje 'new' /' delete', zaczyna używać swojego wolnego sklepu.Po wyjściu z programu system operacyjny odbiera całą pamięć, w tym stos i wszystko inne. Nie obchodzi go, do jakich konkretnych bloków pamięci w wolnym sklepie były używane (np. Co to było 'nowe' d lub 'delete'd, itd.). To po prostu zabiera całą rzecz. –

+0

Czy istnieje jakiś specyficzny proces w systemie operacyjnym, szczególnie w systemie UNIX, który robi to dla systemu operacyjnego? – 4sh1sh

3

przy okazji (oprócz Carnegie powiedział Seth):

Korzystanie z rutyny w <signal.h> można złapać sygnał SIGINT (przerwania) do obsługi Ctrl + C w dowolny sposób, na przykład, aby oczyścić żadnych ważnych zasobów, nie tylko pamięć (jak pliki zamykania, unikając w ten sposób strat dowolnej buforowanej i jeszcze niepublikowanej zawartości lub delikatnie zamykających się połączeń sieciowych).

0

pamięć w rzeczywistości nie jest "wolna()".

Pamięć uzyskana przez system operacyjny to rozmiar strony (zwykle 4kB pamięci). za każdym razem, gdy procesowi kończy się pamięć, uzyskuje dodatkowe strony, które są aktualnie używane przez malloc(). kiedy proces kończy się, wszystkie strony są zwracane do systemu operacyjnego, co sprawia, że ​​dzwonienie za darmo nie jest konieczne. jeśli twój program jest serwerem lub czymś podobnym, każda pamięć, która nigdy nie zostanie uwolniona, zostanie zwrócona tylko wtedy, gdy program zostanie faktycznie zabity - co sprawia, że ​​każda pamięć staje się głodna.

Powiązane problemy