프로그래밍
첫 페이지 회원가입 로그인
비공개 손님 2016-07-20 23:34:47
메모리 할당 질문이요

VirtualAlloc 으로 예약할때
시작주소가 시스템 예약 단위에 정렬되는데(윈도우64KB)
이걸 이것의 배수로 하고 싶어요(128 256 512..)
기본 전제는 주소의 낭비가 없어야 하구요
(Reserve 하고 안쓴다던지 하는)

일단 시도해본건 이래요
#include "stdafx.h"

int main()
{
    const size_t system_alignment = 64 * 1024;
    const size_t need_alignment = system_alignment * 10;
    const size_t rate = need_alignment / system_alignment;
    const size_t need_size = need_alignment * 2;

    const size_t reserve_size = need_size + system_alignment * (rate-1);
    size_t pAll = (size_t)::VirtualAlloc(0, reserve_size, MEM_RESERVE, PAGE_NOACCESS);
    size_t pEND = pAll + reserve_size;
    size_t u = (size_t)pAll / need_alignment;
    size_t d = (size_t)pAll % need_alignment;

    std::cout << "Reserev " << (void*)pAll << std::endl;

    size_t s = u * need_alignment;
    if(d)
        s += need_alignment;
    size_t e = s + need_size;

    printf("[%p ~]///[%p ~]///[%p ~][END %p]\n", (void*)pAll, (void*)s, (void*)e, (void*)pEND);
    std::cout << "----------------\n";
    printf("FrontSize: %Iu %IuKB\n", s - pAll, (s - pAll)/1024);
    printf("Body: %Iu %IuKB\n", need_size, need_size/1024);
    printf("BackSize: %Iu %IuKB\n", pEND - e, (pEND - e)/1024);
    std::cout << "----------------\n";

    if(pAll != s)
    {
        auto p = ::VirtualFree((void*)pAll, s - pAll, MEM_RELEASE);
        std::cout << "Free Front " << p << std::endl;
    }
    if(pEND != e)
    {
        auto p = ::VirtualFree((void*)e, pEND - e, MEM_RELEASE);
        std::cout << "Free Back " << p << std::endl;
    }

    byte* pResult = (byte*)::VirtualAlloc((void*)s, need_size, MEM_COMMIT, PAGE_READWRITE);
    std::cout << "Commit " << (void*)pResult << std::endl;

    for(size_t i=0; i<need_size; i++)
    {
        *(pResult+i) = 0xff;
    }

    system("pause");

    // 에러 테스트
    for(size_t i=pAll; i<s; i++)
        *(byte*)i = 0xff;
    for(size_t i=e; i<pEND; i++)
        *(byte*)i = 0xff;





    system("pause");
    return 0;
}
요약하자면 시스템예약단위64KB를 전제로
배율 = 요구 정렬단위 /  64KB
예약요청크기 = 요구메모리 + 64KB *(배율-1)
메모리 예약요청(예약요청크기)
결과 주소에서 요구된 정렬단위 위치를 찾아
필요없는 앞, 뒤 주소를 예약해제
이건데 역시 Release 는 Reserve 한거 통째로 해야 해서 실패하네요

관련 함수가 있을거 같은데 찾지를 못하겠어요

기타, _algined_malloc 같은 것은 정렬단위 192KB 에서 펑 해요

질문 | 995명이 읽었어요. 3.238.90.95 |

0
1 비공개 손님 2016-07-21 13:30:49
VirtualAlloc은 시스템 페이지 단위로 할당하는 함수입니다.
그래서 Allocation도 Alignment도 1페이지(4096bytes) 단위로 되게 됩니다.
그리고 메모리 할당 메커니즘 상 일부만 해제하거나는 불가능합니다.
5 비공개 손님 2016-07-22 12:59:59
예약단위 할당단위는 알고 있습니다
6 비공개 손님 2016-07-26 05:02:08
질문이 뭔소린지 하나도 모르겠음
주소의 낭비 안하는건 클래식한 서버아키텍쳐의 memory fragmentation을 방지하자는거와 개념이 같은데
그럴땐 미리 할당된 메모리 풀을 이용하면 -- 메모리를 크게 통짜로 잡아놓고 그 안에서 할당 및 해제를 자체적으로 하는것 -- 어느정도 해소되긴 합니다만
뭘 하고 싶은지를 모르겠네여
memory fragmentation을 안해봤자 실제로 사용 안한다면 page 아웃 되는것..
만약 진짜 하드코어하게 메모리 관리 하고싶으면 WDM단에서 non paged memory 사용하거나 SysMemAlloc계열을 이용해 피지컬 메모리를 건드리면 되는데
궂이 이럴 필요까지 있나 싶네여
7 비공개 손님 2016-07-26 05:04:33
참고로 효율적으로 관리하고 싶다고 해서 'virtual' 메모리의 주소를 관리하는건 아무런 성능상/효율상 이득이 없어요 어차피 큰 페이지를 잡아도 잘개 쪼개져서 메모리 컨트롤러에서 매번 접근시 주소 resolve 합미당
8 비공개 손님 2016-07-26 19:16:57
다른 분들은 질문이 뭔지 이해 하신거 같은데...

주소 예약을 64KB가 아닌 그 배수에 정렬되게 하고 싶다 이게 목적이고
그런 기능을 지원하는 시스템 함수가 있는지가 질문 내용입니다

실질적 할당인 4KB 단위 물리메모리 매핑은 질문 내용이 아닙니다
댓글을 작성하실 수 없습니다.
(권한이 없는 회원레벨)
목록으로
이용약관 | 광고/제휴 | 개인정보취급방침 | 문의/신고 | 모바일 TE31 | 서버 부하 : 9.75%
실시간 Issue 커뮤니티 TE31 [알지롱] ⓒ 2002-2021
TOP arrow_upward