Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СП_УМК 2012 каз для 5В070400.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.4 Mб
Скачать

7.2 Үйме жадысын басқару

Үймеден жады блоктарын бөліп беруі үйме дескрипторын, блок өлшемін және бірнеше жалаушалар нұсқауларын көрсету жолымен жүзеге асады.

LPVOID Heap Alloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes)

Қайтарылатын мағына: бөлінген жады блогында немесе NULL көрсеткіші сәтсіз жағдайда (басқа оқиғаларда, - ерекше жағдайларды генерациялауға бергенде).

HeapAlloc функцияның параметрлері

hHeap – үйме дескрипторы. Сол жерде жады блогы бөліну керек. Бұл дескрипторлар GetProcessHeap немесе HeapCreate функциялармен қабылдану керек.

DwFlags - өзінен үш жалаушаның комбинациясын құрайды.

  • HEAP_GENERATE_EXCEPTIONS және HEAP_NO_SERIALIZE Heap Create қызметі сияқты мағынасы бар. Бірінші жалаушаны көрсетпеуге болады, егереде ол осы үймеге Heap Create қызметімен құрылған болса, ал екінші жалауша үйме процесінен жадыны бөліп алғанда қолданады.

  • HEAP ZERO MEMORY белгіленген жады нөлдермен толтырады дегенеді көрсетеді; басқа жағдайда жадының құрамы белгісіз болады.

DwBytes – бұл ерекшелену керек ететін жады блогының мөлшері. Өспейтін үймелерге оның шегі 0x7FFF8 құрайды (0,5 Мбайтқа сәйкес).

Үймеден жадыны босату оңай орындалыды.

BOOL HeapFree (HANDLE hHeap, DWORD dwFlags, LPVOID lpMem)

DwFlags немесе HEAP_NO_SERIALIZE конcтантасына тең болуы тиіс.

LpMem Heap Alloc немесе Heap ReAlloc қызметінмен қайтарылмайтын мәні болуы керек.

aл Heap – бұл үйме дескрипторы.

Көлемнің өзгерту үшін жады блогтары қайтадан белгіленіп алынуы керек.

LPVOID Heap ReAlloc (HANDLE hHeap, DWORD dwFlags,

LPVOID lpMem, SIZE_T dwBytes)

Қайтаралатын мән: қайтадан бөлінген блогының көрсеткіші. Сәтсіз жағдайда NULL қайтарылады.

HeapReAlloc қызметінің параметрлері

hHeap бірінші параметрі үстінде қарастырылға dwFlags кейбір керекті басқару жалаушаларын көрсетеді.

  • HEAP_GENERATE_EXCEPTIONS және HEAP_NO_SERIALIZE алдындағы оқиғалар сияқты.

  • HEAP_ZERO_MEMORY бөлінген жадыны ғана инициализациялайды. Бастапқы блогының мағынасы өзгермей қалады.

  • HEAP_REALLOC_IN_PLACE_ONLY блок ауыстыра алмайтынын көрсетеді. Жады блогының мөлшерін үлкейту кезінде мекен-жаймен бөліну керек.

LpMem үймеде бар hHeap блогына көрсетеді. Ол қайтадан белгіленуі керек.

dwBytes – блоктың жаңа өлшемі. Ол алғашқыда қарағанда ол кіші немесе үлкен болады.

Жай жағдайларда қайтарылатын көрсеткіш LpMem мәніне тең. Егерде блокты көшірген болса, онда қайтарудың мәні басқа болады.

Белгіленген блоктың көлемі HeapSize қызметімен анықталады.

DWORD HeapSize (HANDLE hHeap, DWORD dwFlags,

LPCVOID lpMem)

Қайтарылатын мәні: Сәтсіз жағдайда 0 немесе блоктың көлемі.

HEAP_NO_SERIALIZE жалаушасы

HeapCreate, HeapAlloc және HeapReAlloc функцияларында HEAP_NO_SERIALIZE жалаушалары көрсетілген бола алады. Оны қолданған жағдайда жылдамдығының, өнімділігінің кішкене өсуін ала аламыз. Осы жалаушаны қолдану астында келтірілген аз жағдайларды қауыпсыз болады.

  • Бағдарлама ағындарды қолданбайды.

  • әр бір ағында өзінің үймелері немесе үймелер топтары болады. Оларға басқа ағындар қатынаса алмайды.

  • Программада өзінің ерекше жағдайлар механизмі бар. Олар бір уақатта үймеге бірнеше ағын кірмеуін HeapAlloc және HeapReAlloc қызметтері. Сол сияқты мақсаттарға HeapLock және HeapUnLock функциялары бар.

HEAP_GENERATE_EXEPTIONS жалаушасы.

Ерекшелерді сәтсіз бөлінуде шақыру бөлінген қателерді тексеру жасайды. Соған қарамастан ерекшелер немесе бітуі бөлінген жадыны жойып тастай алады. Екі ерекшелінген кодалар бола лады.

1. STATUS_NO_MEMORY блок белгіленген көлемді жасай алмайды. Оның себебі өзінің шегіне жеткен үйме өсуінің жады фрагментация себебі бола алады.

2. STATUS_ACCESS_VIOLATION үйме құртылған дегенәне көрсетеді. Мысал: Бағдарлама бөлінген блоктан тыс жадысына жазса.

Үймемен жұмыс үшін арналған басқа функциялар

HeapCompact функциясы біріктіру әрекетін істейді немесе үймедегі бос аралас блоктарды дефрагментациялайды; HeapValidate үймедегі зақымды анықтайды; HeapWalk үймедегі блоктарды сұрыптайды, GetProcessHeap үймедегі сол процеске жарамдыларының бүкіл дискриторларын алады.

HeapLock және HeapUnLock функциялары ағынға дағы үймеге рұқсат етуді қарастырады.

Үймені басқарудың резюмесі

Үймемен жұмыс кезіндегі қарапайын реті осындай.

  1. CreateHeap немесе GetProcessHeap функциясымен үйменің дескрипторын алу.

  2. HeapAlloc –ты қолданып, үймедегі блоктарды бөліп беру.

  3. HeapFree көмегімен барлық немесе кейбір блоктарды босату.

  4. HeapDestroy көмегімен үймені жойып, дескрипторды жабу.

Негізгі әдебиеттер: 1 [393 - 414], 4 [193-206]

Бақылау сұрақтары:

  1. Бөлек үймені қолданудың артықшылығы.

  2. Үймемен жұмыс кезіндегі реті.

  3. Үймемен жұмысқа негізделген API функциялары.

Дәріс 8. Файлдық жүйені қолдану

Файлды әдетте есте сақтау құрылғысындағы бір-бірімен байланысты деректер блогы деп атайды, ал API Win32-де файлды аталынған каналдар деп санайды, байланыс ресурстары, дисктік құрылғылар, консоль немесе жай файлдарға енгізу және шығару ағындары. Ұйымдастыру принципі бойынша барлық файлдар типтері бірдей болып табылады, бірақ бір-бірінен өздерінің қосымша қасиеті және шектеулерімен ерекшеленеді. API Win32 файлдық функциялары қосымшаға негізгі файлдық жүйе немесе құрылғының типінен тәуелсіз файлға кіруге рұқсат алады. Берілетін мүмкіндіктер сонда да файлдық жүйе, құрылғы немесе операциялық жүйеге тәуелді болады.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]