     

     9 

    ,  ,     Win32   
  ,   (heaps).     
    . ,    
  ,   ,     
( 7)  ,    ( 8). 
    ^^  16- Windows,     : 
  .     DLL-    
 ,       . 
     Win32       
.    : 
          (    
, ,  ); 
          ;      
     .    16- 
Windows        
 ,         
16- Windows   Win32; 
         ,    
 ; 
     DLL-    ;   , 
    .  DLL     
       .   
16- DLL        
,  DLL-,         . 
            Win32  ,  
  : , ,   . . (,   
Win32-poex     .)     
,   Win32   16- Windows   
  . ,  ,    
 Win32 API   ;       
,         . 
     . 

    201 

    202 _____________________________ Windows   


    Win32-Ky4H 

        .  
      .   ,   
    , , ,   
(heap manager),     .    
       . 
      ,        
 .        Win32 
API. Microsoft        
 ,  ,      
 .          
  .       ,  
         
  (. . VirtualAllocn VirtualFree),    
  . 

       

      Win32-nponecca      
    (process's default heap).    1 
.     ,   ,  
        /HEAP: 

    /HEAP: reserve]., commit] 

    (  : DLL-     ,  
       /HEAP.) 
         \32-. , 
  Windows NT      
Unicode-  .   ANSI- - Win32^yHKm, 
 ,    ANSI  Unicode,   
Unicode-.    ANSI-    
,     Unicode- .    
    .    ,  
  ,        .  
       16- Windows,  . 
          'WmH-,  
        ,  
       .  ,  
,            
     .        
   ,    ,    
  ,           
  .        
   .     
 ,            
 .  Win32-y , ,     
    . 
    '  ,       .  
      .    
           
       .     
,   Win32^yH,       , 
      . 

    ________________________________________ 9.  203 

          GetProcessHeap: 

    HANDLE GetProcessHeap(VOID); 


       Win32-npouecce 

           . 
   ?     : 
      ; 
        ; 
      . 
       . 

      

    ,     :   
 NODE     BRANCH.  ,    
  -: 
    LNKLST.C,      ,  BINTREE.C 
     . 
      NODE  BRANCH    ,    
  (. . 9-1): 

    NODE3 
    BRANCH I 
   
    NODE 2 
    BRANCH 2 
    BRANCH 3 
    NODE 1 

    . 9-1.  ,    . NODE  BRANCH 

     ,   ,   ,  
,      8   NODE I.    
      BRANCH 3. ,     
BINTREE.C     ,   - , 
     .  ,   - 
    ,          
 .           ( 
   ),        . 
            NODE,   BRANCH,   
   .       
     ,  . ,  
      ,     
   ,     . 

    204 ______________________________Windows   


       

        ,     
 . ,   NODE  24 ,  
  BRANCH  32.        
 .  . 9-2 ,       
  NODE  BRANCH.   NODE 2  NODE 4 , 
     .      
      BRANCH,       
 ,     48 ,   BRANCH   32. 

    NODE3 
    NODE 5 
    NODE 4 
    
    NODE 6 
    BRANCH 5 
    BRANCH 1 
    
    NODE 2 
    BRANCH 2 
    BRANCH 3 
    
    NODE 1 

    . 9-2.  ,    NODE  BRANCH 

            ,  
            . 

      

      ,        
 ,   .  4    
          
     .    
      - .    
          . 
    ,     , 
         
 . 
          ,   
  ,   _   .   
      , ,    
     .    NODE   
   , ,   ,     
  NODE      . 
           
  -  NODE      . 
            ,  NODE  
      .    
        NODE,  
    BRANCH.      
     

    ________________________________________ 9.  205 

     (page fault)      NODE,    
      . 

     Win32-K/4M 

          HeapCreate: 

    HANDLE HeapCreate(DWORD flOptions, DWORD dwInitialSize, DWORD cbMaximumSize): 

     flOptions   ,   . 
    , HEAP_NO_SERIALIZE, HEAP_GENERATE_EXCEPTIONS  
   . 
           ,  
         
.           ( 
    ): 
    1.        . 
    2.    . 
    3.   ,    . 
    4.        . 
         HEAP_NO_SERIALIZE, ,  
         .  
    . 1  2      
.        ,    
       . 1  2.     
    3,       . 
    ,   ,       . 
  1   ,     . 
    2   ,   -- . 
.._    _ ,    
,        . 
         ,     
.       ,  ,    
 .      : 
         .      
    ; 
             .      
