Yoda писал(а):
As for me, обработчики прерываний лучше распределять равномерно, как минимум во избежания потери прерываний.
С обработкой прерываний справляется и одно ядро, при этом даже умудряется делать что-то сверх того)))
Цитата:
Думаю, надо, но обязательно только со сбором статистики. Если какое-то ядро занято как минимум двумя потоками, работающими длительное время, или это потоки реального времени, то один из них следует перенести на свободное ядро.
Прям как в винде.
Цитата:
Проще, но явно хуже. И, кстати, хорошо, если ядро заточено под быстрый перенос потока с ядря на ядро.
Так я тоже думаю, что хуже, но не могу убедительно ответить на вопрос: "Почему хуже?" Понятно, что если нужно переносить поток с одного ядра на другое, то лучше это делать как можно быстрее.
Цитата:
Думаю, общие принципы следующие:
1. Каждый процессор (ядро) имеет свою очередь задач.
2. Свободный процессор забирает нагрузку у других процессоров.
3. Перегруженный процессор (более одного процесса реального времени) раскидывает критичную нагрузку на другие процессоры.
4. Всё планирование исходит из того, что перенос процесса с ядра на ядро может оказаться затратным (межпроцессорное взаимодействие + наполнение кэша другого процессора).
1. Видимо, так.
2. Да, но требует уточнения: вы сами говорили, что однозначно нужно забирать тяжеловесный поток (высокоприоритетный). А вот если таковых нет, брать легковесный (один или даже несколько) или уходить в спячку, пока тебя не нагрузит и не разбудит другое ядро?
3. Требует серьезного уточнения. Ядро может и не само этим заниматься. Раз мы уже сошлись на том, что очередь выполнения для каждого ядра своя, это может сделать выводящее из ожидания высокоприоритетный поток ядро, который может быть закреплен и за другим ядром. Оно просто проверяет, выполняет ли уже ядро, за которым был закреплен выходящий из ожидания поток, другой высокоприоритетный поток. Если да, то пытается перевести выходящий поток на другое ядро, которое спит или обрабатывает менее приоритетные потоки. Кстати вопрос, нужно ли считать актуальной информацию о "родном" ядре для потока, который не находится ни в одной очереди выполнения? Какое ядро является более подходящим для дальнейшей работы потока: 1) на котором он выполнялся до перехода в состояние ожидания ("родное" ядро); 2) которое вывело его из состояния ожидания?
4. Да, только каковы критерии того, эффективнее перевести поток на другое ядро или проще его придержать на текущем ядре?
pavia писал(а):
Вытесняющая многозадачность это такой вид планирования при котором задача с большем приоритетом вытесняют остальные задачи.
Не согласен. Вытесняющая многозадачность - это противоположность кооперативной многозадачности. Т.е. если ядро забирает управление у потока (по таймеру), когда он сам явно не обращается к ядру, то это уже вытесняющая многозадачность. А то что вы говорите, это вытесняющая многозадачность на основе приоритетов.
Yoda писал(а):
Я думаю, задачи надо разбивать на классы, как минимум нескольких уровней:
1. Реального времени;
2. Интерактивные;
3. Нормальные;
4. Фоновые.
Вот между классами есть вытеснение, т.е. задачи более высокого класса вытесняют более низкий класс, и то, я не стал бы полностью вытеснять интерактивные (в системах с пользовательским интерфейсом).
А в рамках одного класса должны быть уровни приоритета, так что задачи с бОльшим приоритетом получают бОльшую долю ЦПУ, но всё равно не вытесняют остальные задачи полностью.
+1. Ты практически точно описал используемую мной модель, только для потоков переднепланового процесса я повышаю не приоритетный класс, а только уровень приоритета - этого вполне достаточно, чтобы довести отклик переднепланового процесса до приемлемого, однако твой вариант тоже весьма интересен (обязательно поэкспериментирую с ним).