Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 38

Автор ДТонсон Π₯Π°Ρ€Ρ‚

β€’ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ (Π³Π»Π°Π²Π° 7), ΠΈΠ»ΠΈ, Ρ‚ΠΎΡ‡Π½Π΅Π΅, процСсс (Π³Π»Π°Π²Π° 6) ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ этот Ρ„Π»Π°Π³ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

β€’ ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΊΡƒΡ‡Ρƒ ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€ ΠΊΡƒΡ‡, ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступа ΠΊ этой ΠΊΡƒΡ‡Π΅.

β€’ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° располагаСт собствСнным ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΊΡƒΡ‡Π΅ сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapAlloc ΠΈ HeapAlloc. Для этой Ρ†Π΅Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapLock ΠΈ HeapUnlock. 

Π€Π»Π°Π³ HEAP_GENERATE_EXCEPTIONS

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ вмСсто Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ NULL Π² случаС сбоСв ΠΏΡ€ΠΈ распрСдСлСнии памяти позволяСт ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ нСобходимости тСстирования Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ распрСдСлСния. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ очистку памяти, которая ΠΊ этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π±Ρ‹Π»Π° частично распрСдСлСна. Π­Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Π΄Π²Π° ΠΊΠΎΠ΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

1. STATUS_NO_MEMORY: это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ систСмС Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ объСма. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ этого ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ фрагмСнтация памяти, достиТСниС нСрастущСй ΠΊΡƒΡ‡Π΅ΠΉ максимально допустимого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ»ΠΈ исчСрпаниС всСй доступной памяти растущими ΠΊΡƒΡ‡Π°ΠΌΠΈ.

2. STATUS_ACCESS_VIOLATION: это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΡƒΡ‡ΠΈ.

Одной ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ этого ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ записи Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ с Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ распрСдСлСнного Π±Π»ΠΎΠΊΠ°.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΡƒΡ‡ΠΈ

Ѐункция HeapCompact пытаСтся ΡƒΠΏΠ»ΠΎΡ‚Π½ΠΈΡ‚ΡŒ, ΠΈΠ»ΠΈ Π΄Π΅Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, смСТныС Π±Π»ΠΎΠΊΠΈ Π² ΠΊΡƒΡ‡Π΅. Ѐункция HeapValidate пытаСтся ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ поврСТдСния ΠΊΡƒΡ‡ΠΈ. Ѐункция HeapWalk пСрСчисляСт Π±Π»ΠΎΠΊΠΈ Π² ΠΊΡƒΡ‡Π΅, Π° функция GetProcessHeaps ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ всС Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСскрипторы ΠΊΡƒΡ‡.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapLock ΠΈ HeapUnlock ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ ΠΊΡƒΡ‡Π΅, ΠΎ Ρ‡Π΅ΠΌ говорится Π² Π³Π»Π°Π²Π΅ 8.

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Windows 9x ΠΈΠ»ΠΈ Windows Π‘Π•. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅Π΄ΡˆΠΈΠ΅ ΠΈΠ· употрСблСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались Ρ€Π°Π½Π΅Π΅ для совмСстимости с 16-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ систСмами. ΠœΡ‹ упомянули ΠΎΠ± этих функциях лишь для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ лишний Ρ€Π°Π· ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ, хотя Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости Π² Π½ΠΈΡ… большС Π½Π΅Ρ‚.

РСзюмС: ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΡƒΡ‡Π°ΠΌΠΈ

ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° использования ΠΊΡƒΡ‡ Π½Π΅ прСдставляСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… слоТностСй:

1. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ дСскриптор ΠΊΡƒΡ‡ΠΈ, воспользовавшись ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CreateНСар ΠΈΠ»ΠΈ GetProcessHeap.

2. Π Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π±Π»ΠΎΠΊΠΈ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ HeapAlloc.

3. Π’ случаС нСобходимости освободитС всС ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapFree.

4. Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΡŒΡ‚Π΅ ΠΊΡƒΡ‡Ρƒ ΠΈ Π·Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π΅Π΅ дСскриптор ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapDestroy.

