Введение

Операционная система суперкомпьютера Система совместного использования времени сети Ливермор (NLTSS, также иногда называемая Новой системой совместного использования времени Ливермор) - операционная система, активно разрабатывавшаяся в Лаборатории Лоуренса Ливермора (ныне Национальная лаборатория Лоуренса Ливермора) с 1979 по 1988 год, хотя она продолжала запускать производственные приложения до 1995 года. Более ранняя система, система совместного использования времени Ливермора, была разработана более десяти лет назад. NLTSS изначально работал на компьютере CDC 7600, но производился только с 1985 по 1994 год на компьютерах Cray, включая модели Cray 1, Cray X MP и Cray Y MP.

Характеристики

Операционная система NLTSS была необычной во многих отношениях и уникальной в некоторых.

Архитектура низкого уровня

NLTSS была микроядерной системой передачи сообщений. Он был уникальным в том, что только один системный вызов поддерживался ядром системы. Этот системный вызов, который можно было бы назвать "общаться" (у него не было названия, потому что его не нужно было отличать от других системных вызовов), принимал список "буферных таблиц" (например, см. Интерфейс системы сообщений NLTSS), который содержал информацию о контроле для сообщений, которые либо отправляет, либо принимает. Такая связь, как локально внутри системы, так и через сеть, была всем ядром системы, поддерживаемым непосредственно для пользовательских процессов. "Система сообщений" (поддерживающая один вызов и сетевые протоколы) и драйверы для дисков и процессора составляли все ядро системы.

Архитектура среднего уровня

NLTSS - это система безопасности клиент-сервер, основанная на возможностях. Два основных сервера - это файловый сервер и процессовый сервер. Файловый сервер был процессом, которому доверяли драйверы для локального хранения (дискового хранения), а процессовый сервер был процессом, которому доверяли драйверы процессора (программное обеспечение, которое переключало управление временным распределением между процессами в "альтернаторе", обрабатывало прерывания для процессов, кроме "общающегося" вызова, обеспечивало доступ к памяти и состоянию процесса для процессового сервера и т. Д.). NLTSS была настоящей сетевой операционной системой, поскольку ее запросы на ресурсы могли исходить от локальных процессов или удаленных процессов в любом месте сети, и серверы не различали их. Единственным средством для сервера, чтобы сделать такие различия, будет сетевой адрес, и у них нет причин делать такие различия. Все запросы на серверы отображались как сетевые запросы. Для связи между процессами в NLTSS по конвенции использовался пакет протоколов Livermore Interactive Network Communication System (LINCS), который определял стек протоколов в соответствии с моделью OSI. Протокол на уровне транспорта для NLTSS и LINCS был назван Delta T. На уровне представления LINCS определил стандарты для передачи пронумерованных параметров в виде токенов (например, целых чисел, возможностей и т. Д.). которые были сохранены в записи уровня сеанса для обработки в механизме отдалённого вызова процедуры. Понятие "пользователь" в NLTSS было определено лишь в периферии. Существовал "сервер учетных записей", который отслеживал, какие пользователи используют какие ресурсы (например, запросы на создание объектов, таких как файлы или процессы, требуют такой возможности учетной записи). Контроль доступа полностью управлялся с возможностями (передаваемые токены власти).

Файловый сервер

Любой процесс может обращаться к файловому серверу с запросом на создание файлов (возвращение возможности файла), запрос на чтение или запись файлов (презентация возможности файла) и т. д. Например, для чтения файла обычно требуется три буферные таблицы, одна для отправки запроса на файловый сервер, одна для получения ответа от файлового сервера и одна для получения данных из файла. Эти три запроса, как правило, подавались одновременно в систему сообщений, иногда в пакете с другими запросами. Контрольные биты могут быть установлены в буферных таблицах для пробуждения (разблокировки) процесса, когда любая из представленных буферных таблиц была помечена как "Done". Призыв библиотеки к чтению файла обычно блокируется до получения ответа от файлового сервера, хотя асинхронные вводы и выводы, конечно, не блокируются и могут проверяться или блокироваться позже. Любые такие различия с пользовательской стороны были невидимы для файлового сервера.

Процессный сервер

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

Сервер каталогов

Примером сервера более высокого уровня в NLTSS был сервер каталогов. Задача этого сервера заключалась в том, чтобы превратить файлы (невидимые для пользователя) в каталоги, которые можно использовать для хранения и извлечения возможностей по имени. Поскольку возможности были просто данными, это не было особенно сложной задачей, состоящей в основном из манипулирования разрешениями доступа к возможностям в соответствии с конвенциями, определенными в пакете протоколов LINCS. Одно место, где это стало немного интересным, касалось разрешения на доступ, называемого наследством. Если этот бит был включен (разрешен), то возможности можно было получить с полным доступом из каталога. Если этот бит был отключен (недопущен), то любые разрешения, отключенные в возможности каталога, в свою очередь были отключены в возможности, которую забирают, прежде чем она была возвращена в запрашивающее приложение. Этот механизм позволял людям хранить, например, файлы чтения/записи в каталоге, но давать другим пользователям только разрешение на извлечение только экземпляров из них.

Разработка

Основная часть программирования для NLTSS была выполнена в расширении Pascal, разработанном в Национальной лаборатории Лос-Аламоса, известном как "Model". Модель расширила Паскаля, включив в него абстрактный тип данных (объект) механизм и некоторые другие функции. NLTSS был обременен наследием совместимости. NLTSS последовал за разработкой и развертыванием системы совместного использования времени Ливермора (LTSS) в Компьютерном центре Ливермора в LLNL (~ 1968 1988?). Разработка NLTSS началась примерно в то же время, когда LTSS была перенесена на Cray 1, чтобы стать системой совместного использования времени Cray. Чтобы оставаться совместимым с многими научными приложениями LLNL, NLTSS был вынужден эмулировать системные вызовы предыдущей операционной системы LTSS. Эта эмуляция была реализована в виде библиотеки совместимости под названием "baselib". В качестве одного примера, в то время как структура каталогов и, следовательно, структура процессов для NLTSS была естественным образом направленным графиком (процессные возможности могли храниться в каталогах, как и файловые возможности или возможности каталогов), библиотека baselib эмулировала простую линейную (контроллер controllee) структуру процессов (даже не древовую структуру, как в Unix), чтобы оставаться совместимой с предыдущей LTSS. Поскольку научные пользователи никогда не получали доступ к услугам NLTSS за пределами библиотеки baselib, NLTSS в конечном итоге выглядел почти точно так же, как LTSS для своих пользователей. Большинство пользователей не знали о возможностях, не понимали, что они могут получить доступ к ресурсам через сеть, и, как правило, не знали, что NLTSS предлагает какие-либо услуги помимо LTSS. NLTSS действительно поддерживала совместную симметричную мультипроцессию памяти, развитие, которое параллельно с аналогичным развитием в системе совместного использования времени Cray. Даже название NLTSS было чем-то вроде наследия. Название "Новая система совместного использования времени Ливермора" изначально считалось временным названием, которое должно использоваться во время разработки. Как только система начала запускать некоторые приложения в режиме двойной системы (своего рода виртуальная машина, совместно использующая драйверы с LTSS), разработчики выбрали более постоянное название LIncs Network Operating System (LINOS). К сожалению, руководство LLNL решило, что название не может быть изменено в этот момент (по-видимому, потому что предыдущий термин был использован в бюджетных запросах), поэтому временное название NLTSS оставалось в системе на протяжении всего срока ее использования. Параллельно с NLTSS была разработана система массового хранения данных, которая использовала протоколы LINCS (те же файлы и каталоги, что и NLTSS). Эта система/программное обеспечение позже было коммерциализировано как продукт Unitree. Unitree была в целом заменена высокопроизводительной системой хранения (HPSS), которую можно свободно считать наследием LINCS и NLTSS. Например, LINCS и NLTSS ввели форму передачи третьей стороной (для копирования файла в файл в NLTSS процесс может отправлять два запроса на файловые серверы, один для чтения и один для записи и направлять файловые серверы для передачи данных между собой), которые выполняются в модифицированной форме на Unitree и HPSS.

Вопросы реализации и проектирования

Самым большим ударом по NLTSS в течение его производственного срока была производительность. Единственная проблема производительности, которая больше всего затронула пользователей, - это задержка доступа к файлам. Это, как правило, не было значительной проблемой для ввода/вывода (I/O) диска, но системы, на которых работал NLTSS, также поддерживали значительное дополнение очень низкой задержки твердотельных дисков с временем доступа менее 10 микросекунд. Начальные задержки для операций с файлами в рамках NLTSS были сопоставимы с задержкой для доступа к твердотельным дискам и значительно выше, чем задержка LTSS для такого доступа. Для улучшения латентности доступа к файлам в рамках NLTSS внедрение было значительно изменено, чтобы поместить наиболее чувствительные к латентности процессы (в частности файловый сервер) "в ядре". Это не было столь значительным, как могло бы показаться на первый взгляд, поскольку все серверы NLTSS работали по многопоточной модели. Это изменение действительно означало перемещение потоков, ответственных за услуги файлового сервера, из отдельного процесса файлового сервера в "процесс" ядра. Коммуникация с пользователями оставалась неизменной (по-прежнему через буферные таблицы, токены LINCS и т. Д.). ), но операции с файлами избежали некоторых значительных изменений контекста, которые были основной причиной более высоких задержек по сравнению с тем, что обеспечивала более старая LTSS и конкурирующая система совместного использования времени Cray. Это изменение значительно (~ 3x) улучшило задержку операций ввода/вывода файлов, но это также означало, что файловый сервер стал доверенной частью ядра (по реализации, а не по дизайну). Вторая проблема внедрения NLTSS связана с безопасностью/целостностью его возможностей внедрения данных. Эта реализация использовала модель возможности пароля (например, см. Контроль по паролю). С помощью этой модели любой человек или процесс, который может получить доступ к пространству памяти процесса, будет иметь полномочия на доступ к возможности, представленной данными, найденными в этой памяти. Некоторые системные архитекторы (например, Эндрю С. Таненбаум, архитектор распределенной операционной системы Amoeba) предположили, что это свойство доступа к памяти, подразумевающее доступ к возможностям, не является присущей проблемой. В среде NLTSS иногда случалось, что люди брали с собой сбросы программной памяти для анализа. Из-за этого и других проблем такие возможности пароля считались уязвимостью в NLTSS. Для защиты от этой уязвимости был разработан механизм "Контроль с помощью шифрования с помощью открытого ключа". Этот механизм не был запущен в производство в NLTSS как из-за его значительной стоимости производительности, так и потому, что пользователи не знали о уязвимости возможностей пароля. Современные достижения в криптографии сделают такую защиту для возможностей практичной, особенно для возможностей Интернета / Веба (например, см. YURL или WideWORD). Проблема проектирования с NLTSS, которая не рассматривалась до тех пор, пока не была снята с производства, была его открытой сетевой архитектурой. В NLTSS процессы рассматривались как виртуальные процессоры в сети без брандмауэров или других ограничений. Любой процесс может свободно общаться с любым другим. Это означало, что невозможно было ограничить даже в смысле ограничения прямого общения, например, против ограничения скрытых каналов, таких как "удар по стене". Чтобы исправить эту проблему, NLTSS потребует возможностей для обеспечения связи. Поздние разработки NLTSS, такие как "номера потоков", приближались к такому устройству, но к тому времени, когда активная разработка прекратилась в 1988 году, связь в NLTSS все еще была не ограничена.