Pull to refresh

Comments 18

… А еще можно сделать модную нынче стейтлесс асинхронность.
Хочешь прочитать кусок файла — сделай read (да чего уж там, сразу get) запрос по ури вида /path/to/file?start=xxx&len=yyy и жди ответа асинхронно (внутре либы это не обязательно делать через колбэки; epoll рулит тащемта и в смысле организации кода по типу горутин, и в смысле производительности).
При воскрешении снэпшота запрос read/get запрос тупо повторяется, если он не был завершен в прошлый раз. И да, write (put) и delete — тоже идемпотентные, т.е. их можно повторять. Проблемы — только с new (post). Но для таких вещей — транзакции.
На выходе получаем систему, в которой работающие треды можно прозрачно перебрасывать между серверами например, для балансировки нагрузки, отказоустойчивости и всего такого.
Ну это так, мысли в слух.
Нуда, давайте навяжем на все новомодные REST, сделаем GUI на HTML и прочие приблуды, а потом будем просить пользователя купить новомодный i7 с 8 физическими ядрами.
Синтаксис запроса вторичен. Конечно, никто не будет парсить URI на системных вызовах. А в остальном — всё верно там написано.
UFO just landed and posted this here
Старый добрый Fluke с неблокирующимися системными вызовами: https://www.usenix.org/legacy/events/osdi99/full_papers/lepreau/lepreau.pdf, плюс еще и ядерных стеков не надо.
Ядерные стеки-то — чёрт с ними, а в остальном — да, очень перекликается. Спасибо.

(Кстати, интересное пересечение — нулевая версия ядра фантома использовала в качестве базы oskit, на котором и fluke базировался.)
Немного не в тему, но меня давно мучает вопрос про таймауты. Как организуется с ними работа в Фантоме. К примеру, я делаю чтение с жесткого диска. После запроса данных с жёсткого диска, но до их полного получения машина засыпает. Допустим, после пробуждения, стейтлесс асинхронность и транзакции позлят продолжить чтение файла с того места где программа остановилась. С точки зрения программы прошли доли секунды (вернее, несколько инструкций процессора), но если взять таймаут как разницу времени, то он может оказаться достаточно большим, чтобы решить, что в процессе чтения данных есть проблемы.
Как предполагается отличать проблемный (долгий) таймаут, от таймаута выспавшейся программы?
Все объекты прикладного уровня, имеющие отношения с ядром при рестарте получают уведомление о случившемся, соответственно — могут принять его во внимание, чтобы отличить эти два случая. См. restart_list выше.
Просто коментарий: не лучше ли было на прикладном уровне реализовать принцип «let it fault»? То есть сделать некое подобие контекста транзакции для доступа к системным ресурсам (ядру). Вне контекста ресурсы недоступны. При изменении ядра или перезапуске системы данные программы восстанавливаются, однако ресурсы, задействованные транзакцией, становатся невалидными и при следующем доступе по хендлу генерируют исключение. Вся транзакция откатывается на момент начала и прозрачно рестартует: снова запрашиваются ресурсы и выполняются необходимые операции.
По-моему, весь этот геморрой связан исключительно с тем, что формирование снапшотов и вызовы в ядро могут пересекаться по времени. Как будто бы, корень проблемы именно в этом. Но неужели это так уж необходимо? Можно было бы делать все системные вызовы таким образом, чтобы они не сразу выполнялись, а сначала происходила проверка «далеко ли до следующего снапшота?» Если следующий снапшот ещё не скоро, то вызов уходит в ядро и к моменту снапшота уже успевает вернуться. Если же следующий снапшот уже идёт или вот-вот начнётся, то системный вызов просто шедулится на время «сразу после снапшота». Думаю, все и так понимают, что системные вызовы — это такая вещь, которая быстро не делается. Ну, подумаешь, придётся программе несколько лишних миллисекунд подождать в том случае, если она сделала свой вызов в неудачное для системы время. Это не смертельно.
Системный вызов чтения байта с клавиатуры может быть заблокирован на месяц. Когда я в отпуске. :)
Так это же основная фича персистентной ОС. Я имею в виду то, что время для программ останавливается. Разве нет? Если между системным вызовом чтения с клавиатуры и возвратом из него пользователь успел побывать в отпуске, то вряд ли программе в качестве результата вызова нужен код той клавиши, которую пользователь нажал до отпуска.
«формирование снапшотов и вызовы в ядро могут пересекаться по времени.» — это вызов в ядро. Если он будет блокировать снапшоты, то они не будут происходить месяц.
Кто он? И зачем ему блокировать снапшоты? Наоборот, снапшоты должны блокировать всех.
«Действительно: если прикладная программа сделает вызов в ядро и в таком состоянии мы сделаем снапшот, то совершенно непонятно, как такой снапшот восстанавливать.»
Всё верно. Я именно об этом и говорю. Хорошо бы делать снапшоты не во время выполнения вызовов в ядро со стороны прикладных программ, а строго между такими вызовами. В тех случаях, когда программа делает вызов не вовремя, исполнение этого вызова можно просто откладывать. Вопрос только в том, почему так не сделано изначально. Наверняка, не просто так. Видимо, возможность выполнять системные вызовы, не откладывая, имеет какое-то принципиальное значение. К сожалению, я не понимаю, почему это так важно.
Если вызов длится месяц, то «строго между вызовами» — это «через месяц».
Sign up to leave a comment.

Articles