3 сущности!

Думаю, общей информации по
Inferno уже
достаточно, и можно перейти к главному вопросу: что из себя представляет
Inferno изнутри, с точки зрения программиста? В чём заключается
взаимодействие программиста со средой предоставляемой Inferno? Сколько
нюансов поведения и разных видов сущностей должен держать в голове
программист в Inferno?

Например, под линухом для эффективного и качественного программирования
нужно держать в голове как минимум несколько очень толстых томов Стивенса,
начиная с APUE (Advanced Programming in the UNIX Environment, Second
Edition, 925 страниц, обошлась мне в $75+доставка с амазона). И слава Богу,
что такая книга вообще есть в природе, без неё было бы совсем туго, кстати!

А всё потому, что под линухом мы имеем множество разных сущностей
(файлы/каталоги, процессы, терминалы, сигналы, нити, пайпы, сообщения,
семафоры, разделяемая память, сетевые сокеты, unix сокеты,
псевдо-терминалы, etc.), и у каждой море нюансов поведения (блокирующий
I/O, неблокирующий I/O, асинхронный I/O, мультиплексирование I/O,
fcntl/ioctl, etc.) в разных условиях! Насколько я понимаю, под виндой
ситуация ещё хуже т.к. плюс к примерно аналогичному зоопарку добавляется
по несколько версий API, которые Microsoft называет «новыми революционными
технологиями» и выпускает раз в 2-3 года (у
Джоэля Спольски была хорошая
статья на эту тему).

Так вот, в Inferno таких сущностей ровно ТРИ: нити, каналы и файлы.
И нюансов поведения у них значительно меньше: файлы поддерживают
исключительно блокирующий I/O без возможности мультиплексирования,
каналы тоже блокирующие но их можно мультиплексировать, файлы все
«обычные» и никаких fcntl/ioctl в природе нет, etc. Причём этих трёх
сущностей хватает, чтобы покрыть практически всю ту функциональность, для
которой в UNIX-системах развели этот зоопарк!

1-я сущность: процесс/нить.


В Inferno нет отличия между процессами и нитями. Изолирование и
группирование нитей осуществляется через namespaces. Вот сравнительная
таблица свойств процессов Inferno по сравнению с процессами линуха:
Linux Inferno
Open files + +
UID, GID, EUID, EGID + ?
Supplementary group IDs +
Process group ID + +
Session ID +
Controlling terminal +
SUID and SGID flags +
Current working dir + +
Root dir + +
umask +
Signal mask and dispositions +
The close-on-exec flag for open files +
Environment + +
Attached shared memory segments +
Memory mappings +
Resource limits +
File locks for open files +
Pending alarms +
Namespace +

Что касается UID/GID/EUID/EGID, то UID, теоретически, в Inferno есть.
А практически его как бы и нет — разделение прав доступа к ресурсам
обеспечивается сертификатами, протоколом Styx, и namespace… а имя юзера
никакой роли в этом процессе не играет и используется, насколько я
понимаю, исключительно для определения имени домашнего каталога.
Возможно я что-то не уловил, но похоже что Inferno под типовые определения
однопользовательской/многопользовательской системы просто не попадает,
это нечто иное. :)
Для управления практически всеми (кроме текущего каталога) свойствами
процесса Inferno служит один, довольно простой сискол
pctl.
Процессы в Inferno можно: порождать (оператором spawn в Limbo), изменять
их свойства (сисколом pctl), завершать (оператором exit в Limbo) и… и
всё, в общем! По крайней мере в той части, которая касается API Inferno.
В принципе кроме этого можно ещё оперировать процессами через файлы в
каталоге /prog/, но это уже относится к файловому API.

2-я сущность: каналы.


