Принцип: Когда происходит переключение таблицы страниц во время переключения потоков? Влияет ли переключение таблицы страниц на работу программы или операционной системы и почему?
Переключение таблицы страниц происходит в функции
Process::prepare_next_thread()
, где вызывается функцияThread::prepare()
, которая загружает новую таблицу страниц для нового потока.
Это не влияет на выполнение, потому что во время прерывания операционная система выполняет операции, а используемое операционной системой линейное отображение ядра существует в каждой таблице страниц.
Проектирование: Если не использовать sscratch
для предоставления стека ядра, а вместо этого сталкиваться с прерыванием и просто помещать контекст в стек, приведите следующие ситуации:
handle_interrupt
).handle_interrupt
, не учитывая последующее выполнение).Только один очень доброжелательный поток, например
loop {}
.
Поток теряет свой
sp
, например,mv sp, x0
. В этом случае невозможно сохранить регистры, и нет стека, который мог бы поддерживать нормальную работу операционной системы. Запускаются два потока. При переключении между двумя потоками необходимо переключать таблицу страниц. Однако в этот момент операционная система работает в стеке предыдущего потока, и после переключения доступ к стеку приведёт к ошибке страницы, поскольку стек каждого потока находится только в своей таблице страниц. Пользовательский процесс хитроумно проектируетsp
так, чтобы он находился рядом с некоторыми переменными ядра, и при сохранении регистров изменяет значение переменной. Это эквивалентно произвольному изменению управляющей информации операционной системы.
Эксперимент: Когда нажимается Ctrl + C, операционная система должна быть способна перехватить прерывание. Реализуйте перехват сигнала операционной системой и завершите текущий выполняемый поток (вам может потребоваться прочитать некоторый код, не упомянутый в инструкции).
Эксперимент: Реализовать fork()
процесса. В настоящее время ядро не может выполнять системные вызовы, поэтому мы упрощаем его до «выполнить fork при нажатии F». После fork следует создать почти идентичную копию текущего процесса.
Старая задача: у этой задачи есть некоторые проблемы, которые могут привести к сбою указателей в стеке в потоке. Если вы уже выполнили задачу
clone()
, рекомендуется, но не обязательно переделыватьfork()
.Реализовать
clone()
потока. В настоящее время ядро не может выполнять системные вызовы, поэтому мы упростили его до «выполнить clone при нажатии C». После clone следует создать почти идентичную копию текущего потока, новый поток принадлежит тому же процессу, что и старый поток, совместно использует таблицу страниц и большую часть пространства памяти, а стек нового потока является копией.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )