А если процессоров на устройстве несколько, то просто блокировка прерывания таймера не поможет. Второй же подход приведет к тому, что вероятно новосозданные процессы не будут доступны сразу после создания, и это придется править костылями. На мой взгляд самое простое решение - запретить прерывание таймера, заблокировать массив spin-lockом, прочитать, найти нужный процесс, разблокировать массив, разрешить прерывание и работать уже с этим процессом. Я делал иначе - обращения к процессам у меня идут как любые другие IO запросы через менеджер ввода-вывода. В то же время свич потоков другие процессы почти не затрагивает (берется только процесс следующего запланированного потока) и потому почти не пересекается с IO-менеджером. Да, это гораздо медленней, зато позволяет при занятости откладывать это чтение стандартными средствами (т.е. читать асинхронно) или снимать запросивший поток с планирования на время ожидания доступа и не жрать процессорное время пустым ожиданием семафора, а также автоматически разрешает конфликты при доступе, потому что весь доступ делается исключительно IO-менеджером и никем другим. Для меня скорость не очень важна - я не планирую, что работа с чужими процессами будет выполняться очень часто в моей ОС. Более того, она вообще будет максимально ограничена, а для большинства юзермодных процессов запрещена вовсе в целях безопасности, поскольку в пользовательских ОС, к коим относится моя хобби-ос, работа с чужим процессом обычному приложению не нужна.
|