특정 번지에 할당과 해제가 자유로운 heap을 만들 수 잇는가?
글쓴이: vyoz / 작성시간: 토, 2007/11/10 - 11:05오전
현재 리눅스에 dpram dd를 짜고 잇습니다. 512kbyte * 2의 크기를 갖고 있는 dpram에 FIFO queue를 꾸며야하는데
클라이언트 요구사항이 좀 복잡합니다.
가장 머리 아픈부분은 512kbyte의 dpram 영역에 '동적할당'이 가능한 queue를 여러개 꾸며야 한다는 것이죠.
그래서 push할때 데이터 크기와 메모리 주소를 기록해놓고 데이터를 쓸 생각을 하고 있었습니다.
1번 큐의 1번 블럭은 10byte이고 a위치에 넣는다.
2번 큐의 1번 블럭은 5byte이고 a위치 바로 뒤의 b위치에 넣는다.
1번 큐의 2번 블럭은 2byte이고 b위치 바로 뒤의 c위치에 넣는다.
pop은 이 테이블을 참조로 읽어내면 될꺼라고 보고..
그런데 가령 2번큐의 1번 블럭인 b위치에서 5byte를 읽어내 버리면 해당 위치는 다시 쓰기가 좀 애매해집니다.
(사용중인 1번 큐의 1,2번 블럭에 둘러쌓인 5byte 블럭이므로)
가장 무식하게 해결할 수 있는 방법은 블럭을 읽을때 마다 해당 위치의 뒤에 오는 모든 블럭을 앞으로 당겨주면
될 것 같습니다. 그런데 이런 방식이라면 단순히 생각하기에도 pop에서 오는 오버헤드가 매우 큽니다.
뒤에 있는 모든 블럭의 위치를 재조절 해야 하니까요.
여러분들의 조언을 듣고싶습니다. 머리가 깨질거같아요.
Forums:
memory allocator와 queue를
memory allocator와 queue를 따로 만드시는게 좋을 듯 한데요...
간단하게 malloc/free를 구현하고, queue는 그냥 malloc/free를 이용해서 만들면 됩니다.
그러면 queue는 문제가 안되고 malloc/free를 구현하는게 문제인데, malloc도 그냥 간단하게 전체 heap을 반씩 계속 나눠서 원하는 size가 나올때 까지 나눈 다음에 할당하도록 하면 됩니다. size를 2^n 단위로 할당해야겠죠. free된 것은 따로 free list를 가지고 있다가 다음번 malloc할 때에 참조해서 사용하면 됩니다.
댓글 달기