С каналами всё ещё проще, чем с процессами:
  • их можно создавать (как переменные в Limbo типа chan of что-то)
    можно удалять (когда переменная выходит из области видимости либо в
    неё присваивают nil)
    можно с помощью операторов Limbo chan<- и <-chan атомарно,
    в блокирующем режиме принимать/передавать данные между нитями
    можно мультиплексировать ввод/вывод в каналы

    Этой функциональности достаточно, чтобы заменить все виды синхронизации и
    IPC существующие в линухе.

    3-я сущность: файлы/каталоги.


    Работа с файлами в Inferno не намного проще, чем в линухе — за исключением
    не нужных fcntl и ioctl API практически идентичное:
    mount, bind, chdir, open, dup, read, stat, diropen, dirread, etc…
    Жизнь, правда, заметно упрощается за счёт того, что весь I/O в файлы
    только блокирующий, и мультиплексирования тоже нет — если что-то из этого
    арсенала необходимо это решается выделением блокирующих задач в отдельные
    нити (что, кстати, стимулирует более продуманную архитектуру приложения).
    В принципе в Inferno ещё есть такой рудимент как пайпы. Но, в отличие от
    линуха, где они используются как одно из основных средств IPC, в Inferno
    пайпы это что-то типа workaround-а для случая, когда кому-нить (например,
    библиотечной функции) нужен файловый дескриптор, а вам хочется вместо
    дескриптора реального файла подсунуть ей «виртуальный» дескриптор ведущий
    не в реальный файл, а в ваш код.
    Ещё добавляется работа со специфичными фичами Inferno — namespaces,
    поддержка протокола Styx и его сертификаты, авторизация, аутентификация и
    шифрование. Но эта часть работы обычно выполняется админом в командной
    строке (или в sh-скрипте запускающем ваше приложение), и никак не
    усложняет программирование приложения.

    И всё?


    И всё! Всё остальное это голые вычисления — обсчитывание данных в
    переменных: поддержка разных форматов файлов, баз данных, сетевых
    протоколов, etc. Это всё прикладуха, и никак не усложняет среду в которой
    работают программы и не вводит новых сущностей.

    Бонус.


    На закуску я повторю список сущностей линуха и покажу чем все они
    заменяются в Inferno:
    Linux Inferno
    файлы/каталоги файлы/каталоги
    процессы нити
    терминалы -
    сигналы каналы
    нити нити
    пайпы — (тот workaround не считается)
    сообщения каналы
    семафоры каналы
    разделяемая память каналы
    сетевые сокеты файлы
    unix сокеты — (надеюсь, скоро здесь будут стоять «файлы»)
    псевдо-терминалы -
+12
28 мая 2007, 15:08
10
powerman 102,8

комментарии (38)

0
DileSoft #
Я не уверен, что этой системой будут пользоваться, но как способ знакомства с архитектурами ОС вообще - очень хорошо.
0
agl666 #
аналогично :) тем более "знакомство" идёт в сравнение с unix/linux, так что заодно узнаётся и их архитектура
+1
schors #
Почему? Нет, просто интересно, почему?
Кстати, сложно сказать, является ли это "знакомством". Семейство Plan9 является вещью в себе. Кроме Plan9, PlanB и Inferno на них никто не походит... А Inferno ещё и решило стать байткодом.
0
wii #
Думаю, сейчас уже не так-то просто будет занять уже занятую нишу. Кто знает, но пока не похоже.
Альтернатива. Давайте наконец-то уже доведем до ума одну операционку (я про ту, которая открытая. А как иначе? :) )
0
OldCat #
Не альтернатива - но настолько удобный инструментарий что
используя архитектуру инферно возможно пересмотреть типовые решения (хранилище данных, сервера веб контента ... поисковые машины типа гугл? итд...) в связи сразвитием медиа технологий подходящих к своему максимуму производительности.

Ведь фактически появляется возможность решить Кучу! тяжеленных операций не особо заморачиваясь на изобретение (и главное поддержку!!!) собственного инструментария распределенных вычислений и взаимозаменяемых (и динамически выделяемых) ресурсов
- просто мечта идиота (sic!) - эффективно и легко переписать нечто настолько привычно кривоватое... (апач, маська, ...)

