почему потокам пользовательского уровня не нужен системный вызов?

#multithreading #operating-system

#многопоточность #операционная система

Вопрос:

Я читал, что преимущество потоков пользовательского уровня в том, что они не требуют вызовов ядра для переключения. Загрузка регистров (IP, SP) не требует системного вызова? Я программировал потоки пользовательского уровня на C, используя функции — getcontext, setcontext ? Разве эти функции не вызывают системные вызовы?

Ответ №1:

(Большинство) регистров, видимых в коде пользовательского режима, также могут быть сохранены / восстановлены в коде пользовательского режима.

Поскольку поток пользовательского режима (по крайней мере, обычно) не переключается с упреждением, обычно вам все равно не нужно сохранять все регистры. Типичная реализация использует setjmp и longjmp для сохранения / восстановления необходимого состояния. Обычно они не требуют переключения режимов пользователя / ядра.

Комментарии:

1. Здесь у меня есть небольшие сомнения. Означает ли это, что поток пользовательского уровня может загружать IP и SP в любое значение, которое ему нравится, не проходя через ядро?

2. Более или менее, да. Загрузка в IP-это просто переход к местоположению — все время, пока вы выполняете код, вы постоянно загружаете значения в IP. Более или менее то же самое верно и для SP — каждый раз, когда вы вызываете функцию или возвращаете ее из функции, вы загружаете ее с новым значением.

3. Означает ли это, что проверка недопустимых адресов в этих регистрах не касается ОС?

4. Нет — это обрабатывается процессором. Если вы загружаете недопустимый адрес, операционная система может быть вовлечена в обработку возникающего исключения.