Я вижу вашу проблему. У вас ужасная книга.
Вы спрашиваете о нескольких связанных проблемах. Прежде всего, существует два общих способа реализации потоков.
1) Темы реализованы в библиотеке с использованием таймеров. В системах, которые планируют процессы для выполнения, это единственный способ сделать поток. Это был ТОЛЬКО способ делать потоки в старые времена. Эта система обычно называется «пользовательские потоки». Пользовательские потоки мультиплексируются в процессе. Процесс выполняет планирование собственных потоков.
Мифическое преимущество «пользовательских потоков» над «потоками ядра» (ниже) заключается в том, что они более эффективны. Это то, к чему ссылается ваш цитируемый отрывок. Утверждение «весь процесс блокируется, если поток вызывает системный вызов блокировки», справедлив только для некоторых систем [unix].
2) Нити реализованы в операционной системе. Процесс состоит из адресного пространства и одного или нескольких потоков. Ядро операционной системы планирует НИТЬ для выполнения, а не ПРОЦЕССОВ. Это поток ядра.
Обратите внимание, что даже если система поддерживает потоки ядра, процесс может использовать пользовательские потоки. Эти два не являются взаимоисключающими. Однако система, которая не поддерживает ядра напрямую, может использовать пользовательский поток.
Это простой способ объяснить различные модели резьбы.
- = - = - = - = - = - = - = - = - = - = - = -
Один-к-одному, многие-к-одному, и многие-ко-многим модели - бесполезная путаница для студентов. Теперь нам нужно перейти к перекрывающейся терминологии.
Давайте изменим терминологию. Для # 1 вместо вызова планируемой единицы исполнения «процесс» мы называем это «потоком ядра». В этой модели может быть только один поток ядра для каждого процесса. Тогда потоки в этом процессе - это «пользовательские потоки». Любое количество пользовательских потоков, выполняемых внутри /, отображается в поток ядра. Это тогда модель «много-к-одному». Потоки пользователей = много-к-одному.
Если у нас есть операционная система, создайте поток (поток ядра), давайте теоретически будем называть то, что выполняется «пользовательский поток». Каждый поток пользователей отображает/выполняет один и только один поток ядра. Это тогда индивидуальная модель.
Модель «все-к-одному» такая же, как обычно называемая «модель пользовательской резьбы».
Терминология начинает приобретать бессмысленность, потому что существует только один поток, но мы называем его пользовательским нитьм, отображаемым в поток ядра.
Модель «один к одному» - это то, что обычно называют моделью потоков ядра.
Наконец, мы переходим к модели «многие ко многим». Это теоретическая БС. Теоретически, многие потоки пользователей могут отображаться во многих потоках ядра. Другими словами, один поток пользователей может выполняться в разных потоках ядра. Я никогда не слышал о том, как система реализует потоки таким образом, и я не могу представить никаких практических преимуществ такой системы.
- = - = - = - = - = - = - = - = - = - = - = - = -
Что касается вашего последнего вопроса, в некоторых операционных системах, система блокировки вызовов блок также блок таймеры, используемые для реализации пользовательских потоков (a/k/a many-to-one). Если один поток выполняет блокирующий вызов, он блокирует все остальные потоки PROCESS от выполнения до завершения блокирующего вызова.
Эта блокировка не встречается во всех системах (что-то должно указывать учебник ОС).
Это сделало все понятным. Спасибо! –