PCLSRing (также известный как Program Counter Lusering [1] [a] ) - это термин, используемый в операционной системе ITS для принципа согласованности в способе доступа одного процесса к состоянию другого процесса. [2]
Сценарий проблемы
Этот сценарий представляет определенные сложности:
- Процесс A выполняет длительный системный вызов. Под «трудоемким» подразумевается, что система должна поместить процесс A в очередь ожидания и может запланировать выполнение другого процесса, если он готов к запуску. Типичный пример - операция ввода-вывода .
- Пока процесс A находится в этом состоянии ожидания, процесс B пытается взаимодействовать с процессом A или получить к нему доступ, например, послать ему сигнал .
Каким должно быть видимое состояние контекста процесса A во время доступа процесса B? Фактически, процесс A находится в середине системного вызова, но ITS обеспечивает видимость того, что системные вызовы не видны другим процессам (или даже тому же процессу).
ITS-решение: прозрачный перезапуск
Если системный вызов не может завершиться до доступа, его необходимо перезапустить . Это означает, что контекст сохраняется до точки входа в системный вызов, в то время как аргументы вызова обновляются, чтобы отразить ту часть операции, которая уже была завершена. [2] Для операции ввода-вывода это означает, что начальный адрес буфера должен быть увеличен по сравнению с уже переданными данными, а длина передаваемых данных должна быть соответственно уменьшена. После завершения взаимодействия с процессом B процесс A может возобновить выполнение, и системный вызов возобновится с того места, где он остановился.
Этот метод программно отражает то, что PDP-10 делает аппаратно. Некоторые инструкции PDP-10, такие как BLT, могут не выполняться до завершения либо из-за прерывания, либо из-за ошибки страницы. [2] В процессе обработки инструкции PDP-10 будет модифицировать регистры, содержащие аргументы инструкции, так, чтобы позже инструкция могла быть запущена снова с новыми аргументами, которые завершили бы любую оставшуюся работу, которую нужно было выполнить. PCLSRing применяет тот же метод к системным вызовам.
Это требует дополнительных сложностей. Например, страницы памяти в пространстве пользователя могут не выгружаться во время системного вызова в ITS. Если бы это было разрешено, тогда, когда системный вызов PCLSRed и пытается обновить аргументы, чтобы вызов можно было прервать, страница, содержащая аргументы, могла бы отсутствовать, и системный вызов должен был бы блокироваться, не позволяя PCLSR успешно выполнить. Чтобы предотвратить это, ITS не позволяет выгружать страницы памяти в пользовательском пространстве после первого обращения к ним во время системного вызова, а системные вызовы обычно начинаются с касания страниц в пользовательском пространстве, к которым они знают, что им потребуется доступ. [2]
Unix-решение: перезапуск по запросу
Сравните это с подходом, принятым в операционной системе UNIX , где есть возможность перезапуска, но она не прозрачна. Вместо этого операция ввода-вывода возвращает количество фактически переданных байтов (или ошибку EINTR, если операция была прервана до фактической передачи каких-либо байтов), и приложение должно проверить это и управлять своим собственным возобновлением операции. пока не будут переданы все байты. В философии UNIX это было представлено Ричардом П. Габриэлем как пример принципа « хуже - лучше ».
Асинхронные подходы
Возможен другой подход. Из приведенного выше очевидно, что системный вызов должен быть синхронным, то есть вызывающий процесс должен дождаться завершения операции. Это не является неизбежным: в операционной системе OpenVMS все операции ввода-вывода и другие трудоемкие операции по своей сути асинхронны , что означает, что семантика системного вызова такова: «запустить операцию и выполнить одно или несколько из этих уведомлений, когда она завершится. "после чего он немедленно возвращается вызывающему. Существует стандартный набор доступных уведомлений (таких как установка флага события или доставка асинхронной системной ловушки ), а также набор системных вызовов для явной приостановки процесса во время ожидания их, которые: а) полностью перезапускаются в ЕГО смысл, и б) намного меньше по количеству, чем набор реальных трудоемких системных вызовов.
OpenVMS предоставляет альтернативные синхронные версии «начать операцию и дождаться завершения» для всех трудоемких системных вызовов. Они реализованы как «выполнить фактическую асинхронную операцию», за которой следует «подождать, пока операция не установит флаг события». Любой доступ к контексту процесса в это время увидит, что он собирается (повторно) войти в вызов флага ожидания события.
Заметки
- ^ Это называется «luser-ing ПК», потому что ПК принудительно переводится в «режим luser», где «luser» - ласковое имя «пользователя» в Массачусетском технологическом институте.
Рекомендации
- ^ Программа счетчика LoSeRing, http://www.xxeo.com/archives/2006/06/29/vms.html
- ^ а б в г Алан Боуден. «PCLSRing: сохранение модульного состояния процесса» .