Π­Ρ‚ΠΎΡ‚ процСсс ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ рис. 5.2 ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.2. 

Π’ отсутствиС нСобходимости создания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΡƒΡ‡ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ программисты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΈ Π΄Π°Π»Π΅Π΅. ΠŸΡ€ΠΈ этом, Ссли Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ ΠΊΡƒΡ‡Π΅ процСсса, функция malloc эквивалСнтна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapAlloc, функция realloc β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapReAlloc, Π° функция free β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapFree. Ѐункция calloc распрСдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈ Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π»Π΅Π³ΠΊΠΎ эмулируСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ HeapAlloc. Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HeapSize Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π‘ отсутствуСт.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: сортировка Ρ„Π°ΠΉΠ»ΠΎΠ² с использованиСм Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска

РаспространСнными динамичСскими структурами Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌΠΈ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅Ρ€Π΅Π²ΡŒΡ поиска. Π”Π΅Ρ€Π΅Π²ΡŒΡ поиска ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ сопровоТдСния ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ записСй, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ прСимущСством ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ примСнСния Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ эффСктивных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΎΠ±Ρ…ΠΎΠ΄Π° ΡƒΠ·Π»ΠΎΠ².

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° sortBT (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.1) Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ UNIX-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ sort Π·Π° счСт создания Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска с использованиСм Π΄Π²ΡƒΡ… ΠΊΡƒΡ‡. ΠšΠ»ΡŽΡ‡ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΊΡƒΡ‡Π΅ ΡƒΠ·Π»ΠΎΠ² (node heap), ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» содСрТит Π»Π΅Π²Ρ‹ΠΉ ΠΈ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠ»ΡŽΡ‡ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° запись Π² ΠΊΡƒΡ‡Π΅ Π΄Π°Π½Π½Ρ‹Ρ… (data heap). Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΡƒΡ‡Π° ΡƒΠ·Π»ΠΎΠ² состоит ΠΈΠ· Π±Π»ΠΎΠΊΠΎΠ² фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΊΡƒΡ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… содСрТит строки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. НаконСц, отсортированный Ρ„Π°ΠΉΠ» выводится ΠΏΡƒΡ‚Π΅ΠΌ ΠΎΠ±Ρ…ΠΎΠ΄Π° Π΄Π΅Ρ€Π΅Π²Π°.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для использования Π² качСствС ΠΊΠ»ΡŽΡ‡Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 8 Π±Π°ΠΉΡ‚ΠΎΠ² строки, Π° Π½Π΅ цСлая строка. Π’ Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сортировки, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² настоящСй Π³Π»Π°Π²Π΅ (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 5.4 ΠΈ 5.5), выполняСтся сортировка индСксированных Ρ„Π°ΠΉΠ»ΠΎΠ², Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ всСх Ρ‚Ρ€Π΅Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π’.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ созданию ΠΊΡƒΡ‡ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π±Π»ΠΎΠΊΠΎΠ² Π² памяти прСдставлСна Π½Π° рис. 5.2. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ справа, являСтся псСвдокодом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ лишь Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ сущСствСнныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Π’ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ адрСсном пространствС, схСматичСски ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠΌ слСва, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ для Ρ‚Ρ€Π΅Ρ… ΠΊΡƒΡ‡, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ распрСдСлСнныС Π±Π»ΠΎΠΊΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.1 Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ отличаСтся ΠΎΡ‚ рисунка Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° рисункС, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΊΡƒΡ‡Π΅ процСсса.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ЀактичСскоС располоТСниС ΠΊΡƒΡ‡ ΠΈ Π±Π»ΠΎΠΊΠΎΠ² Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΊΡƒΡ‡ зависит ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Windows, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ прСдыстории использования памяти процСссом, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ рост ΠΊΡƒΡ‡ΠΈ свСрх Π΅Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, послС увСличСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° растущСй ΠΊΡƒΡ‡ΠΈ с Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ области ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΆΠ΅ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ΅ адрСсноС пространство. НаиболСС ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° программирования состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ фактичСской Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ распрСдСлСния памяти Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ; просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ.