0
uranik #
Так ктож мешает, мечты надо реализовывать :)
Жалко только что пока на булку с икрой заработаешь да пиво выпьешь, сутки и кончаются. Эх вот уйду на пенсию, такого напишу!
0
kovleon #
Дело в том, что практически вся документация написана для знающих людей, еслибы она была расчинтана на новичков, и не выглядела бы, как сравнение с уже существующими решениями(отличие от С, сравнение sh с *nix оболочками) - больше новичков интересовалось и начинало бы свое обучение именно с этой, простой и элегантной, ОС.
Если в учебных заведениях ввести обучение этой опереционке -через пару лет ос станет очень популярной.
НЛО прилетело и опубликовало эту надпись здесь
0
anortorn #
Не читайте этот блог, если не хотите - никто не заставляет.
0
powerman #
Я думаю, проблема в том, что вы щедро плюсуете хабратопики, и они попадают на главную, т.е. на глаза людям которым это не интересно. Всё таки Inferno это, мягко говоря, не mainstream. С другой стороны может кто-нить благодаря этому заинтересуется системой.
0
anortorn #
Верно. Все верно. Но, однако, так уж устроен Хабр: если что-то интересно некоторому числу людей (тем, кто плюсует), оно будет попадать на главную вне зависимости от того, мейнстрим это или нет. Эта система в том числе обсепечивает проникновение не-мейнстрима на глаза людям, относящимся к объекту обсуждения нейтрально, а следовательно, как вы уже справедливо заметили, кто-то еще может заинтересоваться. На мой взгляд, в этом нет ничего плохого.
0
OldCat #
В "этом" проблемы нет :) - публичное обсуждение несет свои плюсы и свои минусы, и вообще как узнать с кем беседуеш если не дать ему высказаться?
И собственно может быть "Cила" - в безразличии (к препятствию) ... не так ли?

"доказывающий не прав, правый не доказывает" (не помню из кого цитата - подскажете?)

P.S.: я вот проследив комментарии Entreri - обнаружил что таки нашел живого поклонника окошек - что для меня оказалось просто открытием :))

сказывается наверное круг общения.... ;)

0
nochnoy #
Гуляешь прямиком на damochka.ru
0
Zerkella #
Можно прямой линк на статью Спольски, плз?
0
powerman #
Я попытался его найти когда писал статью, но быстро найти не получилось. :( У него просто статей на эту тему несколько, и чтобы найти ту, которая ближе всего к теме нужно их все перечитать...
0
alexrum #
Возможно, речь шла об этой статье:
«Как Microsoft проиграла битву за API»
http://russian.joelonsoftware.com/Articl…
0
alexrum #
И совсем короткая статья:
«Пожалуйста, сэр, могу ли я получить компоновщик?»
http://russian.joelonsoftware.com/Articl…
0
nsavin #
по-моему это: Огонь и движение
0
robot12 #
Почитал. По делу коментариев мало... ненужная полемика ... А статьи полезные. Всё таки я бы выделил другие три основных момента в Infero - это Styx, Limbo и Dis :)
0
powerman #
Да, безусловно. С точки зрения архитектуры Inferno. А я пишу с точки зрения пользователя/программиста Inferno.
0
bolk #
Гм. А как же без разделяемой памяти обходятся?
0
powerman #
Очень просто. Вся память разделяется между всеми нитями. Другое дело, что если при запуске нити ей не дали указатель на какую-то структуру в памяти, то она к ней доступа и не получит, что обеспечивает защиту памяти. Обмениваться данными нити могут как через такие разделяемые структуры (но тогда придётся синхронизировать доступ к этой памяти через каналы) либо через те же каналы непосредственно обмениваться данными (что работает очень быстро, как я уже упоминал).
0
bolk #
А как разным приложениям обмениваться через разделяемую память?
0
bolk #
Т.е. как им обмениваться вообще данными? Через сокет/pipe? На каждый чих писать сервер?
0
powerman #
Всё зависит от архитектуры, от того, насколько они на самом деле "разные".

К примеру, эти приложения при запуске могут получать параметром указатель на разделяемую ими структуру в памяти. Эта схема предполагает, что приложения не такие уж и разные - по крайней мере они реализуют некий общий интерфейс, который позволяет их так запускать (а-ля интерфейс "Command" который позволяет sh запускать модули как программы из командной строки).

