#multithreading #operating-system
#многопоточность #операционная система
Вопрос:
Я читал, что преимущество потоков пользовательского уровня в том, что они не требуют вызовов ядра для переключения. Загрузка регистров (IP, SP) не требует системного вызова? Я программировал потоки пользовательского уровня на C, используя функции — getcontext, setcontext ? Разве эти функции не вызывают системные вызовы?
Ответ №1:
(Большинство) регистров, видимых в коде пользовательского режима, также могут быть сохранены / восстановлены в коде пользовательского режима.
Поскольку поток пользовательского режима (по крайней мере, обычно) не переключается с упреждением, обычно вам все равно не нужно сохранять все регистры. Типичная реализация использует setjmp и longjmp для сохранения / восстановления необходимого состояния. Обычно они не требуют переключения режимов пользователя / ядра.
Комментарии:
1. Здесь у меня есть небольшие сомнения. Означает ли это, что поток пользовательского уровня может загружать IP и SP в любое значение, которое ему нравится, не проходя через ядро?
2. Более или менее, да. Загрузка в IP-это просто переход к местоположению — все время, пока вы выполняете код, вы постоянно загружаете значения в IP. Более или менее то же самое верно и для SP — каждый раз, когда вы вызываете функцию или возвращаете ее из функции, вы загружаете ее с новым значением.
3. Означает ли это, что проверка недопустимых адресов в этих регистрах не касается ОС?
4. Нет — это обрабатывается процессором. Если вы загружаете недопустимый адрес, операционная система может быть вовлечена в обработку возникающего исключения.