2012-04-04 3 views
5

예, 컴퓨터 시스템 과정을 수강하고 있습니다. malloc을 구현하기위한 다양한 할당 스키마에 대해 몇 가지 질문이있었습니다. 명시 적 목록의 경우 LIFO 형 스택을 사용하여 malloc을 구현하면 이전에 해제 된 메모리에 대한 포인터를 갖는 목적은 무엇입니까? 왜 이중 연결 목록이 필요한지? 단독으로 연결된 목록도 제대로 작동하지 않습니까?Malloc 할당 스키마

Malloc lecture. 이 링크를 온라인에서 찾았 으면 슬라이드 7에서 내가 무슨 말을하는지 확인할 수 있습니다.

분리 목록 할당 체계를 살펴볼 때 이러한 목록은 단방향입니까? 또한, 합체 메커니즘은 정확히 무엇입니까? 예를 들어, 4 단어가 해제 된 경우, 분리 된 연결된 목록에 다시 삽입하기 전에 주위의 여유 공간이있을 때 먼저 시도하고 결합합니까? 또는 각각의 분리 링크 된 목록의 '4 단어'섹션에 4 단어 블록을 삽입하면됩니까?

감사합니다.

답변

4

해제 된 블록에는 항상 두 개의 포인터가있는 공간이 있으므로 중복 된 목록을 만들면 안됩니까? 병합 코드를 단순화하여 목록을 탐색하는 동안 후행 포인터를 유지할 필요가 없습니다. 또한 목록의 끝이 검색을 시작하기에 더 가까울 수 있다는 힌트가있는 경우 목록을 어느 방향 으로든 탐색 할 수 있습니다. 한번 보았던 하나의 모호한 시스템은 마지막 활동이 발생한 "중간"에 포인터를 유지했습니다.

블록을 해제 할 때. 오직 네 가지 경우가 있습니다 :

  • 무료 블록이 무료 블록 후 인접 해 있습니다.
  • 자유 블록은 앞에 있고 자유 블록 앞에 있습니다.
  • 빈 블록은 그 전후의 두 자유 블록 사이에 있습니다.
  • 빈 블록이 여유 블록과 인접하지 않습니다. 인접한 자유 블록을 병합의

목적은 다음과 같습니다

  • 정확하게 볼 앞서 찾기 위해 할당 부담없이 무료로 블록의 크기를 반영하기 위해 연결리스트의 길이를 줄이기 위해 두 블록이 인접한 경우

빈 블록을 특정 길이의 freelist로 정렬하면 종종 이점이 있지만 대부분의 실제 구현에서는 병합이 우선이므로 alloc() 다른 크기의 여유 블록이 많으면 다른 크기 블록에 대한 요청이 부적절하게 거부되지 않습니다.

+0

나는 당신이 말하는 것을 보았지만 후행 포인터를 유지할 필요가 없다는 점에 대해 더 자세히 설명 할 수 있습니까? 또한, 내가 자유 블록을 호출하면 B. 우리는 B-> next-> prev = B라고 가정하고 있는가? 이 경우가 아니라면 이중 링크 된 목록이 도움이되는 방법을 알지 못합니다. 또한 분리 목록 할당 자에서 힙을 초기화하는 가장 좋은 방법은 무엇입니까? 페이지를 어떤 패턴으로 분할 하시겠습니까? (당신이 지정된 무한대 범주에 올 때까지 2 단어의 64 자유 블록, 4 단어의 64 자유 블록, 8 단어의 64 자유 블록 ...을 제공 하시겠습니까? 아니면 초기화하는 더 좋은 방법이 있습니까? – de1337ed

+0

@ de1337ed : 아마도 어떤 노드 목록 처리 코드도 작성하지 않았습니까? Whirl : 링크 된 목록에 노드를 삽입하는 함수를 작성하십시오.목록을 주소 = 정렬 된 순서로 유지하십시오. 단독 링크로 사용해보십시오. 그리고 이중으로 연결되도록 수정하십시오. (B-> next-> prev라는 질문에 대답하기 위해서는 항상 * B가있다. 그렇지 않으면 버그가있다.) 힙을 초기화하는 것은 구현 자의 정책 결정에 달려있다. 512 바이트 블록을 사용할 준비가 되셨습니까? 시스템에 따라 다릅니다. – wallyk