2009-11-15 6 views
2

시스템 내 에너지 소비 최적화와 관련된 프로젝트를 진행 중입니다. 이 프로젝트의 일부는 지역에 기반한 RAM 메모리 할당, 즉 가능한 한 프로그램에 가까운 메모리 세그먼트를 서로 가깝게 할당하는 것입니다. 내가 할당 한 메모리의 위치 (메모리 칩)가 정확히 어디인지를 알 수있는 방법이 있으며 결정적 방식으로 할당을 강제 할 수 있는지 궁금합니다. 나는 윈도우와 리눅스에 관심이있다. 또한이 프로젝트는 Java 및 .NET에서 구현되므로 관리되는 API에 관심이 있습니다.RAM 메모리 재 할당 - Windows 및 Linux

[I이 직접 에너지 소비 감소로 번역하지 않을 수도 있음을 알고 있지만 프로젝트가 개념 증명 될 예정이다.] C/C++에서

+1

정말 매력적입니다. 더 가까운 메모리 세그먼트로 인해 에너지 소비가 감소한다는 사실을 뒷받침하는 문서가 있습니까? –

+0

더 중요한 것은 보조 저장 장치에 대해 동일한 작업을 수행하는 것입니다. 즉, 다른 파일 시스템 및 파일 할당 전략의 에너지 소비를 측정합니다 (현재 기계식 HDD는 검색 할 때 더 많은 에너지를 소모하기 때문에). –

답변

13

잘못된 추상화 수준에서 작업하고 있습니다.

자바 (및 아마도 .NET)는 원시 포인터가 아닌 핸들을 사용하는 객체를 참조합니다. 기본 Java VM은 언제든지 가상 메모리에서 객체를 이동할 수 있습니다. 자바 애플리케이션은 차이점을 보지 못한다.

Win32 및 Linux 응용 프로그램 (예 : Java VM)은 가상 주소를 사용하여 메모리를 참조합니다. 가상 주소에서 RAM 칩의 실제 주소로의 매핑이 있습니다. 커널은 언제든지이 매핑을 변경할 수 있습니다 (예 : 데이터가 디스크로 페이징 된 후 다른 메모리 위치로 다시 읽혀지는 경우). 응용 프로그램은 아무런 차이를 느끼지 않습니다.

Java 및.NET, 나는 이것을 달성하기 위해 Java/.NET 응용 프로그램을 변경하지 않을 것입니다. 대신 기본 Linux 커널 또는 Java VM을 변경합니다.

프로토 타입의 경우 한 가지 방법은 mem = 매개 변수를 사용하여 Linux를 부팅하여 커널의 메모리 사용량을 보유한 메모리 양보다 적게 제한 한 다음 예비 메모리를 mmap 할 수 있는지 여부를 조사하는 것입니다 (매핑/dev/mem을 루트로 사용 하시겠습니까?). 그런 다음 Java VM에서 malloc()에 대한 모든 호출을 변경하여 여유 공간에서 할당하는 고유 한 메모리 할당자를 사용할 수 있습니다.

실제로 구현하려면 커널을 변경하고 사용자 공간 호환성을 유지해야합니다. memory hotplug in Linux에서 완료된 작업을 확인하십시오. http://lhms.sourceforge.net/

+0

또한 NUMA 인식 OS에서 기본 할당자가 공격적으로 노드에 로컬 메모리를 할당하려고 시도합니다 (다른 노드의 전원이 꺼지면 전력 소비가 향상 될 수 있음). 비스타 이후 Windows 버전에서도 NUMA를 지원합니다 ... – ShuggyCoUk

+0

이것은 정확하지 않습니다 : non_pageable 플래그가있는 창에서 ExAllocatePoolWithTag를 사용하고 linux에서 map_locked 및 map_fixed 플래그로 고정 주소에서 페이지 할 수없는 메모리를 사용할 수 있습니다 (단, 주소를 선택할 수 없습니다.) 주소를 선택할 수는 없지만 최소한 페이지 할 수없고 움직일 수는 없습니다. java 및 .net 격리 문제를 극복하려면 연결된 라이브러리에서 포인터를 반환하도록 할 수 있습니다. 각각의 VM에 바이트 배열로 메모리. 다음 작품의 많은 요 당신은 자신의 "메모리 관리자"를 쓰는 메모리의 BLOB로부터 데이터를 읽고 쓸 수 있습니다. –

1

, 당신은 int로 포인터를 강요하는 경우,이 주소를 알려줍니다. 그러나 Windows 및 Linux에서는 이것이 가상 주소입니다. 운영 체제가 실제 메모리에 매핑을 결정하고 프로세서의 메모리 관리 장치가이를 수행합니다.

데이터가 실제 메모리 인인데 신경 쓰면 OS에 문의해야합니다. 데이터가 동일한 MMU 블록에 있는지 궁금하다면 OS 설명서를 확인하여 사용중인 크기 블록을 확인하십시오 (x86의 경우 4KB가 일반적이지만 16M 거대한 블록을 가지고 놀고있는 아이들이 있습니까?).

