Введение

PCLSRing (также известный как Program Counter Lusering) — термин, используемый в операционной системе ITS для обозначения принципа обеспечения согласованности при обращении одного процесса к состоянию другого процесса.

ITS-решение: прозрачный перезапуск

Если системный вызов не может быть завершен до осуществления доступа, он должен быть возобновляемым. Это означает, что контекст сохраняется до точки входа в системный вызов, а аргументы вызова обновляются, чтобы отразить ту часть операции, которая уже была выполнена. Для операции ввода-вывода это означает, что начальный адрес буфера должен быть сдвинут вперед на объем уже переданных данных, а длина данных для передачи должна быть соответствующим образом уменьшена. После завершения взаимодействия с процессом B, процесс A может возобновить выполнение, а системный вызов продолжится с того места, где он был прерван. Эта техника программно имитирует то, что PDP 10 делает аппаратно. Некоторые инструкции PDP 10, такие как BLT, могут не завершаться из-за прерывания или ошибки страницы. В процессе обработки инструкции PDP 10 изменяет регистры, содержащие аргументы инструкции, чтобы позже инструкцию можно было запустить снова с новыми аргументами, завершающими оставшуюся работу. PCLSRing применяет ту же технику к системным вызовам. Это требует дополнительной сложности. Например, в ITS страницы памяти в пользовательском пространстве не могут быть выгружены во время системного вызова. Если бы это было разрешено, то при возобновлении (PCLSR) системного вызова и попытке обновить аргументы для прерывания вызова, страница, содержащая аргументы, могла бы отсутствовать, и системный вызов был бы заблокирован, что помешало бы успешному завершению PCLSR. Чтобы предотвратить это, ITS не позволяет выгружать страницы памяти в пользовательском пространстве после первого доступа к ним во время системного вызова, и системные вызовы обычно начинаются с обращения к страницам в пользовательском пространстве, к которым они планируют получить доступ.

Unix-решение: перезапуск по запросу

Сравните это с подходом, используемым в операционной системе UNIX, где предусмотрена возможность возобновления, но она не является прозрачной. Вместо этого, операция ввода-вывода возвращает количество фактически переданных байтов (или ошибку EINTR, если операция была прервана до передачи каких-либо байтов), и приложение должно самостоятельно проверять это и управлять возобновлением операции до тех пор, пока не будут переданы все байты. Ричард П. Габриэль привел это в качестве примера принципа "чем хуже, тем лучше" в философии UNIX.

Асинхронные подходы

Возможен другой подход. Из вышесказанного следует, что системный вызов должен быть синхронным – то есть вызывающий процесс должен ждать завершения операции. Однако это не обязательно: в операционной системе OpenVMS все операции ввода/вывода и другие длительные операции по своей природе асинхронны, что означает, что семантика системного вызова заключается в "запуске операции и выполнении одного или нескольких уведомлений по её завершении", после чего управление немедленно возвращается вызывающему процессу. Существует стандартный набор доступных уведомлений (например, установка флага события или передача асинхронной системной ловушки), а также набор системных вызовов для явной приостановки процесса в ожидании этих уведомлений, которые a) полностью восстанавливаемы в смысле ITS и b) значительно меньше по количеству, чем набор фактических длительных системных вызовов. OpenVMS предоставляет альтернативные синхронные версии всех длительных системных вызовов, реализуемые как "выполнение фактической асинхронной операции", за которым следует "ожидание установки флага события". Любой доступ к контексту процесса в течение этого времени покажет, что он собирается (повторно) войти в вызов ожидания флага события.