Реентерабельные модули и программы

Реентерабельные модули разрабатываются таким образом, чтобы они не изменялись в процессе выполнения, т. е. они допускают «только чтение». Выбираемые из системной библиотеки, эти модули могут загружаться на участке памяти супервизора. Таким образом, реентерабельные программы защищены от случайных изменений со стороны какой-либо программы пользователя.

Так как реентерабельный загрузочный модуль никогда не изменяется в процессе выполнения, он может загружаться один раз и свободно использоваться любой задачей в системе в любое время. Он может использоваться одновременно двумя (или более) задачами в мультипрограммных режимах. Прежде чем одна задача, первой обратившаяся к нему, закончит выполнение модуля, по прерыванию может начаться его выполнение другой задачи, что не помешает первой задаче в дальнейшем продолжить ранее прерванное выполнение модуля.

При написании реентерабельных программ следует пользоваться регистрами для адресации и хранения переменных, а также временными областями памяти, которые принадлежат задаче, использующей эти программы. Для реентерабельной программы такие временные области памяти могут обеспечиваться обратившейся к ней программой или могут быть получены динамически по макрокоманде типа GETMAIN из области памяти, принадлежащей обратившейся задаче. Область памяти может быть освобождена по макрокоманде FREEMAIN или автоматически после завершения задачи. Связь реентерабельной программы с рабочей областью осуществляется через один из регистров, который содержит адрес этой области.

Если реентерабельная программа была прервана по какой-нибудь причине, то содержимое регистров и слово состояния программы сохраняются супервизором в области памяти (области сохранения), связанной с прерванной задачей, и восстанавливаются позднее, когда выполнение задачи необходимо продолжить. Супервизор сохраняет в неизменном виде рабочую память задачи и при необходимости восстанавливает содержимое сохраненных регистров и слово состояния программы.