Умеет ли винда "отбирать квант времени", выделенный потоку?
От: Аноним  
Дата: 15.12.10 22:12
Оценка:
Вопрос в том, что когда определеный квант времени был выделен на выполнение кода определенному потоку, может ли винда как-то определить, что поток квант времени уже не используется и выделить квант времени друому потоку.
Просто интеесно что происходит когда поток часто записывает/читает данные из БД/файла, ожидает отклик сервера, и.т.д. Все это ведет к тому, что поток начинает простаивать. Винда навеное как-то определяет такие потоки и не выделяет ждущим потокам кванты времени, но я так полагаю, что совсем без потерь процессорного времени не обходится. Интересно: "забирает" ли винда квант времени у потока, после того как его ему отдала, если этот квант потоку уже не нужен (он в начале кванта времени отправил запрос в БД и ушел в спячку). То есть, простаивает ли процессор остаток этого кванта, или сразу после того как поток ушел в "спячку" неизрасходованный остаток кванта времени может быть отдан другому потоку?

18.12.10 18:52: Перенесено из '.NET'
Re: Умеет ли винда "отбирать квант времени", выделенный пото
От: sgenie  
Дата: 15.12.10 22:51
Оценка: +2
Если поток ставит себя в ожидающее состояние (например, ждет события), то система не дает ему кванта до тех пор, пока поток не сигнализирован как активныи.

А>Просто интеесно что происходит когда поток часто записывает/читает данные из БД/файла, ожидает отклик сервера, и.т.д. Все это ведет к тому, что поток начинает простаивать. Винда навеное как-то определяет такие потоки и не выделяет ждущим потокам кванты времени, но я так полагаю, что совсем без потерь процессорного времени не обходится. Интересно: "забирает" ли винда квант времени у потока, после того как его ему отдала, если этот квант потоку уже не нужен (он в начале кванта времени отправил запрос в БД и ушел в спячку). То есть, простаивает ли процессор остаток этого кванта, или сразу после того как поток ушел в "спячку" неизрасходованный остаток кванта времени может быть отдан другому потоку?
Re: Умеет ли винда "отбирать квант времени", выделенный пото
От: Jolly Roger  
Дата: 16.12.10 02:49
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>Вопрос в том, что когда определеный квант времени был выделен на выполнение кода определенному потоку, может ли винда как-то определить, что поток квант времени уже не используется и выделить квант времени друому потоку.


Это может произойти даже если потоку есть чем заняться, например при готовности к работе более высокоприоритетного потока или возникновении прерывания. В книге Соломона и Руссиновича кухня планирования разобрана подробно, почитайте.
"Нормальные герои всегда идут в обход!"
Re[2]: Умеет ли винда "отбирать квант времени", выделенный п
От: Аноним  
Дата: 16.12.10 10:49
Оценка:
Здравствуйте, sgenie, Вы писали:

S>Если поток ставит себя в ожидающее состояние (например, ждет события), то система не дает ему кванта до тех пор, пока поток не сигнализирован как активныи.


Тогда не совсем понятно почему при работе нашей системы процессор не загружается на 100%. В нашей системе работает 50-350 потоков, которые выполняют разные задачи. При этом каждая задача запрашивает веб-страницы, что-то записывает/считывает из БД и файловой системы.
Я думал, что это является как раз следствием того, что потоку, например, номер 123 выделяется квант времени (предположим 10 мс), этот поток выполняется 2 мс, отправляя запрос на получение веб-страницы и начинает простаивать, ожидая ответа и процессор эти 8 мс простаивает вместе с ним.
Если это не так и эти 8 мс могут быть сразу отданы другому потоку на выполнение, почему тогда процессор не нагружается на 100%? (у 350 потоков однозначно есть работа, чтобы нагрузить 2-ух ядреный процессор и СУБД при этом не нагружена более чем на 3-5%)
Re[3]: Умеет ли винда "отбирать квант времени", выделенный п
От: blackhearted Украина  
Дата: 16.12.10 10:55
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, sgenie, Вы писали:


