Запрос относительно не вытесняющего потока

Я читал о неупреждающих потоках и нашел слайд из Принстонского университета, на котором показана следующая диаграмма: (Ссылка на источник: http://www.cs.princeton.edu/courses/archive/fall11/cos318)./lectures/L5_ThreadsImplementation.pdf)

введите здесь описание изображения

Насколько я понял, исполняемый поток сначала помещается в очередь готовности. Когда он выходит из очереди, он находится в рабочем состоянии. Если он хочет вызвать другой поток, он вызывает функцию yield, которая сохранит текущее состояние потока и вставит его в конец очереди. И поток, стоящий впереди очереди, будет выполнен.

Что произойдет, если поток заблокирован (т. е. ожидает какого-либо ресурса)? Я думал, что в невытесняющем потоке он будет ждать ресурса, а затем продолжит выполнение.

Но из приведенной ниже диаграммы видно, что он переходит в заблокированное состояние, а затем ставится в очередь готовности? Это почему?


person user1692342    schedule 25.08.2014    source источник
comment
Я тоже этого не понимаю. Если поток не может немедленно получить ресурс ввода-вывода, он либо блокируется, либо получает своего рода ответ «не готов» от своего системного вызова. Если он блокируется, процессор, который он не может использовать, должен куда-то уйти...   -  person Martin James    schedule 25.08.2014
comment
Невытесняющий означает, что другой поток не может прервать (вытеснить) работающий поток, а не то, что работающий поток не уступит, когда ему нужно чего-то ждать. Если бы работающие потоки не уступали при ожидании дискового/сетевого/любого ввода-вывода, пропускная способность системы серьезно пострадала бы... Ожидание нажатия пользователем любой клавиши для продолжения может привести к остановке всей системы...   -  person twalberg    schedule 25.08.2014
comment
@twalberg Означает ли это, что когда поток ожидает ресурса, он переходит в очередь блокировки, позволяя другим потокам выполняться из очереди готовности? Кроме того, когда ресурс становится доступным, он удаляется из очереди блокировки и присоединяется к хвосту очереди готовности?   -  person user1692342    schedule 25.08.2014
comment
Да, это именно то, что показано на диаграмме - когда потоку нужно заблокировать ожидание диска/сети/клавиатуры/чего-то еще, он переходит в какую-то заблокированную очередь и уступает процессор чему-то другому (различные реализации могут использовать одну заблокированную очередь , или отдельные очереди для каждого ресурса, или что-то еще), а затем ядро ​​перемещает его обратно в очередь готовности, как только ресурс, который он ожидает, готов...   -  person twalberg    schedule 25.08.2014


Ответы (1)


Как сказано в комментариях, невытесняющий означает, что другой поток не может прервать (вытеснить) работающий поток, а не то, что работающий поток не уступит, когда ему нужно чего-то ждать.

Когда поток ожидает данных из памяти (например), говорят, что он находится в состоянии заблокировано: его контекст сохраняется, а другой поток занимает место в вычислительном ресурсе (ядре ЦП). Когда данные доступны в кэш-памяти процессора, первый поток объявляется готовым возобновить свое выполнение (и это произойдет, как только он станет следующим для выполнения и текущий выполняемый поток даст вычислительный ресурс).

Это позволяет перекрывать как перемещение данных, так и выполнение потоков, тем самым экономя время за счет оптимизации использования ресурсов.

person Tim    schedule 18.10.2015