Сводка: Вы корректны, что получение сигнала не прозрачно, ни один в случае, если я (прерванный не считав что-либо), ни в случае, если ii (прервал после частичного чтения). Сделать иначе в случае, если я потребовал бы коренных изменений внесения и к архитектуре операционной системы и к архитектуре приложений.
Рассмотрите то, что происходит, если системный вызов прерван сигналом. Обработчик сигналов выполнит код непривилегированного режима. Но syscall обработчик является кодом ядра и не доверяет никакому коду непривилегированного режима. Поэтому давайте исследуем выбор для syscall обработчика:
Основное различие для прерывания - то, что коду прерывания доверяют и высоко ограничивают. Обычно не позволяется выделить ресурсы, или работать навсегда, или взять блокировки и не выпустить их или сделать любой другой вид противных вещей; так как обработчик прерываний записан самим реализатором ОС, он знает, что он ничего не сделает плохо. С другой стороны, код приложения может сделать что-либо.
Когда приложение прервано посреди системного вызова, syscall должен продолжиться к завершению? Не всегда. Например, рассмотрите программу как оболочка, это читает строку из терминала и пользовательские нажатия Ctrl+C
, инициирование SIGINT. Чтение не должно завершаться, это - то, о чем сигнал - все. Обратите внимание, что этот пример показывает что read
syscall должен быть прерываемым, даже если никакой байт еще не был считан.
Таким образом, должен быть путь к приложению, чтобы сказать ядру отменять системный вызов. При дизайне Unix, который происходит автоматически: сигнал делает возврат syscall. Другие проекты потребовали бы, чтобы путь к приложению возобновил или отменил syscall на своем досуге.
read
системный вызов является способом, которым это - потому что это - примитив, который имеет смысл, учитывая общий дизайн операционной системы. То, что это означает, примерно, “читайте так, как Вы можете, до предела (размер буфера), но останавливаться, если что-то еще происходит”. На самом деле считать полный буфер включает выполнение read
в цикле, пока не было считано как можно больше байтов; это - высокоуровневая функция, fread(3)
. В отличие от этого, read(2)
который является системным вызовом, fread
библиотечная функция, реализованная в пространстве пользователя сверху read
. Это подходит для приложения, которое читает для файла или умирает, пробуя; это не подходит для интерпретатора командной строки или для сетевой программы, которая должна отрегулировать соединения чисто, ни для сетевой программы, которая имеет параллельные соединения и не использует потоки.
Пример чтения в цикле обеспечивается в Системном Программировании Linux Robert Love:
ssize_t ret;
while (len != 0 && (ret = read (fd, buf, len)) != 0) {
if (ret == -1) {
if (errno == EINTR)
continue;
perror ("read");
break;
}
len -= ret;
buf += ret;
}
Это заботится о case i
и case ii
и еще много.
При тестировании Моно / Linux по сравнению с рабочими нагрузками.NET/Windows, необходимо помнить, что там более приведено в действие, чем просто среда выполнения.
Существуют области, в которых Linux работает лучше, чем Windows (Большая часть IO, и сетевые операции имеют тенденцию быть быстрее для сопоставимых программ C). В то же время.NET имеет более усовершенствованный сборщик "мусора" и более усовершенствованный JIT-компилятор.
Когда дело доходит до библиотек классов это действительно зависит, на каких путях выполнения кода Вы используете. Как JacksonH заявил относительно предыдущего сообщения, можно поразить пути выполнения кода, которые были оптимизированы в одной реализации, но не на другом, и наоборот.
На рабочих нагрузках ASP.NET необходимо помнить, что установка по умолчанию направит все входящие запросы к единственному процессу "рабочего", mod_mono, и чероки используют аналогичный подход:
(источник: mono-project.com)
По крайней мере, с Apache мы поддерживаем механизм, где можно разделить рабочие нагрузки приложений через несколько рабочих, который помогает при высоких загрузках, поскольку он избегает любой незавершенной блокировки и дает каждому рабочему целый пул потоков для работы от:
(источник: mono-project.com)
Детали о том, как настроить эту установку, доступны здесь:
Это - своего рода неответ. Однако здесь нет реального ответа. К сожалению, эта вещь является очень зависящей от приложения. Ваше приложение могло совершить нападки на чем-то, что Моно, оказывается, действительно успевает, или Вы могли бы в большой степени использовать что-то, что реализовано плохо или имеет некоторые ошибки. Это не действительно случай Моно, являющихся в X разы более медленным/быстрее, чем IIS.
Мое предложение состоит в том, чтобы взять Ваше приложение, развернуть его на двух различных экземплярах EC2 (один Windows и один Моно) и сделать Ваше тестирование там. При нахождении главных проблем о Моно экземпляре сообщите о них, и мы попытаемся улучшить вещи.
Все, что быть сказанным, я могу сказать Вам от личного опыта, что Моно aspx действительно работает действительно хорошо.