자바와 .NET은 믹스에 세 번째 레이어를 추가합니다.하지만 내가 도와 드릴 수는 없습니다.

0

만약 당신이 메모리 할당에 대한 조수 제어를 원한다면 C와 같은 컴파일 된 언어를 사용하는 것이 더 낫다고 생각합니다. JVM은 하드웨어로부터 언어의 실제 구현을 격리 시켰습니다.

0

.NET에는 자세한 주소 정보를 제공 할 수있는 .NET 응용 프로그램을 프로파일 링하기 위해 노출 된 COM 인터페이스가 있습니다. 나는 당신이 가상 주소를 번역하기 위해 OS에 대한 몇몇 호출과 이것을 결합 할 필요가 있다고 생각한다.

zztop을 사용하지 않으면 .NET CLR은 가비지 수집이 완료 될 때마다 메모리를 압축합니다. 대형 오브젝트의 경우 압축되지 않습니다. 이들은 대형 오브젝트 힙의 오브젝트입니다. 대형 오브젝트 힙은 OS 호출에서 VirtualAlloc으로 분산 된 많은 세그먼트로 구성 될 수 있습니다. 여기

는 프로파일 링 API에 대한 몇 링크입니다 :

http://msdn.microsoft.com/en-us/magazine/cc300553.aspx

http://blogs.msdn.com/davbr/default.aspx

1

인가 전혀 (필요 이상으로) 옵션을 큰 덩어리에서 미리 할당? 그것은 원래 목적을 이길 것인가?

0

이러한 접근에는 특수한 하드웨어가 필요합니다. 일반적인 메모리 스틱 및 슬롯 구성에서는 가능한 한 칩 단위로 열을 발산하도록 설계되었습니다. 예를 들어, 물리적 칩 당 모든 버스 워드에 1 비트.

0

자바 나 .NET과 같은 관리 언어의 기능을 넘어서는 것이지만 이것은 흥미로운 주제입니다. 해당 언어의 주요 교장 중 하나는 이 메모리를 관리해야하므로 결과를 추상화한다는 것입니다. C/C++은 실제로 메모리를 할당하는 측면에서 더 나은 제어를 제공하지만 이전에 참조 된 것처럼 운영 체제가 손을 흔들거나 메모리 할당과 함께 간접적 인 작업을 수행하여 상황이 함께 할당되는 방식을 결정하기 어렵게 만듭니다. 그럼에도 불구하고, 당신은 실제 칩에 대한 참조를 만들고, 그것은 더 힘들며 하드웨어에 의존 할 것이라고 생각합니다. 필자는 어셈블리 레벨에서 코드를 작성하고 컴파일러 최적화 또는 운영 체제 보안 사례의 간섭없이 명시 적으로 모든 메모리 유닛 할당을 제어 할 수있는 프로토 타이핑 보드를 사용하는 것을 진지하게 고려할 것입니다. 그러면 프로그램의 모든 측면을 제어하고 컴파일러 나 운영 체제에서 수행하는 보이지 않는 최적화가 아닌 알고리즘으로 인한 전력 소비 개선을 결정할 수 있기 때문에 가장 의미있는 결과를 얻을 수 있습니다. 나는 이것이 일종의 연구 프로젝트 (매우 흥미 롭다)라고 생각한다. 그래서 프로토 타이핑 보드에 ~ 100 달러를 쓰는 것이 내 의견으로는 분명 가치가있을 것이다.

2

큰 런타임이 필요한 언어로 시험해 보려면 해당 런타임의 구현을 조정하거나 샘플 응용 프로그램의 모든 메모리 관리를 수행 할 DLL/공유 객체를 작성해야합니다. 어느 시점에서 전반적인 시스템 동작은 이러한 런타임의 일반적인 작동과 거의 같지 않습니다.

C++에서는 사용자 지정 할당자를 사용하여 참조 가능 지역의 (아마도 작은) 장점을 감지 할 수있는 가장 단순하고, 가장 깨끗한 테스트 환경을 제공합니다. 이 환경은 런타임 데이터 (주로 가비지 수집)에서 발생할 수있는 몇 가지 잠재적 인 노이즈 원인을 제거합니다. 또한 CLR/JVM을 시작하거나 작동 상태를 유지하는 것과 관련된 전력 오버 헤드가 없어지므로 프로젝트에서 전력 소비를 최소화 할 수 있습니다. 자연스럽게 테스트 애플리케이션에 스레드 코어를 제거하기위한 프로세서 코어를 제공하려고합니다.

현재 페이지에 미리 할당 된 청크 중 하나를 제공하는 사용자 정의 할당기를 작성하는 것은 너무 힘들지 않아야하지만 C/C++에서 참조의 지역성을 달성하기 위해서는 일반적으로 스택을 사용하는 것이 좋을 것 같습니다 다운로드하고 사용하면됩니다.