Рис. 5.2. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΡƒΡ‡


ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.1 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½ΠΎ Π±Ρ‹Π»ΠΈ Π±Ρ‹ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΏΡ€ΠΈ использовании ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘ ΠΈΠ»ΠΈ ΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡƒΡ‡ΠΈ процСсса.

β€’ Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ ΡƒΠ·Π»ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² собствСнной ΠΊΡƒΡ‡Π΅, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΡƒΡ‡Π΅.

β€’ Π“ΠΎΡ‚ΠΎΠ²ΡΡΡŒ ΠΊ сортировкС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ Π΄Π²Π΅ ΠΊΡƒΡ‡ΠΈ, Π° Π½Π΅ освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ элСмСнтами.

β€’ ΠžΡˆΠΈΠ±ΠΊΠΈ ΠΏΡ€ΠΈ распрСдСлСнии памяти ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, вслСдствиС Ρ‡Π΅Π³ΠΎ ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² тСстировании Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ функциями для отслСТивания Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Windows, Ρ‚ΠΎ сфСра примСнимости Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.1, ограничиваСтся Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ нСбольшого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ вСсь Ρ„Π°ΠΉΠ» ΠΈ ΠΊΠΎΠΏΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π» Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° опрСдСляСтся объСмом доступного Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ адрСсного пространства (максимум 3 Π“Π±Π°ΠΉΡ‚); фактичСски достиТимый ΠΏΡ€Π΅Π΄Π΅Π» оказываСтся Π΅Ρ‰Π΅ мСньшим. Π’ случаС Win64 ограничСния ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° практичСски ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 5.1 Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ: FillTree, InsertTree, Scan ΠΈ TreeCompare. ВсС ΠΎΠ½ΠΈ прСдставлСны Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 5.2.

Π’ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΡƒΡ‡ΠΈ. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅, ΠΎΡ‚ΠΊΠ°Π·Π°Π²ΡˆΠΈΡΡŒ ΠΎΡ‚ использования Ρ„Π»Π°Π³Π° HEAP_GENERATE_EXCEPTIONS ΠΈ отслСТивая ошибки, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ распрСдСлСнии памяти, явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.1. sortBT: сортировка с использованиСм Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска 

/* Π“Π»Π°Π²Π° 5. Команда sortBT. ВСрсия, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска.*/

#include "EvryThng.h"

#define KEY_SIZE 8


typedef struct _TreeNode {/* ОписаниС структуры ΡƒΠ·Π»Π°. */

 struct _TreeNode *Left, *Right;

 TCHAR Key[KEY_SIZE];

 LPTSTR pData;

} TREENODE, *LPTNODE, **LPPTNODE;

#define NODE_SIZE sizeof(TREENODE)

#define NODE_HEAP_ISIZE 0x8000

#define DATA_HEAP_ISIZE 0x8000

#define MAX_DATA_LEN 0x1000

#define TKEY_SIZE KEY_SIZE * sizeof(TCHAR)


LPTNODE FillTree(HANDLE, HANDLE, HANDLE);

BOOL Scan(LPTNODE);

int KeyCompare (LPCTSTR, LPCTSTR); iFile;


BOOL InsertTree (LPPTNODE, LPTNODE);


int _tmain(int argc, LPTSTR argv[]) {

 HANDLE hIn, hNode = NULL, hData = NULL;

 LPTNODE pRoot;

 CHAR ErrorMessage[256];

 int iFirstFile = Options(argc, argv, _T("n"), &NoPrint, NULL);

 /* ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. */

 for (iFile = iFirstFile; iFile < argc; iFile++) __try {

  /* ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ». */

  hIn = CreateFile(argv[iFile], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

  if (hIn == INVALID_HANDLE_VALUE) RaiseException(0, 0, 0, NULL);

  __try { /* Π Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π²Π΅ ΠΊΡƒΡ‡ΠΈ. */

   hNode = HeapCreate(HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE, NODE_HEAP_ISIZE, 0);

   hData = HeapCreate(HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE, DATA_HEAP_ISIZE, 0); 

   /* ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», создавая Π΄Π΅Ρ€Π΅Π²ΠΎ. */