![]() |
Translate to: |
||||||
| Обратная связь | Новости САПР | Программы | Документация | Полезные советы | Обзорные статьи | ||
| Заказ и разработка | Каталог САПР | САПР-конференция | Библиотека ГОСТов | Наши соавторы | Коммерческое ПО | ||
Эта глава применима только к системам MS-DOS/PS-DOS, базовыми системами UNIX она может быть игнорирована: в системе UNIX программы LISP и объём данных практически неограниченны.
Переменные , пользовательские определители (user- defined) функций и стандартные функции, описанные в этом руководстве, все помещаются в памяти вашего компьютера только на время сеанса редактирования в системе AutoCAD. Когда AutoLISP загружен , он требует для себя два больших участка памяти. Первый , называемый heap (или nodes), это участок , на котором хранятся все функции и переменные , больше переменных и функций есть у вас (и больше комплексов ваших функций) –больший heap space (участок памяти) будет использован. Второй участок, называемый stack (стек) , содержит аргументы функций и частично результаты; глубже "клубок" функций или больше повторений выполнения ваших функций - большая часть стека (stack space) использована.
По умолчанию размеры участков памяти: heap 5.000 bytes
stack 5.000 bytes
AutoLISP, работая с AutoCADом, не может менять размеры участков памяти heap и stack. Если вы , вычисляя достачно большое количество функций и переменных , израсходуете весь участок памяти heap, AutoLISP выведет на дисплей сообщение об ошибке:
и закончит выполнение текущей функции. Если недостаточно памяти , чтобы загрузить AutoLISP , когда вы в AutoCADе , на экран дисплея будет выведено сообщение:
AutoLISP не будет функционировать до тех пор, пока память не будет предоставлена , и AutoCAD выполнится снова.
6.1. Устанавливаемые AutoLISPом требования к памяти
Если вы опытный программист и хорошо знакомы с концепцией использования "heap" и "stack" областей памяти в языках программирования , вы можете по желанию использовать команду "SET" системы DOS, чтобы после этого AutoLISP получил достаточную память для участков heap и stack. Например, команды:
C>SET LISPHEAP=25000 C>SET LISPSTACK=10000
говорят AutoLISPу резервировать 25000 байтов памяти для участка heap, и 10000 байтов для участка stack. Полный объем памяти для двух участков не должен превышать 45000 байт. Если вы хотите, вы можете поместить утверждения , подобные приведенным выше , в ваш файл "autoexec.bat", и они будут выполняться всегда , когда вы включаете ваш компьютер. Эти команды "SET" эффективны только в AutoLISPе , они не являются причиной , того, что память вашего компьютера будет "погибшей"(" lost "), пока AutoLISP не загружен.
6.2. Восстанавливаемое NODE SPACE(участок памяти node)
Вы можете обнаружить, что некоторые созданные вами функции и переменные нужны вам только на некоторое время. Когда они вам будут уже не нужны, вы можете эффективно " не обнаружить" их, присваивая им значение "nil". Например, если вы загрузились и использовали функцию с именем SETUP , а дальше в ней не нуждаетесь , вы можете:
(setq setup nil),
чтобы избавиться от нее. Node (heap) участок памяти , используемый этой функцией , восстановится, давая возможность использовать его другими функциями и переменными.
Если вы хотите почистить(удалить) все функции и переменные , которые вы загрузили или определили во время этого сеанса редактирования, это тоже легко можно сделать. AutoLISP обслуживает список с именем ATOMLIST, который первоначально содержит имена всех системных (systemdefined) функций и переменных. ( Если вы хотите видеть его содержание, введите только "!atomlist" в ответ на подсказку AutoCADа "Command:") Как только вы создаете новые функции и переменные , их имена заносятся в оглавление ATOMLIST. Вы можете изъять любое ,обозначенное вами, из того что есть в оригинале, прерыванием ATOMLISTа . Будьте внимательны, однако, не прерывайте системных функций, иначе вы окажетесь в тупике.
Если вы поместите следующую функцию в ваш "acad.lsp" файл: (defun C:CLEAN ()
(setq atomlist (member 'C:CLEAN atomlist))
'DONE
)
у вас будет возможность ввести команду CLEAN , всегда , когда вы хотите сделать ATOMLIST аккуратным и получить обратно участок памяти node, используемый всеми вашими функциями и переменными. Если C:CLEAN последняя функция в вашем "acad.lsp" файле , функции, которые вы определяете ранее в файле, будут сохранены , когда вы введете CLEAN. Функция CLEAN сбрасывает только подпоследовательно определяемые(subsequently-defined) функции и переменные, таким образом, все , что вы в " acad.lsp" определили раньше, обработается как системно определяемые функции.
6.3. Виртуальные страничные функции
Если применение Вашего AutoLISPа становится слишком большим, чтобы быть впору имеющемуся участку памяти node (установленному переменной SET в LISPHEAP , как описано выше), вы можете использовать перелистыватель виртуальной функции AutoLISPа, чтобы позволить рост вашей программы. Чтобы сделать это, просто выполните функцию:
(vmon)
перед первым DEFUN в вашей программе. Это позволит виртуальной функции разбить память на страницы, для остатка сеанса AutoCAD Drawing Editor. Однажды позволенная , функция разбиения памяти на страницы не отключается. Только функции, созданные через функции DEFUN ,следующие за функцией VMON, подходят для разбиения памяти на страницы, а, если у вас функции DEFUN перед VMON , они не будут разбивать память на страницы и еще могут вызвать на терминал сообщение:
После того , как функция VMON выполнится, AutoLISP будет перелистывать страницы редко используемых функций, всякий раз когда они запускаются из памяти, и автоматически читать их снова, когда они понадобятся. Вам не нужно беспокоиться об этом перелистывании, так как оно управляется автоматически, и это ясно из вашей программы. Эти функции временно перекачиваются в файл , через который управляется файл перелистывателя страниц AutoCADа. Итак, когда вы имеете достаточно расширенную или продленную память, обычно эта память будет перекачивать функции и выдаст результат намного быстрее , чем свопинг(перекачка)на диск.
Запомните, что система с виртуальной памятью только листает функции: однако, вы должны иметь достаточный участок node памяти для размещения всех списков (data lists) , использующихся в вашей программе, а также функций и имен переменных. Следовательно, хотя листание страниц позволяет прогнать большую программу со много меньшей памятью, вы ,однако, должны установить оптимальный размер участка heap и набор LISPHEAP соответственно. То же самое относится к размеру участка stack и к набору LISPSTACK при работе с виртуальной памятью.
Технические замечанияПосле того , как функция VMON выполнится, все функции DEFUN занимают новый участок node памяти, называемый таблица страниц (page table), в начале каждого списка функции. Этот node участок добавляется перед списком, содержащим формальные аргументы. Участок памяти page table node используется исключительно, как перелистыватель страниц ,и в любом случае, им нельзя манипулировать пользователю программ. Функция TYPE возвращает PAGETB в эти участки памяти node.
Когда программа AutoLISP загружается из участка памяти node, меньше всего используемая функция сбрасывается записью ее в страничный файл (paging file), сохраняя адрес страничного файла в таблице страниц, и освобождая весь участок памяти node, занимаемый функцией, следующей за таблицей страниц. В таблице страниц маркируется та функция, которая сброшена. Когда сброшенная функция вычислена, она снова считывается из страничного файла (возможно откачивание других функций) по приоритету выполнения. Когда функция списана из страничного файла, последующие откачки просто освобождают этот участок hode памяти. Нет необходимости удалять функцию , так как она всегда присутствует в файле.
В AutoLISPе функции, созданные с помощью DEFUN, являются просто списками, и ими можно манипулировать как со списками. Программы, которые делают это , должны быть осведомлены об операции перелистывания страниц (или не применяйте VMON). Прежде всего, функции, создаваемые с помощью функции DEFUN, имеют в начале участок памяти node таблицы страниц (pagetable), так что , вы должны перескочить его, если будете сканировать функцию. Если вы создаете функцию сами для себя , как список (обходя DEFUN), она будет работать прекрасно, но она не подойдет для свопинга (перекачивания) , поэтому вы можете легко запустить ее из памяти, если вам это удобнее. Наоборот, вы можете поместить функцию в память , переопределяя ее без таблицы страниц. Например, чтобы поместить функцию, определенную DEFUNом с именем ZORP, в память, вы должны использовать:
(setq zorp (cdr zorp))
чтобы удалить применение таблицы страниц. Таблицы страниц печатаются просто как пробел , когда вы используете функцию PRINT. Вы можете определить, когда функция перекачиваема, проверив, имеется ли пробел после первой левой скобки: если так , она перекачиваема. Если вы пытаетесь сканировать функцию, как данные, и откачивать ее, вы должны найти только таблицу страниц в списке функции. Проходная функция не будет перекачена- только вычисливши ее, можно сделать это. Итак, если вы создаете функции и модифицируете их с хитростью, организуйте их как списки , вместо использования функции DEFUN, или используйте трюк, приведенный выше, чтобы поместить их в память.
Список символов, известных AutoLISPу, называется ATOMLIST. Есть возможность хитрой программе манипулировать этим списком, чтобы исправить пробел или сканировать все символы. (Как отмечено в предыдущей главе, это не стандартная особенность LISPа, и она может быть изменена в будущих версиях AutoLISPа.) Когда функция откачивается , она преобразуется в пути , это предполагает что ATOMLIST, не будет изменен до тех пор, пока функция не откачается (если разбиения памяти на страницы нет на этом пути, функция занимает гораздо больше места на диске и идет в пять раз медленней). Чтобы быть уверенным , что ATOMLIST не изменится, когда листание действительно имеется, доступ к ATOMLISTу блокируется перемещением ATOMLISTа из списка символов ,доступных пользователю. Если вы используете виртуальную функцию листания страниц, оставьте ATOMLIST в покое.
Если вы действительно хотите , чтобы у вас были неприятности, вы можете это сделать. Вы можете создать свою собственную функцию, включая таблицу страниц, из любой другой функции. Вы должны присвоить ATOMLISTу собственную переменную и изменить ее после того , как AutoLISP стартует для листания страниц. Вы можете даже придумать что-нибудь более творческое и ужасное. Однако такое поведение может быть отмщено разрушением вашей программы; это не может повредить AutoLISPу или AutoCADу. Итак, если вы хотите нести потери, вперед.
Copyright © Сайт поддержки пользователей САПР