Comments 16
struct thread_data {
INTERNAL uint64_t magic;
— А вы не могли бы пояснить, что это за магия такая?
+3
Это простая проверка id потока. Когда поток добавлятся в планировщик, ему в magic пишется магическая константа, когда же он удаляется, то константа обнуляется. В текущей реализации id — это просто адрес потока, приведённый к числу. Соответственно, если мы передаём неправильный id, то magic не совпадёт и функция вернёт ERR_NOT_FOUND.
+1
А как magic и id связаны?
+1
В текущей реализации id — это просто адрес потока, приведённый к числу.
+1
Из ответа автора мне тоже не удалось до конца понять, что к чему. Потому полез в исходники (файл 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;
+2
То есть эта переменная, фактически, флаг, что тред создан?
+1
Да, точнее, что он attached к планировщику. Это для того, чтобы минимизировать вероятность ошибки передачи неверного id.
+1
Скорее, что id указывает на валидную (созданую, запланированую и ещё не разрушеную) структуру thread_data, а не на случайный адрес в памяти.
+2
А можно ли приостановленный поток запустить на другом процессоре или даже на другой машине в сети?
+1
Преостановленный поток, т.е. поток находящийся в планировщике может быть запущен в любой момент (resume_thread), причём каждый раз при запуске находится наименее загруженный процессор. Отсюда следуют, что в общем случае поток каждый раз может запускаться на любом процессоре.
Вторая часть вашего вопроса особенна интересна. Действительно, можно приостановить поток, извлечь его из планировщика (detach_thread), сохранить (например в файл) и возобновить на другой машине (при условии совместимости процессоров). Последнее возможно с точки зрения планировщика. В реальности всё будет гораздо сложнее, поскольку поток пользуется не только стеком, но и другой памятью, иными ресурсами, которые должны совпадать (или эмулироваться) на другой машине.
Вторая часть вашего вопроса особенна интересна. Действительно, можно приостановить поток, извлечь его из планировщика (detach_thread), сохранить (например в файл) и возобновить на другой машине (при условии совместимости процессоров). Последнее возможно с точки зрения планировщика. В реальности всё будет гораздо сложнее, поскольку поток пользуется не только стеком, но и другой памятью, иными ресурсами, которые должны совпадать (или эмулироваться) на другой машине.
+1
А как запущен сам планировщик? Как поток на одном из процессоров? Успеет ли он в таком случае справиться с планированием большого количества других потоков на многих процессорах?
+1
перенёс
0
Автор, надеюсь «Operating Systems Design and Implementation» Andrew S. Tanenbaum — ваша настольная книга ;-))
0
Sign up to leave a comment.
Пишу игрушечную ОС (о планировщике)