2013-09-04 2 views
2

C 및 C++ 프로그래머로서 나는 mallocnew을 사용하여 메모리를 할당했습니다. 나는 단지 궁금하다 : 어떻게 OS가 메모리를 할당 하는가?어디에서 프로그램이 메모리를 할당합니까?

  1. RAM 또는 하드 디스크 또는 다른 곳에서 할당합니까?

  2. 경우에 대비해 메모리를 하드 디스크에서 빌릴 수 있습니까?

+0

중복 된 http : // stackoverflow.com/questions/2308751/what-is-a-memory-heap – DGomez

+0

http://en.wikipedia.org/wiki/Virtual_memory –

+1

@DGomez : 너는 나를 속 였어. 나는이 질문들에 답하는 것조차도 그 답이 없다는 것을 깨닫기 전에 가까운 투표를했다. –

답변

9

실제로 생각보다 훨씬 복잡합니다. 운영 체제는 "페이지"의 모든 것을 생각하고 RAM을 페이지로 분할하며 하드 드라이브를 페이지로 분할합니다. 프로그램이 시작되면 실행 파일의 메모리 양을 확인하고 RAM 페이지를 선택하여 해당 페이지를 프로그램에 할당합니다. RAM에 "사용 가능한"페이지가 없으면 RAM의 일부 페이지가 오래 걸리고 다른 곳에있는 하드 드라이브에 저장 한 다음 해당 페이지를 제공합니다.

프로그램에 메모리를 할당하면 프로그램의 메모리 관리자가 운영 체제가 할당 한 페이지에서 사용 가능한 부분을 찾으려고 시도합니다. 충분하지 않으면 운영 체제에 더 많은 페이지를 요청하고 운영 체제는 더 많은 공간을 확보하고 응용 프로그램에 더 많은 페이지를 제공합니다.

프로그램에 잠시 사용하지 않은 페이지 (가끔 코드)가 있으면 운영 체제가 해당 페이지를 하드 드라이브에 저장할 수 있으며 프로그램에서 해당 페이지를 다시 사용하려고하면 운영 체제가 프로그램을 일시 중지하고 페이지를 RAM으로 다시로드 한 다음 프로그램을 다시 시작합니다.

여기 코드는 0x00010000-0x0002FFFF의 메모리 스택 있으며, 일부 동적 메모리를 할당 한, 그것은 0x0004000에있어,이 코드에서 어떤 의미를 그래서

C++ addresses   RAM   hard drive 
+------------+ +------------+ +------------+ 
| 0x00010000 |\ ->| 0x00010000 | | 0x00010000 | 
+------------+ X +------------+ +------------+ 
| 0x00020000 |/ ->| 0x00020000 | | 0x00020000 | 
+------------+ +------------+ +------------+ 
| 0x00030000 |-->?   /----->| 0x00030000 | 
+------------+   /  +------------+ 
| 0x00040000 |-----------/  | 0x00040000 | 
+------------+ 
| etc  | 

하지 않습니다도있다. 당신도 알다시피! 실제로 0x0002000에 액세스 할 때 운영 체제에 "오, RAM 주소 0x00010000에 해당 페이지를 저장했습니다."라고 표시되어 해당 값을 읽습니다. 잠시 후 0x00040000 페이지를 건드리지 않았으므로 운영 체제는 하드 드라이브 위치 0x00030000에 하드 드라이브에 저장했지만 사용하려고하면 RAM에 저장됩니다. 운영 체제가 아직 주소 0x00030000을 제공하지 않았기 때문에이를 사용하려고하면 운영 체제에서 주소에 실제 페이지가 없으며 세그먼테이션 오류 (segfault)가 발생한다고 알려줍니다. 이 점이 흥미로운 이유는 벡터처럼 큰 인접한 덩어리를 요구할 때 운영체제가 주변에 놓인 오래된 페이지를 제공 할 수 있기 때문에 연속적이든 아니든 상관없이 걱정할 필요가 없습니다. 그들은 당신의 프로그램과 연속적으로 보입니다.

이렇게하면 운영 체제가 다른 프로그램의 메모리 공간을 읽거나 수정할 수 없도록 한 프로그램의 메모리를 숨길 수 있습니다. 그들은 안전하다! 제외하고는 ... 운영 체제가 두 프로그램간에 페이지를 공유하도록 알려주는 방법이 있습니다 (각 프로그램마다 주소가 다를 수 있음). 페이지를 공유 할 수 있습니다. DLL이이를 수행합니다.

실제로는 이보다 훨씬 복잡합니다.

2

방금 ​​Virtual Memory을 발명했다고 생각합니다.

