5

현재 Windows에서 구현은 malloc()입니다. 그러나 제 연구에서 나는 당황한 것을 발견했습니다 :Windows 메모리 할당 질문

먼저 API 레벨에서 windows는 주로 HeapAlloc()VirtualAlloc() 호출을 사용하여 메모리를 할당합니다. Microsoft에서 구현 한 malloc() (CRT에 포함 된 것 - C 런타임)은 기본적으로> 480 바이트 블록을 호출하고 작은 할당에서는 VirtualAlloc()으로 할당 된 특수 영역을 관리하여 조각화를 방지하기 위해 here에서 수집합니다.

글쎄, 잘 됐어. 그러나 다른 구현 예는 malloc()입니다. 예를 들어 nedmalloc은 Microsoft의 malloc보다 최대 125 % 빠르다고 주장합니다.

  1. 왜 우리가 작은 블록 HeapAlloc()를 호출 할 수

    이이 모든 날 몇 가지 궁금합니다? Does는 단편화와 관련하여 제대로 수행되지 않습니다 (예 : "best-fit"대신 "first-fit"을 수행).

    • 사실, 다양한 API 할당 호출의 내용에 대해 알 수있는 방법이 있습니까? 그것은 매우 도움이 될 것입니다. 마이크로 소프트의 malloc보다 nedmalloc 훨씬 더 빠르게 만드는 것
  2. ? 상기로부터

  3. , 나는 HeapAlloc()/VirtualAlloc()는 한 동안 한 번만 전화를 한 후 할당 된 메모리 자체를 관리하는 데 훨씬 더 빨리 malloc()에 대한 것을 너무 느리다는 인상을 받았습니다. 그 가정은 사실입니까? 또는 조각화 때문에 malloc() "래퍼"가 필요합니까? 이런 식의 시스템 호출이 빠르다고 생각할 것입니다. 적어도, 효율적으로 만들기 위해서는 약간의 생각이 들었을 것입니다.

    • 사실이라면 왜 그렇습니까? 평균적으로
  4. 은, 얼마나 많은 (아마도 이미 할당 된 세그먼트의 수의 함수) 전형적인 malloc 호출에 의해 메모리 (크기 순서가)/쓰기를 읽고 수행? 직관적으로 말하자면 평균적인 프로그램을 위해 수십 만 개가 넘는다는 말입니까?

+0

"dlmalloc"을 읽는 것은 malloc 전략에 대해 매우 유익합니다. – Will

답변

5
  1. 크로스 플랫폼 소리를하지 않습니다를 HeapAlloc을 호출. MS는 원하면 언제든지 구현을 변경할 수 있습니다. 멀리 머물 것을 권유한다. :)
  2. Loki 라이브러리가 "작은 객체 할당 자"와 마찬가지로 Loki 라이브러리와 훨씬 더 효과적으로 메모리 풀을 사용하고있을 가능성이 높습니다.
  3. 일반적으로 일반적인 용도의 힙 할당은 구현시 항상 느립니다. 할당자를 "전문화"할수록 빠를 것입니다. 그러면 메모리 풀 (및 응용 프로그램에 사용 된 할당 크기)을 다루는 포인트 # 2로 돌아갑니다.
  4. 잘 모름
  5. 위부터
+0

Microsoft는 모든 것을 더 좋게 만들기 위해 일을 자유롭게 변경할 수 있습니다. Low Fragmentation Heap으로의 전환을 참조하십시오. – MSN

+0

1. Windows에서 malloc 구현 타겟을 시도하고 있기 때문에 어느 것으로도 기대하지 않았습니다. 그러나 문제는 여전히 남아 있습니다 : 분열성에 비효율적입니까? 2. 이렇게하면 여유 공간에 대한 포인터를보다 효율적으로 관리하므로 메모리에 적절한 블록을 할당하는 것이 더 빠릅니다. 내가 메모리 풀에 대해 읽을 수있는 곳을 아십니까? 위의 사용자가 제안한대로 dlmalloc을 시작했습니다. 이전에 건너 뛴 적이 있지만 유닉스 지향적이라고 들었습니다. 유닉스 호출을 에뮬레이트하는 Windows 기능을 설명했습니다. – Norswap

1

, 나는를 HeapAlloc()이 /에서 VirtualAlloc()가이 malloc에 ​​훨씬 빠르다는 것을 너무 느리다는 인상을 가지고() 한 동안 한 번만를 호출하고 할당 관리 기억 자체. 그 가정은 사실입니까?

OS 레벨 시스템 호출은 프로세스의 전체 메모리 공간을 관리하도록 설계되고 최적화됩니다. 그것들을 사용하여 정수로 4 바이트를 할당하는 것은 실제로 최적이 아닙니다. 라이브러리 코드에서 작은 할당을 관리하고 더 큰 할당을 위해 OS를 최적화하도록함으로써 성능과 메모리 사용이 전반적으로 향상됩니다. 적어도 내가 이해하는 한.