⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib0039.html

📁 Memory Management—Algorithms and implementation in C/C++ Introduction Chapter 1 - Memory Manag
💻 HTML
📖 第 1 页 / 共 3 页
字号:

<span style="background-color:d9d9d9">} /*end destructor---------------------------------------*/</span>

<span style="background-color:d9d9d9">/*</span>
<span style="background-color:d9d9d9">U4 nbytes    -    number of bytes required</span>
<span style="background-color:d9d9d9">returns address of first byte of memory region allocated</span>
<span style="background-color:d9d9d9">( or NULL if cannot allocate a large enough block )</span>
<span style="background-color:d9d9d9">*/</span><a name="519"></a><a name="IDX-270"></a>

<span style="background-color:d9d9d9">void* SegregatedMemoryManager::allocate(U4 nbytes)</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">U4 index;</span>

    <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
    <span style="background-color:d9d9d9">MSG1("allocate(%lu)\n",nbytes);</span>

    <span style="background-color:d9d9d9">if(nbytes==0)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
        <span style="background-color:d9d9d9">MSG0("allocate(): zero bytes requested\n");</span>
        <span style="background-color:d9d9d9">return(NULL);</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">if(nbytes&lt;=16)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">index = searchColumn(START16);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START32);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START64);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START128);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START256);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START512);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if(nbytes&lt;=32)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">index = searchColumn(START32);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START64);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START128);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START256);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START512);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if(nbytes&lt;=64)</span><a name="520"></a><a name="IDX-271"></a>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">index = searchColumn(START64);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START128);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START256);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START512);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if(nbytes&lt;=128)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">index = searchColumn(START128);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START256);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START512);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if(nbytes&lt;=256)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">index = searchColumn(START256);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START512);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if(nbytes&lt;=512)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">index = searchColumn(START512);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
        <span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if(nbytes&lt;=1024)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span><a name="521"></a><a name="IDX-272"></a>
        <span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if(nbytes&lt;=4096)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
        <span style="background-color:d9d9d9">if(index){ return((void*)&amp;ram[index]); }</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">return(NULL);</span>

<span style="background-color:d9d9d9">}/*end allocation----------------------------------------------------*/</span>

<span style="background-color:d9d9d9">/*</span>
<span style="background-color:d9d9d9">search a given size range for a free element</span>
<span style="background-color:d9d9d9">return index</span>
<span style="background-color:d9d9d9">or zero if no available memory</span>
<span style="background-color:d9d9d9">*/</span>

<span style="background-color:d9d9d9">U4 SegregatedMemoryManager::searchColumn(U4 index)</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">U4 i;</span>
    <span style="background-color:d9d9d9">for(i=0;i&lt;nrows;i++)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">if(STATE(index)==FREE)</span>
        <span style="background-color:d9d9d9">{</span>
            <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
            <span style="background-color:d9d9d9">MSG1("searchColumn(): free at index %lu, ",index);</span>
            <span style="background-color:d9d9d9">MSG1("address=%p\n",&amp;ram[index]);</span>
            <span style="background-color:d9d9d9">STATE(index)=OCCUPIED;</span>
            <span style="background-color:d9d9d9">return(index);</span>
        <span style="background-color:d9d9d9">}</span>
        <span style="background-color:d9d9d9">index = index + SZ_ROW;</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">return(0);</span>

<span style="background-color:d9d9d9">}/*end searchColumn---------------------------------------------------*/</span>

<span style="background-color:d9d9d9">void SegregatedMemoryManager::release(void *addr)</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">U4 free;    //index into ram[]</span>

    <span style="background-color:d9d9d9">if(addr==NULL)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
        <span style="background-color:d9d9d9">MSG0("release(): cannot release NULL pointer\n");</span>
        <span style="background-color:d9d9d9">return;</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
    <span style="background-color:d9d9d9">MSG1("release(%p)\n",addr);</span><a name="522"></a><a name="IDX-273"></a>

    <span style="background-color:d9d9d9">//perform sanity check to make sure address is kosher</span>

    <span style="background-color:d9d9d9">if( (addr&gt;= (void*)&amp;ram[size]) || (addr&lt; (void*)&amp;ram[0]) )</span>
    <span style="background-color:d9d9d9">{</span>
       <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
       <span style="background-color:d9d9d9">MSG0("release(): address out of bounds\n");</span>
       <span style="background-color:d9d9d9">return;</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">//translate void* addr to index in ram[]</span>

    <span style="background-color:d9d9d9">free = (U4)( ((U1*)addr) - &amp;ram[0]);</span>

    <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
    <span style="background-color:d9d9d9">MSG1("address resolves to index %lu\n",free);</span>

    <span style="background-color:d9d9d9">//a header always occupies first 13 bytes of storage</span>

    <span style="background-color:d9d9d9">if(free==0)</span>
    <span style="background-color:d9d9d9">{</span>

        <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
        <span style="background-color:d9d9d9">MSG0("release(): address in first 1st byte\n");</span>
        <span style="background-color:d9d9d9">return;</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">//yet more sanity checks</span>

    <span style="background-color:d9d9d9">if(STATE(free)!=OCCUPIED)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
        <span style="background-color:d9d9d9">MSG0("release(): referencing invalid region\n");</span>
        <span style="background-color:d9d9d9">return;</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">STATE(free)=FREE;</span>

    <span style="background-color:d9d9d9">return;</span>

<span style="background-color:d9d9d9">}/*end release---------------------------------------------------*/</span>

<span style="background-color:d9d9d9">void SegregatedMemoryManager::printState()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">printf("[16 bytes]");</span>
    <span style="background-color:d9d9d9">printColumn(START16);</span>

    <span style="background-color:d9d9d9">printf("[32 bytes]");</span>
    <span style="background-color:d9d9d9">printColumn(START32);</span>

    <span style="background-color:d9d9d9">printf("[64 bytes]");</span>
    <span style="background-color:d9d9d9">printColumn(START64);</span><a name="523"></a><a name="IDX-274"></a>

    <span style="background-color:d9d9d9">printf("[128 bytes]");</span>
    <span style="background-color:d9d9d9">printColumn(START128);</span>

    <span style="background-color:d9d9d9">printf("[256 bytes]");</span>
    <span style="background-color:d9d9d9">printColumn(START256);</span>

    <span style="background-color:d9d9d9">printf("[512 bytes]");</span>
    <span style="background-color:d9d9d9">printColumn(START512);</span>

    <span style="background-color:d9d9d9">printf("[1024 bytes]");</span>
    <span style="background-color:d9d9d9">printColumn(START1024);</span>

    <span style="background-color:d9d9d9">printf("[4096 bytes]");</span>
    <span style="background-color:d9d9d9">printColumn(START4096);</span>

    <span style="background-color:d9d9d9">return;</span>

<span style="background-color:d9d9d9">}/*end printState------------------------------------------------------*/</span>

<span style="background-color:d9d9d9">void SegregatedMemoryManager::printColumn(U4 index)</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">U4 i;</span>
    <span style="background-color:d9d9d9">for(i=0;i&lt;nrows;i++)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">if(STATE(index)==OCCUPIED)</span>
        <span style="background-color:d9d9d9">{</span>
            <span style="background-color:d9d9d9">printf("[%p] ",&amp;ram[index]);</span>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -