Введение

Aleph — это экспериментальное ядро операционной системы, разработанное в Университете Рочестера в рамках их проекта Rochester's Intelligent Gateway (RIG) в 1975 году. Aleph стал одним из первых шагов на пути к созданию первой практической операционной системы с микроядром, Mach. В Aleph для передачи данных между программами и ядром использовалась межпроцессная коммуникация, что позволяло приложениям прозрачно получать доступ к ресурсам на любом компьютере в локальной сети (которая в то время представляла собой экспериментальную сеть Xerox Ethernet со скоростью 3 Мбит/с). Проект в конечном итоге был прекращен через несколько лет из-за быстрых изменений на рынке компьютерного оборудования, однако идеи, заложенные в него, привели к созданию Accent в Университете Карнеги — Меллона, а затем и Mach. Приложения, разработанные для системы RIG, взаимодействовали посредством портов. Порты, по сути, являлись очередями сообщений, обслуживаемыми ядром Aleph и идентифицируемыми уникальным идентификатором машины (в отличие от глобально уникального), состоящим из пары: идентификатор процесса и идентификатор порта. Процессам автоматически присваивался номер процесса (PID) при запуске, после чего они могли запросить у ядра открытие портов. Процессы могли открывать несколько портов и затем "читать" их, автоматически блокируясь и позволяя другим программам выполняться до поступления данных. Процессы также могли "следить" за другими, получая копию каждого сообщения, отправленного отслеживаемому процессу. Аналогично, программы могли "перехватывать" сообщения, предназначенные для другого процесса, получая их и фактически исключая исходное сообщение из обмена данными. RIG был реализован на ряде миникомпьютеров Data General Eclipse. Порты были реализованы с использованием буферов памяти, размер которых был ограничен 2 КБ. Это приводило к значительным накладным расходам при копировании больших объемов данных. Еще одна проблема, выявленная лишь впоследствии, заключалась в том, что использование локальных идентификаторов позволяло вредоносным программам "угадывать" порты и, таким образом, получать доступ к ресурсам, к которым у них не должно было быть доступа. И поскольку эти идентификаторы зависели от идентификатора программы, идентификаторы портов менялись при перезапуске программы, что затрудняло разработку серверов с клиентами, которые могли бы полагаться на конкретный номер порта для обслуживания.