.   1    ,   
 ,   2; 
       ,    ,  .   
 ,       .  
 . 
               
     (        
).        HEAP_NO_SERIALIZE.  
         : 
          ; 
        ,        ; 
        ,        
,     (mutual exclusion),  
-   (.  10). 

    206 ______________________________Windows   

       ,     HEAP_NO_SERIALIZE,    
.         
  - ,    ,  
,         . 
     , HEAP_GENERATE_EXCEPTIONS,    
        .  (. 
 16)        .   
 ,    ,     
,  . 
       HeapCreate  dwInitialSize    
,   .     
    ,   ,  
.   , dwMaximumSize,   
  (   ,   
  ).    0,    
(   )       
  .     HeapCreate 
 ,   .     
,   . 

         

         HeapAlloc: 

    LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes); 

     hHeap   ,    
.      HeapCreate  
GetProcessHeap.  dwBytes      ,  
dwFlags   ,     .  
     : 

    HEAP_ZERO_MEMORY, HEAP_GENERATE_EXCEPTIONS  HEAP_NO_SERIALIZE. 

      HEAP_ZERO_MEMORY :    
    HeapAlloc.      
  ,        
 . ,        
  HeapCreate;   ,  ,   
        
.        HeapCreate,    
HeapAlloc     .   ,     
  HEAP_GENERATE_EXCEPTIONS. ,       
HeapAlloc,       . 
              
,       : 

                       

    STATUS_NO_MEMORY                 -  . 
    STATUS_ACCESS_VIOLATION            - 
     . 

     ,   HeapAlloc,  ,   
 ,          
 .     HeapAlloc  
 .      HEAP_GENERATE_EXCEPTIONS  , 
  NULL. 

    ________________________________________ 9.  207 

     HEAP_NO_SERIALIZE  HeapAlloc      
    .      
,           
  . 

       

          .   
  ,  , ,  ,    , 
 .  , ,       
       .     
   HeapReAlloc. 

    LPVOID HeapReAlloc(HANDLE hHeap, DWORD dwFlags. LPVOID IpMem, DWORD dwBytes); 

     ,  hHeap  ,   
.  dwFlags  ,     
.   : HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE, 
HEAP_ZERO_ MEMORY  HEAP_REALLOC_IN_PLACE_ONLY. 
         ,      HeapAlloc.  
_ZERO_MEMORY       .   
  ,   ,  .  
      . 
     HEAP_REALLOC_IN_PLACE_ONLY  HeapReAlloc,    
     ;       
   .        
,        .   , 
      ,    , 
   .     ,   
    .  
HEAP_REALLOC_IN_PLACE_ONLY   ,     
    .         
      ,      
      . 
       (IpMem  dwBytes)    
      ( ).  HeapReAlloc 
   ,  ,  NULL,    
  . 

       

      ,   HeapSize     : 

    DWORD HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID IpMem): 

     hHeap (    HeapCreate  
GetProcessHeap)  ,  IpMem (    
HeapAlloc  HeapReAlloc)   .  dwFlags  
 : 0  _NO_SERIALIZE. 

      

        HeapFree: 

    BOOL HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID IpMem): 

             TRUE. 
 dwFlags   : 0  HEAP_NO_SERIALIZE.   
  

    208 ______________________________Windows   

       ,  ,  ,   
   ,    . 

     Win32-Ky4H 

        HeapDestroy. 

    BOOL HeapDestroy(HANDLE hHeap); 

               
         , 
 .      TRUE.   
     ,   ,    
       .    ,  
      . 
             ,  
     .     
   HeapDestroy,     . 

         C++ 

          Win32-Ky4,   
   ,   C++.     
       new,    
malloc,     .      
 ,    free    
delete. ,     CSomeClass,      
 .     - : 

    CSomeClass* pCSomeClass = new CSomeClass; 

       ,  C++  ,    
