Pull to refresh

Comments 16

struct thread_data { INTERNAL uint64_t magic;

— А вы не могли бы пояснить, что это за магия такая?
Это простая проверка id потока. Когда поток добавлятся в планировщик, ему в magic пишется магическая константа, когда же он удаляется, то константа обнуляется. В текущей реализации id — это просто адрес потока, приведённый к числу. Соответственно, если мы передаём неправильный id, то magic не совпадёт и функция вернёт ERR_NOT_FOUND.
А как magic и id связаны?
В текущей реализации id — это просто адрес потока, приведённый к числу.
Из ответа автора мне тоже не удалось до конца понять, что к чему. Потому полез в исходники (файл src/schedule.c):
#define CAST_TO_THREAD(thrd, id)                        \
  struct thread_data *thrd = (struct thread_data*)id;   \
  if (thrd->magic != THREAD_MAGIC)                      \
    return ERR_NOT_FOUND;
То есть эта переменная, фактически, флаг, что тред создан?
Да, точнее, что он attached к планировщику. Это для того, чтобы минимизировать вероятность ошибки передачи неверного id.
Понятно, спасибо.

Не знаю, насколько бестактно вам указывать, но я бы эту переменную назвал bool isThreadAttached :)
Скорее, что id указывает на валидную (созданую, запланированую и ещё не разрушеную) структуру thread_data, а не на случайный адрес в памяти.
А можно ли приостановленный поток запустить на другом процессоре или даже на другой машине в сети?
Преостановленный поток, т.е. поток находящийся в планировщике может быть запущен в любой момент (resume_thread), причём каждый раз при запуске находится наименее загруженный процессор. Отсюда следуют, что в общем случае поток каждый раз может запускаться на любом процессоре.

Вторая часть вашего вопроса особенна интересна. Действительно, можно приостановить поток, извлечь его из планировщика (detach_thread), сохранить (например в файл) и возобновить на другой машине (при условии совместимости процессоров). Последнее возможно с точки зрения планировщика. В реальности всё будет гораздо сложнее, поскольку поток пользуется не только стеком, но и другой памятью, иными ресурсами, которые должны совпадать (или эмулироваться) на другой машине.
А как запущен сам планировщик? Как поток на одном из процессоров? Успеет ли он в таком случае справиться с планированием большого количества других потоков на многих процессорах?
Нет, планировщик распределён между всеми логическими процессорами. На каждом из них срабатывает прерывание по таймеру, в котором и происходит само планирование. Т.е. один и тот же код выполняется на каждом процессоре.
Автор, надеюсь «Operating Systems Design and Implementation» Andrew S. Tanenbaum — ваша настольная книга ;-))
Нет, в электронном виде и читаю редко. Больше спецификации.
Sign up to leave a comment.

Articles