Если они совершенно разные, тогда да, нужно писать сервера. Собственно я уже писал, что "правильное" приложение под Inferno - это файловый сервер экспортирующий один файл либо целый каталог с подкаталогами и файлами (в Limbo есть стардартные библиотеки упрощающие написание таких серверов). Такое IPC будет медленнее прямого доступа к памяти, но зато эта схема снимает ограничение на запуск всех этих приложений на одном сервере.
НЛО прилетело и опубликовало эту надпись здесь
0
powerman #
Я MS упомянул исключительно в том ключе, что её API не проще линухового. Даже в мыслях небыло "гнать" на винду, я из этого возраста уже давно вышел. Могу публично заявить: винда нормальная операционка, не хуже других. Я лично с громадным удовольствием её использую... для запуска игр. Вот. :)

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

Один только переход на Inferno, безусловно, не научит людей привыкших писать переусложнённые программы решать те же проблемы более простыми программами. Но во-первых под Inferno из кода программ уйдёт сложность вызванная сложностью окружающей среды (ОС), а во-вторых философия и архитектура Inferno будет помогать людям задумываться: а действительно ли необходимо всё делать насколько сложно?
0
dv5ife #
Вообще весь софт становится слишком сложным и тяжёлым, не только популярные ОС... пора что-то менять.

философия и архитектура Inferno будет помогать людям задумываться: а действительно ли необходимо всё делать насколько сложно?


Менять-то давно пора, только ничего из этого не выйдет, мне кажется. Компьютеры становятся мощнее, с их помощью решают более объемные задачи, требующие более сложного ПО (вроде так). С интерфейсами прикладных программ та же проблема: чем больше функций пытаются запихнуть в программу, тем сложнее с ней обращаться (хотя есть исключения). В общем ждем 4-го GNOME'a, в котором будет только кнопка "Читать мозг" :-) (с) ЛОРовцы.
0
powerman #
Большие, сложные и объёмным задачи действительно никуда не денутся. Фокус в том, что их не обязательно решать сложным ПО. В абсолютном большинстве случаев задачи решаются неоправданно сложным способом, и проблема именно в этом.

Как пример можно привести ту же Inferno, чтобы не ходить далеко. Inferno обеспечивает практически ту же самую функциональность что и другие операционки, но при этом проще их на порядки! И достигается это именно за счёт простой архитектуры и реализации, а не за счёт упрощения задачи.
0
dv5ife #
Собственно, да. Просто мы с вами, как оказалось, говорим о разных вещах :) Вы — о реализации, а я об управлении. Хотя, если подумать, преимущества "Инферны" могли бы, наверное, помочь упростить и сами интерфейсы.
0
dv5ife #
Упс. "Упростить и сами пользовательские интерфейсы."
0
powerman #
Нет, не думаю что выбор ОС может упростить UI. Для упрощения UI нужны хорошие юзабилисты, дизайнеры, etc. А самое главное, что помогает кардинально упростить UI - просто не реализовывать избыточную функциональность, о чём хорошо написано в Getting Real.

А вот внутренние интерфейсы, между приложениями, действительно под Inferno упрощаются.
0
dv5ife #
Выбор ОС может помочь упростить UI. То есть, принципы операционки могут позволять, а могут и не позволять делать какие-то вещи. Отсюда и возможности для упрощения интерфейсов.
0
ingeniarius #
Прошло столько времени,
может стоить ещё что нибудь осветить.
Например как реально можно использовать Инферно,
в том числе на хост ос.
НЛО прилетело и опубликовало эту надпись здесь
0
powerman #
Во-первых, нити там очень лёгкие. Во-вторых, я при сравнении epoll в perl/linux и нитей в limbo/inferno заметной разницы в производительности, памяти и загруженности CPU не заметил. В-третьих, нити позволяют решать те же задачи заметно более простым кодом, нежели при использовании мультиплексирования — а это самое главное и с головой окупает потери в памяти и нагрузке на CPU, даже если бы они были.
НЛО прилетело и опубликовало эту надпись здесь
0
powerman #
Полностью согласен. Но это связано исключительно с тем, как в традиционных OS реализованы нити. В Inferno нити реализованы намного лучше. Насколько я понимаю, это стало возможным благодаря более простой архитектуре самой OS Inferno, и добиться такой же эффективности нитей в традиционных OS врядли получится.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.