2010-05-23 3 views
0

실제로 128KB가 아닌 실제로 64KB의 메모리 만 할당하고 수동으로 정렬하려면 너무 많은 낭비가 있습니다. Windows의 VirtualAlloc은 정확하게이 동작을 제공합니다. 아마도 SquirrelFish에는 모든 플랫폼에서이 작업을 수행하는 코드가 있지만 아마 그 위치를 찾을 수 없었습니다. POSIX에서 64KB 경계에 64KB를 할당하는 공간 효율적인 방법이 있습니까? 리눅스에서는 실패 했나요?POSIX : 64KB 경계에 64KB 할당

+0

이 응용 프로그램에 관해서는 상당히 궁금합니다. 페이지 크기 조정 이상의 사용자 공간 상황은 거의 볼 수 없습니다. – caf

+0

@caf : OP는 추가 정보를 저장하기 위해 포인터의 하위 16 비트를 사용하고 싶습니다. 어느 쪽이든, 또는 32 비트 레지스터의 16 비트 부분이 다른 것으로 사용하거나 심지어'eax'가 포인터이고'al'과'ah'가 x이고 y 좌표가 256x256 이미지 또는 뭔가 ... –

답변

8

체크 아웃 posix_memalign(3)

사용법

#include <stdlib.h> 

int 
posix_memalign(void **memptr, size_t alignment, size_t size); 

설명

The posix_memalign() function allocates size bytes of memory such that 
the allocation's base address is an exact multiple of alignment, and 
returns the allocation in the value pointed to by memptr. 

체크 아웃 자세한 내용은 맨 페이지 ...

+0

그게 효과가 있었 겠지. 물론 내부적으로 128KB를 mallocing하는 경우 64KB 경계에 정렬 된 중간 근처의 포인터를 반환하면 받아 들일 수 없습니다. 소스 코드를 확인하고 구현 방법을 확인해야합니다. – Eloff

+2

libc에서 구현 된 방법은 malloc (크기 + 2 * 정렬)을하고 중간에 정렬 된 부분을 찾는 것입니다. 그러나 충분히 크다면 메모리의 머리 부분이나 꼬리 부분을 힙으로 되돌려 놓으려고 시도하므로 실제로 두려워하는만큼 낭비가되지는 않습니다. 작동 할거야. – Eloff

0

mmap()을 MAP_PRIVATE와 함께 사용할 수 있습니다. 상당수의 libc 할당자는 요즘 내부에서 할당 할 메모리 덩어리를 얻기 위해 내부적으로 mmap()을 사용합니다.

0

물론 posix_memalign은 훌륭한 해결책이지만 128k를 할당하더라도 아무런 변경되지 않은 페이지는 쓰기시 복사 제로 페이지로 유지되며 최소한의 물리적 리소스 만 사용합니다. 또한 mmap을 MAP_PRIVATE와 함께 사용하여 128k 맵을 만든 다음 그 중 어떤 부분이 정렬되지 않았는지 munmap 할 수 있습니다.