S>>Если поток ставит себя в ожидающее состояние (например, ждет события), то система не дает ему кванта до тех пор, пока поток не сигнализирован как активныи.


А>Тогда не совсем понятно почему при работе нашей системы процессор не загружается на 100%. В нашей системе работает 50-350 потоков, которые выполняют разные задачи. При этом каждая задача запрашивает веб-страницы, что-то записывает/считывает из БД и файловой системы.

А>Я думал, что это является как раз следствием того, что потоку, например, номер 123 выделяется квант времени (предположим 10 мс), этот поток выполняется 2 мс, отправляя запрос на получение веб-страницы и начинает простаивать, ожидая ответа и процессор эти 8 мс простаивает вместе с ним.
А>Если это не так и эти 8 мс могут быть сразу отданы другому потоку на выполнение, почему тогда процессор не нагружается на 100%? (у 350 потоков однозначно есть работа, чтобы нагрузить 2-ух ядреный процессор и СУБД при этом не нагружена более чем на 3-5%)

А переключение потоков? Что-то попахивает бредом.
Re[4]: Умеет ли винда "отбирать квант времени", выделенный п
От: Аноним  
Дата: 16.12.10 11:18
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, sgenie, Вы писали:


S>>>Если поток ставит себя в ожидающее состояние (например, ждет события), то система не дает ему кванта до тех пор, пока поток не сигнализирован как активныи.


А>>Тогда не совсем понятно почему при работе нашей системы процессор не загружается на 100%. В нашей системе работает 50-350 потоков, которые выполняют разные задачи. При этом каждая задача запрашивает веб-страницы, что-то записывает/считывает из БД и файловой системы.

А>>Я думал, что это является как раз следствием того, что потоку, например, номер 123 выделяется квант времени (предположим 10 мс), этот поток выполняется 2 мс, отправляя запрос на получение веб-страницы и начинает простаивать, ожидая ответа и процессор эти 8 мс простаивает вместе с ним.
А>>Если это не так и эти 8 мс могут быть сразу отданы другому потоку на выполнение, почему тогда процессор не нагружается на 100%? (у 350 потоков однозначно есть работа, чтобы нагрузить 2-ух ядреный процессор и СУБД при этом не нагружена более чем на 3-5%)

B>А переключение потоков? Что-то попахивает бредом.


можешь пояснить почему бредом? Когда в системе работает несколько сотен потоков, то они поочередно выполняются на процессоре (имеется ввиду код, который выполняет поток). разве не так?
Re[5]: Умеет ли винда "отбирать квант времени", выделенный п
От: blackhearted Украина  
Дата: 16.12.10 11:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, blackhearted, Вы писали:


B>>Здравствуйте, Аноним, Вы писали:


А>>>Здравствуйте, sgenie, Вы писали:


S>>>>Если поток ставит себя в ожидающее состояние (например, ждет события), то система не дает ему кванта до тех пор, пока поток не сигнализирован как активныи.


А>>>Тогда не совсем понятно почему при работе нашей системы процессор не загружается на 100%. В нашей системе работает 50-350 потоков, которые выполняют разные задачи. При этом каждая задача запрашивает веб-страницы, что-то записывает/считывает из БД и файловой системы.

А>>>Я думал, что это является как раз следствием того, что потоку, например, номер 123 выделяется квант времени (предположим 10 мс), этот поток выполняется 2 мс, отправляя запрос на получение веб-страницы и начинает простаивать, ожидая ответа и процессор эти 8 мс простаивает вместе с ним.
А>>>Если это не так и эти 8 мс могут быть сразу отданы другому потоку на выполнение, почему тогда процессор не нагружается на 100%? (у 350 потоков однозначно есть работа, чтобы нагрузить 2-ух ядреный процессор и СУБД при этом не нагружена более чем на 3-5%)

