Я полагаю, Ваши сведения устарели для популярных цпу и ОС. На современных процессорах "mapping памяти" переключается тривиально (загрузка нескольких регистров, самое дорогое при этом - некоторые внутренние процессорные кеши обнуляются, но на "совсем современных" процессорах даже это уже незаметно), права доступа у тредов даже в одном процессе бывают разные, кроме того, эти самые права и контексты внешних объектов в современных популярных ОС - это всего лишь данные в памяти - при переключении маппинга памяти автоматически все переключается.StrangerR wrote:Это не так точнее совсем не такПереключение между "процессами" и "потоками" (или "нитями" или "легкими процессами") стоит примерно одинаково.
Переключение процесса
- полностью поменять меппинг памяти (ну да, в новом часть может совпадать если там шеред сторейдж)
- поменять контекст прав доступа
- поменять контекст внешних объектов (fd и прочего)
- взять регистры и прочее для процесса включая положение стека
- запуститься
Переключение треда
- взять регистры для процесса, выставить новое положение стека
- запуститься
Намного меньше так как не меняется меппинг памяти, права и внешние объекты.
В итоге, заметить разницу между переключением процесса и переключением потока очень сложно. А в некоторых операционных системах, например Windows, планировщик вообще не делает (и никогда не делал разницы - для всех версий NT, аж с 1991 года) разницы между процессами или потоками так как "видит" только "потоки", более того, "процесс" в обязательном порядке имеет хотя бы один "поток", иначе он просто не будет выполняться.
Ничего существенно дополнительного (что реально было бы заметно с точки зрения времени выполнения) в зависимости от переключения "потоков" одного "процесса" или разных делать не нужно. В результате за исключением редчайшей экзотики беспокоиться о разнице переключения "потоков" одного "процесса" или разных "процессов" не нужно вообще.
А вот где начинается существенная разница - это при использовании "user mode threads" или как оно там называется для разных ОС.