Ruby 1.8 использует потоки пользовательского пространства, а не потоки операционной системы.Это означает, что Ruby 1.8 может использовать только одно ядро ЦП независимо от того, сколько потоков Ruby вы создаете.
С другой стороны, не все так плохо.Ruby 1.8 внутренне использует неблокирующий ввод / вывод , в то время как Ruby 1.9 разблокирует глобальную блокировку интерпретатора при выполнении ввода / вывода.Таким образом, если один поток Ruby заблокирован во время ввода-вывода, другой поток Ruby может продолжить выполнение.Аналогичным образом, Ruby достаточно умен, чтобы заставить такие вещи, как sleep () и даже waitpid () вытеснять другие потоки.
Выше приведен отрывок из недавнего сообщения в блоге отФьюжн люди.
Как МРТ внутренне обрабатывает дисковый ввод / вывод?
Исходя из того, что я собираю, неблокирующее выполнение дискового ввода / вывода с помощью select / epoll / kqueueневозможно, так как fds
всегда будет доступен для чтения / записи.Поэтому я ожидаю, что MRI будет блокировать, когда он выполняет файловый ввод-вывод, но если он блокирует, нет смысла писать многопоточные программы.Есть ли в MRI внутренний пул потоков, в который выгружаются эти блокирующие вызовы ввода-вывода?