B>>А переключение потоков? Что-то попахивает бредом.


А>можешь пояснить почему бредом? Когда в системе работает несколько сотен потоков, то они поочередно выполняются на процессоре (имеется ввиду код, который выполняет поток). разве не так?


Начнём издалека... Вы как "нагрузку процессора" и "СУБД" смотрите?
Re[6]: Умеет ли винда "отбирать квант времени", выделенный п
От: Аноним  
Дата: 16.12.10 11:48
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, blackhearted, Вы писали:


B>>>Здравствуйте, Аноним, Вы писали:


А>>>>Здравствуйте, sgenie, Вы писали:


S>>>>>Если поток ставит себя в ожидающее состояние (например, ждет события), то система не дает ему кванта до тех пор, пока поток не сигнализирован как активныи.


А>>>>Тогда не совсем понятно почему при работе нашей системы процессор не загружается на 100%. В нашей системе работает 50-350 потоков, которые выполняют разные задачи. При этом каждая задача запрашивает веб-страницы, что-то записывает/считывает из БД и файловой системы.

А>>>>Я думал, что это является как раз следствием того, что потоку, например, номер 123 выделяется квант времени (предположим 10 мс), этот поток выполняется 2 мс, отправляя запрос на получение веб-страницы и начинает простаивать, ожидая ответа и процессор эти 8 мс простаивает вместе с ним.
А>>>>Если это не так и эти 8 мс могут быть сразу отданы другому потоку на выполнение, почему тогда процессор не нагружается на 100%? (у 350 потоков однозначно есть работа, чтобы нагрузить 2-ух ядреный процессор и СУБД при этом не нагружена более чем на 3-5%)

B>>>А переключение потоков? Что-то попахивает бредом.


А>>можешь пояснить почему бредом? Когда в системе работает несколько сотен потоков, то они поочередно выполняются на процессоре (имеется ввиду код, который выполняет поток). разве не так?


B>Начнём издалека... Вы как "нагрузку процессора" и "СУБД" смотрите?


Нагрузку процессора смотрю через диспетчер задач. Нагрузку СУБД лично не смотрю, она хостится не у нас — сисадмин говорит, что нагрузка не превышает 5%.
Re[3]: Умеет ли винда "отбирать квант времени", выделенный п
От: drol  
Дата: 16.12.10 11:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если это не так и эти 8 мс могут быть сразу отданы другому потоку на выполнение, почему тогда процессор не нагружается на 100%?


Потому что Ваша толпа потоков ждёт завершения каких-то операций ввода\вывода.

А>(у 350 потоков однозначно есть работа, чтобы нагрузить 2-ух ядреный процессор


Почему Вы так решили ? У Вас там какие-то мегавычислительные задачи в оных потоках ?

А>и СУБД при этом не нагружена более чем на 3-5%)


Аналогично. СУБД значит тоже упирается в ввод\вывод. В сетевой, например.
Re[3]: Умеет ли винда "отбирать квант времени", выделенный п
От: Jolly Roger  
Дата: 16.12.10 11:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если это не так и эти 8 мс могут быть сразу отданы другому потоку на выполнение, почему тогда процессор не нагружается на 100%? (у 350 потоков однозначно есть работа, чтобы нагрузить 2-ух ядреный процессор и СУБД при этом не нагружена более чем на 3-5%)


Значит, есть периоды, когда ни одному из Ваших потоков нечем заняться. Может это нормально, а может — следствие злоупотребления средствами синхронизации. Также, если Вы следили за загрузкой CPU только Вашим процессом, то возможно, что часть времени отдаётся потокам других процессов.
"Нормальные герои всегда идут в обход!"
Re[4]: Умеет ли винда "отбирать квант времени", выделенный п
От: Аноним  
Дата: 16.12.10 12:00
Оценка:
Здравствуйте, drol, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


