ru:os2faq:os2gen:os2gen.119

[Q]: Как в OS/2 обрабатываются ситуации с недостатком памяти?

[A]: Vitalie Vrabie (2:469/15.89)

1. аллокация памяти

в каждом процессе есть указатель на процедуру обработки ошибок с аллоцированием памяти (memory allocation error handler). функционально почти идентично тому что был в RTL от BP. эта процедура получает в качестве параметра кол-во байт которое не удалось проаллоцировать, а в качестве результата выдаёт одно из:

a) попробовать переаллоцировать. это когда хендлер написан таким что он освобождает требуемое количество памяти.

b) вернуть null pointer. в этом случае вызов getmem возвращает null. если программа проверяет результат getmem, она может пожаловаться (пользователю, в логи и т.п.). если же она этого не проверяет, то естественно прога вылетит по GPF когда попробует туда залезть.

c) трапнуться. без комментариев. :)

1.1. minfree

при аллокации (вызове getmem, или как там его), если свободного места на разделе со своппером меньше чем minfree, выскакивает варнинг (через harderr).

смотрим хелп: [– 8< – ] SWAPPATH Command: Minfree Parameter [^Y] This value does not define the amount of free space on the disk at any given time because applications can cause less free space to be available on the disk than what is specified by minfree. [– 8< – ]

2. дисковые операции

для ошибок с дисковыми операциями тоже существует некая процедура (handler) их обработки. и в контексте каждого процесса тоже существует поинтер на неё. кстати, в досе такое тоже есть (именно через него всякие нортоны/dn/tvision/command.com/whatever и выводят свои abort/retry/ignore, а затем передают ответ юзера системе).

эксперимента ради, посмотрите fc/2. он _всегда_ будет выводить красное окошко с retry/cancel, вне зависимости от autofail. и почему? потму что он устанавливает собственный хендлер ошибки дисковых операций.

аналогично и BP/VP RTL пользуется этим хендлером для {$I+}/{$I-}.

посмотрите у ральфа брауна, там про дос. но и в оси/виндах всё семантически аналогично.

единственное что в досе/виндах нельзя настроить дефолтное поведение. :)

- - -

3. autofail

autofail=yes отрубает всякие интерактивные возникания harderr.exe (кстати, нафига он болтается, его ж никогда не вызовут*). в случае с дисковыми операциями возвращается “fail”, а в случае с аллокацией памяти он выбирает либо пункт 1.b, либо пункт 1.c - точно не скажу, но по-моему 1.b.

при autofail=no возвращается то что выбрал юзер.

- - -

конкретику (названия функций / номера прерываний) не приведу. никогда ими напрямую не пользовался - только через VP/BP RTL и твижн.

- - -

* наверное, таки вызывают. но он просто не задаёт интерактивных вопросов. :)