2012-12-08 2 views
0

현재 할당 자의 개념을 기반으로하는 C++ 용 메모리 관리 라이브러리를 작성하고 있습니다. 그것은 지금, 모든 할당 자이 두 멤버 함수 구현, 비교적 간단합니다할당 자 라이브러리에서 할당 오버 헤드 당 더 작음

virtual void * alloc(std::size_t size) = 0; 
virtual void dealloc(void * ptr) = 0; 

당신이 볼 수 있듯이, 내가 인터페이스에 정렬을 지원하지 않습니다을하지만 실제로 내 다음 단계 : 그리고 난 왜 이유 이 질문을합니다.

각 할당자가 전문화 될 수 있기 때문에 할당 자에게 정렬 책임이 있습니다. 예를 들어 블록 할당자는 블록 크기의 정렬 된 메모리 만 반환 할 수 있으므로 실패를 처리하고 다른 정렬을 요청하면 NULL을 반환 할 수 있습니다.

내 할당 자 중 일부는 실제로 하위 할당 자입니다. 예를 들어, 그 중 하나는 할당에 대한 포인터 충돌 만하는 선형/순차 할당 기입니다. 이 할당자는 char * pBegin과 char * pEnd를 전달하여 생성되며 메모리의 해당 영역에서 할당합니다. 지금은 위대한 작품이지만 1 바이트 정렬되는 물건을 얻을. 그것은 x86에서 작동하지만 다른 CPU (콘솔)에서 재앙이 될 수 있다고 들었습니다. 또한 x86에서의 읽기 및 쓰기 속도가 다소 느립니다.

정렬 된 메모리 관리를 구현하는 유일한 방법은 추가 sizeof (void *) + (alignement - 1) 바이트를 할당하고 원래 할당 된 주소를 유지하면서 정렬 된 주소를 반환하는 포인터 비트 마스크를 수행하는 것입니다. 사용자 데이터 앞에있는 바이트 (void * 바이트, 위 참조).

OK, 내 질문은 ...

그 오버 헤드 할당 당, 나에게 큰 보인다. 4 바이트 정렬의 경우, 32 비트 CPU에는 7 바이트의 오버 헤드가 있고, 64 비트에는 7 바이트의 오버 헤드가 있습니다. 그것은 많은 것처럼 보인다.

우선 많이입니까? 과거에 사용했거나 현재 사용하고있는 다른 메모리 관리 라이브러리와 동등합니까? malloc을 살펴 봤는데 16 바이트 이상의 오버 헤드가있는 것 같습니다. 맞습니까?

내 lib의 사용자에게 정렬 된 메모리를 반환하는 더 좋은 방법, 작은 오버 헤드를 알고 계십니까?

+0

패딩에 대해 아무 것도 할 수 없다고 생각합니다 ... 다음 할당을 위해 패딩 바이트 중 일부를 헤더로 사용하고 (책을 유지하는 경우) 8을 유지할 수 있습니다. - 바이트 정렬,하지만 그건 엄청 까다로운 소리. – Cornstalks

+0

각 정렬에 대해 서로 다른 할당자를 사용하십시오. 그런 다음 패딩이 0입니다. 대부분의 할당자는 정렬되므로 두 배가 올바르게 정렬됩니다. double이 8 바이트이면 1, 2, 4 및 8 바이트 정렬을위한 할당자를 가져야합니다. –

답변

1

포인터가 아닌 오프셋을 저장할 수 있습니다.이 오프셋은 지원되는 최대 정렬을 저장할만큼 커야합니다. 너비가 작은 정렬 만 지원하면 바이트로 충분할 수도 있습니다.

+0

불행히도 그것은 나쁜 생각이었습니다. 할당 시작으로 오프셋을 계산하는 것에 대해 충분히 알려주지 않습니다. – JasonD

0

요구 사항에 따라 x 바이트 정렬 될 수있는 버디 시스템을 구현하는 것은 어떻습니까?

일반 아이디어 :

당신의 lib 디렉토리를 초기화
  1. , 메모리의 큰 덩어리를 할당합니다. 예를 들어 16B로 가정하십시오. (이 블록 만 정렬해야 알고리즘에서 다른 블록을 정렬 할 필요가 없습니다.)
  2. 전원 2의 메모리 청크 목록을 유지합니다. 즉 4B, 8B, 16B, ... 64KB, ... 1MB, 2MB, ... 512MB.
  3. 사용자가 8B의 데이터를 요청하면 8B에 대한 목록을 확인하고, 16B의 목록을 확인하고 8B의 두 블록으로 분할하십시오. 하나를 다시 사용자에게주고 다른 하나를 8B의 목록에 추가하십시오.
  4. 사용자가 16B를 묻는 경우 적어도 2 개의 8B를 사용할 수 있는지 확인하십시오. 그렇다면 결합하여 사용자에게 제공하십시오. 그렇지 않은 경우, 시스템에 충분한 메모리가 없습니다.

장점 :

  1. 없음 내부 또는 외부 단편화.
  2. 정렬 할 필요가 없습니다.
  3. 미리 할당 된대로 메모리 청크에 빠르게 액세스합니다. 메모리리스트

    1. 오버 : 목록 배열, 다른 크기의 메모리 청크

    단점에 직접 액세스 할 수있는 경우

  4. .
  5. 목록이 연결된 목록 인 경우 순회가 느립니다.
+0

내 할당 자 중 하나는 이진 버디 할당 자이지만이 질문에 대한 포인터 기반 범용 할당 자에 더 초점을 맞추고있었습니다. – binarez