А>>Если это не так и эти 8 мс могут быть сразу отданы другому потоку на выполнение, почему тогда процессор не нагружается на 100%?


D>Потому что Ваша толпа потоков ждёт завершения каких-то операций ввода\вывода.


Вот в этом и был изначальный вопрос — если поток ждет завершение операций ввода/вывода, может ли квантовое время, выделенное этому потоку (который использует его чтобы просто "ждать"), быть выделено сразу же другому потоку, который может использовать его с пользой. Пример тот же, который уже приводил: потоку номер 123 выделяется квант времени (предположим 10 мс), этот поток выполняется 2 мс, отправляя запрос на получение веб-страницы и начинает простаивать, ожидая ответа. Может ли винда выделить эти 8 мс другому потоку, чтобы процессор не простаивал вообще?

А>>(у 350 потоков однозначно есть работа, чтобы нагрузить 2-ух ядреный процессор


D>Почему Вы так решили ? У Вас там какие-то мегавычислительные задачи в оных потоках ?


Вцелом да. Загружается страница, и распарсивается регулярными выражениями. Обработка одной страницы может доходить до минуты. То есть получается, при 350 подобных задач процессор должен быть всегда нагружен на 100%, так как всегда найдутся хотябы 2 потока, которые как раз будут заниматься распарсиванием страниц (хотя их на самом деле больше порядока 70-90 %). Но процессор никогда не бывает нагруженным на 100%. Еть узкие места в виде ожидания отклика от веб-сервера (4-40 сек). Но зачем процессору в это время простаивать, когда есть еще сотня других потоков, который занимаются парсингом страниц?
Re: Умеет ли винда "отбирать квант времени", выделенный пото
От: Spinifex Россия https://architecture-cleaning.ru/
Дата: 16.12.10 12:07
Оценка: -1
Здравствуйте, Аноним, Вы писали:

Может быть не винда должна отбирать что-то у потока, а сам поток должен сообщать что кванты ему не нужны?
В частности вызов Thread.SpinWait(1) вызовет переключение контекста без suspend'инга потока.
Re[5]: Умеет ли винда "отбирать квант времени", выделенный п
От: Alexey Sudachen Чили  
Дата: 16.12.10 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:

>Вцелом да. Загружается страница, и распарсивается регулярными выражениями. Обработка одной страницы может доходить до минуты. То есть получается, при 350 подобных задач процессор должен быть всегда нагружен на 100%, так как всегда найдутся хотябы 2 потока, которые как раз будут заниматься распарсиванием страниц (хотя их на самом деле больше порядока 70-90 %). Но процессор никогда не бывает нагруженным на 100%. Еть узкие места в виде ожидания отклика от веб-сервера (4-40 сек). Но зачем процессору в это время простаивать, когда есть еще сотня других потоков, который занимаются парсингом страниц?


И в процессе это деятельности нет никаких блокирующих поток действий? Ну там в хипе чего-нить выделить, к примеру?
Re[2]: Умеет ли винда "отбирать квант времени", выделенный п
От: Аноним  
Дата: 16.12.10 12:13
Оценка:
Здравствуйте, Spinifex, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


S>Может быть не винда должна отбирать что-то у потока, а сам поток должен сообщать что кванты ему не нужны?

S>В частности вызов Thread.SpinWait(1) вызовет переключение контекста без suspend'инга потока.

А при синхронном запросе страницы через HttpWebRequest этот метод вызывается? При синхроннозм запросе самому его не вызвать (до запроса "еще рано", а после запроса "уже поздно")
Re[2]: Умеет ли винда "отбирать квант времени", выделенный п
От: drol  
Дата: 16.12.10 12:13
Оценка:
Здравствуйте, Spinifex, Вы писали:

S>Может быть не винда должна отбирать что-то у потока, а сам поток должен сообщать что кванты ему не нужны?

S>В частности вызов Thread.SpinWait(1) вызовет переключение контекста без suspend'инга потока.

А SpinWait() надо вообще запретить\заобсолетить. На нынешних сильномногоядерных девайсах никакой пользы от него нет, наоборот ухудшение сплошное.
Re[7]: Умеет ли винда "отбирать квант времени", выделенный п
От: Alexey Sudachen Чили  
Дата: 16.12.10 12:16
Оценка:
А>Нагрузку процессора смотрю через диспетчер задач. Нагрузку СУБД лично не смотрю, она хостится не у нас — сисадмин говорит, что нагрузка не превышает 5%.

А это диспетчер процессорное время ядра показывает?
Re[6]: Умеет ли винда "отбирать квант времени", выделенный п
От: Аноним  
Дата: 16.12.10 12:21
Оценка:
Здравствуйте, Alexey Sudachen, Вы писали:

AS>Здравствуйте, Аноним, Вы писали:


>>Вцелом да. Загружается страница, и распарсивается регулярными выражениями. Обработка одной страницы может доходить до минуты. То есть получается, при 350 подобных задач процессор должен быть всегда нагружен на 100%, так как всегда найдутся хотябы 2 потока, которые как раз будут заниматься распарсиванием страниц (хотя их на самом деле больше порядока 70-90 %). Но процессор никогда не бывает нагруженным на 100%. Еть узкие места в виде ожидания отклика от веб-сервера (4-40 сек). Но зачем процессору в это время простаивать, когда есть еще сотня других потоков, который занимаются парсингом страниц?


AS>И в процессе это деятельности нет никаких блокирующих поток действий? Ну там в хипе чего-нить выделить, к примеру?


Ты имеешь ввиду выделение памяти для нужд потока? Это может блокировать поток и вести к тому, что процессор будет просто простаивать? Явно поток мы не блокируем.
Re[5]: Умеет ли винда "отбирать квант времени", выделенный п
От: drol  
Дата: 16.12.10 12:28
Оценка:
D>>Потому что Ваша толпа потоков ждёт завершения каких-то операций ввода\вывода.

А>Вот в этом и был изначальный вопрос —


Если Ваши потоки упираются в ввод\вывод, то загрузить процессор на 100% можно только в случае бесконечного числа таких потоков. Во всех остальных раскладах всегда наступает момент, когда все сидят и ждут I\O...

А>Вцелом да. Загружается страница, и распарсивается регулярными выражениями. Обработка одной страницы может доходить до минуты. То есть получается, при 350 подобных задач процессор должен быть всегда нагружен на 100%, так как всегда найдутся хотябы 2 потока, которые как раз будут заниматься распарсиванием страниц (хотя их на самом деле больше порядока 70-90 %).


Ничего подобного. Если у Вас медленные клиенты, например, то в итоге все Ваши 350 потоков будут сидеть и ждать пока отошлются ответы.

А>Еть узкие места в виде ожидания отклика от веб-сервера (4-40 сек). Но зачем процессору в это время простаивать, когда есть еще сотня других потоков, который занимаются парсингом страниц?


Он и не простаивает. Просто нет готовых потоков — у Вас же их фиксированное количество.
Re[7]: Умеет ли винда "отбирать квант времени", выделенный п
От: drol  
Дата: 16.12.10 12:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ты имеешь ввиду выделение памяти для нужд потока? Это может блокировать поток и вести к тому, что процессор будет просто простаивать?


Это может приводить к гораздо худшему. А именно к блокировке целой толпы потоков, если они вдруг тоже захотят повыделять память в это же самое время.
Re[3]: Умеет ли винда "отбирать квант времени", выделенный п
От: Аноним  
Дата: 16.12.10 12:42
Оценка:
Здравствуйте, drol, Вы писали:

D>А SpinWait() надо вообще запретить\заобсолетить. На нынешних сильномногоядерных девайсах никакой пользы от него нет, наоборот ухудшение сплошное.

Ухудшение? а поподробней?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.