CSomeClass -,   new.  ,  
     .       
 ++- new.      
 delete: 

    delete pCSomeClass; 

      new  delete   ++-,   
   \32-,  .  
   CSomeClass   , , : 

    class CSomeClass { 
    private; 
    static HHEAP s_hHeap; 
    static UINT s_uNumAllocsInHeap; 
    //      - 
    
    public:                                                                    
                    ' 
    void* operator new (size_t size): 
    void operator delete (void* p); 
    //      - 

    ________________________________________ 9.  209 

          s_hHeap  s_uNumAllocsInHeap   
 .   ,   C++    
 CSomeClass      .  ,   
    s_hHeap  s_uNumAllocsInHeap   
  .   :   ,   
  CSomeClass     . ~~~'  
s_hHeap    ,     
CSomeClass.  s_uNumAllocsInHeap       
 CSomeClass.          
 CSomeClass      .  
 ,     .   
  -     : 

     CSomeClass::s_hHeap = NULL; 
    UINT CSomeClass::s_uNumAllocsInHeap = 0; 
    
    void* CSomeClass::operator new (size_t size) { 
    if (s_hHeap == NULL) { 
    
    //   :   
    s_hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0); 
    
    if (s_hHeap == NULL) 
    return(NULL); 
    
    //    CSomeGlass  
    void* p: 
    
    while ((p = (void *) HeapAlloc(s_hHeap. 0, size)) == NULL) { 
    //  CSomeClass     
    if (_new_handler != NULL) { 
    
    //      
    (*_new_handler)(); 
    } else { 
    
    //     :    
    break: 
    } 
    if (p != NULL) { 
    
    //   :   
    //  CSomeClass   
    s_uNumAllocsInHeap++; 
    
    //     GSomeClass 
    return(p): 
    } 

    ,          s_hHeap 
 s_uNumAllocsInHeap,      NULL  0 
.  new     size,   
,    CSomeClass.  new    
,   .      s_hHeap: 
  NULL,   ,      HeapCreate,  
,  ,   

    210 _____________________________Windows   

     s_hHeap,      new  
 ,     . 
     HeapCreate,    HEAP_NO_SERIALIZE,    
   .   10    
 Win32,          
    .  ,    
HeapCreate,      .     
  .  0 ,      ,   
      . 
     ,   ,   size  new  
  HeapCreate   .     
  ,        
  .    HeapAlloc     
 ,           . 
,    ,   . - ,     
      ,   HeapAlloc  
     ,       
 ,      .                              
             CSomeClass  
 HeapAlloc.     ,     
CSomeClass.     . 
       ,   - 
s_uNumAllocsInHeap,       . , 
 new       CSomeClass.        
          CSomeClass.  , 
   ,      .   
   delete:                                                
    
    void CSomeClass::operator delete (void* p) {                               
    if (HeapFree(s_hHeap, 0, p)) { 
    //    
    s_uNumAlIocs In Heap--; 
    if (s_uNumAllocsInHeap == 0) { 
    
    //      ,   
    if (HeapDestroy(s_hHeap)) { 
    //    NULL,   new 
    //         CSomeClass 
    s_hHeap = NULL; 
    } 
    } 
    } 

     delete    :   . 
   HeapFree        
 .    , s_uNumAllocsInHeap 
, ,    CSomeClass    . 
  :      0, ,  ,  
HeapDestroy,    .   , s_hHeap 
 NULL.  :        
   CSomeClass.      new, , 
  s_hHeap, ,      
  . 

    ________________________________________ 9.  211 

             
.          .  
,  ,     .   
      CSomeClass  ,  
  (derived class)   new  delete, 
  CSomeClass.      ,   
,    new      
        ,     
CSomeClass.    ,    .   
  ,      ,  
     ,       
     . 
            ,  
 ,      CSomeClass.    
     s_hHeap  s_uNumAllocsInHeap   
     new  delete.  ,   
   _  new  delete   
   ,    ,     . 
    "       ,   
           
  .        
 ,       . , 
,   ,   ,        
  .         
. , ,      . 

        

      ,  Windows NT    , 
   .     ,   , 
  Windows 95   . 
           ,   
GetProcessHeaps      : 

    DWORD GetProcessHeaps(DWORD NumberOfHeaps, PHANDLE ProcessHeaps): 

         ,    
 : 

    HANDLE hHeaps[25]: 
    DWORD dwHeaps = GetProcessHeaps(25, hHeaps); 
    if (dwHeaps > 25) { 
    //    ,    
    } else { 
    //   hHeaps[0]  hHeaps[dwHeaps-1] 
    //    
    } 

      :         
 ,   GetProcessHeaps.  HeapValidate: 

    BOOL HeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID ipMem); 

      .   ,   hHeap 
 ,  dwFlags  0 (     
HEAP_NO_SERIALIZE),   IpMem  NULL.      , 
     . 

    212 ______________________________Windows   

       ,   IpMem    
 .      . 
       16- Windows,    ,  
Win32 ,   (compact)    (discard).   
  HeapCompact    Win32: 

    UINT HeapCompact(HANDLE hHeap. DWORD dwFlags); 

         ,    ,  
  16 Windows GlobalCompact  LocalCompact.  
HeapCompact        ,  
    ,   .    
dwFlags  0,     HEAP_NO_SERIALIZE. 
        HeapLock  HeapUnlock   : 

    BOOL HeapLock(HANDLE hHeap); 
    BOOL HeapUnlock(HANDLE hHeap); 

      ,        16- 
Windows GlobalLock, LocalLock, GlobalUnlock  LocalUnlock.  HeapLock  
HeapUnlock    .    
HeapLock ,   ,   .   
    ,     ,  
     ,      
 HeapUnlock. 
     HeapAlloc, HeapSize, HeapFree       HeapLock 
 HeapUnlock,      .  
    . 
     ,     ,  HeapWalk: 

    BOOL HeapWalk(HANOLE hHeap, LPPROCESS_HEAP_ENTRY IpEntry); 

             . 
     ,    
PROCESS_HEAP_ENTRY (       ): 

    typedef struct _PROCESS_HEAP_ENTRY { 
    PVOID IpData; 
    DWORD cbData; 
    BYTE cbOverhead; 
    BYTE iRegionIndex: 
    WORD wFlags; 
    uhioh { 
    struct { 
    HANDLE hMem; 
    DWORD dwReserved[ 3 ]; 
    } Block; 
    struct { 
    DWORD dwCommittedSize; 
    DWORD dwUhCommittedSize; 
    LPVOID IpFirstBlock; 
    LPVOID IpLastBlock; 
    } Region; 
    }; 
    } PROCESS_HEAP_ENTRY, *LPPROCESS_HEAP_ENTRY, *PPROCESS_HEAP_ENTRY; 

         ,  NULL  IpData,   
   HeapWalk    .  
  

    ________________________________________ 9.  213 

     ,  HeapWalk  ,      
     PROCESS_HEAP_ENTRY.  HeapWalk  FALSE, 
,     .     
PROCESS_HEAP_ENTRY .  Win32 SDK. 
       HeapWalk   HeapLock  HeapUnlock, 
     ,      
 . 

       16- Windows 

      ,   Win32   16- Windows, 
   .      , 
  ,    ,    
  ,  ,      
  16- Windows,      
    Win32-poe. Win32  , 
    ,     
.     Win32-poee    
 ,   16- Windows,   
           
   \^2-.,,  . 
      16- ,     
,        
    ,      
   . 
        ,  Win32   
    .     
 ;       ,  
   .   GlobalAlloc     
        ,  
.          
    .  ,  ,  
  .     GlobalLock,   
       ,   
  . 
     Win32    ,   
     .   
     ;   Win32  
  ,   . 
     -        
16-   ,  \^32-,,  
. ,     ,    Win32,  
  16- Windows,         
Win32,   .  :        , 
  16- Windows.    ,    
Win32-cpee 16- ,  . 

     16- Windows,   Win32 

       . 9-3 ,    Win32  
16- Windows,  .       
,     . ,   Win32  
HGLOBAL  HLOCAL   HANDLE. 

    214 ______________________________Windows   

        16- Windows                   Win32 

    HGLOBAL GlobalAlloc(UINT fuAlloc,            . 
    DWORD cbAlloc); 
    HLOCAL LocalAlloc(UINT fuAlloc, 
    UINT cbAlloc); 
    HGLOBAL GlobalDiscard(HGLOBAL hgib);        .  
 : 
    HLOCAL LocalDiscard(HLOCAL hid);          GlobalReAlloc((hglb), 0, GMEM_MOVEABLE); 
    LocalReAlloc((hlcl), 0, LMEM_MOVEABLE); 
    
    UINT GlobalFlags(HGLOBAL hgib);                
 . 
    UINT LocalFlags(HLOCAL hid); 
    
    HGLOBAL GlobalFree(HGLOBAL hgib);          . 
    HLOCAL LocalFree(HLOCAL hid); 
    
    LPVOID GlobalLock(HGLOBAL hgib);            . 
    LPVOID LocalLock(HLOCAL hid); 
    
    BOOL GlobalUnlock(HGLOBAL hgib);            . 
    BOOL LocalUnlock(HLOCAL hid); 
    
    HGLOBAL GlobalReAlloc(HGLOBAL hgib,        /   . 
    DWORD cbNewSize, UINT fuAlloc); 
    HLOCAL LocalReAlloc(HLOCAL hid, 
    UINT cbAlloc, UINT fuAlloc); 
    
    DWORD GlobalSize(HGLOBAL hgib);              . 
    UINT LocalSize(HLOCAL hid); 
    
    HGLOBAL GlobalHandle(LPVOID IpvMem);        , 
    HLOCAL LocalHandle(LPVOID IpvMem);         . 
    
    . 9-3. - ,   16- Windows 
 Win32 


        

       GlobalAlloc  LocalAlloc   
 , Win32-CHCTeMa      
      .       
   . ,   : 

    HGLOBAL hgib = GlobalAlloc(GMEM_MOVEABLE, 10); 
    LPVOID Ipv = GlobalLock(hglb); 

     hgib      .   
GlobalLock ,     ,  
  .  GlobalLock    . 
          .  
         
 (      ).   
          
        GlobalAlloc  LocalAlloc. 
       . 9-4   ,   Win32. ( 
 ,     GlobalAlloc  LocalAlloc .) 

    _______________________________________ 9.  215 


                        Win32 
    
    GHND                    (GMEM_MOVEABLE : GMEM_ZEROINIT). 
    LHND                    (LMEMJMOVEABLE ! LMEM_ZEROINIT). 
    GPTR                     (GMEM_FIXED ! GMEM_ZEROINIT). 
    LPTR                     (LMEM_FIXED : LMEM_ZEROINIT). 
    GMEM_DDESHARE,              
Win32  
    GMEM_SHARE            .     ,  
 ,      . 
    
    GMEM_DISCARDABEE,          
(discardable memory 
    LMEM_DISCARDABLE     block). Win32   . 
    GMEM_FIXED,               . 
    LMEM_FIXED 
    GMEM_LOWER,          . 
    GMEM_NOT_BANKED, 
    GMEM_NOCOMPACT, 
    LMEM_NOCOMPACT, 
    GMEM_NODISCARD, 
    LMEM_NODISCARD, 
    GMEM_NOTIFY, 
    LMEM_NOTIFY 
    GMEM_MOVEABLE,          . 
    EMEM_MOVEABLE 
    GMEM_ZEROINIT,              . 
    LMEM_ZEROINIT 
    NONZEROLHND            (LMEM_MOVEABLE). 
    NONZEROEPTR            (LMEM_FIXED). 

    . 9-4.       'Win32 

     GlobalReAlloc  LocalReAlloc      
 GMEM_DISCARDABLE  LMEMJ3ISCARDABLE,    GMEM_MODIFY  LMEM_MODIFY'. 

     16- Windows,     Win32 

       . 9-5   16- Windows, 
       Win32,   
,     .        
  : 
           .  Win32  
    ,    ; 
         ,      
(discardable memory).  Win32      .  
 ,       GlobalDiscard 
 LocalDiscard.         ; 
    1.  GMEM_MODIFY  LMEM_MODIFY      . 9-4 
- ,       GlobalReAlloc  LocalReAlloc. 

    216 _____________________________Windows   

           (moveable memory).  
Win32         . 
        16- Windows                Win32 

    BOOL DefineHandleTable(WORD w);        ,   ((w), TRUE) 
    DWORD GetFreeSpace(UINT u);            ,   (OxIOOOOOL) 
    DWORD GlobalCompact(DWORD);           0100000 
    void GlobalFix(HGLOBAL);                 To ,  GlobalLock 
    HGLOBAL GlobalLRUNewest(HGLOBAL h); ,   (HANDLE) (h) 
    HGLOBAL GlobalLRU01dest(HGLOBAL h);  ,   (HANDLE) (h) 
    void GlobalUnfix(HGLOBAL);              To ,  GlobalUnlock 
    BOOL GlobalUnWire(HGLOBAL);          To ,  GlobalUnlock 
    void *GlobalWire(HGLOBAL);              To ,  GlobalLock 
    void LimitEmsPages(DWORD);                  
    UINT LocalCompact(UINT);                 0100000 
    UINT LocalShrink(HLOCAL, UINT);           0100000 
    HGLOBAL LockSegment(UINT w);          ,   
GlobalFix((HANDLE) (w)) 
    LONG SetSwapAreaSize(UINT w);           ,   (w) 
    void UnlockSegment(UINT w);              ,   
GlobalUnfix((HANDLE) (w)) 

    . 9-5.      16- Windows  
  Win32 


     16- Windows,   Win32 

       16- Windows,   Win32 API  
 ,      Intel.  Win32 API 
 ,         
.        : 

    AllocDStoCSAlias      GlobalDOSAlhc       Locallnit 
    AllocSekctor           GlobalDOSFree        SwitchStackBack 
    ChangeS elector        GlobalNotify          SwitchStackTo 
    FreeSelector            GlobalPageLock 
    GetCodeInfo          GlobalPageUnlock 
