Common Lisp/Кеpування пам'яттю
Керування пам'яттю у Common Lisp
Динамiчне автоматичне керування пам'яттю надає велику кiлькiсть переваг
iнтерпретатору muLisp. Немає необхiдностi власноручно програмiсту розподiляти
пам'ять пiд задачу, яка буде виконуватися. Пам'ять, яка не буде
використовуватися програмою, доступна для створення нових структур даних.
При iнiцiалiзацiї muLisp обчислюється розмiр доступної пам'ятi, яка потiм розбивається на 4 областi:
- область атомiв (64К), яка забезпечує пам'ять для 4 елементiв-вказiвникiв, необхiдних для кожного символа та числа.
- область векторiв (128К), яка забезпечує пам'ять для кожного тiла PRINT-iменi символа (64К) та числового двiйкового вектора кожного числа (64К).
- область вказiвникiв (256К), яка забезпечує пам'ять пiд 2 елементи-вказiвники, необхiднi для кожного cons-а та пiд D-код, необхiдний для визначення функцiї. Оскiльки cons є основною структурою даних Лiспу, область вказiвникiв є найбiльшою серед iнших.
- область стеку (64К), яка забезпечує пам'ять для контрольного стеку та змiнного стеку. Цi два стеки розташованi на протилежних кiнцях областi стекiв.
Таким чином для роботи iнтерпретатора muLisp необхiдно 512К плюс пам'ять пiд DOS.
Збiр смiття
MuLisp має алгоритм збору смiття з двома переглядами (помiтка та чистка).
Пiд час першого перегляду пам'ятi помiчаються усi активнi об'єкти даних,
доступ до яких забезпечується внаслiдок зчеплення за допомогою елементiв-
вказiвникiв, починаючи з елементiв списку значень та властивостей усiх
символiв системи, або зi стеку змiнних, або D-коду. Символи з автоматичним
посиланням, якi не мають властивостей та поточних визначень функцiй, не
помiчаються. Такi символи автоматично видаляються зi списку пiд час другого
перегляду.
У процесi другого перегляду збору смiття усi помiченi об'єкти даних
ущiльнюються та збираються в одному з кiнцiв вiдповiдної областi даних. Це
дозволяє зберегти залишки областей даних для створення нових об'єктiв.
Перерозподiл областей даних
Пiсля збирання смiття однiй або декiльком з чотирьох областей даних може
бракувати вiльної пам'ятi для того, щоб програми мали змогу продовжити
виконання, незважаючи на те, що iншi областi даних мають достатню кiлькiсть
вiльної пам'ятi. Якщо виникає така ситуацiя, то здiйснюється перерозподiл
областей даних шляхом дiлення областей, додання пам'ятi, якої не вистачає,
однiй або декiльком областям. Але обмеження на розмiри для кожної областi
даних, якi описувались вище, мають бути дотриманими.
Отже, muLISP може реагувати на змiни вимог програм до розмiру областей даних.
Хоча збiр смiття та перерозподiл областей даних вiдбуваються автоматично,
їхня поява не проходить непомiтно для користувача, оскiльки вони викликають
коротку паузу в роботi програм.
Точна сума часу для збирання смiття й перерозподiлу залежить вiд кiлькостi
даних в системi. Збiр смiття звичайно займає менше секунди. Точно так же,
менше секунди звичайно вiдбувається й перерозподiл областей даних. В
дiйсностi, це не повинно турбувати користувача, але при розробцi систем
реального часу, що використовують muLISP, це питання необхiдно розглядати.
Явище, вiдоме як "thrashing" виникає в тому разi, коли система змушена
витрачати непередбачену кiлькiсть часу на збiр смiття для дуже маленького
повернення областi даних. Ознакою "thrashing" є значне зростання часу
виконання даної задачi. Дана проблема може бути вирiшена шляхом збiльшення
розмiру пам'ятi ЕОМ (до 512К) i (або) модификацiї програми з метою зменшення
її вимог до пам'ятi.