+1

아니요 !!!! [ "가상 메모리"] (http://en.wikipedia.org/wiki/Virtual_memory)는 "컴퓨터 아키텍처"에서와 마찬가지로 한 가지입니다. 힙, 스택 및 정적 저장소 에서처럼 [ "메모리 관리"] (http://en.wikipedia.org/wiki/Memory_allocation)는 완전히 다른 것입니다. – paulsm4

+2

@ paulsm4 : 응? OP가 요구하는 질문은 일반적인 가상 메모리 구현에 의해 다루어집니다. –

0

malloc 또는 운영자 new에 의해 할당 된 메모리 주소는 RAM에 있으며 고유 한 주소를가집니다. 운영 체제에서 RAM의 블록을 처리 할 때 RAM의 블록을 차지하는 것은 작업이지만 재량에 따라 디스크로 스왑 할 수 있습니다. 스와핑이 느리기 때문에 스와핑을 최소화하는 방법을 파악하는 것은 OS에 달려 있습니다.

"가상 메모리"를 사용하는 운영 체제를 사용하면 가상 메모리 관리자가 사용할 수있는 디스크 공간을 설정할 수 있습니다.

특히 데이터 수명이 단일 세션보다 길면 데이터베이스를 사용하여 데이터를 관리하는 것이 더 나은지 여부를 고려해 볼 수도 있지만 직접 관리하지 않아도됩니다.

+0

사실, 쓰여질 때까지 RAM이나 디스크에 존재하지 않습니다. –

4

1) RAM 또는 하드 디스크 또는 다른 곳에서 어딘가에 할당합니까?

가상 메모리를 지원하는 최신 시스템/플랫폼에서 운영 체제는 메모리를 할당하고 저장하는 위치와 방법을 결정합니다. 시스템은 RAM 또는 디스크의 어느 한 위치에서 다른 위치로 메모리를 자유롭게 이동할 수 있습니다.

2) 경우에 따라 메모리 형태의 하드 디스크를 빌릴 수 있습니까?

메모리를 관리하는 운영 체제는 디스크에서 메모리를 차용 할 수 있습니다.

파일에 데이터를 저장하여 디스크에서 메모리를 명시 적으로 빌릴 수도 있습니다. C 및 C++ 표준 라이브러리 (stdio.hfstream)는 파일 조작을 가능하게합니다.

0

이 대답은 그것이 것보다 훨씬 더 복잡

꽤 리눅스 중심이 될 것입니다. 한 블럭의 메모리를 할당하면 두 가지 중 하나가 발생할 수 있습니다. 프로세스에 이미 이전에 해제되었지만 OS로 반환되지 않은 메모리가 충분한 경우 (할당자가 대개 수행하지 않음) 해당 메모리가 할당 자 테이블에 할당 된 것으로 표시되어 반환됩니다. 프로세스가 이미 메모리를 가지고 있지 않으면, 할당자는 OS에 더 많은 것을 요구한다. Linux에서는 brk 또는 sbrk syscalls을 의미합니다. 나는 그것이 Windows 또는 OSX에서 무엇을 의미하는지 모른다.

모든 현대의 일반적인 OS (Linux, Windows, OSX 및 그 파생물)는 실제 메모리를 가리키는 것이 아닌 가상 메모리 (가상 메모리)를 사용합니다. 당신이 그 안에 무언가를 넣을 때까지, 당신이 할당 한 기억은 전혀 존재하지 않을 수도 있습니다. 일단 당신이 그것을 사용하기 시작하면, 운영 체제는 RAM을위한 공간을 확보해야합니다.이렇게하려면 운영 체제는 사용되지 않는 다른 페이지 (메모리의 일부)를 디스크의 스왑 파일이나 파티션에 저장합니다 (구성된 경우).

운영 체제는 스왑 공간과 실제 RAM간에 메모리 페이지를 지속적으로 이동하고 있습니다. 프로세스가 RAM에없는 메모리 부분에 액세스 할 때마다 프로세서는 페이지 폴트를 생성하여 OS가 디스크에서 해당 페이지를로드하고 다른 페이지를 이동하여 메모리에 여유 공간을 만듭니다 스왑으로


그래서 기본적으로, 현대 OS에서, 메모리는 어느 곳에서나 OS가 선택한에서 올 수 있고, 당신이 그것을을 할당 한 경우에도 존재하지 않을 수도 있습니다.


주 : 대부분의 경우 Linux와 같은 일부 OS는 사용자에게 제공 할 필요가없는 메모리를 할당 할 수도 있습니다. 이를 오버 커밋 메모리라고합니다.

관련 문제