Я изучаю потоки и процессы в курсе «Операционные системы» и обнаружил явное противоречие в своем учебнике («Современные операционные системы», 4-е изд. Таненбаума и Боса). Я уверен, что я кое-что неправильно понимаю здесь, было бы здорово, если бы кто-то мог прояснить ситуацию.

На странице 106:

Другой общий вызов потока - это thread_yield, который позволяет потоку добровольно отказаться от ЦП, чтобы позволить другому потоку работать. Такой вызов важен, потому что нет прерывания часов, чтобы фактически обеспечить мультипрограммирование, как с процессами.

Хорошо, хорошо - я так понимаю, что потоки никогда не откажутся от контроля, если они не уступят его добровольно. Имеет смысл.

Затем, на странице 116, в примере потоков, неправильно обрабатывающих совместно используемую информацию:

В качестве примера рассмотрим переменную errno , поддерживаемую UNIX. Когда процесс (или поток) выполняет системный вызов, который завершается неудачно, код ошибки помещается в errno . На рис. 2-19 поток 1 выполняет системный вызов access , чтобы узнать, есть ли у него разрешение на доступ к определенному файлу. Операционная система возвращает ответ в глобальной переменной errno . После возврата управления потоку 1, но до того, как у него появится возможность прочитать errno , планировщик решает, что поток 1 имеет достаточно процессорного времени на данный момент, и решает переключиться на поток 2.

Но разве поток 1 не был выдернут из процессора случайно? Я думал, что нет способа принудительно переключить потоки, как при переключении процессов?

0
Tulkas 26 Фев 2016 в 22:10

2 ответа

Лучший ответ

Это имеет смысл, если мы будем рассматривать потоки уровня процесса, а не потоки уровня ОС. ЦП может прерывать процесс (независимо от того, какой поток запущен), но поскольку ОС не знает о потоках уровня процесса, она не может их прервать. Если один поток внутри процесса хочет разрешить выполнение другого потока, он должен специально уступить другому потоку.

Однако в наши дни в большинстве языков используются потоки на уровне ОС, о которых ОС знает и может упредить.

0
Darth Android 26 Фев 2016 в 19:17

Заблуждение состоит в том, что есть два разных способа реализации потоков. В старые времена поддержки потоков вообще не было. Полномочия Министерства обороны на язык программирования Ada (в котором задачи - или потоки - были неотъемлемой частью) вынудили принять потоки.

Были созданы библиотеки времени выполнения (в основном для поддержки Ada). Это работало внутри процесса. Процесс поддерживает таймер, который прерывает потоки, и библиотека переключается между потоками так же, как операционная система переключает процессы.

Обратите внимание, что эта система позволяет одновременно выполнять только один поток процесса, даже в многопроцессорной системе.

Ваш первый пример описывает такую библиотеку, но он описывает очень примитивную библиотеку потоков, в которой планирование потоков основано на взаимодействии между различными потоками процесса.

Позже операционная система начала развивать поддержку потоков. Вместо того, чтобы планировать процесс, операционная система планирует потоки для выполнения. Таким образом, процесс представляет собой адресное пространство с набором потоков. Ваш второй пример говорит об этой теме.

0
user3344003 26 Фев 2016 в 20:29