Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 20.10.05 12:43
Оценка: 3 (3) +1 -2
Тут на прошлой неделе довелось мне домашними делами заняться. В общем, 3 дела было, причем каждое из них делаться могло урывками — часть сделал, подождал результата, потом следующую часть и т.д.

Как программист, решил делать все это в многопоточном режиме. Естественно, делать дело A в паузах B или C не получилось. Так что иногда прерывал А в середине очередного кванта , отвлекался на B, потом возвращался к А и т.д. Критерий — закончить все 3 дела как можно быстрее .

Не скажу, что алгоритм был оптимальный. Уж одно точно — предварительное планирование не проводилось . Действовал по принципу реакции на ситуацию — в каждый момент решал, что лучше — отвлечься от А и переключиться на В, или пусть В подождет, потом в А будет большая пауза (знаю), вот тогда В и займемся. И т.д.

Сделал все и подумал. А что, если бы в соседней комнате кто-то сидел и не видя, что я сейчас делаю, мне команды давать начал , типа "брось А, переходи к В" и т.д. Ну то. что я бы от таких команд озверел — ладно, не в этом дело. Но вот закончил бы я скорее всего намного позже. Мне-то лучше знать, когда чем стоит заниматься.

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

Только не надо мне про приоритеты потоков говорить. Устанавливать их надолго — неприлично это, потому как это не один ваш поток за
счет другого берет, а берет он за счет всех (многих, по крайней мере) других потоков.

А между тем в Win API есть средство для ручного шедулинга — фиберы. Вот, цитирую

A fiber is a unit of execution that must be manually scheduled by the application. Fibers run in the context of the threads that schedule them. Each thread can schedule multiple fibers. In general, fibers do not provide advantages over a well-designed multithreaded application. However, using fibers can make it easier to port applications that were designed to schedule their own threads

Как раз получается ситуация, которую я описал.

Устроил я голосование

http://www.rsdn.ru/poll/1273.aspx
Автор: Pavel Dvorkin
Дата: 12.10.05
Вопрос: Испоользовали ли Вы когда-либо фиберы (fibers) в своих программах ?


и , похоже, результат его можно занести в книгу рекордов RSDN, если такая появится (а кстати, не сделать ли ?). 100% единодушие — фиберы не использует никто.

(В скобках — весьма существенный фактор. что их нет в 9x. Но и те, кто пишет программы для NT только, сервисы, к примеру, их, видимо, тоже не использует)

Я не агитирую за фиберы . Отнюдь нет. Я их тоже не использовал никогда. Меня другое интересует — есть ли рациональное зерно в том. чтобы взять управление шедулингом на себя в Windows. Подчеркиваю, именно в Win32 и обычных языках (С++, Pascal, VB), о всяких языках с внутренней поддержкой многопоточности я предлагаю здесь не говорить.

Сам шедулинг устроить не сложно. К примеру, через таймер, как ОС и делает у себя внутри. Получаем сигнал от таймера и переключаемся на тот фибер, который, по нашему мнению, больше всего сейчас достоин. Иными словами, на приоритеты и квантование в ОС мы не посягаем, сколько времени дадут, столько и дадут, но вот распорядиться им попробуем сами, а не предоставим это ОС.

Кто что думает ?
With best regards
Pavel Dvorkin
Re: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 20.10.05 12:55
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Устроил я голосование


PD>http://www.rsdn.ru/poll/1273.aspx
Автор: Pavel Dvorkin
Дата: 12.10.05
Вопрос: Испоользовали ли Вы когда-либо фиберы (fibers) в своих программах ?


PD>и , похоже, результат его можно занести в книгу рекордов RSDN, если такая появится (а кстати, не сделать ли ?). 100% единодушие — фиберы не использует никто.


Уже не 100%. Я проголосовал.

Отчет по файберам
Автор: Gaperton
Дата: 23.04.05


Кстати, насчет своего шедулера — написать хороший шедулер не так просто. Кстати, кроме шедулера придется реализовать самому примитивы синхронизации. Но результат того стоит. В ряде случаев.
Re: Немного о многопоточности
От: GlebZ Россия  
Дата: 20.10.05 13:10
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Кто что думает ?

В подавляющем количестве систем они бессмыслены. Имеет смысл только для систем с балансировкой нагрузки для задач, что большая редкость. Вообще, многопоточность — вещь конечно хорошая, но стремная. Легко сделать ошибку, но очень сложно ее отловить. Поэтому лучшая программа это та, которая локализует ее воздействие в определенных местах, и как можно меньше вмешивается в ее работу.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Немного о многопоточности
От: ie Россия http://ziez.blogspot.com/
Дата: 21.10.05 03:25
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А вот в Windows мы именно так себя и ведем. Передоверили ОС все планирование и надеемся на ее мудрость. А она, между прочим, эту мудрость в рамках системы реализует, а не моего процесса. А мне бы интересно свой процесс пооптимальнее сделать.


Я что-то не понимаю, а в других ОС не так обстоят дела?
Превратим окружающую нас среду в воскресенье.
Re: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.10.05 04:56
Оценка: 10 (3) +2
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>Сделал все и подумал. А что, если бы в соседней комнате кто-то сидел и не видя, что я сейчас делаю, мне команды давать начал , типа "брось А, переходи к В" и т.д. Ну то. что я бы от таких команд озверел — ладно, не в этом дело. Но вот закончил бы я скорее всего намного позже. Мне-то лучше знать, когда чем стоит заниматься.


PD>А вот в Windows мы именно так себя и ведем.

К сожалению, это кривая аналогия. Не так мы себя ведем. Это коммунальная квартира с толпой жильцов, которые совместно используют ограниченное количество ресурсов. И каждый из них представления не имеет о том, какие задачи стоят перед остальными. Жильцы могут договориться о некоторых правилах (туалет надолго не занимать). Но один злонамеренно или случайно нарушивший правила блокирует всех остальных.
PD>Передоверили ОС все планирование и надеемся на ее мудрость. А она, между прочим, эту мудрость в рамках системы реализует, а не моего процесса. А мне бы интересно свой процесс пооптимальнее сделать.
Делай — кто тебе запрещает? Система рулит тобой на уровне "стой" — "беги". А уж чем тебе при этом "беги" заниматься — лично твое дело.
PD>А между тем в Win API есть средство для ручного шедулинга — фиберы.
Есть.
PD>Как раз получается ситуация, которую я описал.
PD>Устроил я голосование
PD>и , похоже, результат его можно занести в книгу рекордов RSDN, если такая появится (а кстати, не сделать ли ?). 100% единодушие — фиберы не использует никто.
PD>(В скобках — весьма существенный фактор. что их нет в 9x. Но и те, кто пишет программы для NT только, сервисы, к примеру, их, видимо, тоже не использует)
Они нужны очень-очень-очень редко.
PD>Я не агитирую за фиберы . Отнюдь нет. Я их тоже не использовал никогда. Меня другое интересует — есть ли рациональное зерно в том. чтобы взять управление шедулингом на себя в Windows.
Для ответа на этот вопрос надо задаться другим вопросом: "а нафига вообще нужен шедулинг?" И тогда станет понятно, что собственно вся идея шедулинга — в том, чтобы обеспечить эффективное использование ресурсов. И "тонкое руление" в этом смысле не особенно лучше, чем "толстое". Я спрашивал как-то на лекциях по ОС, не стоит ли применять в шедулере более продвинутые алгоритмы, чем LRU и "кто не ждет на блокировке, того и пустим". Оказалось, что нет, т.к. расходы на управление превышают выигрышь.

Основное рациональное зерно в ручном управлении шедулингом состоит в минимизации переключений потоков. Винда, действительно, имеет очень ограниченное представление о сути деятельности переключаемого потока. Поэтому ей приходится делать операцию переключения достаточно дорогостоящей. В некоторых частных случаях может оказаться эффективнее использовать фиберы, т.к. переключение фибера гораздо дешевле. Ну и сами расходы на фибер меньше.
Тем не менее, примеров приложений, которые их используют, очень мало.
Вообще многопоточных приложений пока что мало (исключая сервера, которые построены в рамках фреймворков со встроенным обеспечением многопотоковости). Потому что сложно это — многопотоковое приложение написать. Головой думать больше приходится. Я вот никак не мог этого сделать, пока не начал с SQL работать — потому, что там как раз все можно в действии отследить, и все зависимости увидеть, и т.п.
А с файберами надо о еще более низком уровне думать. Обычно овчинка не стоит выделки.

PD>Сам шедулинг устроить не сложно. К примеру, через таймер, как ОС и делает у себя внутри. Получаем сигнал от таймера и переключаемся на тот фибер, который, по нашему мнению, больше всего сейчас достоин.

Очень-очень наивное представление о том, как это сделать. Во-первых, файберы сами по себе кооперативны, и сделать вытесняющий шедулер на их основе невозможно. Во-вторых, собака зарыта внутри "больше всего сейчас достоин". Нужна конкретная идея, как вычислять этот размер достоинства. А также аргументация того, что этот алгоритм будет грузить ресурсы эффективнее, чем стандартный алгоритм шедулера в винде (а там, кстати, AFAIK, используется довольно-таки нетривиальная механика). Если нет ни того, ни другого, то использование фиберов — это способ бездарно убить свое время.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 21.10.05 05:50
Оценка:
Здравствуйте, Gaperton, Вы писали:


G>Уже не 100%. Я проголосовал.


Что же ты наделал! Лишил меня рекорда!

G>Отчет по файберам
Автор: Gaperton
Дата: 23.04.05


G>Кстати, насчет своего шедулера — написать хороший шедулер не так просто.


+1
With best regards
Pavel Dvorkin
Re: Немного о многопоточности
От: FR  
Дата: 21.10.05 05:53
Оценка: 1 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>и , похоже, результат его можно занести в книгу рекордов RSDN, если такая появится (а кстати, не сделать ли ?). 100% единодушие — фиберы не использует никто.


иногда используют

PD>(В скобках — весьма существенный фактор. что их нет в 9x. Но и те, кто пишет программы для NT только, сервисы, к примеру, их, видимо, тоже не использует)


вообще то их нет только в Win95, в 98 и выше они есть.

PD>Я не агитирую за фиберы . Отнюдь нет. Я их тоже не использовал никогда. Меня другое интересует — есть ли рациональное зерно в том. чтобы взять управление шедулингом на себя в Windows. Подчеркиваю, именно в Win32 и обычных языках (С++, Pascal, VB), о всяких языках с внутренней поддержкой многопоточности я предлагаю здесь не говорить.


А что не нравится? при желании и сейчас можно писать многопоточные программы используя только фиберы. Но по моему нужны оба варианта и нормальные и легкие потоки. Некторые вещи очень хорошо ложатся на легкие потоки и сопрограммы, а для других просто не обойтись без тяжелых потоков.
Re[2]: Немного о многопоточности
От: FR  
Дата: 21.10.05 06:03
Оценка: 1 (1) +1
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Кто что думает ?

GZ>В подавляющем количестве систем они бессмыслены. Имеет смысл только для систем с балансировкой нагрузки для задач, что большая редкость. Вообще, многопоточность — вещь конечно хорошая, но стремная. Легко сделать ошибку, но очень сложно ее отловить. Поэтому лучшая программа это та, которая локализует ее воздействие в определенных местах, и как можно меньше вмешивается в ее работу.

Когда пишешь с использованием легких потоков (фиберы, генераторы в скриптовых языках) логика совсем другая, есть полный контроль над потоком управления и вероятность ошибок гораздо меньше чем для "нормальных" потоков.
Re[2]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 21.10.05 06:15
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Pavel Dvorkin, Вы писали:



PD>>Сделал все и подумал. А что, если бы в соседней комнате кто-то сидел и не видя, что я сейчас делаю, мне команды давать начал , типа "брось А, переходи к В" и т.д. Ну то. что я бы от таких команд озверел — ладно, не в этом дело. Но вот закончил бы я скорее всего намного позже. Мне-то лучше знать, когда чем стоит заниматься.


PD>>А вот в Windows мы именно так себя и ведем.

S>К сожалению, это кривая аналогия. Не так мы себя ведем. Это коммунальная квартира с толпой жильцов, которые совместно используют ограниченное количество ресурсов. И каждый из них представления не имеет о том, какие задачи стоят перед остальными. Жильцы могут договориться о некоторых правилах (туалет надолго не занимать). Но один злонамеренно или случайно нарушивший правила блокирует всех остальных.

+1. Но я, может быть, неудачено выразился. Я имею в виду, что в рамках того времени, которое нам Windows отдает, мы ей позволяем решать, когда какому из наших потоков что делать. А то, что мы могли бы у чужих потоков время позаимствовать — это и так ясно.

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

S>Делай — кто тебе запрещает? Система рулит тобой на уровне "стой" — "беги". А уж чем тебе при этом "беги" заниматься — лично твое дело.

Так я об этом и говорю

PD>>(В скобках — весьма существенный фактор. что их нет в 9x. Но и те, кто пишет программы для NT только, сервисы, к примеру, их, видимо, тоже не использует)

S>Они нужны очень-очень-очень редко.

Или же о них просто мало кто знает

поиск по RSDN

поток 93495
фибер 41


PD>>Я не агитирую за фиберы . Отнюдь нет. Я их тоже не использовал никогда. Меня другое интересует — есть ли рациональное зерно в том. чтобы взять управление шедулингом на себя в Windows.

S>Для ответа на этот вопрос надо задаться другим вопросом: "а нафига вообще нужен шедулинг?" И тогда станет понятно, что собственно вся идея шедулинга — в том, чтобы обеспечить эффективное использование ресурсов. И "тонкое руление" в этом смысле не особенно лучше, чем "толстое". Я спрашивал как-то на лекциях по ОС, не стоит ли применять в шедулере более продвинутые алгоритмы, чем LRU и "кто не ждет на блокировке, того и пустим".

Есть разница. Хоть какой алгоритм применяй в ОС — ОС не знает и не может знать, чем потоки занимаются сейчас. Ну разве что за вычетом потоков из System . Поэтому она с ними вынуждена обращаться по принципу "всем сестрам по серьгам", пока, конечно, приоритеты не поставлены. Вот представь себе ОС, которая только на себя работает, т.е. весь исполняемый в ней код — ее собственный код . Авторы такой ОС, может быть и вытесняющую многопоточность делать не будут вообще — просто шедулер будет принимать решение, какой код сейчас выполнять. Потому что, собственно говоря, и потоков как таковых не будет (я имею в виду не объект ядра, а идею).


PD>>Сам шедулинг устроить не сложно. К примеру, через таймер, как ОС и делает у себя внутри. Получаем сигнал от таймера и переключаемся на тот фибер, который, по нашему мнению, больше всего сейчас достоин.

S>Очень-очень наивное представление о том, как это сделать. Во-первых, файберы сами по себе кооперативны, и сделать вытесняющий шедулер на их основе невозможно.

Именно. И не надо. Кооперативная многозадачность вообще-то эффективнее. Она по другим причинам неприемлема в рамках ОС, но не внутри моего процесса. Внутри него мне не надо вытесняющей многозадачности. Смысла нет — зачем мне вытеснять случайным образом, когда можно принять решение на основе имеющейся информации. Мой процесс-то, в отличие от ОС, хорошо знает, какой фибер у него чем занимается и в каком у него состоянии дела.

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


Эта идея может быть только в рамках той задачи, которая реализуется. Грубо говоря — если Вы набираете команду для постройки дома, то как руководитель Вы и решаете, куда сейчас основные ресурсы бросить сейчас, а куда потом, так, чтобы в итоге дом был быстрее построен. И совсем не уверен, что этот опыт Вам прямо пригодится, если Вы наберете команду поваров и дадите им заданме изготовить обед для приема . В общем, сетевое планирование и т.д.
With best regards
Pavel Dvorkin
Re[3]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 21.10.05 06:23
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>поиск по RSDN


PD>поток 93495

PD>фибер 41

добавь еще "файбер" и "fiber"
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[3]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.10.05 07:19
Оценка: 3 (1) +2
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Потому что, собственно говоря, и потоков как таковых не будет (я имею в виду не объект ядра, а идею).
PD>>>Сам шедулинг устроить не сложно. К примеру, через таймер, как ОС и делает у себя внутри. Получаем сигнал от таймера и переключаемся на тот фибер, который, по нашему мнению, больше всего сейчас достоин.
S>>Очень-очень наивное представление о том, как это сделать. Во-первых, файберы сами по себе кооперативны, и сделать вытесняющий шедулер на их основе невозможно.

PD>Именно. И не надо. Кооперативная многозадачность вообще-то эффективнее. Она по другим причинам неприемлема в рамках ОС, но не внутри моего процесса. Внутри него мне не надо вытесняющей многозадачности. Смысла нет — зачем мне вытеснять случайным образом, когда можно принять решение на основе имеющейся информации.

Гм. Ты точно говоришь о той вытесняющей многозадачности, о которой я? Она характеризуется вовсе не случайностью вытеснения. А тем, кто принимает решение. В кооперативной многозадачности решение о передаче управления принимает поток. А в вытесняющей — шедулер.
PD>Мой процесс-то, в отличие от ОС, хорошо знает, какой фибер у него чем занимается и в каком у него состоянии дела.
Это все словоблудие, пока мы не определили понятия "знает", "состояние", "дела".
PD>Эта идея может быть только в рамках той задачи, которая реализуется. Грубо говоря — если Вы набираете команду для постройки дома, то как руководитель Вы и решаете, куда сейчас основные ресурсы бросить сейчас, а куда потом, так, чтобы в итоге дом был быстрее построен. И совсем не уверен, что этот опыт Вам прямо пригодится, если Вы наберете команду поваров и дадите им заданме изготовить обед для приема . В общем, сетевое планирование и т.д.

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


На таком уровне рассуждений мы ни к чему не придем. Потому, что ответ на вопрос "А могут ли существовать ситуации, когда существует более эффективный способ управлять ресурсами системы, чем отдавать управление шедулеру" — "да, могут". Но пользы в нем 0. Могут, ну и что? Может, их на практике не встречается.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Немного о многопоточности
От: Cyberax Марс  
Дата: 21.10.05 07:25
Оценка: +1 -1
Sinclair wrote:

> На таком уровне рассуждений мы ни к чему не придем. Потому, что ответ

> на вопрос "А могут ли существовать ситуации, когда существует более
> эффективный способ управлять ресурсами системы, чем отдавать
> управление шедулеру" — "да, могут". Но пользы в нем 0.Могут, ну и что?

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

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[4]: Немного о многопоточности
От: oleksab Украина  
Дата: 21.10.05 08:14
Оценка: :)
Здравствуйте, Sinclair, Вы писали:
PD>>Именно. И не надо. Кооперативная многозадачность вообще-то эффективнее. Она по другим причинам неприемлема в рамках ОС, но не внутри моего процесса. Внутри него мне не надо вытесняющей многозадачности. Смысла нет — зачем мне вытеснять случайным образом, когда можно принять решение на основе имеющейся информации.

S>Гм. Ты точно говоришь о той вытесняющей многозадачности, о которой я? Она характеризуется вовсе не случайностью вытеснения. А тем, кто принимает решение. В кооперативной многозадачности решение о передаче управления принимает поток. А в вытесняющей — шедулер.


Помнится мне, в Windows 3.11 поток мог принять решение, что никому он не передаст управление
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[5]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.10.05 09:05
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Ну во-первых, не нужна синхронизация (так как волокна не работают

C>параллельно).
Гм. Вот тут есть некоторое непонимание с моей стороны. Если фибер не работает параллельно, то нафиг он вообще такой нужен? А если фиберы все таки работают параллельно, то нужны какие-то примитивы синхронизации.
C> Во-вторых, с помощью волокон можно делать сопрограммы.
С этим у меня в голове сложнее. Я не вполне понимаю, что такое сопрограммы, и, по-моему, без поддержки со стороны языка программирования сочинять их крайне трудно.
C>В-третьих, волокон может быть МНОГО без всякой дополнительной нагрузки
C>на планировщик.
Ну как же без нагрузки? Мы же собираемся писать свой планировщик, верно? Потому что без планировщика фиберы вряд ли смогут работать согласованно.
Я понимаю, что наш планировщик может работать дешевле системного. Вопрос — насколько.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.10.05 09:42
Оценка:
Здравствуйте, oleksab, Вы писали:

O> Помнится мне, в Windows 3.11 поток мог принять решение, что никому он не передаст управление

Совершенно верно. В три-одиннадцатой была кооперативная многозадачность.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 21.10.05 10:28
Оценка: 1 (1) +2 :)
Здравствуйте, Sinclair, Вы писали:

PD>>Сам шедулинг устроить не сложно. К примеру, через таймер, как ОС и делает у себя внутри. Получаем сигнал от таймера и переключаемся на тот фибер, который, по нашему мнению, больше всего сейчас достоин.

S>Очень-очень наивное представление о том, как это сделать. Во-первых, файберы сами по себе кооперативны, и сделать вытесняющий шедулер на их основе невозможно.

Во-первых, ты не прав — это на самом деле сделать возможно. Достаточно шедулер (или его часть) запустить в другом потоке, который будет делать отсечку по времени, и все. Видишь ли в чем дело — SwitchToFiber можно вызывать из другого потока — это совсем не обязательно делать из активного файбера.

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

Далее, хочу заметить, что невытесняющий характер многозадачности — это на самом деле огромный плюс, как это ни странно. Приложение писать, отлаживать, и верифицировать гораздо проще, если количество мест, в котором поток может прерваться ограничено, и ты их знаешь. Если подойти к делу с умом — станет ясно, что от большей части кода не требуется реентерабельности. Что очень круто.

S>Во-вторых, собака зарыта внутри "больше всего сейчас достоин". Нужна конкретная идея, как вычислять этот размер достоинства. А также аргументация того, что этот алгоритм будет грузить ресурсы эффективнее, чем стандартный алгоритм шедулера в винде (а там, кстати, AFAIK, используется довольно-таки нетривиальная механика).


Ресурсы, т.е. CPU, "эффективнее" нагрузить нельзя. Этот аргумент вообще идет мимо — он не из той области. Можно нагрузить поровну, или дать кому-то приоритет .

S>Если нет ни того, ни другого, то использование фиберов — это способ бездарно убить свое время.

Синклер, если мозгов в голове нет, то любое занятие — отличный способ бездарно убить время. Ты зачем это написал — Дворкина подозреваешь в идиотизме? Или хочешь предостеречь от опрометчивого шага программеров-идиотов? Так как это бесполезно, я тебе лучше порекламирую файберы.

"Пробовал ли ты? А ты попробуй!" Тебе надоели тред-пулы? Задолбали "паттерны" параллельного проектирования? Хочется чтоб алгоритмы выглядели по человечески — свой "поток" на каждую истинно параллельную активность в системе? Чтобы их крутились десятки тысяч, и все было нормально? Нет времени и желания рефакторить старый код, чтобы он стал thread-safe? Тогда пиши свой файберный планировщик, в котором любая операция O(1) — задачка, скажу тебе, не слишком простая , но и не очень сложная — я уложился в 468 строк на С++.
Re[6]: Немного о многопоточности
От: Cyberax Марс  
Дата: 21.10.05 10:52
Оценка: +2
Sinclair wrote:

> C>Ну во-первых, не нужна синхронизация (так как волокна не работают

> C>параллельно).
> Гм. Вот тут есть некоторое непонимание с моей стороны. Если фибер не
> работает параллельно, то нафиг он вообще такой нужен?

Для сопрограмм, например.

> А если фиберы все таки работают параллельно, то нужны какие-то

> примитивы синхронизации.

В этом случае нужны.

> C> Во-вторых, с помощью волокон можно делать сопрограммы.

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

Простейший пример сопрограмм — это yield в C# 2.

> C>В-третьих, волокон может быть МНОГО без всякой дополнительной нагрузки

> C>на планировщик.
> Ну как же без нагрузки? Мы же собираемся писать свой планировщик, верно?

Не обязательно писать планировщик (например в случае с сопрограммами).

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[2]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 11:17
Оценка: 3 (1) :)
Здравствуйте, Sinclair, Вы писали:

S>...А также аргументация того, что этот алгоритм будет грузить ресурсы эффективнее, чем стандартный алгоритм шедулера в винде (а там, кстати, AFAIK, используется довольно-таки нетривиальная механика). Если нет ни того, ни другого, то использование фиберов — это способ бездарно убить свое время.


Мне кажется, что у уважаемого Pavel-а Dvorkin-а одна из главных задач — убить свое время. Он все время интересуется разными тонкими вопросами которые по сути интереса не представляют. Основной его посыл "нужно экономить на всем". Жаль что в это "все" не входит собственное время и время окружающих.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 11:17
Оценка: +1
Здравствуйте, Andrei N.Sobchuck, Вы писали:

PD>>поток 93495

PD>>фибер 41

ANS>добавь еще "файбер" и "fiber"


Еще зеленые и легкие потоки (причем как по-русски, так и по-английски), ну, и нужно вспомнить, что потоками называют еще ручу вещей вроде потоков вода-вывода.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 11:17
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Sinclair wrote:


>> На таком уровне рассуждений мы ни к чему не придем. Потому, что ответ

>> на вопрос "А могут ли существовать ситуации, когда существует более
>> эффективный способ управлять ресурсами системы, чем отдавать
>> управление шедулеру" — "да, могут". Но пользы в нем 0.Могут, ну и что?

C>Ну во-первых, не нужна синхронизация (так как волокна не работают

C>параллельно).

Еща как нужна. Только другая. Да и параллельно они работать потенциальном огут, так как могут быть запущены на разных потоках.

C> Во-вторых, с помощью волокон можно делать сопрограммы.


Это одно и тоже. Просто левая терминология. Как в рочем волокнами часто называют потоки.

C>В-третьих, волокон может быть МНОГО без всякой дополнительной нагрузки

C>на планировщик.

Естественно. Ведь они не выполняются автоматом пареллельно. Переключение контекста потокв дело конечно дорогое, но при этом обеспечивается параллельная работа (хотя бы ее эмуляция). Файберы же это урощенный контекст который может быть приостановлен и возобнавлен.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 11:17
Оценка:
Здравствуйте, oleksab, Вы писали:

O> Помнится мне, в Windows 3.11 поток мог принять решение, что никому он не передаст управление


Помнится в Windows до версии 95 вообще небыло потоков .

А кооперативная многозадачность в нем осущестлялась на уровне сообщений. Все прилоежния виндовс должны были обработывать сообщение и отдавать управление ОС. Собственно точно так же себя ведут и 99% приложений в современных версиях Windows. От того в таскмэнеджере и можно наблюдать, что в большинстве случаев все приложения потребляют 0 процессорного времени, а крутися "Систем".
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Немного о многопоточности
От: IID Россия  
Дата: 21.10.05 11:52
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>поиск по RSDN


PD>>поток 93495

PD>>фибер 41

ANS>добавь еще "файбер" и "fiber"


тогда, для симметрии, добавляем "thread", "многопоточность"
kalsarikännit
Re[6]: Немного о многопоточности
От: IID Россия  
Дата: 21.10.05 12:12
Оценка:
Здравствуйте, VladD2, Вы писали:

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


O>> Помнится мне, в Windows 3.11 поток мог принять решение, что никому он не передаст управление


VD>Помнится в Windows до версии 95 вообще небыло потоков .


Windows 3.51 почти на 2 года старше
kalsarikännit
Re[6]: Немного о многопоточности
От: oleksab Украина  
Дата: 21.10.05 12:16
Оценка:
Здравствуйте, VladD2, Вы писали:

O>> Помнится мне, в Windows 3.11 поток мог принять решение, что никому он не передаст управление


VD>Помнится в Windows до версии 95 вообще небыло потоков .


Я дома книжку открою, вспомню. Но вполне может быть — ибо одно приложение, "повесив" себя могло отправить туда же и все остальные.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[7]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.10.05 12:32
Оценка:
Здравствуйте, Cyberax, Вы писали:


C>Простейший пример сопрограмм — это yield в C# 2.

Хм. Как ни странно, yield а) потребовал поддержки со стороны языка
б) прекрасно работает без фиберов
C>Не обязательно писать планировщик (например в случае с сопрограммами).
У меня почему-то есть подозрение, что для сопрограмм никаких фиберов не надо...
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 21.10.05 12:41
Оценка:
Здравствуйте, VladD2, Вы писали:

PD>>>фибер 41


ANS>>добавь еще "файбер" и "fiber"


VD>Еще зеленые и легкие потоки (причем как по-русски, так и по-английски), ну, и нужно вспомнить, что потоками называют еще ручу вещей вроде потоков вода-вывода.


Вот такой вот филисофский вопрос: а "зелёные" это насколько "то"? "Зелёные" ведь тоже не подразумевают создания шедулера.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 21.10.05 12:44
Оценка:
Здравствуйте, Sinclair, Вы писали:

C>>Простейший пример сопрограмм — это yield в C# 2.

S>Хм. Как ни странно, yield а) потребовал поддержки со стороны языка
S>б) прекрасно работает без фиберов
C>>Не обязательно писать планировщик (например в случае с сопрограммами).
S>У меня почему-то есть подозрение, что для сопрограмм никаких фиберов не надо...

Если без поддержки со стороны языка то надо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[3]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 21.10.05 12:48
Оценка: :))) :)
Здравствуйте, VladD2, Вы писали:

S>> Если нет ни того, ни другого, то использование фиберов — это способ бездарно убить свое время.


VD>Мне кажется, что у уважаемого Pavel-а Dvorkin-а одна из главных задач — убить свое время.


Влад, открою тебе маленький секрет. В этом форуме все убивают своё время.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 21.10.05 13:08
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Гм. Ты точно говоришь о той вытесняющей многозадачности, о которой я? Она характеризуется вовсе не случайностью вытеснения. А тем, кто принимает решение. В кооперативной многозадачности решение о передаче управления принимает поток. А в вытесняющей — шедулер.


Да, похоже мы о разных немного вещах говорим. Я имею в виду, что в вытесняющей решение принимает ОС (внешний по отношению к процессу элемент и ему неподконтрольный), а в кооперативной мог бы принимать сам процесс. Если всю Windows со всеми ее программами считать одним большим процессом, то можно заявить, что потоков в обычном понимании слова вообще нет и вытесняющей нет, а просто этот суперпроцесс принимает решение, каким его частям когда выполняться. Технические детали (сохранение CONTEXT, перезагрузка CR3 при необходимости и т.д.) здесь роди не играют. Даже если переключение шло бы на уровне процессора (задачи процессора), это тоже суть дела бы не изменилоА теперь переносим эту идею в мой процесс.

PD>>Мой процесс-то, в отличие от ОС, хорошо знает, какой фибер у него чем занимается и в каком у него состоянии дела.

S>Это все словоблудие, пока мы не определили понятия "знает", "состояние", "дела".

Это не совоблудие, потому как в общем виде не определяемо. Я об этом уже писал.

S>Не надо рассуждений про поваров и строителей. Может, есть какой-то готовый пример задачи, с которой

S>а) виндовый шедулер справляется недостаточно хорошо,

Я же с фиберами не работал . Вот тут кто-то работал, может, он и поделится. А вообще не понимаю такую логику. Если я не могу предъявить немедленно пример — идея не имеет права на существование, так ?


S>б) есть способ написать свой лучший шедулер?


Для конкретной задачи — думаю да. Если в ней нужно, конечно. Потому как время от времени в работу шедулера Windows мы все же пытаемся вмешиваться, изменяя приоритеты потоков или процесса. Да и шедулинг в Windows Server, как ты наверное знаешь, отличается от такового в WS.


S>На таком уровне рассуждений мы ни к чему не придем. Потому, что ответ на вопрос "А могут ли существовать ситуации, когда существует более эффективный способ управлять ресурсами системы, чем отдавать управление шедулеру" — "да, могут". Но пользы в нем 0. Могут, ну и что? Может, их на практике не встречается.


Может, не встречается, может, встречаются, но никто не пробовал поуправлять.

P.S. А что, шедулинг в Windows — это лучшее решение forever ?
With best regards
Pavel Dvorkin
Re[6]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 21.10.05 13:11
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А кооперативная многозадачность в нем осущестлялась на уровне сообщений. Все прилоежния виндовс должны были обработывать сообщение и отдавать управление ОС. Собственно точно так же себя ведут и 99% приложений в современных версиях Windows. От того в таскмэнеджере и можно наблюдать, что в большинстве случаев все приложения потребляют 0 процессорного времени, а крутися "Систем".


Ну если (не на сервере) у тебя постояннно крутится System, то что-то у тебя в системе не так. System Idle там крутиться в основном должен
With best regards
Pavel Dvorkin
Re[3]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 21.10.05 13:18
Оценка: +2 -1 :)
Здравствуйте, VladD2, Вы писали:

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


S>>...А также аргументация того, что этот алгоритм будет грузить ресурсы эффективнее, чем стандартный алгоритм шедулера в винде (а там, кстати, AFAIK, используется довольно-таки нетривиальная механика). Если нет ни того, ни другого, то использование фиберов — это способ бездарно убить свое время.


VD>Мне кажется, что у уважаемого Pavel-а Dvorkin-а одна из главных задач — убить свое время. Он все время интересуется разными тонкими вопросами которые по сути интереса не представляют. Основной его посыл "нужно экономить на всем". Жаль что в это "все" не входит собственное время и время окружающих.


Мне только одно в таком случае непонятно — зачем столь занятый человек, как VladD2 тратит свое время на ответы ? Можно же не отвечать... И чего Вы так заботитесь о времени окружающих? У них всегда есть возможность мои постинги не читать, если не хотят.

А насчет "интереса не представляют" — я не думаю, что мнение "интереса не представляет все то, о чем я (т.е. VladD2) так думаю" — едва ли представляет какой-то интерес для кого бы то ни было, кроме его автора. Потому как от такого мнения один шаг до классической фразы "На этот счет есть два мнения : одно мое, другое неправильное".
With best regards
Pavel Dvorkin
Re[6]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 13:19
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Вот такой вот филисофский вопрос: а "зелёные" это насколько "то"? "Зелёные" ведь тоже не подразумевают создания шедулера.


Это все синонимы. Подразумевается что это замена потоков на базе кооперативной многозадачности. А в кооперативной многозадачности роль шедулера выполняют сами "потоки". Они сами принимают решение когда они могут отдать управление.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 13:19
Оценка:
Здравствуйте, IID, Вы писали:

IID>Windows 3.51 почти на 2 года старше


Она называлась Windows NT. Это сейчас ее потомков считают за Windows, а тогда это бал монстр больше похожий на Юникс.

В общем, главное, что Windows 3.11 потоков не имела.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 13:19
Оценка:
Здравствуйте, oleksab, Вы писали:

O> Я дома книжку открою, вспомню.


Можешь не напрягаться. Я в те времена жил.
Для Windows-приложений там небыло ни потоко, ни процессов. Забавно что для DOS-сессий как раз был почти полноценный многозадачный режим, так как они выполнялись в особом режиме.

O> Но вполне может быть — ибо одно приложение, "повесив" себя могло отправить туда же и все остальные.


Не могло, а вешало на 100%. Был правда механизм... нажатие на Ctrl+Alt+Del вызывало некий хитрый код открыающий тогдашний таскменедер. Это в некоторых случаях позволяло скнять зависшую задачу.

Собственно то как это происходило можно увидить и сейчас если создать приложение с двумя окнами (в оном потоке) и в одно из окон при обработке сообщения сделать вечный цикл. Оба окна при этом "заморозатся".
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.10.05 13:32
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Во-первых, ты не прав — это на самом деле сделать возможно. Достаточно шедулер (или его часть) запустить в другом потоке, который будет делать отсечку по времени, и все. Видишь ли в чем дело — SwitchToFiber можно вызывать из другого потока — это совсем не обязательно делать из активного файбера.

Ага. А при этом исполнение этого файбера начнется в нашем потоке, не так ли? Или это переключит файбер в том потоке, где был вызван CreateFiber?

G>Тут есть минус и плюс. Плюс в том, что можно сделать шедулер, накладные издержки которого не зависят от количества файберов. Минус — потребуется два переключения контекста для переключения одного файбера.

Гм. Спрашивается, к чему стремились?

G>Далее, хочу заметить, что невытесняющий характер многозадачности — это на самом деле огромный плюс, как это ни странно. Приложение писать, отлаживать, и верифицировать гораздо проще, если количество мест, в котором поток может прерваться ограничено, и ты их знаешь. Если подойти к делу с умом — станет ясно, что от большей части кода не требуется реентерабельности. Что очень круто.

Может быть. Хотя...

G>Ресурсы, т.е. CPU, "эффективнее" нагрузить нельзя.

А при чем тут CPU? Ресурсов довольно много: как минимум файлуха и сторонние девайсы.

G>Синклер, если мозгов в голове нет, то любое занятие — отличный способ бездарно убить время. Ты зачем это написал — Дворкина подозреваешь в идиотизме? Или хочешь предостеречь от опрометчивого шага программеров-идиотов? Так как это бесполезно, я тебе лучше порекламирую файберы.

Нет, почему. Мне искренне интересно, где именно файберы лучше чем потоки.
G>"Пробовал ли ты? А ты попробуй!" Тебе надоели тред-пулы?
Нет. Меня они вполне устраивают.
G>Задолбали "паттерны" параллельного проектирования? Хочется чтоб алгоритмы выглядели по человечески — свой "поток" на каждую истинно параллельную активность в системе? Чтобы их крутились десятки тысяч, и все было нормально? Нет времени и желания рефакторить старый код, чтобы он стал thread-safe? Тогда пиши свой файберный планировщик, в котором любая операция O(1) — задачка, скажу тебе, не слишком простая , но и не очень сложная — я уложился в 468 строк на С++.
И? А синхронизация там есть?
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 21.10.05 14:04
Оценка:
Здравствуйте, VladD2, Вы писали:

ANS>>Вот такой вот филисофский вопрос: а "зелёные" это насколько "то"? "Зелёные" ведь тоже не подразумевают создания шедулера.


VD>Это все синонимы. Подразумевается что это замена потоков на базе кооперативной многозадачности. А в кооперативной многозадачности роль шедулера выполняют сами "потоки". Они сами принимают решение когда они могут отдать управление.


Не. Вот
Автор: Gaperton
Дата: 21.10.05
Gaperton всё объяснил.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 21.10.05 14:17
Оценка: 31 (2)
Здравствуйте, Sinclair, Вы писали:

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


G>>Во-первых, ты не прав — это на самом деле сделать возможно. Достаточно шедулер (или его часть) запустить в другом потоке, который будет делать отсечку по времени, и все. Видишь ли в чем дело — SwitchToFiber можно вызывать из другого потока — это совсем не обязательно делать из активного файбера.

S>Ага. А при этом исполнение этого файбера начнется в нашем потоке, не так ли? Или это переключит файбер в том потоке, где был вызван CreateFiber?

Ок, объясняю по порядку — тут все просто.
1) Сначала выбранный поток "расслаивается" на файберы посредством специального вызова на этом самом потоке.
2) Далее — он продолжает свое выполнение в главном файбере.
3) Выполнение этого потока не останавливается, при этом ты можешь переключать ему активный файбер вызывая SwitchToFiber как из этого самого потока, так и из другого.
4) Если происходит выход из любой файбер-функции "расслоеного" потока, то этот поток завершает свою работу.
5) Файберы ты, понятное дело, можешь убивать. Причем, в отличии от обычных потоков, ты можешь корректно убить стек с отработкой деструкторов, пробросив снизу вверх исключение даже для не активного файбера. Что превращает убийство файбера в штатную и гражданскую ситуацию, в отличии от потоков.

Вопрос снят? Идея понятна?

G>>Тут есть минус и плюс. Плюс в том, что можно сделать шедулер, накладные издержки которого не зависят от количества файберов. Минус — потребуется два переключения контекста для переключения одного файбера.

S>Гм. Спрашивается, к чему стремились?

Я это ясно сказал — к тому, чтобы накладные издержки шедулера не зависели от количества файберов. Обыкновенно, кстати, так не делают — шедулер живет в том же потоке, что и файберы.

G>>Далее, хочу заметить, что невытесняющий характер многозадачности — это на самом деле огромный плюс, как это ни странно. Приложение писать, отлаживать, и верифицировать гораздо проще, если количество мест, в котором поток может прерваться ограничено, и ты их знаешь. Если подойти к делу с умом — станет ясно, что от большей части кода не требуется реентерабельности. Что очень круто.

S>Может быть. Хотя...
Не "может быть", а совершенно точно. Я опираюсь не на умозрительные рассуждения, а на собственную практику использования файберов.

Вся штука в том, что при программировании потоков ты обязан закладываться на то, что прервать тебя могут в любой момент в любом месте. В случае файберов (который в мире UNIX называются user-level threads) количество таких мест конечно и невелико — они обозначены вызовом yield(). Один этот факт (свобода в выборе точки прерывания) уже радикально уменьшает количество примитивов синхронизации в программе.

Теперь ты мне расскажи, что стоит за "хотя".

G>>Ресурсы, т.е. CPU, "эффективнее" нагрузить нельзя.

S>А при чем тут CPU? Ресурсов довольно много: как минимум файлуха и сторонние девайсы.
При чем здесь CPU? Синклер, не пугай меня. Ты конечно же в курсе, что планировщик задач в оперсистеме распределяет процессорное время между готовыми к выполнению задачами, и ничего другое, и, надеюсь, не станешь убеждать меня в обратном.

G>>"Пробовал ли ты? А ты попробуй!" Тебе надоели тред-пулы?

S>Нет. Меня они вполне устраивают.

А меня нет. Многие алгоритмы выглядят гораздо проще, если не надо держать в голове наличие тред-пула, и считать количество потоков — типа не дай бог их будет слишком много. Задачи баз данных и к этому классу задач не относятся — если твой опыт ограничивается ими, то понять преимущества concurrency oriented programming тебе будет тяжело.

G>>Задолбали "паттерны" параллельного проектирования? Хочется чтоб алгоритмы выглядели по человечески — свой "поток" на каждую истинно параллельную активность в системе? Чтобы их крутились десятки тысяч, и все было нормально? Нет времени и желания рефакторить старый код, чтобы он стал thread-safe? Тогда пиши свой файберный планировщик, в котором любая операция O(1) — задачка, скажу тебе, не слишком простая , но и не очень сложная — я уложился в 468 строк на С++.

S>И? А синхронизация там есть?

Файбер API состоит из 6 функций. Примитивов синхронизации там (естественно) нет и быть не может, так как их реализация завязана на факт наличия планировщика задач, а его нет. Так что синхронизацию придется писать самому.

Понятное дело, что не каждому захочется писать кусочек оперсистемы, и не для всех задач это оправдано. Но все таки, хочу избавить тебя от иллюзий, что это очень сложно.

Вот тебе кусочек нашего продакшн кода. Особенной коммерческой тайны в нем нет — до этого и так кто угодно с ходу додумается. Мне кажется, это должно снять вопросы на тему "ой как сложно и страшно реализовать свои примитивы синхронизации".
class FiberEvent
{
    bool m_bState;
    
    typedef std::list< Task * > WaitingTaskList;
    WaitingTaskList m_waitingTaskList;
public:
    FiberEvent( bool i_bState = false );
    explicit FiberEvent( const FiberEvent & i_event );
    FiberEvent & operator = ( bool i_state );
    operator bool() const;
    
    void Set();
    void Reset();
    void Wait();
};

FiberEvent & FiberEvent::operator = ( bool i_state )
{
    if( m_bState != i_state )
    {
        if( i_state )
            for( WaitingTaskList::iterator it = m_waitingTaskList.begin(); it != m_waitingTaskList.end(); ++it )
                (*it) -> ResumeTask();

        m_bState = i_state;
    }
    
    return *this;
}

void FiberEvent::Wait()
{
   if( !m_bState )
   {
      m_waitingTaskList.push_back( Task::ReplyCurrent() );
      Task::ReplyCurrent() -> StopTask();
   }
}
Re[8]: Немного о многопоточности
От: FR  
Дата: 21.10.05 14:27
Оценка:
Здравствуйте, Sinclair, Вы писали:

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



C>>Простейший пример сопрограмм — это yield в C# 2.

S>Хм. Как ни странно, yield а) потребовал поддержки со стороны языка
S>б) прекрасно работает без фиберов

Вообще-то это равноценные вещи, например на питоне с помощью yield легко реализуются легкие потоки. И наооборот на C++ с помощью фиберов можно сделать нечто похожее на генераторы из питона.

C>>Не обязательно писать планировщик (например в случае с сопрограммами).

S>У меня почему-то есть подозрение, что для сопрограмм никаких фиберов не надо...

Если есть yield то не надо.
Re[4]: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 21.10.05 14:55
Оценка: +1
Здравствуйте, Sinclair, Вы писали:
PD>>Именно. И не надо. Кооперативная многозадачность вообще-то эффективнее. Она по другим причинам неприемлема в рамках ОС, но не внутри моего процесса. Внутри него мне не надо вытесняющей многозадачности. Смысла нет — зачем мне вытеснять случайным образом, когда можно принять решение на основе имеющейся информации.
S>Гм. Ты точно говоришь о той вытесняющей многозадачности, о которой я? Она характеризуется вовсе не случайностью вытеснения. А тем, кто принимает решение. В кооперативной многозадачности решение о передаче управления принимает поток. А в вытесняющей — шедулер.

Вот эта функция — часть шедулера. Ее вызывовом файбер обозначает точку, в которой его шедулер может прервать. А может и нет — в зависимости от того, истек ли квант. Функция из нашей системы — я немного упростил условие.
inline void Yield()
{
   if( Task::QuantIsExceeded() )
      Task::Return();
}


Это я к чему. Вот скажи мне, Sincler, это по твоей классификации вытесняющая или кооперативная многозадачность?

PD>>Мой процесс-то, в отличие от ОС, хорошо знает, какой фибер у него чем занимается и в каком у него состоянии дела.

S>Это все словоблудие, пока мы не определили понятия "знает", "состояние", "дела".
Спокойнее, Синклер спокойнее. Во-первых, мы-то с PD в курсе этих понятий — здесь все более или менее однозначно. Во-вторых, почитай чего-нибудь по планировщикам задач — это самый естественный и безболезненный способ разобраться. Любую книгу по операционным системам возьми — например Танненбаума. Ну, и подумай немного над задачей сам — тут все просто.
Re[4]: Класс задач, на котором.
От: Gaperton http://gaperton.livejournal.com
Дата: 21.10.05 15:15
Оценка: 12 (1) +1
Здравствуйте, Sinclair, Вы писали:

S>Не надо рассуждений про поваров и строителей. Может, есть какой-то готовый пример задачи, с которой

S>а) виндовый шедулер справляется недостаточно хорошо,
S>б) есть способ написать свой лучший шедулер?

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

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

Цена вопроса — разрастание кода вдвое, c одновременным ухудшением читабельности и maintainability (как это по-русски?).

Есть альтернатива, которая позволяет сохранить чистоту алгоритмов и выиграть в производительности. Это — применение first-class сontinuations или файберов. Основная их ценность в том, что конечные автоматы в явном виде из кода уходят, превращаясь в гражданский последовательный код. Это и дает выигрыш примерно вдвое по размеру кода и огромный выигрыш по читабельности.
Re[8]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 19:10
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

VD>>Это все синонимы. Подразумевается что это замена потоков на базе кооперативной многозадачности. А в кооперативной многозадачности роль шедулера выполняют сами "потоки". Они сами принимают решение когда они могут отдать управление.


ANS>Не. Вот
Автор: Gaperton
Дата: 21.10.05
Gaperton всё объяснил.


Так, а что "нет"? Он сказал что-то новое?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.10.05 19:10
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну если (не на сервере) у тебя постояннно крутится System, то что-то у тебя в системе не так. System Idle там крутиться в основном должен


Гы. System Idle — это текстовая строчка в таскменеджере. А крутится в момент простоя как раз шедулер. Как ты думашь где он находится.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Немного о многопоточности
От: Candle645 Украина http://www.brainbench.com/transcript.jsp?pid=11259
Дата: 21.10.05 19:23
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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


G>Ок, объясняю по порядку — тут все просто.

G>1) Сначала выбранный поток "расслаивается" на файберы посредством специального вызова на этом самом потоке.
G>2) Далее — он продолжает свое выполнение в главном файбере.
G>3) Выполнение этого потока не останавливается, при этом ты можешь переключать ему активный файбер вызывая SwitchToFiber как из этого самого потока, так и из другого.
G>4) Если происходит выход из любой файбер-функции "расслоеного" потока, то этот поток завершает свою работу.
G>5) Файберы ты, понятное дело, можешь убивать. Причем, в отличии от обычных потоков, ты можешь корректно убить стек с отработкой деструкторов, пробросив снизу вверх исключение даже для не активного файбера. Что превращает убийство файбера в штатную и гражданскую ситуацию, в отличии от потоков.

Sorry за off-topic, но года 4 назад я копал эту тему и в результате сложилось совершенно другое мнение...
SwitchToFiber из другого потока приводил к падению всего процесса. Насколько помню — в MSDN где-то сказано, что его можно вызывать только из потока, в котором живет fiber.

вот простой тест на предмет убиения фибера из другого потока:
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <stdio.h>
#define Q_STACK_SIZE 4096
VOID CALLBACK FiberProc (PVOID lpParameter)
{
  puts ("FiberProc Start");
  ::ExitThread (666);
  puts ("FiberProc End");
}
LPVOID g_fib1 = 0;
LPVOID g_fib2 = 0;
int g_fdata1 = 1;
int g_fdata2 = 1;
int g_tdata  = 2000;
DWORD WINAPI ThreadProc (PVOID lpParameter)
{
  puts ("ThreadProc Start");
  g_fib1 = ::ConvertThreadToFiber (&g_fdata1);
  g_fib2 = ::CreateFiber (Q_STACK_SIZE, FiberProc, &g_fdata2);
  puts ("ThreadProc Deadlock");
  for (;;);
}
int main(int argc, char* argv[])
{
  DWORD tid = -1;
  HANDLE  htr = ::CreateThread (0l, Q_STACK_SIZE * 4, ThreadProc, &g_tdata, 0, &tid);
  ::Sleep (1000);
  puts ("Killing deadlocked thread...");
  ::SwitchToFiber (g_fib2); // Здесь мы падаем ;(
  puts ("Success");
  ::Sleep (1000);
  return 0;
}


Последнее, что выводится до падения это "Killing deadlocked thread..." Проблемма не в синхронизации, т.к. увеличение времени слипа в пред строке ничего не меняет.
Только-что проверил под W2K — результат тот-же что был и под NT 4.0...
Re[5]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.10.05 21:00
Оценка:
Здравствуйте, IID, Вы писали:

IID>тогда, для симметрии, добавляем "thread", "многопоточность"


Чего заниматься гаданием на кофейной гуще? Не проще ли еще одно голосование создать?
... << RSDN@Home 1.2.0 alpha rev. 615 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[5]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.10.05 21:00
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>Спокойнее, Синклер спокойнее. Во-первых, мы-то с PD в курсе этих понятий — здесь все более или менее однозначно. Во-вторых, почитай чего-нибудь по планировщикам задач — это самый естественный и безболезненный способ разобраться. Любую книгу по операционным системам возьми — например Танненбаума. Ну, и подумай немного над задачей сам — тут все просто.


Рекомендую впредь обходится без подобных приемчиков, дабы оставить дисскуссию в конструктивном русле.
... << RSDN@Home 1.2.0 alpha rev. 615 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[2]: Немного о многопоточности
От: Игoрь Украина  
Дата: 21.10.05 22:17
Оценка: +2
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Устроил я голосование


PD>>http://www.rsdn.ru/poll/1273.aspx
Автор: Pavel Dvorkin
Дата: 12.10.05
Вопрос: Испоользовали ли Вы когда-либо фиберы (fibers) в своих программах ?


PD>>и , похоже, результат его можно занести в книгу рекордов RSDN, если такая появится (а кстати, не сделать ли ?). 100% единодушие — фиберы не использует никто.


G>Уже не 100%. Я проголосовал.


G>Отчет по файберам
Автор: Gaperton
Дата: 23.04.05


Файберы и потоки сравнивать ИМХО некорректно, хотя бы потому, что это несколько разные уровни ОС. Потоки — объекты ядра, а файберы — чисто user-mode абстракции. Более того, файберы крутятся внутри потока, который, в свою очередь, с точки зрения ядра является обычным планируемым потоком. Поэтому об преимуществах файберов над потоками говорить не имеет смысла. Возможно иногда и удобно разбить какую-то задачу на файберы, для удобства, но обработка все равно будет псевдопараллельной. А вот задачу, в которой необходимо 10К файберов, я что-то не могу себе представить.
Что касается серверов... в многопроцессорных системах смысл использования файберов лично мне вообще не ясен... Их же нельзя заставить работать на разных процах, то есть все равно прийдется создавать потоки на каждый проц. (???)
Re: Немного о многопоточности
От: Nickolay Ch  
Дата: 22.10.05 06:44
Оценка: 1 (1) -2
Здравствуйте, Pavel Dvorkin, Вы писали:

...

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

Да, не забудем про то, что дорожку то перед собой надо самому делать, откуда дорожниые рабочии знать, по какой дороге я хочу ехать. Будет такой у нас велосипел — путеукладчик.

ЗЫ По теме на подавляющем большинстве задач, которые решаются на ОС общего назначения ваши гм.. идеи приведут только к росту цены на ПО в геометрической прогресси.

ЗЗЫ В программировании есть множество подходов. Каждый имеет своих сторонников и противников, плюсы и минусы. Нельзя сказать, что вот ООП(к примеру) — это идеальный подход, применимый везде. Равно как и сказать что это отстой, фу, фтопку. Можно долго спорить о технологиях, приводить аргументы, соглашаться, не соглашаться.
Но (имхо конечно), подход "Зафигачить фигню, просто так, чтоб было, а потом посмотрим какое уродство мы родили, главное, что родили сами а не кто то другой" — это однозначно дурной и проигрышный подход.
Re[2]: Немного о многопоточности
От: FR  
Дата: 22.10.05 07:30
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

Только одно не при чем тут велосипеды? Может ты темой ошибся?
Re[3]: Немного о многопоточности
От: FR  
Дата: 22.10.05 07:30
Оценка:
Здравствуйте, Игoрь, Вы писали:


И>Файберы и потоки сравнивать ИМХО некорректно, хотя бы потому, что это несколько разные уровни ОС. Потоки — объекты ядра, а файберы — чисто user-mode абстракции. Более того, файберы крутятся внутри потока, который, в свою очередь, с точки зрения ядра является обычным планируемым потоком. Поэтому об преимуществах файберов над потоками говорить не имеет смысла. Возможно иногда и удобно разбить какую-то задачу на файберы, для удобства, но обработка все равно будет псевдопараллельной. А вот задачу, в которой необходимо 10К файберов, я что-то не могу себе представить.

И>Что касается серверов... в многопроцессорных системах смысл использования файберов лично мне вообще не ясен... Их же нельзя заставить работать на разных процах, то есть все равно прийдется создавать потоки на каждый проц. (???)

Мне достаточно того что фиберы позволяют легко реализовать на C++ ленивые вычисления и сопрограммы. А преимущества у фиберов над потоками одно, на порядок меньше граблей и если нет необходимости в настоящей многопоточности, то проще использовать фиберы
Re[9]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 22.10.05 08:26
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>>>Это все синонимы. Подразумевается что это замена потоков на базе кооперативной многозадачности. А в кооперативной многозадачности роль шедулера выполняют сами "потоки". Они сами принимают решение когда они могут отдать управление.


ANS>>Не. Вот
Автор: Gaperton
Дата: 21.10.05
Gaperton всё объяснил.


VD>Так, а что "нет"? Он сказал что-то новое?


В отличие от кооперативной многозадачности с фиберами возможно "внешнее" планирование.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 22.10.05 08:32
Оценка: +1 :)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Устроил я голосование


Голосование некорректное. Нет варианта "а что такое фибер?".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: Немного о многопоточности
От: Игoрь Украина  
Дата: 22.10.05 10:18
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Игoрь, Вы писали:



И>>Файберы и потоки сравнивать ИМХО некорректно, хотя бы потому, что это несколько разные уровни ОС. Потоки — объекты ядра, а файберы — чисто user-mode абстракции. Более того, файберы крутятся внутри потока, который, в свою очередь, с точки зрения ядра является обычным планируемым потоком. Поэтому об преимуществах файберов над потоками говорить не имеет смысла. Возможно иногда и удобно разбить какую-то задачу на файберы, для удобства, но обработка все равно будет псевдопараллельной. А вот задачу, в которой необходимо 10К файберов, я что-то не могу себе представить.

И>>Что касается серверов... в многопроцессорных системах смысл использования файберов лично мне вообще не ясен... Их же нельзя заставить работать на разных процах, то есть все равно прийдется создавать потоки на каждый проц. (???)

FR>Мне достаточно того что фиберы позволяют легко реализовать на C++ ленивые вычисления и сопрограммы. А преимущества у фиберов над потоками одно, на порядок меньше граблей и если нет необходимости в настоящей многопоточности, то проще использовать фиберы

Все зависит от решаемых задач. Например идут лесом длительные синхронные операции (а если не идут, то смысла использовать файберы я не вижу), в замен нужно использовать асинхронные. С одной стороны это может повысить эффективность (иногда), а с другой — есть усложнение. В принципе, синхронность наверное можно эмулировать через свой планировщик, но тут есть свои ограничения. Например, я не вижу, как тут можно использовать IOCP (видимо никак), о написании серверных приложений стоит забыть (разве что однопоточные псевдопараллельные), так как не можем использовать преимущества многопроцессорности.
Вообщем, как я понимаю, файберы можно использовать в рамках одного потока с целью упрощения его логики без существенного снижения эффективности. Как-то так.
Re[6]: Немного о многопоточности
От: Игoрь Украина  
Дата: 22.10.05 10:51
Оценка: 4 (1) +1
Здравствуйте, Candle645, Вы писали:

C><skipped>

В main забыл вызвать ::ConvertThreadToFiber.
Re[10]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.10.05 14:26
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>В отличие от кооперативной многозадачности с фиберами возможно "внешнее" планирование.


В этом случае это уже превращается в "закат солнца в ручную".
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 22.10.05 14:39
Оценка: +1
Здравствуйте, VladD2, Вы писали:

ANS>>В отличие от кооперативной многозадачности с фиберами возможно "внешнее" планирование.


VD>В этом случае это уже превращается в "закат солнца в ручную".


Напомню, что в этом была и вся фишка
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: Немного о многопоточности
От: gear nuke  
Дата: 22.10.05 15:26
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>System Idle — это текстовая строчка в таскменеджере.


Idle — отдельный процесс (Руссинович почему-то называет его "лжепроцесс", но своё адресное пространство у Idle есть). System — тоже отдельный процесс, в нём крутятся working threads ядра.

VD>А крутится в момент простоя как раз шедулер.


CPU выполняет команду halt (в процессе Idle) — просто ожидание прерывания от таймера.

VD> Как ты думашь где он находится.


AFAIK sheduler не имеет своего контекста выполнения (выполняется в контексте любого thread).

Мои ответы относятся к NT. В оригинале похоже о 9x, там проц всегда чем-то занят .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Немного о многопоточности
От: gear nuke  
Дата: 22.10.05 15:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Может, есть какой-то готовый пример задачи, с которой

S>а) виндовый шедулер справляется недостаточно хорошо

Проблема стандартного шедьюлера — длинные кванты (обычно 15мс) и отсутствие документированного способа их изменения. Если нужны кванты меньше, остаётся либо недокументированно уменьшать длительность кванта, либо использовать своё планирование.

S>б) есть способ написать свой лучший шедулер?


Написать то можно, но чтобы он был лучше — тут кроется подвох: предположим, нужно переключение через 2мс, мы это обеспечиваем, всё работает. А потом стандартный шедьюлер забирает у нас 60мс . Какой тогда в этом смысл? Всё равно придётся лезть в таймер и подставлять костыли non realtime OS. Если же сделать это, то возникает вопрос: а чем будет самописный шедьюлер лучше чем готовый, но подкрученный? В общем, замкнутый круг .

По поводу примера — многоклиентный сервер (пусть хотя бы чего-то поверх tcp). Пример довольно спорный, и есть разные варианты решения, но ИМХО "оптимизированный" шедьюлер позволил бы значительно экономить ресурсы CPU при переключении между клиентами.

Резюме (ИМХО) такое — сколь бы хорош свой планировщик не был, он не предоставит больше возможностей, чем имеющийся в ОС, поскольку именно последний его органичивает. Свой планироващик может быть удобнее, проще решать задачу, или ещё что-то там, но в ряде случаев он будет похож на человека пытающегося заплыть на водопад .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Немного о многопоточности
От: gear nuke  
Дата: 22.10.05 16:54
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>в вытесняющей решение принимает ОС (внешний по отношению к процессу элемент и ему неподконтрольный), а в кооперативной мог бы принимать сам процесс. Если всю Windows со всеми ее программами считать одним большим процессом, то можно заявить, что потоков в обычном понимании слова вообще нет и вытесняющей нет, а просто этот суперпроцесс принимает решение, каким его частям когда выполняться.


Упрощённый алгоритм выбора: "хм, кто тут у нас долше положенного времени отдыхал? нет таких, ну тогда писть пашет [сложная формула с иксом, игреком и... а это что за 3я неизвестная ] знает кто!"

PD>Технические детали (сохранение CONTEXT, перезагрузка CR3 при необходимости и т.д.) здесь роди не играют.

PD>Даже если переключение шло бы на уровне процессора (задачи процессора), это тоже суть дела бы не изменило

Чем дольше будет время переключения контекста выполнения — тем дороже будет стОить многозадачность. Переключение между файберами очень быстрое. Хотя в подовляющем большенстве случаев на сэкономленные копейки ничего не купишь .

PD>А теперь переносим эту идею в мой процесс.


А в моём процессе адгоритм будет уже: "(почесав затылок) ты, ты,... — а можно я? — ...да, и ты, на мясо!".

PD>>>Мой процесс-то, в отличие от ОС, хорошо знает, какой фибер у него чем занимается и в каком у него состоянии дела.


People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: Немного о многопоточности
От: gear nuke  
Дата: 22.10.05 17:23
Оценка:
Здравствуйте, Candle645, Вы писали:

C>SwitchToFiber из другого потока приводил к падению всего процесса. Насколько помню — в MSDN где-то сказано, что его можно вызывать только из потока, в котором живет fiber.


You can call SwitchToFiber with the address of a fiber created by a different thread. To do this, you must have the address returned to the other thread when it called CreateFiber and you must use proper synchronization.

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Немного о многопоточности
От: gear nuke  
Дата: 22.10.05 17:34
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мне кажется, что у уважаемого Pavel-а Dvorkin-а одна из главных задач — убить свое время. Он все время интересуется разными тонкими вопросами которые по сути интереса не представляют.


Я тоже интересуюсь всякой такой ерундой. Причина проста — знаю очень мало. Это на Спектруме было понятно зачем каждый байт нужен, а теперь, когда в окружении многих других программ запускается и даже работает моя, первая мысль: "ух как повезло" .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Немного о многопоточности
От: Cyberax Марс  
Дата: 23.10.05 06:52
Оценка: +1
Игoрь wrote:

> Все зависит от решаемых задач. Например идут лесом длительные

> синхронные операции (а если не идут, то смысла использовать файберы я
> не вижу), в замен нужно использовать асинхронные.

Так именно в этом и суть! В "обычном" программировании при использовании
асинхронных каналов приходится писать код в виде автомата, то есть
примерно так:
std::vector<char> accumulator;

void OnIcomingData()
{
    if (state==READING_HEADER)
       readHeader();
    else if (state==READING_BODY)
       readBody();
    else
       assert(false);
}
void readHeader()
{
    channel.read(accumulator);
    if (обнаружен_конец_заголовка)
    {
       //парсим заголовки, очищаем аккумулятор
       state=READING_BODY;
    }
    else
       return; //состояние не изменилось, накапливаем данные в аккумуляторе
}
....

Это неудобно, особенно в достаточно сложных протоколах.

С волокнами это переписывается так:
void read_request()
{
    Header hd;
    while(!hd.finished())
    {
       std::string str;
       str=channel.read_line(); //Sic!
       hd.parse_line(str);
    }
    //читаем тело и т.п.
}

Внутри метода read_line при необходимости блокировки происходит
переключения текущего волокна на какое-нибудь волокно, где в канале уже
есть входящие данные. Если таких волокон нет — то ждем поступления
данных (т.е. переключаемся на поток в котором запускаем select).

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[5]: Немного о многопоточности
От: Merle Австрия http://rsdn.ru
Дата: 23.10.05 08:22
Оценка:
Здравствуйте, Gaperton, Вы писали:

G> Задачи баз данных и к этому классу задач не относятся <...>

Ну почему, вполне относятся. И, что характерно, у того же MSSQL-я шедулер кооперативный... Но не на файберах. Точнее в 2000 была возможность на файберы переключиться, но выгодно это было только для достаточно узкого класса приложений, а в 2005-м эту возможность, кажется, вообще убрали.
... << RSDN@Home 1.1.4 beta 6a rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[9]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.10.05 17:17
Оценка: :)
Здравствуйте, gear nuke, Вы писали:

GN>Idle — отдельный процесс (Руссинович почему-то называет его "лжепроцесс", но своё адресное пространство у Idle есть). System — тоже отдельный процесс, в нём крутятся working threads ядра.


Нет никакого процесса Idle.

VD>>А крутится в момент простоя как раз шедулер.


GN>CPU выполняет команду halt (в процессе Idle) — просто ожидание прерывания от таймера.


Это уже тонкости реализации. Ведь у процессора просто может не быть команды halt. Вынь 9х вообще не вызывала эту команду.

VD>> Как ты думашь где он находится.


GN>AFAIK sheduler не имеет своего контекста выполнения (выполняется в контексте любого thread).


Шедулер и образует эти контексты. Собственно это и есть основная часть ядра ОС.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.10.05 17:17
Оценка:
Здравствуйте, gear nuke, Вы писали:

VD>>Мне кажется, что у уважаемого Pavel-а Dvorkin-а одна из главных задач — убить свое время. Он все время интересуется разными тонкими вопросами которые по сути интереса не представляют.


GN>Я тоже интересуюсь всякой такой ерундой. Причина проста — знаю очень мало. Это на Спектруме было понятно зачем каждый байт нужен,


Интересоваться не вредно. Вредно превращать свою жизнь в вечную борбу.

GN>а теперь, когда в окружении многих других программ запускается и даже работает моя, первая мысль: "ух как повезло" .


Я вот всегда считал првильным когда программа работат так как задумано. И именно для этого нужно интересоваться такими вещами как отдельные вопросы производительности. Многие же живут по прниципу "все должно быть оптимально". Это приводит к тому, что люди зацикливаются на отдельных вопросах не обращая внимание на общий результат.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Немного о многопоточности
От: Игoрь Украина  
Дата: 23.10.05 19:12
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Так именно в этом и суть! В "обычном" программировании при использовании

C>асинхронных каналов приходится писать код в виде автомата, то есть
C><skipped>
C>Это неудобно, особенно в достаточно сложных протоколах.
Ты несколько лукавишь Синхронность канала от написания автоматов не избавляет. Парсить данные как ни крути, а надо. И если протокол сложен, то автоматы будут в любом случае. Другое дело, что синхронность может немного упростить логику, но не более.

C>С волокнами это переписывается так:

C> <skipped>
C>Внутри метода read_line при необходимости блокировки происходит
C>переключения текущего волокна на какое-нибудь волокно, где в канале уже
C>есть входящие данные.
Когда я говорил об эмуляции синхронности с помощью своего планировщика, что-то подобное и имел ввиду.

C>Если таких волокон нет — то ждем поступления

C>данных (т.е. переключаемся на поток в котором запускаем select).
Видимо имелся ввиду не поток, а волокно?

Что мне не нравится в таком подходе, так это проблемы с масштабируемостью системы (если в дальнейшем нужно будет перенести на многопроцессорную систему, то получим "вафли"), с эффективностью есть проблемы (тот же select не блещет, а IOCP вне игры).
Вообщем я согласен, что файберы в некоторых случаях могут упростить логику какой-то локальной задачи, но на замену потокам они не тянут, и центральную роль не играют и в таком виде играть не будут. А если у кого-то возникают проблемы из-за большого числа потоков и постоянного переключения контекстов, то это скорее говорит о проблемах в архитектуре, и просто, о неправильном использовании механизма многопоточности (и этим товарищам возможно действительно подойдут файберы, хотя от потоков им все равно не уйти ).
Re[10]: Немного о многопоточности
От: gear nuke  
Дата: 23.10.05 22:00
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Нет никакого процесса Idle.


Я видел его адресное пространство в отладчике SoftICE .

VD>>>А крутится в момент простоя как раз шедулер.


GN>>CPU выполняет команду halt (в процессе Idle) — просто ожидание прерывания от таймера.


VD>Это уже тонкости реализации. Ведь у процессора просто может не быть команды halt.


Да, в таком случае будет крутиться какой-нибудь пустой цикл в процессе Idle. А потом придёт прерывание от таймера, и его обработчик вызовет по некоторой цепочке шедьюлер. Важный момент: если во время прерывания выполнялся поток в другом процессе, то цепочка будет таже самая.

VD>Вынь 9х вообще не вызывала эту команду.


Это так. Что до остального — про эту ОС знаю только, что там всё не как в NT, вероятно и есть как Вы пишите.

VD>Шедулер и образует эти контексты.


Как понимать образует? Создаёт их не он. Он просто выбирает контескт и делает его текущим.

VD>Собственно это и есть основная часть ядра ОС.


И да и нет. ОС может совсем не иметь планироващика.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Немного о многопоточности
От: gear nuke  
Дата: 23.10.05 22:00
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я вот всегда считал првильным когда программа работат так как задумано. И именно для этого нужно интересоваться такими вещами как отдельные вопросы производительности. Многие же живут по прниципу "все должно быть оптимально". Это приводит к тому, что люди зацикливаются на отдельных вопросах не обращая внимание на общий результат.


ИМХО "все должно быть оптимально" включает в себя "результат должен быть оптимальным". Поскольку результат — цель, он как бы некторая функция от других оптимальностей. Значит смотрим дальше: это нужно ещё оптимальнее, это и так оптимально, а на это оптимальнее забить .

Как можно решать, что оптимальнее, если ничего не знаешь . Вот и приходится что то изучать.

VD>Вредно превращать свою жизнь в вечную борбу.


У меня без такой борьбы через какое-то время появляются подозрения, что деградировать начинаю Так что приходится бороться за жизнь. 2 недели борьбы + 2 недели деградации приводят к некоторому балансу
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.10.05 04:47
Оценка:
Здравствуйте, Merle, Вы писали:

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


G>> Задачи баз данных и к этому классу задач не относятся <...>

M>Ну почему, вполне относятся. И, что характерно, у того же MSSQL-я шедулер кооперативный... Но не на файберах. Точнее в 2000 была возможность на файберы переключиться, но выгодно это было только для достаточно узкого класса приложений, а в 2005-м эту возможность, кажется, вообще убрали.
Именно это меня и смущает. Вот умные пацаны делали фиберы — явно по тем же соображениям. По-моему, в семерке они эту фичу ввели.
В 2000 они не рекомендовали использовать файберы. По-видимому, практика показала преимущество встроенного шедулера.
Если я правильно понял, то они перешли на встроенную в ОС поддержку пула потоков.
А теперь вообще оказалось, что фиберам в MS SQL места нет.

Причем, что характерно — это же как раз то самое приложение, где фиберы должны рулить! Сервер, много клиентов, дорогие переключения...
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.10.05 04:47
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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


G>Ок, объясняю по порядку — тут все просто.

G>1) Сначала выбранный поток "расслаивается" на файберы посредством специального вызова на этом самом потоке.
G>2) Далее — он продолжает свое выполнение в главном файбере.
G>3) Выполнение этого потока не останавливается, при этом ты можешь переключать ему активный файбер вызывая SwitchToFiber как из этого самого потока, так и из другого.
Гм. Вызов из этого потока означает, что никакого вытеснения нет. Вызов из другого потока означает, что надо два переключения туда-обратно. Вернемся к этому чуть позже.
G>5) Файберы ты, понятное дело, можешь убивать. Причем, в отличии от обычных потоков, ты можешь корректно убить стек с отработкой деструкторов, пробросив снизу вверх исключение даже для не активного файбера. Что превращает убийство файбера в штатную и гражданскую ситуацию, в отличии от потоков.
Хм. Вот это уже интересно. Я тут как-то почитал блог одного из разработчиков CLR на тему штатного и нештатного завершения кода. Оказывается, это все жутко сложная проблема. Если есть такое изящное решение — то это очень здорово.

S>>Гм. Спрашивается, к чему стремились?

G>Я это ясно сказал — к тому, чтобы накладные издержки шедулера не зависели от количества файберов.
Ага. Ну то есть у нас есть O(1) алгоритм выбора следующего исполняющегося, правильно? Т.е. если такого алгоритма нет, то и смысла заморачиваться тоже нет.
G>Обыкновенно, кстати, так не делают — шедулер живет в том же потоке, что и файберы.
Ну то есть кооперативная многозадачность.
S>>Может быть. Хотя...
G>Не "может быть", а совершенно точно. Я опираюсь не на умозрительные рассуждения, а на собственную практику использования файберов.
Может быть. Я вообще под кооперативку не программировал никогда. Поэтому мне сложно судить о том, насколько это проще.
G>Вся штука в том, что при программировании потоков ты обязан закладываться на то, что прервать тебя могут в любой момент в любом месте.
Это да.
G>При чем здесь CPU? Синклер, не пугай меня. Ты конечно же в курсе, что планировщик задач в оперсистеме распределяет процессорное время между готовыми к выполнению задачами, и ничего другое, и, надеюсь, не станешь убеждать меня в обратном.
Ну, можно сказать и так. Но на практике задача планировщика — дать исполняться тем, кто не ждет никаких условий. Чисто вычислительных задач почти не встречается в природе. Все преимущество планировщика обнаруживается тогда, когда ты пишешь recvfrom() и висишь на сокете в ожидании данных, а в это время кто-то использует твой CPU. Потом тебе потребуется диск, и кто-то возьмет себе сетевую карточку.
Многозадачность собственно нужна была не для того, чтобы брать одновременно два интеграла. А чтобы можно было чатиться в то время, как идет MPEG-4 компрессия, а из принтера страница за страницей выпадает Буч.
На сервере все немножко по-другому — там больше задач одинакового класса. Но для них параллельность обеспечивается за счет наложения фаз.

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

Ну, пул динамически будет увеличен
G> Задачи баз данных и к этому классу задач не относятся — если твой опыт ограничивается ими, то понять преимущества concurrency oriented programming тебе будет тяжело.

G>Понятное дело, что не каждому захочется писать кусочек оперсистемы, и не для всех задач это оправдано. Но все таки, хочу избавить тебя от иллюзий, что это очень сложно.


G>Вот тебе кусочек нашего продакшн кода. Особенной коммерческой тайны в нем нет — до этого и так кто угодно с ходу додумается. Мне кажется, это должно снять вопросы на тему "ой как сложно и страшно реализовать свои примитивы синхронизации".

Нет, я себе примерно представляю как устроены все эти примитивы синхронизации. Особенно с учетом того, что прервать нас не могут.
Ясно, конечно, что надо поддерживать в памяти граф ожидания, надо делать шедулер таким, чтобы он игнорировал ждущие задачи, и при этом все это еще и было O(1).
Основная сложность в приведенном коде скрыта за Task::StopTask() и Task::ResumeTask().
Кстати о птичках, а как здесь работает WaitForAll?
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Немного о многопоточности
От: Cyberax Марс  
Дата: 24.10.05 07:11
Оценка:
Sinclair wrote:

> Точнее в 2000 была возможность на файберы переключиться, но выгодно

> это было только для достаточно узкого класса приложений, а в 2005-м
> эту возможность, кажется, вообще убрали. Именно это меня и смущает.
> Вот умные пацаны делали фиберы — явно по тем же соображениям.
> По-моему, в семерке они эту фичу ввели.
> В 2000 они *не* рекомендовали использовать файберы. По-видимому,
> практика показала преимущество встроенного шедулера.

Нет, просто волокна — это не самая безглючная часть Винды, я лично
натыкался на баги в взаимодействии волокон и WinAPI.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[8]: Немного о многопоточности
От: Merle Австрия http://rsdn.ru
Дата: 24.10.05 07:27
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Нет, просто волокна — это не самая безглючная часть Винды, я лично

C>натыкался на баги в взаимодействии волокон и WinAPI.
В данном случае дело не в глюках. Просто производительность ниже, к сожалению, за давностью лет уже не помню подробностей...
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[7]: Немного о многопоточности
От: Cyberax Марс  
Дата: 24.10.05 07:35
Оценка: 1 (1) +1
Игoрь wrote:

> C>Это неудобно, особенно в достаточно сложных протоколах.

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

Ну и делаем это линейно:
parseHeader();
parseBody();
parseEpilogue();


> И если протокол сложен, то автоматы будут в любом случае. Другое дело,

> что синхронность может немного упростить логику, но не более.

Я как-то реализовывал

> C>Внутри метода read_line при необходимости блокировки происходит

> C>переключения текущего волокна на какое-нибудь волокно, где в канале уже
> C>есть входящие данные.
> Когда я говорил об эмуляции синхронности с помощью своего
> планировщика, что-то подобное и имел ввиду.

Я бы не назвал это "планировщиком" — так как планирования не происходит.

> C>Если таких волокон нет — то ждем поступления

> C>данных (т.е. переключаемся на поток в котором запускаем select).
> Видимо имелся ввиду не поток, а волокно?

Не важно, на самом деле.

У меня в одном проекте селектор постоянно работал в отдельном потоке и
складывал нотификации о приходе данных в нужные очереди, причем
использовались неблокирующиеся очереди — не нужна была синхронизация.
Затачивалось это под SMP так что работало быстрее, чем с диспетчером в
отдельном потоке. Причем была возможность указывать сколько будет
одновременно работать селекторов и процессоров данных.

В другом проекте действительно был селектор в обычном волокне.

> Что мне не нравится в таком подходе, так это проблемы с

> масштабируемостью системы (если в дальнейшем нужно будет перенести на
> многопроцессорную систему, то получим "вафли"), с эффективностью есть
> проблемы (тот же select не блещет, а IOCP вне игры).

IOCP замечательно работает с фибрами.

> Вообщем я согласен, что файберы в некоторых случаях могут упростить

> логику какой-то локальной задачи, но на замену потокам они не тянут, и
> центральную роль не играют и в таком виде играть не будут.

Угу, нужно просто иметь поддержку continuation'ов в языке.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[4]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 24.10.05 08:52
Оценка:
Здравствуйте, Sinclair, Вы писали:

PD>>Мой процесс-то, в отличие от ОС, хорошо знает, какой фибер у него чем занимается и в каком у него состоянии дела.

S>Это все словоблудие, пока мы не определили понятия "знает", "состояние", "дела".

Хорошо. Предлагаю следующий донельзя упрощенный пример.

Есть 2 потока . Буду называть их потоками, но это не обязательно thread Windows. В общем, нечто, что параллельно выполняется в пределах процесса.

Одна итерация потока А выглядит следующим образом

5 единиц времени (ЕВ) активной загрузки процессора.
5 ЕВ на ввод/вывод, который, условно говоря, загружает процессор на 0%
5 ЕВ активной загрузки процессора

Одна итерация потока B выглядит следующим образом

5 единиц времени (ЕВ) активной загрузки процессора.

После итерации потоки должны "встретиться" (дождаться друг друга), после чего они могут уйти на следующую итерацию и т.д.

Задача — минимизировать астрономическое время на работу одной итерации. При этом чужое время у Windows брать нельзя, но и свое отдавать необязательно . Иными словами, то время, которое Windows отдаст процессу, я намерен использовать максимально эффективно.

Вариант 1 — все на усмотрение Windows

Потоки стартуют одновременно.

За 10 ЕВ поток А доберется до точки, где он начнет в/в, а поток B успеет пройти всю итерацию и станет ждать А.
Еще 5 ЕВ поток А занимается в/в, т.е. процессор на загружает, а его время Windows отдаст кому-то еще или своему Idle
Еще 5 ЕВ поток А выполняет вторую часть

Итого 20 ЕВ

Вариант 2

Зная о том, что потоку А предстоит длительный простой из-за в/в, наш собственный шедулер приостанавливает поток B
За 5 ЕВ поток А доходит до точки В/В
В этот момент шедулер будит поток B. За 5 ЕВ он проходит до точки встречи.
За эти же 5 ЕВ в/в у потока А прошел. Он теперь за 5 ЕВ тоже доходит до точки встречи.

Итого 15 ЕВ.

Плюс. Ни на одной стадии не требуется никакой синхронизации по доступу к общим объектам, так как потоки фактически одновременно не работают.

Разумеется, все это можно переделать с использованием асинхронного в/в и ожиданием, но это не будет очень просто. Кроме того, это ведь на данной итерации. На следующей итерации, возможно, все будет прямо наоборот, и шедулер примет совсем иное решение.
With best regards
Pavel Dvorkin
Re[5]: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 24.10.05 09:01
Оценка: 7 (1)
Здравствуйте, gear nuke, Вы писали:

GN>Резюме (ИМХО) такое — сколь бы хорош свой планировщик не был, он не предоставит больше возможностей, чем имеющийся в ОС, поскольку именно последний его органичивает.


Что касательно не рилтаймового характера ОС — в 99.9% случаев у вас никто не отберет 60 мсек за просто так, если никакой прикладухи кроме вашей программы не запущено. Все не так страшно — soft-realtime задачи вполне можно решать.

Что до возможностей — так это у вас фантазии не хватает (по поводу выделения). Как, например, насчет возможности получить управление в момент передачи кванта задаче и в момент истечения кванта? Может у нас такое встроенный в ОС шедулер?

class FiberTask
{
// Top secret NDA covered code skipped...
    virtual void                        beforeTimeQuant(){}
    virtual void                        afterTimeQuant() {}
};


Зачем мне это понадобилось, спросите вы? Видите-ли в чем дело, мне надо было избежать удаления класса в то время, пока у меня есть квант (это приводило к крэшу). Проблема в том, что объект класса выделяется из пула, и просто "не удалять" я его не могу, он удаляется "сам", и, что характерно, должен быть удален — проблема не решается никак.

Кроме одного довольно изящного способа — я набрасываю его счетчик ссылок в beforeTimeQuant, и отпускаю в afterTimeQuant. Попробуйте повторить такой фокус с потоками. Эта пара коллбэков открывает также целый ряд дополнительных интересных возможностей, до которых в состоянии додуматься пытливый ум . И это далеко не единственная возможность, отсутствующая в стандартном планировщике.

GN>Свой планироващик может быть удобнее, проще решать задачу, или ещё что-то там, но в ряде случаев он будет похож на человека пытающегося заплыть на водопад .


Если плохо написан — то да. Если хорошо — то нет . Ключевое слово — в ряде случаев. Случаи, когда этим имеет смысл заниматься, в этой ветке уже довольно точно описаны.
Re[5]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.10.05 09:44
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>Хорошо. Предлагаю следующий донельзя упрощенный пример.

PD>Задача — минимизировать астрономическое время на работу одной итерации. При этом чужое время у Windows брать нельзя, но и свое отдавать необязательно . Иными словами, то время, которое Windows отдаст процессу, я намерен использовать максимально эффективно.

PD>Вариант 1 — все на усмотрение Windows


PD>Потоки стартуют одновременно.


PD>Итого 20 ЕВ


PD>Вариант 2

встречи.

PD>Итого 15 ЕВ.


Ну, есть же еще вариант 3 — мы снижаем потоку B приоритет. Тогда мы получим 15 астрономических ЕВ магическим образом Даже если 1 ЕВ достаточно длинный, чтобы сбить шедулер с толку.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: ОФФТОП
От: srggal Украина  
Дата: 24.10.05 10:14
Оценка:
Здравствуйте, gear nuke, Вы писали:

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


GN>Я тоже интересуюсь всякой такой ерундой. Причина проста — знаю очень мало. Это на Спектруме было понятно зачем каждый байт нужен, а теперь, когда в окружении многих других программ запускается и даже работает моя, первая мысль: "ух как повезло" .


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

Ну а если не задумываться — то и море поколено
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[6]: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 24.10.05 10:36
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>>>Гм. Спрашивается, к чему стремились?

G>>Я это ясно сказал — к тому, чтобы накладные издержки шедулера не зависели от количества файберов.
S>Ага. Ну то есть у нас есть O(1) алгоритм выбора следующего исполняющегося, правильно? Т.е. если такого алгоритма нет, то и смысла заморачиваться тоже нет.

Он у нас, определенно, есть , и не один. Свой алгоритм рассказать не могу — запрещает NDA. Но могу тебе сказать, что простейшая реализация тупой кольцевой очереди через закольцованный двунаправленный список — имеет сложность О(1). Предлагаю тебе вместо следующих вопросов в эту ветку потратить полчаса и набросать этот планировщик. Глядишь, и все вопросы будут сняты без флейма.

G>>При чем здесь CPU? Синклер, не пугай меня. Ты конечно же в курсе, что планировщик задач в оперсистеме распределяет процессорное время между готовыми к выполнению задачами, и ничего другое, и, надеюсь, не станешь убеждать меня в обратном.

S>Ну, можно сказать и так. Но на практике задача планировщика — дать исполняться тем, кто не ждет никаких условий. Чисто вычислительных задач почти не встречается в природе. Все преимущество планировщика обнаруживается тогда, когда ты пишешь recvfrom() и висишь на сокете в ожидании данных, а в это время кто-то использует твой CPU. Потом тебе потребуется диск, и кто-то возьмет себе сетевую карточку.

На практике, как и в теории, планировщик распределяет процессорное время между готовыми к выполнению задачами, и ничего другое. Если задача висит на сокете, она не готова к выполнению, и поэтому убирается из очереди активных задач. То же относится к дискам и прочему вводу-выводу.

На самом деле есть еще вариант — например, не готовая к выполнению задача тем или иным способом пропускает свой квант, оставаясь в очереди активных, и, если она заблокирована слишком долго, то таки все равно удаляется из списка готовых к выполнению (подобным образом сделано в Солярисе). Но это не более чем оптимизация — суть та же. А именно — единственный ресурс, который распределяет планировщик — это CPU. Без оговорок.

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

Планировщику совершенно все равно, чем занимаются его задачи — берут наперегонки два интеграла или чатятся во время компрессии. Для него есть только готовые и неготовые к выполнению задачи.

S>На сервере все немножко по-другому — там больше задач одинакового класса. Но для них параллельность обеспечивается за счет наложения фаз.


По крайней мере понятно, что с теорией ты знаком. Это хорошо.

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

S>Ну, пул динамически будет увеличен
Ну чего ты споришь с очевидным? Выдели из пула 2 тыщи потоков, будь любезен. Ну, или 3-4 тыщи — больше все равно не получится. Твоя прога должна стать неюзабельной на 2-х тыщах, а проблемы должны начатся примерно с 500.

G>>Вот тебе кусочек нашего продакшн кода. Особенной коммерческой тайны в нем нет — до этого и так кто угодно с ходу додумается. Мне кажется, это должно снять вопросы на тему "ой как сложно и страшно реализовать свои примитивы синхронизации".


S>Нет, я себе примерно представляю как устроены все эти примитивы синхронизации. Особенно с учетом того, что прервать нас не могут.

S>Ясно, конечно, что надо поддерживать в памяти граф ожидания, надо делать шедулер таким, чтобы он игнорировал ждущие задачи, и при этом все это еще и было O(1).

Ну я, положим, вполне обхожусь без поддержки графа ожидания. Что нетрудно заметить, заглянув в мой код.

S>Основная сложность в приведенном коде скрыта за Task::StopTask() и Task::ResumeTask().

Угу. Тока заметь — StopTask и ResumeTask понятия не имеют ни о каких примитивах синхронизации и графах ожидания. И не должны. Они ставят задачу в "список" готовых к выполнению и убирают ее из него за О(1).

Для иллюстрации — еще разок советую тебе сделать (или хотя-бы представить) свой планировщик с кольцевой очередью — и ты все поймешь. Ты все увидишь сам — никакой особой сложности в StopTask и ResumeTask нет.

S>Кстати о птичках, а как здесь работает WaitForAll?

Например, так (псевдокод):

WaitForAll( i_events )
{
   for all event in i_events
       event.Subscribe( Task::ReplyCurrent() );

   // для каждой задачи в состоянии поддерживается количество объектов, которых она ждет. По сути,
   // это счетчик ссылок со стороны примитивов синхронизации.
   while( Task::ReplyCurrent() -> GetWaitingForCount() )
      Task::ReplyCurrent() -> StopTask();
}
Re[11]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.10.05 11:04
Оценка:
Здравствуйте, gear nuke, Вы писали:

VD>>Нет никакого процесса Idle.


GN>Я видел его адресное пространство в отладчике SoftICE .


Думаю, ты перепутал его с потоком Idle. Ну, да по таким вопросам лучше действительно к Русиновичу. Он в Windows все в доль и поперек перепохал.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.10.05 11:04
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>ИМХО "все должно быть оптимально" включает в себя "результат должен быть оптимальным".


К сожалению, это не так. Живой пример Pavel Dvorkin. В его рассуждениях никогда не фигуруют такие понятия как производительность труда программиста, надежность, примемлемость для потребителя. Все рассуждения на уровне битов и о том что нужно потреблять минимум ресурсов.

Что до "все должно быть оптимально" — это утопия недостижимая в мало мальски сложных проектах. Всегда приходится определять приоритеты.

GN>Как можно решать, что оптимальнее, если ничего не знаешь . Вот и приходится что то изучать.


Дык с этим никто и не спорит. Но одно дело получать знания и разумно их использовать, а другое использовать отрывочные знания для псевдо-доказательства своих мифических теорий.

VD>>Вредно превращать свою жизнь в вечную борбу.


GN>У меня без такой борьбы через какое-то время появляются подозрения, что деградировать начинаю


Ну, это к психологам.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Немного о многопоточности
От: Cyberax Марс  
Дата: 24.10.05 11:44
Оценка: 1 (1)
VladD2 wrote:

> GN>ИМХО "все должно быть оптимально" включает в себя "результат должен

> быть оптимальным".
> К сожалению, это не так. Живой пример Pavel Dvorkin
> <http://rsdn.ru/Users/Profile.aspx?uid=187&gt;. В его рассуждениях
> никогда не фигуруют такие понятия как производительность труда
> программиста, надежность, примемлемость для потребителя. Все
> рассуждения на уровне битов и о том что нужно потреблять минимум
> ресурсов.

А вот еще один живой пример: http://cr.yp.to/djb.html (D. J. Bernstein)
— в его утверждениях тоже не фигурирует производительность труда
программиста, однако он написал самый безопасный (оп предлагает премию в
$500 за найденые уязвимости), быстрый, удобный и надежный почтовый
сервер (причем на чистом K&R C).

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[12]: Немного о многопоточности
От: gear nuke  
Дата: 24.10.05 11:53
Оценка:
Здравствуйте, VladD2,

GN>>Я видел его адресное пространство в отладчике SoftICE .


VD>Думаю, ты перепутал его с потоком Idle.


Из справки SICE:

ADDR
Display or switch to an address context.

Syntax
ADDR [process-name | process-id | KPEB]

process-name
Name of any currently loaded process.

process-id
Process ID. Each process has a unique ID.

KPEB
Linear address of a Kernel Process Environment Block.

Use
Use the ADDR command to both display and change address contexts within SoftICE so that process-specific data and code can be viewed. Using ADDR with no parameters displays a list of all address contexts.

If you specify a parameter, SoftICE switches to the address context belonging to the process with that name, identifier, or process control block address.


Можно сделать:
addr explorer

Можно сделать
addr idle

Поток не имеет отдельного адресного простренства.

VD>Ну, да по таким вопросам лучше действительно к Русиновичу. Он в Windows все в доль и поперек перепохал.


Вот что он пишет:

The System process holds operating system kernel threads and device driver threads, and Interrupts and DPCs are artificial processes that Process Explorer uses to display interrupt and Deferred Procedure Call (DPC) activity.

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 24.10.05 12:01
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Pavel Dvorkin, Вы писали:


S>Ну, есть же еще вариант 3 — мы снижаем потоку B приоритет. Тогда мы получим 15 астрономических ЕВ магическим образом Даже если 1 ЕВ достаточно длинный, чтобы сбить шедулер с толку.


Не проходит по условиям, которые я сформулировал. Напоминаю :

PD>При этом чужое время у Windows брать нельзя, но и свое отдавать необязательно


Я , может, не совсем точно сформулировал. Переформулирую

При этом чужое время у Windows брать нельзя, но и свое отдавать не надо.

Изменив приоритет, еще неизвестно, что получим. Может быть, управление получит A, а, может — некий X из процесса Y. Представь себе, что A,B и X имеют равные приоритеты и они наивысшие в системе. Так мы просто часть своего времени отдадим чужим.
А в результате мы в 15 ЕВ не уложимся.

Еще раз — я не намерен конкурировать с другими процессами. Их наличие и т.д. полностью не рассматривается сейчас. Пусть там хоть в это время активизируется System с приоритетом real-time на целую минуту
Под ЕВ имеется в виду время, выделяемое только этому процессу. Иными словами, это количество машинных команд, которые он успеет выполнить.

Вот если бы Sleep была перегружена

Sleep(0,hThread);

т.е я отказываюсь от остатка своего кванта в пользу hThread (независимо от его приоритета), то можно было бы что-то попытаться сделать. Но это и был бы шаг к своему шедулингу.
With best regards
Pavel Dvorkin
Re[12]: Немного о многопоточности
От: srggal Украина  
Дата: 24.10.05 12:20
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

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


ANS>>>В отличие от кооперативной многозадачности с фиберами возможно "внешнее" планирование.


VD>>В этом случае это уже превращается в "закат солнца в ручную".


ANS>Напомню, что в этом была и вся фишка


ИМХО Фишка Файбров в том, что они есть lightweight потоки со всеми вытекающими, причем то, что было названо

"закат солнца в ручную"


И есть одно из вытекающих.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 24.10.05 12:22
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

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


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


G>>> Задачи баз данных и к этому классу задач не относятся <...>

M>>Ну почему, вполне относятся. И, что характерно, у того же MSSQL-я шедулер кооперативный... Но не на файберах. Точнее в 2000 была возможность на файберы переключиться, но выгодно это было только для достаточно узкого класса приложений, а в 2005-м эту возможность, кажется, вообще убрали.
S>Именно это меня и смущает. Вот умные пацаны делали фиберы — явно по тем же соображениям. По-моему, в семерке они эту фичу ввели.
S>В 2000 они не рекомендовали использовать файберы. По-видимому, практика показала преимущество встроенного шедулера.
А другие "умные пацаны", не глупее МС-овских — из Оракла, почему-то предпочитают по возможности не пользоваться сервисами оперсистемы. Файловая система своя, управление памятью свое, и есть опция установки на голое железо без оперсистемы (было доступно для некоторых поставщиков, например Compaq). По словам какой-то шишки из Oracle во время соответствующего анонса, "Windows не делает ничего полезного, кроме того, что тормозит наш сервер" (близко к тексту).

Внимание, вопрос: что показала практика?

S>Если я правильно понял, то они перешли на встроенную в ОС поддержку пула потоков.

S>А теперь вообще оказалось, что фиберам в MS SQL места нет.

S>Причем, что характерно — это же как раз то самое приложение, где фиберы должны рулить! Сервер, много клиентов, дорогие переключения...

Начем с того, что сервер баз данных довольно специфическое приложение, и имеет очень мало общего с теми серверами, которые пишешь ты и большинство людей. Не каждый человек пишет SQL сервера. Впрочем, я уверен, ты меня поправишь если я вдруг ошибся. Это раз.

Файберы (вот так, навскидку) там не очень сильно рулят, так как требуется пареллелить задачу на несколько процов. С файберами это не очень здорово, а дальше надо смотреть по алгоритмам (а не вот так вот — здесь "сервер" и там "сервер") — если они по большей части stateless, то выигрыша не будет. Это два.

Они, умные пацаны из МС, в отличии от Oracle и нас с вами, устроились хорошо и имеют возможность интеграции с некоторыми функциями ядра, и также возможность влиять на разработку ядра. Например, в 2000 сервере была возможность установиться таким образом (галочка в программе установки), чтоб дать MS SQL 2000 прямой доступ к своим файловым кэшам. Вполне возможно, что в последних серверных виндах была "твикнута" многозадачность специально под MS SQL. Более того — я в этом почти уверен. На их месте я сделал бы именно так. Но они нам с вами об этом не расскажут. Это три.

И четвертое. Не по наслышке зная, когда начинаются и чем заканчиваются разговоры о центральной философской проблеме современности "раз это круто, то почему МС так не делает", прощаюсь с вами, уважаемые господа. Желаю вам приятных филосовских бесед.
Re[10]: Немного о многопоточности
От: srggal Украина  
Дата: 24.10.05 12:31
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Нет никакого процесса Idle.


VD>>>А крутится в момент простоя как раз шедулер.


GN>>CPU выполняет команду halt (в процессе Idle) — просто ожидание прерывания от таймера.


VD>Это уже тонкости реализации. Ведь у процессора просто может не быть команды halt. Вынь 9х вообще не вызывала эту команду.


Да это тонкость, но на самом деле, шедуллер не крутиться, он большую часть времени спит, ожидая тонкости реализации
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: Немного о многопоточности
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 24.10.05 12:41
Оценка:
Здравствуйте, Gaperton, Вы писали:

S>>Именно это меня и смущает. Вот умные пацаны делали фиберы — явно по тем же соображениям. По-моему, в семерке они эту фичу ввели.

S>>В 2000 они не рекомендовали использовать файберы. По-видимому, практика показала преимущество встроенного шедулера.
G>А другие "умные пацаны", не глупее МС-овских — из Оракла, почему-то предпочитают по возможности не пользоваться сервисами оперсистемы. Файловая система своя, управление памятью свое, и есть опция установки на голое железо без оперсистемы (было доступно для некоторых поставщиков, например Compaq). По словам какой-то шишки из Oracle во время соответствующего анонса, "Windows не делает ничего полезного, кроме того, что тормозит наш сервер" (близко к тексту).

G>Внимание, вопрос: что показала практика?


Вопрос хороший. Но есть еще и другой: какое количество задач сравнимо с созданием СУБД масштаба Оракла? И, как следствие, сколько из участников данного форума участвуют в подобных задачах для того, чтобы пытаться выигрывать на тонкой смене механизмов диспетчеризации при смене операционки?

G>И четвертое. Не по наслышке зная, когда начинаются и чем заканчиваются разговоры о центральной философской проблеме современности "раз это круто, то почему МС так не делает", прощаюсь с вами, уважаемые господа. Желаю вам приятных филосовских бесед.


Gaperton, а нет ли у тебя ссылок на описания механизмов, подобных виндовым файберам в других ОС? А то для одной идейки мне показалось заманчиво попробовать файберы использовать, но т.к. нужна переносимость, хотелось бы сравнить возможности аналогичных механизмов на других системах.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: Немного о многопоточности
От: gear nuke  
Дата: 24.10.05 12:47
Оценка: 1 (1)
Здравствуйте, Gaperton,

GN>>Резюме (ИМХО) такое — сколь бы хорош свой планировщик не был, он не предоставит больше возможностей, чем имеющийся в ОС, поскольку именно последний его органичивает.


G>Что касательно не рилтаймового характера ОС — в 99.9% случаев у вас никто не отберет 60 мсек за просто так, если никакой прикладухи кроме вашей программы не запущено.


В том-то и дело, что даже на чистой системе реботает несколько процессов с парой сотен потоков. Можно поднять себе приоритет до realtime и радоваться жизни, пока планировщик ОС не увидит, что множество потоков уже давно не получали CPU. Но это похоже на те 0.01% случаев

G>Все не так страшно — soft-realtime задачи вполне можно решать.


G>Что до возможностей — так это у вас фантазии не хватает (по поводу выделения).


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

G>Как, например, насчет возможности получить управление в момент передачи кванта задаче и в момент истечения кванта? Может у нас такое встроенный в ОС шедулер?


Отличный пример. Да, может. Нужно написать драйвер ядра который будет... Вот тут и возникает вопрос: не слишком ли много надо написать когда есть другой механизм .

G>Ключевое слово — в ряде случаев. Случаи, когда этим имеет смысл заниматься, в этой ветке уже довольно точно описаны.


Так я это ключевое слово потому и неписал. А то бывает: "в случае А технология показала себя плохо, значит она плохая" .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[8]: Немного о многопоточности
От: Cyberax Марс  
Дата: 24.10.05 12:55
Оценка: :)
Gaperton wrote:

> А другие "умные пацаны", не глупее МС-овских — из Оракла, почему-то

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

Ну так MS делает точно так же — у них полностью своя операционная система

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[7]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 24.10.05 13:00
Оценка:
PD>Под ЕВ имеется в виду время, выделяемое только этому процессу. Иными словами, это количество машинных команд, которые он успеет выполнить.

Сорри, неверно сформулировал.

Под ЕВ имеется в виду время, выделяемое только этому процессу. Иными словами, это количество астрономического времени, которое понадобится данному процессу в предположении отсутствия других процессов.
With best regards
Pavel Dvorkin
Re[8]: Немного о многопоточности
От: gear nuke  
Дата: 24.10.05 13:01
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

C>А вот еще один живой пример: http://cr.yp.to/djb.html (D. J. Bernstein)

C>- в его утверждениях тоже не фигурирует производительность труда
C>программиста, однако он написал самый безопасный (оп предлагает премию в
C>$500 за найденые уязвимости), быстрый, удобный и надежный почтовый
C>сервер (причем на чистом K&R C).

Хороший пример

P.S. но за такие деньги уязвимости никто не будет искать .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: Немного о многопоточности
От: gear nuke  
Дата: 24.10.05 13:01
Оценка:
Здравствуйте, VladD2, Вы писали:

GN>>ИМХО "все должно быть оптимально" включает в себя "результат должен быть оптимальным".


VD>К сожалению, это не так. Живой пример Pavel Dvorkin. В его рассуждениях никогда не фигуруют такие понятия как производительность труда программиста, надежность, примемлемость для потребителя. Все рассуждения на уровне битов и о том что нужно потреблять минимум ресурсов.


ИМХО и вы оба правы . Просто смотрите на вещи с разных позиций. Вы — с позиции решения потребительских запросов, а Pavel Dvorkin — как бы студентов научить вещам, о которых многие здесь не думают, потому что вещи эти давно уже решаются на уровне подсознания .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 24.10.05 13:02
Оценка: :)
Здравствуйте, gear nuke, Вы писали:

G>>Как, например, насчет возможности получить управление в момент передачи кванта задаче и в момент истечения кванта? Может у нас такое встроенный в ОС шедулер?


GN>Отличный пример. Да, может. Нужно написать драйвер ядра который будет... Вот тут и возникает вопрос: не слишком ли много надо написать когда есть другой механизм .


Круть! Не ожидал. Впрочем, такое злое хакерство — это не мое. В этом я откровенно слаб . Мне больше по душе гражданская, добрая магия — файберы там всякие, например.
Re[2]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 24.10.05 13:09
Оценка: +1
Здравствуйте, Nickolay Ch, Вы писали:

NC>Здравствуйте, Pavel Dvorkin, Вы писали:


NC>...


NC>А еще можно для загородней прогулки на выходных летом собрать самому велосипед.

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

А еще можно считать изобретенный однажды велосипед наилучшим средством передвижения и на основании этого прекратить разработку автомобилей и самолетов.

NC>ЗЗЫ В программировании есть множество подходов. Каждый имеет своих сторонников и противников, плюсы и минусы. Нельзя сказать, что вот ООП(к примеру) — это идеальный подход, применимый везде. Равно как и сказать что это отстой, фу, фтопку. Можно долго спорить о технологиях, приводить аргументы, соглашаться, не соглашаться.

NC>Но (имхо конечно), подход "Зафигачить фигню, просто так, чтоб было, а потом посмотрим какое уродство мы родили, главное, что родили сами а не кто то другой" — это однозначно дурной и проигрышный подход.

Спокойнее, спокойнее. Я ведь не предлагал всем немедленно бросить потоки и взяться за свой шедулинг. Я просто предложил обсудить некую концепцию. Если она неверна — так никто и не станет ее реализовать, и никакого уродства не будет. И уж во всяком случае, судя по дискуссии в этом треде, люди здесь достаточно грамотные, чтобы и аргументированно возражать, и соглашаться, и т.д. А вот подобная нетерпимость — вряд ли чем-то обоснована.
With best regards
Pavel Dvorkin
Re[9]: Немного о многопоточности
От: Gaperton http://gaperton.livejournal.com
Дата: 24.10.05 13:13
Оценка: 24 (1)
Здравствуйте, eao197, Вы писали:

E>Gaperton, а нет ли у тебя ссылок на описания механизмов, подобных виндовым файберам в других ОС? А то для одной идейки мне показалось заманчиво попробовать файберы использовать, но т.к. нужна переносимость, хотелось бы сравнить возможности аналогичных механизмов на других системах.


Вместо ссылок дам ключевые слова. В мире UNIX эта штука штатная, известная давным-давно, и называется user-level threads. Это так потому, что там с обычными потоками есть концептуальные (но решаемые) проблемы, например, нетривиальная семантика вызова fork (описано у Танненбаума, например).

Linux Threads Frequently Asked Questions (FAQ) от 1996 года

User-Level Threads

User-level avoids the kernel and manages the tables itself. Often this is called "cooperative multitasking" where the task defines a set of routines that get "switched to" by manipulating the stack pointer. Typically each thread "gives-up" the CPU by calling an explicit switch, sending a signal or doing an operation that involves the switcher. Also, a timer signal can force switches. User threads typically can switch faster than kernel threads [however, Linux kernel threads' switching is actually pretty close in performance].

Disadvantages. User-level threads have a problem that a single thread can monopolize the timeslice thus starving the other threads within the task. Also, it has no way of taking advantage of SMPs (Symmetric MultiProcessor systems, e.g. dual-/quad-Pentiums). Lastly, when a thread becomes I/O blocked, all other threads within the task lose the timeslice as well.

Solutions/work arounds. Some user-thread libraries have addressed these problems with several work-arounds. First timeslice monopolization can be controlled with an external monitor that uses its own clock tick. Second, some SMPs can support user-level multithreading by firing up tasks on specified CPUs then starting the threads from there [this form of SMP threading seems tenuous, at best]. Third, some libraries solve the I/O blocking problem with special wrappers over system calls, or the task can be written for nonblocking I/O.


Одна из портабельных библиотек

Cthreads is a user-level threads package that runs on several uniprocessors and multiprocessors. It offers support for shared-memory parallel programming. The uniprocessor support is intended for development, debugging and classroom use. Cthreads should work on the following architectures/operating systems:
Sun Sparc SunOS 4.1.3
Sun Sparc Solaris 2.x
SGI MIPS IRIX 5.x
SGI MIPS (32 and 64-bit) IRIX 6.x
IBM RS6000 AIX 3.2
x86 Linux (now Redhat 5.1)
x86 Solaris 2.x
Windows NT



Google
Re[9]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 24.10.05 13:15
Оценка:
Здравствуйте, gear nuke, Вы писали:

C>>А вот еще один живой пример: http://cr.yp.to/djb.html (D. J. Bernstein)

C>>- в его утверждениях тоже не фигурирует производительность труда
C>>программиста, однако он написал самый безопасный (оп предлагает премию в
C>>$500 за найденые уязвимости), быстрый, удобный и надежный почтовый
C>>сервер (причем на чистом K&R C).

GN>Хороший пример


Ошибки там, кстати, есть. Например, переполнение счетчика, если размер письма больше 2х гиг. При попытке проверить наличие этой ошибки, через некоторое время бодания, я выяснил, что у меня раздел, куда qmail временные файлы пишет меньше, чем нужно Но вот в уязвимость эти ошибки, имхо, не превращаются.

GN>P.S. но за такие деньги уязвимости никто не будет искать .


Во-первых, он, afaik, предлагал, и теперь не предлагает. Но, времени, с момента выпуска, уже много прошло. Сервер не сверх популярный, но достаточно, для того, что бы были желающие его пробить.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: Немного о многопоточности
От: Merle Австрия http://rsdn.ru
Дата: 24.10.05 13:18
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>А другие "умные пацаны", не глупее МС-овских — из Оракла, почему-то предпочитают по возможности не пользоваться сервисами оперсистемы. Файловая система своя, управление памятью свое, и есть опция установки на голое железо без оперсистемы (было доступно для некоторых поставщиков, например Compaq).

У этих ребят своя специфика, им надо заставить работать свой сервер на всем, включая кофеваку, а перед MS-овцами такой задачи не стояло.

G> По словам какой-то шишки из Oracle во время соответствующего анонса, "Windows не делает ничего полезного, кроме того, что тормозит наш сервер" (близко к тексту).

Наверное маркетоид какой-то... Их сервер может и тормозит, а MS-овский по тем временам по шустрее был чем Oracle, хотя в отрыве от конкретной задачи сложно утверждать наверняка..

G>Они, умные пацаны из МС, в отличии от Oracle и нас с вами, устроились хорошо и имеют возможность интеграции с некоторыми функциями ядра, и также возможность влиять на разработку ядра.

По утверждениям ребят из MS, в том числе и в личных беседах, ни одной недокументированной функции сиквел не использует. И я вообщем им верю... И, примерно представляя бюрократию внутри MS, вряд ли у ребят из команды сиквела была возможность влиять на ядро, но это уже мои спекуляции. (Хотя, например, в MSSQL и NTFS используется один и тот же механизм для обеспечения отказоустойчивости)

G> Например, в 2000 сервере была возможность установиться таким образом (галочка в программе установки), чтоб дать MS SQL 2000 прямой доступ к своим файловым кэшам.

К каким файловым кешам? Сиквел мимо кешей на диск пишет, ему по другому нельзя...

G>Вполне возможно, что в последних серверных виндах была "твикнута" многозадачность специально под MS SQL.

Нет, не была. Все алгоритмы работы сиквельного шедулера достаточно хорошо известны и довольно подробно описаны, и ничего хитрого в них нет.
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[5]: Немного о многопоточности
От: srggal Украина  
Дата: 24.10.05 13:21
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Резюме (ИМХО) такое — сколь бы хорош свой планировщик не был, он не предоставит больше возможностей, чем имеющийся в ОС, поскольку именно последний его органичивает. Свой планироващик может быть удобнее, проще решать задачу, или ещё что-то там, но в ряде случаев он будет похож на человека пытающегося заплыть на водопад .


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

Но все это сцбъективно, поскольку стандартный лучше отлажен и обдуман, и БОЛЬШИНСТВО программистов, пытающихся придумать свой планировщик — сломают себе шею.
Прозрачность кода на файберах ? Мысль интересная, в чем-то тоже согласен, патерн Стайт га фабберах ? Это уже как-то звучить с душком ИМХО
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[11]: Немного о многопоточности
От: GlebZ Россия  
Дата: 24.10.05 13:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Andrei N.Sobchuck, Вы писали:


ANS>>В отличие от кооперативной многозадачности с фиберами возможно "внешнее" планирование.


VD>В этом случае это уже превращается в "закат солнца в ручную".

[imho]Честно говоря, кооперативная многозадачность в рамках одного потока легко реализуется вручную. В случае внешнего управления, для большинства языков программирования это становится нетривиальной задачей. Проблема сохранения стека. А Лисповский continuation трудно реализовать .
Посему можно сказать, фиберы нужны очень не часто, но в некоторых задачах без них никак.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Немного о многопоточности
От: Игoрь Украина  
Дата: 24.10.05 13:41
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Ну и делаем это линейно:

C>
C>parseHeader();
C>parseBody();
C>parseEpilogue();
C>

Я не большой спец в теории КА, но ИМХО это тоже вырожденный случай КА
Хорошо, усложним ситуацию и представим, что от хедера зависит формат тела, тогда ты и в своем коде получишь ветвление:
switch (parseHeader())
{
    case BodyType1:
        parseBodyType1();
        break;
    case BodyType2:
        parseBodyType2();
        break;
    ...
}
parseEpilogue();

Я уже молчу о том, что внутри parseBody видимо тоже будут использоваться КА.
C>Я как-то реализовывал
Ага, кажись я понял о чем ты говоришь. И там, и там КА присутствуют, но в случае с файберами мы можем не хранить текущее состояние явно, так как за нас это сделает сам механизм файберов, сохранив стэк и регистры.

C>Я бы не назвал это "планировщиком" — так как планирования не происходит.

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

C>Не важно, на самом деле.


C>У меня в одном проекте селектор постоянно работал в отдельном потоке и

C>складывал нотификации о приходе данных в нужные очереди, причем
C>использовались неблокирующиеся очереди — не нужна была синхронизация.
C>Затачивалось это под SMP так что работало быстрее, чем с диспетчером в
C>отдельном потоке. Причем была возможность указывать сколько будет
C>одновременно работать селекторов и процессоров данных.
Это понятно, что можно. Подразумевалось то, что если нет готовых к выполнению файберов, то стоит этот поток перевести в waitable state (например с помощью select).


C>IOCP замечательно работает с фибрами.

Да, работает, просто я видел главным преимуществом файберов возможность легкой "однопоточной" синхронизации, а тут она теряется.
Re[8]: Немного о многопоточности
От: ironwit Украина  
Дата: 24.10.05 14:27
Оценка: +1 :))
Здравствуйте, VladD2, Вы писали:


VD>Не могло, а вешало на 100%. Был правда механизм... нажатие на Ctrl+Alt+Del вызывало некий хитрый код открыающий тогдашний таскменедер. Это в некоторых случаях позволяло скнять зависшую задачу.

гы.. так и вспоминаю это окошко а в нем нет ничего
... << RSDN@Home 1.2.0 alpha rev. 618>>
играет: Faktor-2 — [Мы фальшивые МС #03] Письма [foobar2000 v0.8.3]
Я не умею быть злым, и не хочу быть добрым.
Re[7]: Бага
От: Gaperton http://gaperton.livejournal.com
Дата: 24.10.05 15:09
Оценка:
Здравствуйте, Gaperton, Вы писали:

S>>Кстати о птичках, а как здесь работает WaitForAll?

G>Например, так (псевдокод):

G>
G>WaitForAll( i_events )
G>{
G>   for all event in i_events
G>       event.Subscribe( Task::ReplyCurrent() );

G>   // для каждой задачи в состоянии поддерживается количество объектов, которых она ждет. По сути,
G>   // это счетчик ссылок со стороны примитивов синхронизации.
G>   while( Task::ReplyCurrent() -> GetWaitingForCount() )
G>      Task::ReplyCurrent() -> StopTask();
G>}
G>


К слову о планировщиках задач, файберах, и многозадачности. Тут есть одна тонкость, требующая глубокого понимания деталей. Можно сказать, задача.

В этом коде, что я привел, ошибка. Ну не то, чтобы ошибка, но... Он будет нормально работать для Events, но в общем случае не будет работать корректно для CriticalSection. Тому, кто найдет ошибку, и объяснит — специальный приз в виде оценки "супер".

1) Ошибка не зависит от алгоритма планировщика. Предполагается, что Event реализован так, как сделано выше у меня.
2) Для того, чтобы понять, где тут ошибка, надо (разумеется) суметь написать правильный CriticalSection с методом Wait. Там тоже есть подвох — он состоит в понимании настоящей разницы между семантикой Event и CriticalSection, которая должна быть отражена в реализации Wait.
Re[8]: Бага
От: Cyberax Марс  
Дата: 24.10.05 15:14
Оценка:
Gaperton wrote:

> В этом коде, что я привел, ошибка. Ну не то, чтобы ошибка, но... Он

> будет нормально работать для Events, но в общем случае не будет
> работать корректно для CriticalSection. Тому, кто найдет ошибку, и
> объяснит — специальный приз в виде оценки "супер".

CRITICAL_SECTION — рекурсивна, Event — нет?

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[9]: Немного о многопоточности
От: Cyberax Марс  
Дата: 24.10.05 15:15
Оценка:
gear nuke wrote:

> P.S. но за такие деньги уязвимости никто не будет искать .


В SendMail'е их бесплатно находят

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[10]: Немного о многопоточности
От: gear nuke  
Дата: 24.10.05 15:21
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>В SendMail'е их бесплатно находят


Вы меня не поняли. Уязвимости в первую очередь интересуют не авторов. Думаю, и в SendMail было найдены уязвимости, которые были проданы, а авторы про них узнали позже.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[8]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.10.05 15:29
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>ИМХО и вы оба правы . Просто смотрите на вещи с разных позиций. Вы — с позиции решения потребительских запросов, а Pavel Dvorkin — как бы студентов научить вещам, о которых многие здесь не думают, потому что вещи эти давно уже решаются на уровне подсознания .


Я бы предпочел, чтобы он их ничему не учил. Потом им будет куда проще обяснить некоторые тонкости мимо которых они прошли при обучении, нежели менять битовыжимное мировозрение.

ЗЫ

Поймите, я как раз из тех кто уделяет производительности очень большое и серьезное место. Я так же не понимаю бесцельного расходвания ресурсов. Но между мной и Pavel Dvorkin есть огромная разница. Я думаю о производительности как об одном из качеств программы, а не как о святой корове.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.10.05 15:29
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>А вот еще один живой пример: http://cr.yp.to/djb.html (D. J. Bernstein)

C>- в его утверждениях тоже не фигурирует производительность труда
C>программиста,

А к чему бы эта ссылка? Этот самый D.J. где-то утверждал что-то похожее на утверждения Pavel Dvorkin?

C> однако он написал самый безопасный (оп предлагает премию в

C>$500 за найденые уязвимости), быстрый, удобный и надежный почтовый
C>сервер (причем на чистом K&R C).

Здорово. Один небольшой вопрос. Ваша компания использует этот сервер?
Наша нет. И на RSDN тоже что-то другое стоит. Неужели подвиг D.J.-я остался незамеченным?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 24.10.05 15:38
Оценка:
Здравствуйте, VladD2, Вы писали:

VD> И на RSDN тоже что-то другое стоит. Неужели подвиг D.J.-я остался незамеченным?


А что за MTA на RSDN-е?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[9]: Бага
От: Gaperton http://gaperton.livejournal.com
Дата: 24.10.05 16:03
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Gaperton wrote:


>> В этом коде, что я привел, ошибка. Ну не то, чтобы ошибка, но... Он

>> будет нормально работать для Events, но в общем случае не будет
>> работать корректно для CriticalSection. Тому, кто найдет ошибку, и
>> объяснит — специальный приз в виде оценки "супер".

C>CRITICAL_SECTION — рекурсивна, Event — нет?


Да, но не в этом проблема. Тут прикольнее — именно вопрос реализации критической секции. Рассмотри ситуацию, когда объект в несигнальном состоянии, и на нем ждет много "процессов". Вот он переходит в сигнальное состояние, а потом обратно, а никто из "процессов" не успел получить управление. Что должно произойти в случае Event и CriticalSection?
Re[9]: Немного о многопоточности
От: GlebZ Россия  
Дата: 24.10.05 16:45
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я бы предпочел, чтобы он их ничему не учил.

Не перегибай палку.
VD>Потом им будет куда проще обяснить некоторые тонкости мимо которых они прошли при обучении, нежели менять битовыжимное мировозрение.

VD>ЗЫ


VD>Поймите, я как раз из тех кто уделяет производительности очень большое и серьезное место. Я так же не понимаю бесцельного расходвания ресурсов. Но между мной и Pavel Dvorkin есть огромная разница. Я думаю о производительности как об одном из качеств программы, а не как о святой корове.

Битовыжимание — это сложный процесс которому надо долго учиться. И не только в плане алгоритмов и математики. Меня недавно пытались припахать к программированию технических процессоров (для очень важной аппаратуры, мало не покажется). Я умею писать цифровые фильтры выжимая все из железки. И эти знания очень пригождаются не только для специализированных программ, но и для бизнес-приложений. Я не делаю фатальных ошибок(типа конкатенация строк в Net). И если человек знает как можно битовыжимать — то мне этот человек больше нравится чем тот кто знает как делать по науке. Как науке я и сам могу ему легко объяснить.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Немного о многопоточности
От: Cyberax Марс  
Дата: 24.10.05 17:10
Оценка:
VladD2 wrote:

> C>А вот еще один живой пример: http://cr.yp.to/djb.html (D. J. Bernstein)

> C>- в его утверждениях тоже не фигурирует производительность труда
> C>программиста,
> А к чему бы эта ссылка? Этот самый D.J. где-то утверждал что-то
> похожее на утверждения Pavel Dvorkin?

Товарищ DJB написал книгу о том, как писать быстрый и безопасный код
Про удобство для программистов там тоже было.

> C> однако он написал самый безопасный (оп предлагает премию в

> C>$500 за найденые уязвимости), быстрый, удобный и надежный почтовый
> C>сервер (причем на чистом K&R C).
> Здорово. Один небольшой вопрос. Ваша компания использует этот сервер?

Да, используем только его. С ним меньше всего проблем (про sendmail.cf я
забыл как про страшный сон).

> Наша нет. И на RSDN тоже что-то другое стоит. Неужели подвиг D.J.-я

> остался незамеченным?

До того незамеченым, что сейчас примерно 17% почтовых серверов в мире
его используют (то есть популярнее qmail'а только SendMail).

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[10]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.10.05 18:33
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>А что за MTA на RSDN-е?


Непмоню. Вроде CommuniGate Pro.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.10.05 18:33
Оценка:
Здравствуйте, GlebZ, Вы писали:

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


VD>>Я бы предпочел, чтобы он их ничему не учил.

GZ>Не перегибай палку.

Гворю, что думаю. Если бы не видел плоды подобного обучения может и промолчал. А так...

GZ>Битовыжимание — это сложный процесс которому надо долго учиться.


Процесс как процесс.

GZ> И не только в плане алгоритмов и математики. Меня недавно пытались припахать к программированию технических процессоров (для очень важной аппаратуры, мало не покажется). Я умею писать цифровые фильтры выжимая все из железки. И эти знания очень пригождаются не только для специализированных программ, но и для бизнес-приложений. Я не делаю фатальных ошибок(типа конкатенация строк в Net). И если человек знает как можно битовыжимать — то мне этот человек больше нравится чем тот кто знает как делать по науке. Как науке я и сам могу ему легко объяснить.


А мне кажется, что если есть грамотный специалист, то он с любой задачей справится. Нужно экономить — будет экономить. Нужно быстро написать прототип — напишет наплевав на ресурсы. А нужно найти баланст — найдет баланс.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.10.05 18:48
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Товарищ DJB написал книгу о том, как писать быстрый и безопасный код

C>Про удобство для программистов там тоже было.

Тогда тем более хочется узнать к чему эта ссылка? У нас то речь идет о быстром коде при полном наплевательстве на безопастность кода и производительность труда программиста.

C>До того незамеченым, что сейчас примерно 17% почтовых серверов в мире

C>его используют (то есть популярнее qmail'а только SendMail).

Откуда такая цифра?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Немного о многопоточности
От: GlebZ Россия  
Дата: 24.10.05 18:59
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Гворю, что думаю. Если бы не видел плоды подобного обучения может и промолчал. А так...

А с ДНК не путаешь?

GZ>>Битовыжимание — это сложный процесс которому надо долго учиться.

VD>Процесс как процесс.
Ага, когда припрет люди к старичкам бегут. Сами то неумеют. Навыков нет.

GZ>> И не только в плане алгоритмов и математики. Меня недавно пытались припахать к программированию технических процессоров (для очень важной аппаратуры, мало не покажется). Я умею писать цифровые фильтры выжимая все из железки. И эти знания очень пригождаются не только для специализированных программ, но и для бизнес-приложений. Я не делаю фатальных ошибок(типа конкатенация строк в Net). И если человек знает как можно битовыжимать — то мне этот человек больше нравится чем тот кто знает как делать по науке. Как науке я и сам могу ему легко объяснить.


VD>А мне кажется, что если есть грамотный специалист, то он с любой задачей справится. Нужно экономить — будет экономить. Нужно быстро написать прототип — напишет наплевав на ресурсы. А нужно найти баланст — найдет баланс.

Именно. Грамотный специалист должен уметь все.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.10.05 19:55
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>А с ДНК не путаешь?


Нет не путаю.

GZ>Ага, когда припрет люди к старичкам бегут. Сами то неумеют. Навыков нет.


Ко мне вот отец периодически за помощью в комьпьютерах приезжает. Он как раз более чем на старичка тянет.

VD>>А мне кажется, что если есть грамотный специалист, то он с любой задачей справится. Нужно экономить — будет экономить. Нужно быстро написать прототип — напишет наплевав на ресурсы. А нужно найти баланст — найдет баланс.

GZ>Именно. Грамотный специалист должен уметь все.

Так вот он им никогда не станет, или убъет кучу времени на вправление мозгов, если его образование начнется не с борьбы за биты. Я еще понимаю почему это получалось 10-20 лет назад. Тогда выжимание битов из байтов было актуально. Но сейчас то зачем мозги плющить этим? Специалист способный к грамотному проектированию как нибудь и с оптимизацией по производительности справится. А вот обратно точно не врено.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Немного о многопоточности
От: Cyberax Марс  
Дата: 25.10.05 07:54
Оценка:
VladD2 wrote:

> C>Товарищ DJB написал книгу о том, как писать быстрый и безопасный код

> C>Про удобство для программистов там тоже было.
> Тогда тем более хочется узнать к чему эта ссылка? У нас то речь идет о
> быстром коде при полном наплевательстве на безопастность кода и
> производительность труда программиста.

Не при полном наплевательстве, а при разумных компромисах в
безопасности. Например, в том же qmail'е используются (о ужас!) С-шные
строки, причем даже в статических буфферах. И ничего, живет все без дырок.

> C>До того незамеченым, что сейчас примерно 17% почтовых серверов в мире

> C>его используют (то есть популярнее qmail'а только SendMail).
> Откуда такая цифра?

http://cr.yp.to/surveys.html

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re: Немного о многопоточности
От: opossum  
Дата: 25.10.05 10:04
Оценка: 53 (3)
http://snark.rinet.ru/sched_act/scheduler%20activation.htm
ОБРАЩЕНИЯ К ПЛАНИРОВЩИКУ: ЭФФЕКТИВНАЯ ЯДЕРНАЯ ПОДДЕРЖКА УПРАВЛЕНИЯ ПАРАЛЛЕЛИЗМОМ НА УРОВНЕ ПОЛЬЗОВАТЕЛЯ.
Thomas E. Anderson, Brian N. Bershad, Edward D. Lazowska и Henry M.Levy
Вашингтонский университет

---
Нити являются способом воплощения одновременности для многих подходов в параллельном программировании. Нити могут поддерживаться как операционной системой, так и библиотекой пользовательского уровня в адресном пространстве приложения, но оба варианта страдают своими недостатками.

Эта статья рассматривает возникающую дилемму. Во-первых, мы покажем, что производительность ядерных нитей неизбежно ниже производительности нитей пользовательского уровня. Далее мы показываем, что проблемы, появляющиеся при объединении пользовательских нитей с другими системными сервисами являются следствием недостаточной поддержки пользовательских нитей в современных операционных системах; ядерные же нити являются неудачной базой для поддержки пользовательского механизма управления нитями. Наконец, мы опишем дизайн, реализацию и производительность нового ядерного интерфейса и пользовательского пакета поддержки нитей, которые совместно обеспечивают такую же функциональность, что и ядерные нити, но без потери в производительности и гибкости, как и в случае управления параллелизмом на пользовательском уровне.
---

ОБРАЩЕНИЯ К ПЛАНИРОВЩИКУ: ЭФФЕКТИВНАЯ ЯДЕРНАЯ ПОДДЕРЖКА УПРАВЛЕНИЯ ПАРАЛЛЕЛИЗМОМ НА УРОВНЕ ПОЛЬЗОВАТЕЛЯ. 2
1. ВВЕДЕНИЕ.. 2
1.1 Проблема. 2
1.2 Цели работы.. 3
1.3 Подход. 4
2. НИТИ ПОЛЬЗОВАТЕЛЬСКОГО УРОВНЯ: ПРЕИМУЩЕСТВА В ПРОИЗВОДИТЕЛЬНОСТИ И ОГРАНИЧЕНИЯ ФУНКЦИОНАЛЬНОСТИ.. 4
2.1 Исследование управления пользовательскими нитями. 5
2.2 Источники плохой интеграции в систему пользовательских нитей, построенных на традиционном интерфейсе ядра. 6
3. ЭФФЕКТИВНАЯ ЯДЕРНАЯ ПОДДЕРЖКА ПОЛЬЗОВАТЕЛЬСКОГО УПРАВЛЕНИЯ ПАРАЛЛЕЛИЗМОМ... 7
3.1 Явное направление события ядра пользовательскому планировщику нитей. 8
3.2 Извещение ядра о событиях на пользовательском уровне, которые могут повлиять на распределение процессоров. 12
3.3 Критические секции. 13
4. РЕАЛИЗАЦИЯ.. 14
4.1 Политика распределения процессоров. 15
4.2 Политика планирования нитей. 15
4.3 Способы повышения производительности. 16
4.4 Вопросы отладки. 17
5. ПРОИЗВОДИТЕЛЬНОСТЬ.. 17
5.1 Производительность работы с нитями. 17
5.2 Производительность передачи управления. 18
5.3 Производительность приложений. 18
6. ПОХОЖИЕ ИДЕИ.. 22
7. ИТОГИ.. 23
БЛАГОДАРНОСТИ
Re[10]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.10.05 11:41
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Битовыжимание — это сложный процесс которому надо долго учиться. И не только в плане алгоритмов и математики.


Видтшь ли, все это здорово. В теории. А на практике я еще не разу не сталкивался с проблемами, когда новичек писал жутко неоптимальный, но рабочий код. А вот с обратным сталкивался очень часто.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[11]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 25.10.05 11:47
Оценка:
Здравствуйте, AndrewVK, Вы писали:


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


С этими проблемами потом пользователи его продукта сталкиваются . Ежедневно, ежечасно, и в массовом масштабе.
With best regards
Pavel Dvorkin
Re[12]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.10.05 12:03
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>С этими проблемами потом пользователи его продукта сталкиваются . Ежедневно, ежечасно, и в массовом масштабе.


Опять же по опыту скажу — нарекания на производительность от заказчиков явление редкое. Куда больше притензий по юзабилити, недостаточному функционалу и глюкам. Производительность, как это не парадоксально, почему то больше всего заботит программистов.
И даже если притензии по производительности есть, то они практически всегда определяются скоростью БД или внешних устройств, так что игры с битами и ручным управлением памятью в таких случаях ничем не помогут.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[13]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 25.10.05 13:34
Оценка: +1 -2
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>С этими проблемами потом пользователи его продукта сталкиваются . Ежедневно, ежечасно, и в массовом масштабе.


AVK>Опять же по опыту скажу — нарекания на производительность от заказчиков явление редкое.


Может быть, у меня была уникальная работа, но от меня в первую очередь требовали производительности. Скажу больше — ради этого меня в команду и приняли. Проект уже несколько лет как был в работе, их многое не устраивало, но от меня требовали только одно — обеспечить доступ к данным с максимальной скоростью. Потому что если образец не будет обработан за 3 сек — его безжалостный тайм-шедулер просто сбросит.

Это во-первых. А во-вторых — а не кажется ли тебе, что заказчика мы сами воспитываем так, что он принимает низкое быстродействие как должное ? Почем ему знать, что здесь можно выжать, он же не специалист! Тебе автомобиль дали (допустим, ты не спец в них), он 120 выжимает, других нет — хорошо. А то, что он мог бы 160 выжимать — ты и не узнаешь. А компьютер и ПО ИМХО посложнее. Тем более что апгрейд автомобиля ему не посоветуешь, а тут все ясно — купите еще памяти, второй (третий и т.д) процессор, кластеризацию устройте и т.д. А он этому верит — специалист же советует, и хороший (без иронии говорю).

>Куда больше притензий по юзабилити, недостаточному функционалу и глюкам.


Юзабилити и недостаточный функционал — за пределами этой дискуссии, это отдельная тема. Глюки — да. Но убедительного доказательства, что расточительно написанная программа будет более безошибочной я не вижу.

Еще раз, да поймет меня тот, кто слышит (это не лично к тебе). Я не против хорошего проектирования , дизайна и т.д.
Я против бесконтрольного использования заведомо неэффективных решений под видом лучшего проектирования и т.д. Я против расточительных конструкций — независимо от того, кто их делает — программист или библиотека.


>Производительность, как это не парадоксально, почему то больше всего заботит программистов.


Эх, если бы. Боюсь, грядет век, когда она их и впрямь заботить не будет. Будут плодить монстров, жрущих память и ресурсы, медленные как черепахи , зато понятные и легко сопрвождаемые, да еще и говорить, что это, мол, главное. Как будто программы делаются не для того, чтобы они работали лучше, а для того, чтобы их модифицировать было легче.
Вообще мое настроение на этот счет назвать оптимистическим нельзя.

AVK>И даже если притензии по производительности есть, то они практически всегда определяются скоростью БД или внешних устройств, так что игры с битами и ручным управлением памятью в таких случаях ничем не помогут.


Где как. К примеру, в моем проекте заказчик вынужден был отказаться от баз данных и мне как раз поручили написать свою систему хранения информации в файле. Я удивился и спросил — почему БД не использовать ? Ответ был прост — недостаточно быстро. Надо сказать, что БД в этом проекте была константой, т.е в нее изменения не вносились вообще, она раз в 3 месяца перегенерировалась и всем рассылались новые копии. Я не поленился, запросил в ФИДО конференции по БД (RSDN тогда еще не было), от какой БД можно ждать получения данных в таком-то и таком случае за 50-70 мсек ? Меня там на смех подняли . Я и сыграл на константности данных — только поиск. А в итоге я сделал доступ в 90% случаев за 20 мсек или менее при том , что поиск практически всегда шел с wildcard, т.е. типа LIKE. На это я много времени убил
Да, здесь можно было от БД отказаться. В других случаях нельзя. И то, что при условии, что БД лимитирует, оптимизировать нет смысла — понимаю и не против. Кстати, как химик с понятием лимитирующая стадия процесса знаком не понаслышке . И поверь,оптимизировать чтение из файла путем замены двух сопутствующих операторов я тоже не призываю. а вот когда некие умники начинают из файла по одному байту читать — это уже другой разговор.
Ну а внешние устройства — тема особая.
With best regards
Pavel Dvorkin
Re[11]: Немного о многопоточности
От: GlebZ Россия  
Дата: 25.10.05 15:57
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

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


GZ>>Битовыжимание — это сложный процесс которому надо долго учиться. И не только в плане алгоритмов и математики.


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

Нее, я встречал. Жутко неоптимальный, но рабочий. А неоптимальность еще состоит в том, что при изменении входных данных все валится.
Я не говорю о том, что не нужно уметь остальное. Научить писать красивый код значительно сложней. Но то, что за некоторые действия придется платить — нужно ощущать.

Возьмем ситуацию которая уже обсуждалась. Когда человек изменяет строку в цикле не через StringBuilder, то как выразился Sinclair — подлежит увольнению. Для обоснавания того, что нужно работать через StringBuilder — желательно объяснить как он работает. Или возьмем те же заморочки с производительностью через Reflector. Если программист реализовал через рефлектор некоторую важную и часто выполняемую часть программы, и получил недопустимо низкую производительность, то тут уже проблема архитектуры или алгоритмов. И легче переписать чем переделать.

Мне больше нравятся люди, которые не только знают что это работает, а которые знают — как и почему. Такие люди не только интересней, но и полезней.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[14]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.10.05 08:32
Оценка: 72 (6) +4
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Может быть, у меня была уникальная работа, но от меня в первую очередь требовали производительности.


Кто требовал? Заказчик? И когда это было?
Времена меняются, меняются приоритеты.

PD>Это во-первых. А во-вторых — а не кажется ли тебе, что заказчика мы сами воспитываем так, что он принимает низкое быстродействие как должное?


Нет, не кажется. Заказчик, он штука такая, если что не нравится он быстро уйдет к другому. Конкуренция на IT рынке очень жесткая. Вот буквально вчера общался на эту тему — куча требований, притом весьма противоречивых. Причем, когда я сказал, что реализация части запросов приведет к серьезным тормозам, мне было отвечено что плевать.

PD> Почем ему знать, что здесь можно выжать, он же не специалист!


Зато он точно знает что ему нужно.

PD> Тебе автомобиль дали (допустим, ты не спец в них), он 120 выжимает, других нет — хорошо. А то, что он мог бы 160 выжимать — ты и не узнаешь.


Если это грузовик, то хоть 200 — все равно быстрее 100 ему ездить не нужно, у него другие приоритеты — сколько груза поднимает, как часто ломается, сколько запчасти стоят и т.п.

>>Куда больше притензий по юзабилити, недостаточному функционалу и глюкам.


PD>Юзабилити и недостаточный функционал — за пределами этой дискуссии, это отдельная тема.


Да в том то и дело, что нет. Все эти вещи взаимосвязаны. В условиях ограниченных ресурсов повышение производительности возможно только за счет чего то дургого — обычно за счет функционала, надежности либо сроков. Бесплатного сыра не бывает.

PD> Глюки — да. Но убедительного доказательства, что расточительно написанная программа будет более безошибочной я не вижу.


А такого никто и не утверждает. Говорят о другом — если приоритет отдать безглючности, то глюков будет меньше, хотя бы и в ущерб производительности.

PD>Еще раз, да поймет меня тот, кто слышит (это не лично к тебе). Я не против хорошего проектирования , дизайна и т.д.

PD>Я против бесконтрольного использования заведомо неэффективных решений под видом лучшего проектирования и т.д. Я против расточительных конструкций — независимо от того, кто их делает — программист или библиотека.

Видишь ли — не существует единственно хорошего, т.е. верного и правильного дизайна, это я тебе как краевед говорю. При проектировании любого куска существует множество решений и, как правило, ни одно из них не является лучшим по всем параметрам. Одно тяжелее реализовать, другое приводит к плохо масштабируемому коду, третье чревато глюками, четвертое привносит заметный оверхед и т.п. Задача архитектора — выбрать золотую середину. Так вот — золото этой середины существенно зависит от приоритетов. Если производительность нужна любой ценой, то будет выбрано одно решение, если это не так — другое.
Что же касается расточительных конструкций — очень редко бывает, что оверхед абсолютно бессмысленен. Например, Directory.GetFiles, против которой ты ополчился, на самом деле проще в использовании, нежели виндовый FindFirst/FindNext, код с ее использованием прозрачнее и чище. А если прикинуть типовой сценарий использования — проход по каталогу типичных размеров и обработка найденных файлов, то GetFiles еще и более масштабируемо, поскольку держит объекты ядра максимально короткое время. И то, что оно у тебя тормозит на каталоге из 100000 свидетельствует о нетипичности задачи (тем более что у NTFS при таком количестве мелких файлов будут большие проблемы, причем, что характерно, как раз из-за ее оптимизации). И лучшим решением было бы сменить способ хранения.

>>Производительность, как это не парадоксально, почему то больше всего заботит программистов.


PD>Эх, если бы. Боюсь, грядет век, когда она их и впрямь заботить не будет. Будут плодить монстров, жрущих память и ресурсы, медленные как черепахи , зато понятные и легко сопрвождаемые, да еще и говорить, что это, мол, главное.


Ну и что? Что в этом страшного? В конце концов, тебе шашечки или ехать? Лично мне ехать, поэтому мне не нужно максимально быстрых программ, мне нужны достаточно быстрые.

PD> Как будто программы делаются не для того, чтобы они работали лучше, а для того, чтобы их модифицировать было легче.


Работать лучше != работать быстрее. Вот например быстрый InDesign падает постоянно. И, знаешь, почему то Миша Купаев (редактор RSDN Mag) предпочел бы если бы он тормозил, чем так падать. Скажешь его тоже программисты обманули?

AVK>>И даже если притензии по производительности есть, то они практически всегда определяются скоростью БД или внешних устройств, так что игры с битами и ручным управлением памятью в таких случаях ничем не помогут.


PD>Где как. К примеру, в моем проекте заказчик вынужден был отказаться от баз данных и мне как раз поручили написать свою систему хранения информации в файле. Я удивился и спросил — почему БД не использовать ? Ответ был прост — недостаточно быстро.


Не смешно. Может он просто БД готовить не умеет?

PD>А в итоге я сделал доступ в 90% случаев за 20 мсек или менее при том , что поиск практически всегда шел с wildcard, т.е. типа LIKE. На это я много времени убил


Во-первых современные сиквел-сервера умеют в некоторых случаях для like использовать индекс. Во-вторых отсуствие full text search в конкретной БД совсем не повод отказываться от БД в качестве хранилища. Ну да бог с ней, с БД, ты только что сам признал, что все упиралось в скорость доступа к данным на диске. Для современного процессора единственное обращение к диску это вечность. Так что оптимизация кода здесь малоэффективна, нужно оптимизировать алгоритмы.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[10]: Бага
От: Gaperton http://gaperton.livejournal.com
Дата: 26.10.05 13:53
Оценка:
Здравствуйте, Gaperton, Вы писали:

>>> В этом коде, что я привел, ошибка. Ну не то, чтобы ошибка, но... Он

>>> будет нормально работать для Events, но в общем случае не будет
>>> работать корректно для CriticalSection. Тому, кто найдет ошибку, и
>>> объяснит — специальный приз в виде оценки "супер".

C>>CRITICAL_SECTION — рекурсивна, Event — нет?


G>Да, но не в этом проблема. Тут прикольнее — именно вопрос реализации критической секции. Рассмотри ситуацию, когда объект в несигнальном состоянии, и на нем ждет много "процессов". Вот он переходит в сигнальное состояние, а потом обратно, а никто из "процессов" не успел получить управление. Что должно произойти в случае Event и CriticalSection?


Да, вижу, немного желающих и имеющих возможность решить эту задачку. Должно призойти следующее: все потоки, стоящие на Event, должны дружно проскочить дальше. Ну, или один — зависит от типа Event-а. В случае же критической секции ни один из потоков проскочить не должен по любому.

В этом и состоит разница между Event-ом и критической секцией. И в этом состоит ошибка в приведенной реализации WaitForAll — эта разница в функции не учтена, и код в таком виде будет работать только для Event. Впрочем, эту проблему несложно решить. Я пишу это для того, чтобы вы почувствовали, с какого рода проблемами вам придется столкнуться в случае написания планировщика.

И хочу дать совет. Это крайне интересно и увлекательно, но. Не надо пытаться сразу реализовывать все примитивы синхронизации. Добавляйте их и думайте о них по мере необходимости. Потому что необходимость в них возникает на порядок реже, чем в случае потоков — может быть, вы с ней вообще не столкнетесь.
Re[13]: Немного о многопоточности
От: vladserge Россия  
Дата: 26.10.05 16:06
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Так вот он им никогда не станет, или убъет кучу времени на вправление мозгов, если его образование начнется не с борьбы за биты. Я еще понимаю почему это получалось 10-20 лет назад. Тогда выжимание битов из байтов было актуально. Но сейчас то зачем мозги плющить этим?


Не правда Ваша.
Активно развивающиеся мобильные технологии требуют спецов битовыжимания. И это действительно современно!
Спираль замкнулась, но на другом уровне. На смену мобильным придут микро или нано технологии, перспектива для таких спецов очевидна.
С Уважением Сергей Чикирев
Re[14]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.10.05 23:58
Оценка:
Здравствуйте, vladserge, Вы писали:

V>Не правда Ваша.

V>Активно развивающиеся мобильные технологии требуют спецов битовыжимания. И это действительно современно!

То-то у меня телефон на Яве.

Ну, и потребность в таких специалистах стримится к нулю.

V>Спираль замкнулась, но на другом уровне. На смену мобильным придут микро или нано технологии, перспектива для таких спецов очевидна.


В современном КПК минимум 64 метра памяти. Сравни это с топовыми пюсюками 1985-го года. Стало быть в каком-нить далеком 2020 в новейших нанодевайсах будет современные 512 метров, а то и гиг.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 27.10.05 05:55
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>В современном КПК минимум 64 метра памяти. Сравни это с топовыми пюсюками 1985-го года. Стало быть в каком-нить далеком 2020 в новейших нанодевайсах будет современные 512 метров, а то и гиг.


Но, как и сегодня, кроме притивных игрулек там ничего не будет запускаться.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[15]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 27.10.05 07:16
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Может быть, у меня была уникальная работа, но от меня в первую очередь требовали производительности.


AVK>Кто требовал? Заказчик? И когда это было?


2 года назад.

AVK>Времена меняются, меняются приоритеты.


Нет, для этой задачи приоритет меняться не может. Вот если 30 GHZ у процессора будет — может, и помягче будет. 3 секунды на образец — не успел — до свидания — и вам дополнительный минус.

PD>>Это во-первых. А во-вторых — а не кажется ли тебе, что заказчика мы сами воспитываем так, что он принимает низкое быстродействие как должное?


AVK>Нет, не кажется. Заказчик, он штука такая, если что не нравится он быстро уйдет к другому. Конкуренция на IT рынке очень жесткая. Вот буквально вчера общался на эту тему — куча требований, притом весьма противоречивых. Причем, когда я сказал, что реализация части запросов приведет к серьезным тормозам, мне было отвечено что плевать.


Ну плевать так плевать.

Насчеит уйдет к другому — все не так просто.
Конечно, если другой сделает это в 2 раза более быстро работающим — да. Ну а если другой сделает примерно то же самое ? И остальные другие то же сделают ? Потому что в мире это так принято.

Страшная штука — общественное мнение. Бороться с ним почти невозможно. Все уверовали в то, что именно так и должно быть. И тот, кто скажет, что так быть не должно, в лучшем случае встретит недоуменный взгляд, а в худшем...

Помнишь сказку про голого короля ? Там все придворные делали вид, что на голом короле великолепное платье. А потом появился мальчик, который и сказал :"А король-то голый".

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

Когда придворные впервые увидели голого короля, они, конечно, поверили своим глазам и поняли, что король голый. Но их убеждали, что на короле шикарное платье. Вначале они посмеивались про себя — ну надо делать вид, что это так, будем делать вид. Но человек не может долго лгать самому себе. Другим — может, себе — нет. Это противоречит психологии человека. Поэтому он начинает в свою ложь верить. И спустя некоторое время эти придворные уже вполне верили, что на короле шикарное платье. Не лгали себе, а были в этом убеждены. Вопреки тому, что видели.
И когда появился мальчик и сказал свои слова, то на придворных это никакого влияния не оказало. Мальчика заперли в тюрьму или сумасшедший дом, король продолжал ходить голый, придворные восхваляли по-прежнему его наряд. Вот и все.

Не раз я с этим сталкивался в своей жизни. Делают люди явную чушь, но они ее делают давно, им никто делать, квы, не мешает, вот они и уверовали в то, что делают они нужное и полезное дело. И попробуй им сказать, что они в действительности ерундой занимаются. Да более того — попробуй им объяснить, что вместо этого делать надо (и при том, что они это делать даже смогут!). Бесполезно. Так и будут своей ерундой заниматься. Хорошо, если их ерунда на других не скажется и у них власти нет. А иначе — а впрочем, о чем тут говорить. Ты при советской власти жил ?

Я, конечно, очень далек от мысли, что те, кто делает неэффективно, занимаются ерундой. Просто они неэффективно делают, и в этом мире так принято (могу на эту тему анекдот рассказать . И далеко не всегда найдется достаточно мощная сила, которая сможет не только им сказать "вы не так делаете", но еще и мир убедить, что они не так делают.
PD>> Почем ему знать, что здесь можно выжать, он же не специалист!

AVK>Зато он точно знает что ему нужно.



PD>>Еще раз, да поймет меня тот, кто слышит (это не лично к тебе). Я не против хорошего проектирования , дизайна и т.д.

PD>>Я против бесконтрольного использования заведомо неэффективных решений под видом лучшего проектирования и т.д. Я против расточительных конструкций — независимо от того, кто их делает — программист или библиотека.

AVK>Что же касается расточительных конструкций — очень редко бывает, что оверхед абсолютно бессмысленен. Например, Directory.GetFiles, против которой ты ополчился, на самом деле проще в использовании, нежели виндовый FindFirst/FindNext, код с ее использованием прозрачнее и чище.



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


>А если прикинуть типовой сценарий использования — проход по каталогу типичных размеров и обработка найденных файлов, то GetFiles еще и более масштабируемо, поскольку держит объекты ядра максимально короткое время. И то, что оно у тебя тормозит на каталоге из 100000 свидетельствует о нетипичности задачи


М-да, совершенно нетипичная задача — реализовать команду dir

>(тем более что у NTFS при таком количестве мелких файлов будут большие проблемы


Не будет. Там B+ дерево. Вот у FAT, точно, будет.

>, причем, что характерно, как раз из-за ее оптимизации). И лучшим решением было бы сменить способ хранения.


Я бы и рад в рай, да грехи не пускают. Так эти данные от прибора поступают туда через ПО, которое мне не подконтрольно.

>>>Производительность, как это не парадоксально, почему то больше всего заботит программистов.


PD>>Эх, если бы. Боюсь, грядет век, когда она их и впрямь заботить не будет. Будут плодить монстров, жрущих память и ресурсы, медленные как черепахи , зато понятные и легко сопрвождаемые, да еще и говорить, что это, мол, главное.


AVK>Ну и что? Что в этом страшного? В конце концов, тебе шашечки или ехать?


Ехать, но с ветерком, а не на кляче.

>Лично мне ехать, поэтому мне не нужно максимально быстрых программ, мне нужны достаточно быстрые.


Так ведь в итоге получаются недостаточно. А когда этих недостаточно на одном РС соберется с десяток, то все тормозить начинает уж совсем неприлично.


AVK>Работать лучше != работать быстрее. Вот например быстрый InDesign падает постоянно. И, знаешь, почему то Миша Купаев (редактор RSDN Mag) предпочел бы если бы он тормозил, чем так падать. Скажешь его тоже программисты обманули?


С InDesign не знаком, так что no comment. А если уж зашла речь о RSDN, то не мог бы ты как член RSDN Team объянить наконец, почему он иногда тормозит на 30-40 секунд ? Я об этом несколько раз в "Обсуждении сайта" спрашивал, никто не отвечает. Я , конечно, не буду утверждать, что по мне бы лучше, чтобы он падал, но не тормозил, но вот то, что он тормозит, меня отнюдь не радует. Потому что в результате я трачу времени на просмотр больше, чем надо.

AVK>>>И даже если притензии по производительности есть, то они практически всегда определяются скоростью БД или внешних устройств, так что игры с битами и ручным управлением памятью в таких случаях ничем не помогут.


PD>>Где как. К примеру, в моем проекте заказчик вынужден был отказаться от баз данных и мне как раз поручили написать свою систему хранения информации в файле. Я удивился и спросил — почему БД не использовать ? Ответ был прост — недостаточно быстро.


AVK>Не смешно. Может он просто БД готовить не умеет?


Смешного мало. Утверждать, не зная задачи, что нужную производительность можно получить — я бы не стал. Кстати, когда я обратился в ФИДО конференцию по БД и описал им ситуацию, ответ был почти единодушный — ты этого с помощью БД не получишь, пиши лучше что-то свое.

PD>>А в итоге я сделал доступ в 90% случаев за 20 мсек или менее при том , что поиск практически всегда шел с wildcard, т.е. типа LIKE. На это я много времени убил


AVK>Во-первых современные сиквел-сервера умеют в некоторых случаях для like использовать индекс.


Знаю. Но только в некоторых случаях. А в общем случае — не могут.


>Во-вторых отсуствие full text search в конкретной БД совсем не повод отказываться от БД в качестве хранилища. Ну да бог с ней, с БД, ты только что сам признал, что все упиралось в скорость доступа к данным на диске. Для современного процессора единственное обращение к диску это вечность. Так что оптимизация кода здесь малоэффективна, нужно оптимизировать алгоритмы.


Именно. Только с маленькой поправкой — скорость доступа к данным на диске при том, что там данные организованы именно так, как мне лучше. Оптимизировал я именно алгоритм (там и близко никаких реляционных таблиц не было) и способ хранения, т.е структуру файла. Повлиять на скорость работы диска я не могу. а вот сделать так, чтобы время запроса было сравнимым с временем чтения с диска выборки, как если бы она там уже была готовой (а это обычно было 20-50 Кбайт, не более) — могу. И именно это я и сделал — организовал данные таким образом, что нужно было просто прочитать нужное место, ну и кое-что все же отфильтровать — и вот они на блюдечке с голубой каемочкой.
With best regards
Pavel Dvorkin
Re[16]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.05 09:03
Оценка: +3
Здравствуйте, Pavel Dvorkin, Вы писали:

AVK>>Времена меняются, меняются приоритеты.


PD>Нет, для этой задачи приоритет меняться не может. Вот если 30 GHZ у процессора будет — может, и помягче будет. 3 секунды на образец — не успел — до свидания — и вам дополнительный минус.


Рассказал бы ты все таки что за задача такая.

PD>Насчеит уйдет к другому — все не так просто.

PD>Конечно, если другой сделает это в 2 раза более быстро работающим — да. Ну а если другой сделает примерно то же самое ? И остальные другие то же сделают ? Потому что в мире это так принято.

Ты как будто меня не слышишь. Не я убеждаю заказчика, что производительность не важна. Заказчик убеждает меня, что ему нужен функционал, пусть даже работать это будет очень медленно. И если я ему скажу, что я часть его требований не выполню, зато у него все будет в 10 раз быстрее работать, то он даже разговаривать со мной не будет.

PD>Страшная штука — общественное мнение. Бороться с ним почти невозможно. Все уверовали в то, что именно так и должно быть. И тот, кто скажет, что так быть не должно, в лучшем случае встретит недоуменный взгляд, а в худшем...


Какое к черту общественное мнение? Люди приходят с вполне конкретными требованиями, которые диктуются конкретной ситуацией на их предприятиях. Им плевать на всю эту философию по поводу производительности, потому что, если что то можно сделать автоматически, то это должно быть сделано автоматически и как можно быстрее (в плане доступности решения). Даже если это будет медленнее работать, нежели сделать то же самое руками.
Поэтому ты можешь убеждать себя и других про голого короля, на заказчика это не повлияет. Потому что ему не шашечки, ему ехать. И критерий у него очень простой — вчера у него сидело 2 бабы Мани, а сегодня одна. А работа выполняется та же. Или вчера он остатки на складе получал к обеду раз в день, а сегодня в любое время, через 5 минут после нажатия кнопки. Все, на остальное ему плевать. В том числе и на покупку новых компов, потому что стоимость железок даже для небольшого предприятия ничтожна.
И еще о понятии эффективности — понятие это штука сложная. Не стоит его рассматривать только с точки зрения потребленного электричества. Надо думать и о людских ресурсах, и о стоимости разработки решения, и о времени на модернизацию и о куче других проблем. Программа сама по себе малоинтересна, интересен реальный выхлоп процесса в котором эта программа участвует.

AVK>>Что же касается расточительных конструкций — очень редко бывает, что оверхед абсолютно бессмысленен. Например, Directory.GetFiles, против которой ты ополчился, на самом деле проще в использовании, нежели виндовый FindFirst/FindNext, код с ее использованием прозрачнее и чище.


PD>Пардон, решительно возражу. Получать всю коллекцию чего бы то ни было, когда нужен один или несколько элементов этой коллекции — не есть прозрачнее и чище.


Опять ты меня не слышишь. В 90% случаев нужно получить всю коллекцию. И в этом случае GetFiles эффективнее.

>>А если прикинуть типовой сценарий использования — проход по каталогу типичных размеров и обработка найденных файлов, то GetFiles еще и более масштабируемо, поскольку держит объекты ядра максимально короткое время. И то, что оно у тебя тормозит на каталоге из 100000 свидетельствует о нетипичности задачи


PD>М-да, совершенно нетипичная задача — реализовать команду dir


Нетипичная задача — хранить 100000 файлов в одном каталоге.

>>(тем более что у NTFS при таком количестве мелких файлов будут большие проблемы


PD>Не будет. Там B+ дерево. Вот у FAT, точно, будет.


Будут. Например, с целью оптимизации доступа к мелким файлам эти файлы не занимают кластеры в основном пространстве, а храняться прямо в MFT. Это позволяет съэкономить одно позиционирование головки. Но есть одна засада — расти MFT умеет, а вот уменьшаться нет. А еще оно не умеет дефрагментироваться. В результате, из-за распухшей и фрагментированной MFT операции с диском заметно замедляются.

>>, причем, что характерно, как раз из-за ее оптимизации). И лучшим решением было бы сменить способ хранения.


PD>Я бы и рад в рай, да грехи не пускают. Так эти данные от прибора поступают туда через ПО, которое мне не подконтрольно.


Ага, вот и получается, что проблема то совсем не в БД.

>>Лично мне ехать, поэтому мне не нужно максимально быстрых программ, мне нужны достаточно быстрые.


PD>Так ведь в итоге получаются недостаточно.


Кому?

PD> А когда этих недостаточно на одном РС соберется с десяток, то все тормозить начинает уж совсем неприлично.


ВОт когда соберется, тогда и голову будем ломать. А пока что у меня софта на машине много, но особых взаимных тормозов я пока не наблюдаю.

PD> А если уж зашла речь о RSDN, то не мог бы ты как член RSDN Team объянить наконец, почему он иногда тормозит на 30-40 секунд?


Не знаю, я разработкой сайта почти не занимаюсь.

PD> Я об этом несколько раз в "Обсуждении сайта" спрашивал, никто не отвечает. Я , конечно, не буду утверждать, что по мне бы лучше, чтобы он падал, но не тормозил, но вот то, что он тормозит, меня отнюдь не радует. Потому что в результате я трачу времени на просмотр больше, чем надо.


Поставь янус.

AVK>>Не смешно. Может он просто БД готовить не умеет?


PD>Смешного мало. Утверждать, не зная задачи, что нужную производительность можно получить — я бы не стал.


БД как минимум не хуже FS. Просто если тебе нужен полнотекстовый поиск, то не стоит использовать like.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[17]: Немного о многопоточности
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 27.10.05 09:17
Оценка:
Здравствуйте, AndrewVK, Вы писали:
AVK> В 90% случаев нужно получить всю коллекцию.

Вообще то в 90% случаев нужно последовательно обработать все элементы. А будут там элементы из потока (итератора) или самой коллекции, это не суть важно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[18]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.05 09:44
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

AVK>> В 90% случаев нужно получить всю коллекцию.


ANS>Вообще то в 90% случаев нужно последовательно обработать все элементы. А будут там элементы из потока (итератора) или самой коллекции, это не суть важно.


Важно, если смотреть с точки зрения времени использования открытых хендлов ядра. Я об этом писал.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[17]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 27.10.05 10:27
Оценка:
Здравствуйте, AndrewVK, Вы писали:


AVK>Ты как будто меня не слышишь. Не я убеждаю заказчика, что производительность не важна. Заказчик убеждает меня, что ему нужен функционал, пусть даже работать это будет очень медленно. И если я ему скажу, что я часть его требований не выполню, зато у него все будет в 10 раз быстрее работать, то он даже разговаривать со мной не будет.


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

PD>>Страшная штука — общественное мнение. Бороться с ним почти невозможно. Все уверовали в то, что именно так и должно быть. И тот, кто скажет, что так быть не должно, в лучшем случае встретит недоуменный взгляд, а в худшем...


AVK>Какое к черту общественное мнение? Люди приходят с вполне конкретными требованиями, которые диктуются конкретной ситуацией на их предприятиях. Им плевать на всю эту философию по поводу производительности, потому что, если что то можно сделать автоматически, то это должно быть сделано автоматически и как можно быстрее (в плане доступности решения). Даже если это будет медленнее работать, нежели сделать то же самое руками.


Именно так. Эти люди не знают, что здесь можно сделать, а поэтому полагаются на нас. А мы им даем не самое эффектиыное решение. А потом им надо еще что-то сделать, и то же самое происходит. И т.д. А в итоге все тормозит или жрет ресурсы. И мы им говорим — надо апгрейд машины делать. И они делают. А мы теперь еще больше ресурсов жрем. И все повторяется.


AVK>Поэтому ты можешь убеждать себя и других про голого короля, на заказчика это не повлияет. Потому что ему не шашечки, ему ехать. И критерий у него очень простой — вчера у него сидело 2 бабы Мани, а сегодня одна. А работа выполняется та же. Или вчера он остатки на складе получал к обеду раз в день, а сегодня в любое время, через 5 минут после нажатия кнопки. Все, на остальное ему плевать. В том числе и на покупку новых компов, потому что стоимость железок даже для небольшого предприятия ничтожна.


Да, ты, конечно, прав. Только вот правота эта сводится к одной простой фразе — заказчик все слопает. Как бы мы ни сделали — лишь бы его требованиям удовлетворяло. Ну что же, в этом есть свой резон — на уровне принципа "чего изволите". Но я это все же не могу принять — я хочу помимо всего еще и сделать как следует. И это как следует не заказчиком определяется, а мной. Потому что я знаю, как здесь можно сделать, а заказчик — не знает.


AVK>И еще о понятии эффективности — понятие это штука сложная. Не стоит его рассматривать только с точки зрения потребленного электричества. Надо думать и о людских ресурсах, и о стоимости разработки решения, и о времени на модернизацию и о куче других проблем. Программа сама по себе малоинтересна, интересен реальный выхлоп процесса в котором эта программа участвует.


Не так все это просто. От задачи зависит. Скажем, делая сайт для некоторой компании — это одно, а ICQ — это другое. Насчет дкмать о людских ресурсах — ох, не уверен совсем. Представь себе, что по такому пути автомобилестроители пойдут — не важно, сколько бензина автомобиль сжигает, надо ведь и о людских ресурсах, которые пошли на его разработку, подумать. Фирма с таким подходом в трубу там вылетит.


PD>>Пардон, решительно возражу. Получать всю коллекцию чего бы то ни было, когда нужен один или несколько элементов этой коллекции — не есть прозрачнее и чище.


AVK>Опять ты меня не слышишь. В 90% случаев нужно получить всю коллекцию. И в этом случае GetFiles эффективнее.


Эффективнее оно быть не может, потому хотя бы, что внутри себя вызывает FindFirst/NextFile . А насчет 90% — сомневаюсь. Вот тебе еще пример

The InstalledFontCollection class defines a class that represents the fonts installed on the system.

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

>>>А если прикинуть типовой сценарий использования — проход по каталогу типичных размеров и обработка найденных файлов, то GetFiles еще и более масштабируемо, поскольку держит объекты ядра максимально короткое время.


Если мне понадобится, я их тоже буду держать максимально короткое время. Потому как написать для меня GetFiles ничего не стоит. А с другой стороны , я полумаю, что мне важнее — один лишний хендл, от которого мне ни холодно ни жарко вообще-то, или лишних 50 Мбайт.

AVK>Нетипичная задача — хранить 100000 файлов в одном каталоге.


Пусть так. Но ведь нет же средства, вообще нет (без InterOp) решить эту, пусть нетипичную задачу.

AVK>Будут. Например, с целью оптимизации доступа к мелким файлам эти файлы не занимают кластеры в основном пространстве, а храняться прямо в MFT. Это позволяет съэкономить одно позиционирование головки. Но есть одна засада — расти MFT умеет, а вот уменьшаться нет. А еще оно не умеет дефрагментироваться. В результате, из-за распухшей и фрагментированной MFT операции с диском заметно замедляются.


Ну и что ? Какое это отношение к делу имеет ? Если я эти 100000 файлов по 100 каталогам разбросаю, что, размер MFT изменится или степень дефрагментированности ее ?

AVK>Ага, вот и получается, что проблема то совсем не в БД.


Нет. Это никакого отношения к БД не имело. БД — совсем другая часть задачи, а 100000 файлов — это просто тестовый набор образцов.

PD>>Так ведь в итоге получаются недостаточно.


AVK>Кому?


Мне.


PD>> Я об этом несколько раз в "Обсуждении сайта" спрашивал, никто не отвечает. Я , конечно, не буду утверждать, что по мне бы лучше, чтобы он падал, но не тормозил, но вот то, что он тормозит, меня отнюдь не радует. Потому что в результате я трачу времени на просмотр больше, чем надо.


AVK>Поставь янус.


Не имел с ним дела. Подумаю.

AVK>БД как минимум не хуже FS. Просто если тебе нужен полнотекстовый поиск, то не стоит использовать like.


Да какой-там к богу полнотекстовый поиск!
With best regards
Pavel Dvorkin
Re[5]: ОФФТОП
От: IID Россия  
Дата: 27.10.05 10:43
Оценка:
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, gear nuke, Вы писали:


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


GN>>Я тоже интересуюсь всякой такой ерундой. Причина проста — знаю очень мало. Это на Спектруме было понятно зачем каждый байт нужен, а теперь, когда в окружении многих других программ запускается и даже работает моя, первая мысль: "ух как повезло" .


S>А вот у меня был Speccy какой точно не помню, но прерывания у него были реализованы — мама-не-горюй...


да ладно, всё просто там было. в регистр I грузится старший байт адреса талицы прерываний. Младший байт берётся с шины данных в момент прихода прерывания. Задумка архитектуры проца отличная — возможность железкой выбирать нужное прерывание. На большинстве пост-советских клонов на шине адреса всегда был #FF — в момент прихода прерывания проц брал адрес обработчика из адреса regI * 256 + #FF Всё очень просто!

Но ещё был вопрос совместимости
На оригинальных Speccy и на некоторых клонах в момент прерывания на шине данных был мусор. В этом случае фигачили таблицу размером в 257 байт, выровненную на 256 байт в памяти, т.к. "мусорная" составляющая адреса вызывала колебание на адреса в таблице обработчиков в пределах 256 байт. Заполняли таблицу одинаковыми байтами (напр. #BE). Обработчик размещали, соотв. по адресу #BEBE

вот и вся обработка прерываний на Speccy (режим IM2)
А вот если почитать о прерываниях на x86 — там всё гораздо сложнее

P.S: Speccy — золотое время!
kalsarikännit
Re[18]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.05 11:13
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


PD>Естественно. Но разве я говорил, что ради быстродействия можно поступиться функционалом ?


Помнишь что я писал про многофакторность выбора оптимального решения?

PD>Именно так. Эти люди не знают, что здесь можно сделать, а поэтому полагаются на нас. А мы им даем не самое эффектиыное решение. А потом им надо еще что-то сделать, и то же самое происходит. И т.д. А в итоге все тормозит или жрет ресурсы.


Прочти то, что я писал про эффективность.

PD>Да, ты, конечно, прав. Только вот правота эта сводится к одной простой фразе — заказчик все слопает.


Где я такое писал? Я писал прямо обратное — заказчик не хочет лопать сверхпроизводительные решения, он хочет лопать достаточно производительные и максимально функциональные, причем, что характерно, вчера.

PD> Как бы мы ни сделали — лишь бы его требованиям удовлетворяло. Ну что же, в этом есть свой резон — на уровне принципа "чего изволите". Но я это все же не могу принять — я хочу помимо всего еще и сделать как следует.


Делай. Но за собственные деньги, а не за деньги заказчика. Представь, что ты приехал на сервис сменить летнюю резину на зимнюю. Оставил машину утречком, а вечером приходишь, а тебе и говорят — во-первых машина не готова, а во-вторых с вас 1000 баксов. Ты им — как твк, резину перемонтировать работы на полчаса и 20 баксов. А они тебе в ответ — тут у тебя чего то мотор еще барахлил, амортизаторы подсели, на крыле вмятина, на заднем стекле пару дорожек обогревателя не работают, аккумулятор старенький и т.д. Так мы решили все по совести сделать.
А теперь, внимание, вопрос — поедешь лы ты в такой сервис еще раз резину менять?

PD> И это как следует не заказчиком определяется, а мной. Потому что я знаю, как здесь можно сделать, а заказчик — не знает.


Зато заказчик знает сколько у него денег и сколько времени он готов терпеть.

PD>Не так все это просто.


Это у тебя все просто — мало ресурсов программа кушает, значит это безусловно хорошо. А на практике все совсем не так.

PD> От задачи зависит. Скажем, делая сайт для некоторой компании — это одно, а ICQ — это другое.


Вот об этом я тебе и говорю — выбор эффективного решения штука многофакторная и потребление ресурсов программой далеко не самое важное.

PD>Насчет дкмать о людских ресурсах — ох, не уверен совсем.


Если бы я был заказчик, то, после этой фразы, разговор был бы окончен.

PD> Представь себе, что по такому пути автомобилестроители пойдут — не важно, сколько бензина автомобиль сжигает, надо ведь и о людских ресурсах, которые пошли на его разработку, подумать.


А ты чего думаешь, они об этом не думают? Там сейчас все очень жестко — не сумеешь вовремя выпустить новые машины, вмиг вылетишь с рынка. И думают они не только о расходе бензина, а еще и о комфорте, надежности, дизайне, удобстве, функционале, ремонтопригодности, возможности предложить широчайший выбор опций, и, как это не удивительно, о возможности модернизации. Не секрет, что многие модели 2005 года ведут родословную от автомобилей 20-30летней давности. Т.е. новый автомобиль никто не проектирует с нуля, а, пользуясь заложенными на начальном проектировании запасами, модернизируют старый. До тех пор пока потенциал модернизации не будет исчерпан.
Да что там автомобили. Даже у современных истребителей, которые, казалось бы, должны создаваться на пределе возможного, тем не менее фактор модернизируемости при проектировании один из важнейших.

AVK>>Опять ты меня не слышишь. В 90% случаев нужно получить всю коллекцию. И в этом случае GetFiles эффективнее.


PD>Эффективнее оно быть не может


Читай еще раз что я писал об эффективности.

PD>, потому хотя бы, что внутри себя вызывает FindFirst/NextFile .


Ну и что? Ты помнишь что я писал про время использования объектов ядра? Так вот, с точки зрения масштабируемости решения лучше быстро перебрать, а потом уже ковыряться с файлами, нежели медленно ползти по директории.

PD> А насчет 90% — сомневаюсь.


Ну вот тем не менее за последние 10 лет лично мне ни разу не приходилось читать директории, в которых 100К файлов.

PD>The InstalledFontCollection class defines a class that represents the fonts installed on the system.


PD>Скажи, пожалуйста, для каких задач мне может понадобиться узнать все шрифты. установленные в системе.


Для выбора шрифта из списка. И тебя есть другие варианты применения?

PD>Если мне понадобится, я их тоже буду держать максимально короткое время.


Но при этом формировать буфер тебе придется вручную. В итоге — код больше, сложнее, да еще и помнить надо постоянно о масштабируемости.

AVK>>Нетипичная задача — хранить 100000 файлов в одном каталоге.


PD>Пусть так. Но ведь нет же средства, вообще нет (без InterOp) решить эту, пусть нетипичную задачу.


А чем тебя интероп не устраивает? Нормальное средство.

AVK>>Будут. Например, с целью оптимизации доступа к мелким файлам эти файлы не занимают кластеры в основном пространстве, а храняться прямо в MFT. Это позволяет съэкономить одно позиционирование головки. Но есть одна засада — расти MFT умеет, а вот уменьшаться нет. А еще оно не умеет дефрагментироваться. В результате, из-за распухшей и фрагментированной MFT операции с диском заметно замедляются.


PD>Ну и что ? Какое это отношение к делу имеет ?


Обыкновенное. Ты неэфективно используешь ресурс. Хранить все данные в небольшом количестве файлов эффективнее. Ты ведь за это борешься, а сам такие ляпы допускаешь.

PD>Если я эти 100000 файлов по 100 каталогам разбросаю, что, размер MFT изменится или степень дефрагментированности ее ?


Нет.

AVK>>Ага, вот и получается, что проблема то совсем не в БД.


PD>Нет. Это никакого отношения к БД не имело. БД — совсем другая часть задачи, а 100000 файлов — это просто тестовый набор образцов.


Вот я и говорю — крайне неэффективное решение.

Пишите свои программы эффективно, господа! По крайней мере настолько, насколько это возможно!

Ась?

AVK>>БД как минимум не хуже FS. Просто если тебе нужен полнотекстовый поиск, то не стоит использовать like.


PD>Да какой-там к богу полнотекстовый поиск!


А like по твоему что делает? Вот, кстати, еще один пример, когда ты не следуешь собственным лозунгам. Вместо специализированных решений использовал примитивный like, а оказались БД виноваты.

P.S. По поводу эволюции взглядов на достижение эффективности тебе, думаю, небезынтересно будет прочесть сообщение Re[8]: Как-бы продолжение...
Автор: AndrewVK
Дата: 10.01.05
.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[19]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 27.10.05 13:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Лирическое отступление:

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


Похоже, что да. Можно и прекратить. Поскольку мы взаимно, похоже, не слышим друг друга. Поэтому отвечаю только на то, на что считаю необходимым ответить — так сказать, не могу пропустить


PD>>Да, ты, конечно, прав. Только вот правота эта сводится к одной простой фразе — заказчик все слопает.


AVK>Где я такое писал? Я писал прямо обратное — заказчик не хочет лопать сверхпроизводительные решения, он хочет лопать достаточно производительные и максимально функциональные, причем, что характерно, вчера.


Мне трудно объяснять в десятый раз, когда меня понять не хотят упорно. Я еще раз повторяю — заказчик получает представление о том, что здесь хорошо, а что плохо — на основании того, как это здесь делается. На основании текущего уровня. Если конечно, это не заказчик, который вчера компьютеры увидел. Если он хоть несколько лет с ними работает — у него сформировались представления о том, что и как здесь должно быть. Мы их сформировали. О том, что он мог бы запросить более эффективное решение, он и не догадывается, точно так же, как потребители Фордов 1930 года не могли затребовать современную машину с меньшим расходом бензина.

PD>> Как бы мы ни сделали — лишь бы его требованиям удовлетворяло. Ну что же, в этом есть свой резон — на уровне принципа "чего изволите". Но я это все же не могу принять — я хочу помимо всего еще и сделать как следует.


AVK>Делай. Но за собственные деньги, а не за деньги заказчика. Представь, что ты приехал на сервис сменить летнюю резину на зимнюю. Оставил машину утречком, а вечером приходишь, а тебе и говорят — во-первых машина не готова, а во-вторых с вас 1000 баксов. Ты им — как твк, резину перемонтировать работы на полчаса и 20 баксов. А они тебе в ответ — тут у тебя чего то мотор еще барахлил, амортизаторы подсели, на крыле вмятина, на заднем стекле пару дорожек обогревателя не работают, аккумулятор старенький и т.д. Так мы решили все по совести сделать.


AVK>А теперь, внимание, вопрос — поедешь лы ты в такой сервис еще раз резину менять?


Так он барахлил или нет ?
Аккумуляторы сели или нет ?
Вмятина была ?
И стоит ли вся эта работа 1000$ ?
Если все, что они сделали, действительно по делу, а не чтобы деньги слупить, если после этого машина пройдет 100 тыс км без обращения к ним, а иначе бы не прошла — приеду. Правда, лучше, если бы они не слепили бы с меня $1000 post factum, а честно сказали бы — так мол и так, заплатите нам $1000, зато потом гарантируем 100000 км без сучка и задоринки, а иначе мотор через 100 км забарахлит, аккумулятор сядет и т.д.
PD>> И это как следует не заказчиком определяется, а мной. Потому что я знаю, как здесь можно сделать, а заказчик — не знает.

AVK>Зато заказчик знает сколько у него денег и сколько времени он готов терпеть.


Мы не договоримся, Andrew. Не он знает, а мы ему это представление сформировали своей деятельностью. Он вообще-то ничего не знает. Он свои дела знает (бизнес и т.д.), а в ИТ он знает то, что ему сфера ИТ навяжет. Как и мы знаем с тобой про самолеты, если, конгечно, ты еще и не специалист по воздухоплаванию

AVK>Это у тебя все просто — мало ресурсов программа кушает, значит это безусловно хорошо. А на практике все совсем не так.


Да нет же, совсем не так. Ну почему вы все меня никак понять не хотите ? Я высказался — пишите эффективнее. Мне в ответ — да он призывает к эффективности любой ценой! Не призываю я любой ценой! И готов платить ресурсами, если это надо. Я же не к этому призываю, а к неиспользованию заведомо неэффективных решений, аргументируя это то ли тем, что они проще, то ли тем, что так, мол, библиотека устроена, то ли еще чем. Ну скажи на милость, ты ведь не первый год в ИТ, положа руку на сердце — неужели FindFirst так уж впрямь нарушит дизайн, архитектуру и т.д. ? Ну несерьезно же такое утверждать! Это же 5 минут программирования, и никак ни на каком дизайне не скажется. Мелочь это просто, вот и все. А это решение навязывается библиотекой, и его будут использовать без всякого Интеропа те, кто про Win32 и не слышал, а их все больше будет. Вот это мне и не нравится. Вы отдаете себе отчет, что вы в .Net создаете новый мир программирования ? Отнюдь не Win32 мир с расширениями! И использовать там ИнтерОп большинство будет через некоторое время не больше, чем вызовы WinAPI в VB — тоже ведь не запрещено. И эти новые адепты будут использовать эти неэффективные решения просто потому, что они другого не знают, их этому не учили. а тогда поздно будет что-то менять — общественное мнение сложилось, именно так и надо, именно так и хорошо.

А ты мне — он призывает оптимизировать любой ценой!

AVK>Вот об этом я тебе и говорю — выбор эффективного решения штука многофакторная и потребление ресурсов программой далеко не самое важное.


Да согласен я, согласен. Ну не призываю я любой ценой

PD>>Насчет дкмать о людских ресурсах — ох, не уверен совсем.


AVK>Если бы я был заказчик, то, после этой фразы, разговор был бы окончен.


Твое право. Но, боюсь, когда речь идет о серьезных компаниях по разработке и производству чего бы то ни было. там на первом месте качество продукции, а не то, сколько на это рабочих надо. Нет рабочих или нет денег их набрать — не беритесь. А вот если хотите сэкономить на их труде и за счет этого выпустить продукцию хуже, чем у конкурента — вылетите в трубу.
А заказчик здесь вообще-то ни при чем. Не интересует меня как потенциального заказчика, сколько рабочих у Тойоты и как они оплачиваются. Меня только качество Тойоты интересует и стоимость. Не можете делать за такую же цену и не хуже по качеству, чем у конкурента — у него и куплю. Так что заказчик только деньги платит, а сколько платить — конкуренцией определяется.

PD>> Представь себе, что по такому пути автомобилестроители пойдут — не важно, сколько бензина автомобиль сжигает, надо ведь и о людских ресурсах, которые пошли на его разработку, подумать.


AVK>А ты чего думаешь, они об этом не думают? Там сейчас все очень жестко — не сумеешь вовремя выпустить новые машины, вмиг вылетишь с рынка. И думают они не только о расходе бензина, а еще и о комфорте, надежности, дизайне, удобстве, функционале, ремонтопригодности, возможности предложить широчайший выбор опций, и, как это не удивительно, о возможности модернизации. Не секрет, что многие модели 2005 года ведут родословную от автомобилей 20-30летней давности. Т.е. новый автомобиль никто не проектирует с нуля, а, пользуясь заложенными на начальном проектировании запасами, модернизируют старый. До тех пор пока потенциал модернизации не будет исчерпан.


Именно. На 101% согласен. Обо всем этом они думают, это и есть то, что я называю эффективностью, просто там критерии иные. Но вот о том, во что это им обойдется — они, конечно, думают, но нам не сообщают. А мы — заявляем на весь мир, что мол, деньги нам платят не только за то, что мы хороший продукт делаем, а и за то, что нам так удобнее делать, даже если в итоге продукт и хуже получается.


PD>>Эффективнее оно быть не может


AVK>Читай еще раз что я писал об эффективности.




PD>>, потому хотя бы, что внутри себя вызывает FindFirst/NextFile .


AVK>Ну и что? Ты помнишь что я писал про время использования объектов ядра? Так вот, с точки зрения масштабируемости решения лучше быстро перебрать, а потом уже ковыряться с файлами, нежели медленно ползти по директории.


Ох, совсем не уверен на 100%. Но пусть ты прав. В 90% случаев пусть так лучше. В 10% случаев так не лучше. Вопрос : Почему авторы FW не дали оба механизма ? Ведь дали бы — я бы слова не сказал, а сказал бы — меня просто в RTFM послали бы.

AVK>Ну вот тем не менее за последние 10 лет лично мне ни разу не приходилось читать директории, в которых 100К файлов.


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

PD>>Скажи, пожалуйста, для каких задач мне может понадобиться узнать все шрифты. установленные в системе.


AVK>Для выбора шрифта из списка. И тебя есть другие варианты применения?


Нет. У меня вообще для получения всех нет применений никаких. Если уж нужно выбрать шрифты, ничего не зная о них, то ИМХО надо перебирать по одному, пока не найдешь нужный, а после этого прекратить.

Вот пришел ты в библиотеку (не компьютерную , и говоришь — нужна мне книга, автора не знаю, названия не знаю, год выпуска не знаю, знаю только, что она о Delphi и что она одна-единственная мне нужна. Ведут тебя к полке, где у них сотня книг по Delphi стоит и говорят — берите все, потом отберете нужную. Или все же лучше будет, если у этой полки тебе скажут — посмотрите первую, если это не то, посмотрите вторую и т.д. Я ведь все могу и не поднять

PD>>Если мне понадобится, я их тоже буду держать максимально короткое время.


AVK>Но при этом формировать буфер тебе придется вручную. В итоге — код больше, сложнее, да еще и помнить надо постоянно о масштабируемости.


Andrew, ну несерьезно же. Ты сам это код же писал — какой там к черту больше кода, там его 5 строчек. наконец, если уж так приспичит. напишу GetFiles сам, если решу. что здесь именно это и надо. Или у вас возьму. Но дайте же мне возможность выбора!


AVK>А чем тебя интероп не устраивает? Нормальное средство.


См. выше, что я написал о нем.

AVK>>>Будут. Например, с целью оптимизации доступа к мелким файлам эти файлы не занимают кластеры в основном пространстве, а храняться прямо в MFT. Это позволяет съэкономить одно позиционирование головки. Но есть одна засада — расти MFT умеет, а вот уменьшаться нет. А еще оно не умеет дефрагментироваться. В результате, из-за распухшей и фрагментированной MFT операции с диском заметно замедляются.


PD>>Ну и что ? Какое это отношение к делу имеет ?


AVK>Обыкновенное. Ты неэфективно используешь ресурс. Хранить все данные в небольшом количестве файлов эффективнее. Ты ведь за это борешься, а сам такие ляпы допускаешь.


Эти файлы туда сканер засылает. Эти файлы фотографиями явялются, которые нам обрабатывать надо ! Какой там к богу ляп — это входные данные программы.
И чего тебе так меня хочется ущучить — что я ляпы, мол, допускаю ? Ну предположим на минуту, именно я их допускаю. Допутим, я программист никуда не годный, к эффективности призваю, а сам эффективно делать не умею. От этого что, мои выводы как-то зависят ? Если это так — это лишь меня характеризует как программиста, а к моим высказываниям отношения не имеет.
А если уж тебя это так интересует — да, наверное, и не самые эффективные решения порой применяю. Может, чего-то не знаю, может, где-то не додумал. Не бог я. Вот Sinclair меня поймал на том. что я неверно оценил возможности scasd — спасибо ему за это, буду знать. Но все же пытаюсь делать как лучше, ну а что уж получается — в меру моих способностей и знаний

PD>>Если я эти 100000 файлов по 100 каталогам разбросаю, что, размер MFT изменится или степень дефрагментированности ее ?


AVK>Нет.


AVK>>>Ага, вот и получается, что проблема то совсем не в БД.


PD>>Нет. Это никакого отношения к БД не имело. БД — совсем другая часть задачи, а 100000 файлов — это просто тестовый набор образцов.


AVK>Вот я и говорю — крайне неэффективное решение.


Еще раз — это входные данные. Это не решение вообще.

AVK>

Пишите свои программы эффективно, господа! По крайней мере настолько, насколько это возможно!

AVK>Ась?

Именно. Кстати, не забудь насколько это возможно. Я не зря это сказал.


AVK>А like по твоему что делает? Вот, кстати, еще один пример, когда ты не следуешь собственным лозунгам. Вместо специализированных решений использовал примитивный like, а оказались БД виноваты.


Опять-таки — не использовал я like. Я там бог знает что закрутил, такого ни в какой теории БД нет, потому как и назвать свою разработку БД я не могу, просто это некая структура файла.
With best regards
Pavel Dvorkin
Re[20]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.05 14:50
Оценка: +2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Мне трудно объяснять в десятый раз, когда меня понять не хотят упорно. Я еще раз повторяю — заказчик получает представление о том, что здесь хорошо, а что плохо — на основании того, как это здесь делается.


Ты можешь сколь угодно говорить халва, но слаще от этого во рту не станет. Я таких заказчиков не видел. Я видел других, которые предпочитают все измерять деньгами и сроками.

PD>Так он барахлил или нет ?


Барахлил.

PD>Аккумуляторы сели или нет ?


Да.

PD>Вмятина была ?


Да.

PD>И стоит ли вся эта работа 1000$ ?


Наверное.

PD>Если все, что они сделали, действительно по делу, а не чтобы деньги слупить, если после этого машина пройдет 100 тыс км без обращения к ним, а иначе бы не прошла — приеду.


Да? А вот теперь подумай о другом — машина была на ходу и еще бы не одну тысячу километров проехала. И ты рассчитывал уехать на следующий день в деревню к родным. И 1000 баксов у тебя нету и даже 500 тоже нету. В результате ты и без денег и без машины, потому что пока ты недостающие деньги не найдешь и пока они после этого ее до ума не доведут, ездить ты не сможешь. На лицо убытки.

PD>Мы не договоримся, Andrew. Не он знает, а мы ему это представление сформировали своей деятельностью.


Глупости. Ему плевать на все эти представления. Ему другое важно. Сколько денег он должен вложить и какой и когда он из этих денег получит выхлоп. И если ты его начнешь басенками про голого короля кормить, он вежливо с тобой раскланяется и пойдет к другому, который такой ерундой заниматься не будет.
Более того, даже понять какой эффект он получит от программы непросто. И, если фирма достаточно крупная, он не с тобой будет на эту тему разговаривать, а с другими фирмами, занимающимися консалтингом.
И в этой схеме рассказы про эффективное использование памяти ... Ну, вобщем, просто смешно.

PD> Он вообще-то ничего не знает. Он свои дела знает (бизнес и т.д.), а в ИТ он знает то, что ему сфера ИТ навяжет. Как и мы знаем с тобой про самолеты, если, конгечно, ты еще и не специалист по воздухоплаванию


Я тебе больше скажу — он и знать не хочет. И тебя, если ты попытаешься рассказать, он слушать не будет. Ему это не надо.

AVK>>Это у тебя все просто — мало ресурсов программа кушает, значит это безусловно хорошо. А на практике все совсем не так.


PD>Да нет же, совсем не так. Ну почему вы все меня никак понять не хотите ? Я высказался — пишите эффективнее.


В очередной раз напоминаю о том, что я писал про эффективность. Эффективность штука эфемерная до тех пор, пока мы не определим критерии эффективности.

PD> Мне в ответ — да он призывает к эффективности любой ценой! Не призываю я любой ценой!


Пишите свои программы эффективно, господа! По крайней мере настолько, насколько это возможно!

Настолько, насколько возможно это и есть любой ценой.

PD> И готов платить ресурсами, если это надо.


А когда надо? Как определить — является ли потеря ресурсов допустимой при том выигрыше, который достигнут? Может ли быть код эффективен абсолютно, или эффективность зависит от поставленных задач? На каком уровне программной системы мы можем определится с критериями эффективности? Что предпочесть — эффективность здесь и сейчас или масштабируемость? Сколько времени можно потратить, чтобы сделать код эффективнее? Что лучше — потратить много памяти и мало процессора или наоборот? Стоит ли делать алгоритмы эффективными на конкретном оборудовании, или на каком то классе оборудования?
Пока ты не ответишь на эти вопросы, твои призывы к эффективности ничего не стоят. Т.е. совсем ничего.

PD> Я же не к этому призываю, а к неиспользованию заведомо неэффективных решений


Как их определить? Вот ответь мне на простой вопрос — что эффективнее, LinkedList или ArrayList?

PD>неужели FindFirst так уж впрямь нарушит дизайн, архитектуру и т.д. ?


Архитектуру нет, а вот масштабируемость запросто. А если еще вспомнить, что новички обязательно забудут FindClose позвать или в try..catch обернуть, то получим еще и утечку ресурсов ядра, а это очень неприятно.
Результат знаешь какой — если я увижу FF/FN в коде новичка, то я ни за что не рискну встроить его код в ядро сервера приложений без тщательнейшего контроля. А вот с GetFiles рискну, потому что никакой засады с его стороны я не ожидаю.

PD> Ну несерьезно же такое утверждать! Это же 5 минут программирования, и никак ни на каком дизайне не скажется. Мелочь это просто, вот и все.


Черт, он как известно в мелочах.

PD> Вы отдаете себе отчет, что вы в .Net создаете новый мир программирования ? Отнюдь не Win32 мир с расширениями!


С чего ты взял? WinAPI в дотнете будет использоваться еще очень и очень долго, особенно на клиенте.

PD>И эти новые адепты будут использовать эти неэффективные решения просто потому, что они другого не знают, их этому не учили. а тогда поздно будет что-то менять — общественное мнение сложилось, именно так и надо, именно так и хорошо.


Ты не переживай за них. Они, если действительно припрет, очень быстро обожгутся и узнают про чудесные FindFirst/FindNext. Только вот, веришь, за 4 года программирования под .NET еще ни разу не понадобилось.
Зато я в очередной раз убедился в другом — я весьма редко, несмотря на опыт, угадываю в реальных приложениях узкие места. Засада оказывается совсем не там, где я ее жду. А новички, о которых ты говоришь, вобще не угадают в 90% случаев. В результате масса усилий по оборачиванию того же FF/FN и танцам с бубном вокруг незакрытых хендлов пойдет коту под хвост. А ты ведь именно это советуешь.
Слышал наверное фразу, которую приписывают то Хоару, то Кнуту — "Premature optimization is the root of all evil (or at least most of it) in programming"? Так вот — это не шутка, а чистейшая правда.

AVK>>Вот об этом я тебе и говорю — выбор эффективного решения штука многофакторная и потребление ресурсов программой далеко не самое важное.


PD>Да согласен я, согласен. Ну не призываю я любой ценой


А какой ценой ты тогда призываешь? Если ты цену не укажешь, то твой призыв равносилен призыву за мир во всем мире. Здорово, но абсолютно абстрактно.

AVK>>Если бы я был заказчик, то, после этой фразы, разговор был бы окончен.


PD>Твое право. Но, боюсь, когда речь идет о серьезных компаниях по разработке и производству чего бы то ни было. там на первом месте качество продукции, а не то, сколько на это рабочих надо. Нет рабочих или нет денег их набрать — не беритесь. А вот если хотите сэкономить на их труде и за счет этого выпустить продукцию хуже, чем у конкурента — вылетите в трубу.


Не хочу даже обсуждать.

PD>А заказчик здесь вообще-то ни при чем. Не интересует меня как потенциального заказчика, сколько рабочих у Тойоты и как они оплачиваются. Меня только качество Тойоты интересует и стоимость.


Во, а стоимость слагается в том числе и из стоимости R&D, которая, в свою очередь, напрямую зависит от того, сколько высококвалифицированного персонала и какое время работало над этим. А если еще, к тому же, вспомнить, что доля этого самого R&D в ПО огромна ...

PD>Именно. На 101% согласен. Обо всем этом они думают, это и есть то, что я называю эффективностью, просто там критерии иные.


Во как. Значит все таки от критериев эффективность зависит. Замечательно. Теперь можно идти дальше. Кто, по твоему, и на каком уровне определяет эти критерии?

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


Маркетинг это совсем отдельный разговор. Если придерживаться технической стороны дела, то очевидно, что ты при покупке машины платишь в том числе и за разработку следующей модели.

AVK>>Ну и что? Ты помнишь что я писал про время использования объектов ядра? Так вот, с точки зрения масштабируемости решения лучше быстро перебрать, а потом уже ковыряться с файлами, нежели медленно ползти по директории.


PD>Ох, совсем не уверен на 100%. Но пусть ты прав. В 90% случаев пусть так лучше. В 10% случаев так не лучше. Вопрос : Почему авторы FW не дали оба механизма ?


Дали. Называется интероп. Можно ли было еще и итератор дать? Можно. Но тогда надо помнить, что при прямом отображении на FF/FN этот итератор будет неуправляемым ресурсом, что создает дополнительную нагрузку на GC (финализатор), либо требует от программиста повышенного внимания (не забыть вызвать FindClose, да еще и внутри try..catch). Ну а в МС посчитали, что те 10%, кому очень дано, спокойно воспользуются интеропом. Тебе не нравится? Твое право. Но называть это решение абсолютно неэффективным я бы не стал.

AVK>>Ну вот тем не менее за последние 10 лет лично мне ни разу не приходилось читать директории, в которых 100К файлов.


PD>А мне приходилось. Их со сканера читали и туда заносили, и я тут абсолютно ничего не смог бы сделать, если бы даже и хотел.


Ну вот и приходим к выводу, что собака неэффективности порылась отнюдь не в GetFiles, а в дурацком ПО сканера, которое на первый взгляд эффективно.

AVK>>Для выбора шрифта из списка. И тебя есть другие варианты применения?


PD>Нет. У меня вообще для получения всех нет применений никаких. Если уж нужно выбрать шрифты, ничего не зная о них, то ИМХО надо перебирать по одному, пока не найдешь нужный, а после этого прекратить.


Можно реальный пример? На основании чего ты шрифт будешь подбирать?

PD>Andrew, ну несерьезно же. Ты сам это код же писал — какой там к черту больше кода, там его 5 строчек. наконец, если уж так приспичит. напишу GetFiles сам, если решу. что здесь именно это и надо. Или у вас возьму. Но дайте же мне возможность выбора!


А у тебя он есть — интероп в зубы и вперед.

AVK>>А чем тебя интероп не устраивает? Нормальное средство.


PD>См. выше, что я написал о нем.


Не, ты написал про каких то гипотетических новичков, которые интероп осилить не могут. А вот чем тебя лично он не устраивает?

AVK>>Обыкновенное. Ты неэфективно используешь ресурс. Хранить все данные в небольшом количестве файлов эффективнее. Ты ведь за это борешься, а сам такие ляпы допускаешь.


PD>Эти файлы туда сканер засылает.


Как? Прямо на диск посредством DMA?

PD>И чего тебе так меня хочется ущучить — что я ляпы, мол, допускаю ?


Очень просто. Я хочу показать тебе, что твой призыв никуда не годится.

PD>Ну предположим на минуту, именно я их допускаю. Допутим, я программист никуда не годный, к эффективности призваю, а сам эффективно делать не умею.


Не, лучше допустить, что, во-первых, пока ты программу не напишешь, ты точно не узнаешь что эффективно, а что нет. А во-вторых, и это очень важно, оценка эффективности зависит от обстоятельст и очень сложна. Т.е. тот самый новичек, о котором ты заботишься, скорее всего просто не сможет верно оценить эжффективность. И оценит неверно. И может получить менее эффективное решение, чем если бы он ничего оптимизировать не пытался. Примеры этого я встречаю сплошь и рядом.

PD>Но все же пытаюсь делать как лучше, ну а что уж получается — в меру моих способностей и знаний


Так может и не стоит заранее оптимизировать, а, вместо этого, думать о прозрачности кода? Может лучше пройтись профайлером и по факту поправить только узкие места? Оно и проще и решение в итоге качественнее получается.

PD>Опять-таки — не использовал я like. Я там бог знает что закрутил, такого ни в какой теории БД нет, потому как и назвать свою разработку БД я не могу, просто это некая структура файла.


Так ты закрутил или это сканер такие данные предоставляет?
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[21]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 28.10.05 04:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:


Ладно, давай закончим. В общем, ситуация ясная, мы тут на разных позициях, договориться не удастся, еще десяток аргкментов с одной или другой строны — просто сотрясение воздуха. Отвечу только на технические вопросы.


AVK>Как их определить? Вот ответь мне на простой вопрос — что эффективнее, LinkedList или ArrayList?


Я, увы, в .Net новичок, отвеитить пока не смогу. Вот что эффективнее — массив С++ или список С++ — это, пожалуйста.

AVK>Можно реальный пример? На основании чего ты шрифт будешь подбирать?


А черт его знает. Имени гарнитуры. Глифа. Размера (для растровых) И т.д. Не все ли тебе равно ? И я выбирать буду, и ты будешь, только делать будем по — разному.


AVK>Не, ты написал про каких то гипотетических новичков, которые интероп осилить не могут. А вот чем тебя лично он не устраивает?


Меня — 100% устраивает. Но тогда уж просто признайте, что нельзя эффективно писать в .Net, если вы не знаете досконально WinAPI.

PD>>Эти файлы туда сканер засылает.


AVK>Как? Прямо на диск посредством DMA?


Не знаю. Автоматический сканер, работает круглосуточно. Как он работает — меня не касается, я на это повлиять не могу. Еще раз — это дано. Это исходные данные.

PD>>Опять-таки — не использовал я like. Я там бог знает что закрутил, такого ни в какой теории БД нет, потому как и назвать свою разработку БД я не могу, просто это некая структура файла.


AVK>Так ты закрутил или это сканер такие данные предоставляет?


Это я закрутил. В виде псевдо-БД. А сканер в другой совсем каталог фотографии заносит, и делает это непрерывно. Фотографии — исходные данные, а моя БД — для их обработки.
With best regards
Pavel Dvorkin
Re[22]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.10.05 07:04
Оценка: :))
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я, увы, в .Net новичок, отвеитить пока не смогу. Вот что эффективнее — массив С++ или список С++ — это, пожалуйста.

Классно! Пожалуйста, расскажи, что эффективнее — массив С++ или список С++?
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[23]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 28.10.05 07:43
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Я, увы, в .Net новичок, отвеитить пока не смогу. Вот что эффективнее — массив С++ или список С++ — это, пожалуйста.

S>Классно! Пожалуйста, расскажи, что эффективнее — массив С++ или список С++?

А не скажешь ли, для каких действий ?
With best regards
Pavel Dvorkin
Re[22]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.10.05 07:47
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

AVK>>Как их определить? Вот ответь мне на простой вопрос — что эффективнее, LinkedList или ArrayList?


PD>Я, увы, в .Net новичок, отвеитить пока не смогу.


.NET тут не при чем. То же самое есть и в Java, к примеру. Что это понятно из названия — список на массивах и связанный список.

AVK>>Можно реальный пример? На основании чего ты шрифт будешь подбирать?


PD>А черт его знает.


Т.е. не знаешь. Так и запишем. Характерный, кстати, пример той самой premature optimization.

PD> Имени гарнитуры. Глифа. Размера (для растровых) И т.д.


А смысл? Зачем это надо?

PD> Не все ли тебе равно?


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

AVK>>Не, ты написал про каких то гипотетических новичков, которые интероп осилить не могут. А вот чем тебя лично он не устраивает?


PD>Меня — 100% устраивает.


Ну вот и отлично. И спорить тут больше не о чем.

PD> Но тогда уж просто признайте, что нельзя эффективно писать в .Net, если вы не знаете досконально WinAPI.


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

AVK>>Как? Прямо на диск посредством DMA?


PD>Не знаю. Автоматический сканер, работает круглосуточно. Как он работает — меня не касается, я на это повлиять не могу. Еще раз — это дано. Это исходные данные.


Исходные данные это то что по проводу приходит. А 100000 файлов на диске в одном каталоге это уже косяки ПО.

AVK>>Так ты закрутил или это сканер такие данные предоставляет?


PD>Это я закрутил. В виде псевдо-БД. А сканер в другой совсем каталог фотографии заносит, и делает это непрерывно. Фотографии — исходные данные, а моя БД — для их обработки.


Т.е. все происходит в реальном времени и ты вполне можешь на лету, пусть не в БД, но хотя бы по каталогам раскидать?
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[23]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 28.10.05 08:07
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Устал я от этой дискуссии, однако...

AVK>.NET тут не при чем. То же самое есть и в Java, к примеру. Что это понятно из названия — список на массивах и связанный список.


Ну от операций же зависит. И от способа реализации этих структур. А этого я ни в C#, ни в java не знаю.



PD>>А черт его знает.


AVK>Т.е. не знаешь. Так и запишем. Характерный, кстати, пример той самой premature optimization.


Ну это уж просто несерьезно. Я тебе что, сейчас эту задачу решаю ? Буду решать — буду знать. А сейчас меня в принципе этот механизм интересует, я его для демонстрации привел, только и всего.


PD>> Имени гарнитуры. Глифа. Размера (для растровых) И т.д.


AVK>А смысл? Зачем это надо?


Для дизайна, к примеру А для чего вообще шрифты перебирают ?

AVK>Нет, не все равно. API должно быть максимально удобно для реального использования, а не для гипотетических проблем. Этим, кстати, и отличаются академические разработки от промышленных.


Опять двадцать пять. Если уж на то пошло — академическими разработками я вообще не занимаюсь.


PD>> Но тогда уж просто признайте, что нельзя эффективно писать в .Net, если вы не знаете досконально WinAPI.


AVK>Зависит от задачи. В некоторых случаях нельзя, в других можно. Ты лучше сам признай, что нельзя эффективно писать в .NET игнорируя базовую идеологию платформы.


С удовольствием признаю. Я и не намерен ее игнорировать, когда писать придется. Мне просто в некоторых местах идеология этой платформы не нравится

AVK>Исходные данные это то что по проводу приходит. А 100000 файлов на диске в одном каталоге это уже косяки ПО.


Слушай, не зная о чем речь идет — делать выводы просто несерьезно. Это во-первых. А во-вторых, косяк это ПО или нет — меня не касается, я это ПО не писал и даже ни разу не видел, как оно работает. Это то, что мне дано как исходные данные и обсуждению не подлежит.

AVK>>>Так ты закрутил или это сканер такие данные предоставляет?


PD>>Это я закрутил. В виде псевдо-БД. А сканер в другой совсем каталог фотографии заносит, и делает это непрерывно. Фотографии — исходные данные, а моя БД — для их обработки.


AVK>Т.е. все происходит в реальном времени и ты вполне можешь на лету, пусть не в БД, но хотя бы по каталогам раскидать?


Уф... Трудно объяснять, когда не слышат. Еще раз — некоторое иное ПО эти данные (фотографии) в некоторый каталог заносит. Это мне на 100% неподвластно. Мое дело — оттуда их брать и обрабатывать. Никаких прав у меня на какие то бы ни было изменения в этом каталоге нет, он для меня R/O. А БД моя. Совсем в другом каталоге. Картинка читается, запросы к БД делаются, результат записывается в файл, перешли к следующей картинке.

Извини, но больше не отвечу. Оставляю за тобой последнее слово, если хочешь ответить.
With best regards
Pavel Dvorkin
Re[24]: Немного о многопоточности
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.10.05 08:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

AVK>>.NET тут не при чем. То же самое есть и в Java, к примеру. Что это понятно из названия — список на массивах и связанный список.


PD>Ну от операций же зависит. И от способа реализации этих структур. А этого я ни в C#, ни в java не знаю.


О как интересно. Т.е., не зная досконально внутренностей, невозможно принять решение об эффективности?



AVK>>Т.е. не знаешь. Так и запишем. Характерный, кстати, пример той самой premature optimization.


PD>Ну это уж просто несерьезно. Я тебе что, сейчас эту задачу решаю ? Буду решать — буду знать. А сейчас меня в принципе этот механизм интересует, я его для демонстрации привел, только и всего.


Фиговая демонстрация получилась, надо сказать.


PD>>> Имени гарнитуры. Глифа. Размера (для растровых) И т.д.


AVK>>А смысл? Зачем это надо?


PD>Для дизайна, к примеру А для чего вообще шрифты перебирают ?


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

AVK>>Исходные данные это то что по проводу приходит. А 100000 файлов на диске в одном каталоге это уже косяки ПО.


PD>Слушай, не зная о чем речь идет — делать выводы просто несерьезно. Это во-первых.


А тут и знать нечего. Поскольку очень вряд ли сканер прямо на диск пишет.

PD> А во-вторых, косяк это ПО или нет — меня не касается, я это ПО не писал и даже ни разу не видел, как оно работает. Это то, что мне дано как исходные данные и обсуждению не подлежит.


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

AVK>>Т.е. все происходит в реальном времени и ты вполне можешь на лету, пусть не в БД, но хотя бы по каталогам раскидать?


PD>Уф... Трудно объяснять, когда не слышат. Еще раз — некоторое иное ПО эти данные (фотографии) в некоторый каталог заносит. Это мне на 100% неподвластно. Мое дело — оттуда их брать и обрабатывать. Никаких прав у меня на какие то бы ни было изменения в этом каталоге нет, он для меня R/O. А БД моя. Совсем в другом каталоге.


Так 100К файлов где — в твоем каталоге или каталоге сканера?
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[24]: Немного о многопоточности
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.10.05 11:09
Оценка: +1 :)))
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А не скажешь ли, для каких действий ?
Нет, не скажу. Ты же готов был ответить прямо так, с налету?
Хотя, все же скажу. В твоем стиле:
— А черт его знает. Может, для поиска, или для добавления. А может и для доступа по индексу. Для работы, в общем.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[25]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 28.10.05 12:08
Оценка: -1 :)
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Pavel Dvorkin, Вы писали:

PD>>А не скажешь ли, для каких действий ?
S>Нет, не скажу. Ты же готов был ответить прямо так, с налету?
S>Хотя, все же скажу. В твоем стиле:
S>- А черт его знает. Может, для поиска, или для добавления. А может и для доступа по индексу. Для работы, в общем.

Ну тогда и не спрашивай, что эффективнее. Истина конретна. я уже тебе говорил. Может быть, у меня только списки и будут. А может, только массивы. А скорее всего и то, и другое — где надо.

А вот если ты меня лишить одного из них собрался — мне это точно не понравится. Даже если я еще вообще не знаю, в чем задача заключается, и нужны ли мне и те и другие будут вообще в ней.
With best regards
Pavel Dvorkin
Re[25]: Немного о многопоточности
От: Pavel Dvorkin Россия  
Дата: 28.10.05 12:49
Оценка:
Здравствуйте, AndrewVK, Вы писали:


AVK>О как интересно. Т.е., не зная досконально внутренностей, невозможно принять решение об эффективности?


Извини за "наезд", но у Вас в .Net все возможно. Не исключаю, что доступ по индексу там реализован перебором элементов списка, пока не доберемся до нужного .
With best regards
Pavel Dvorkin
Re[16]: Немного о многопоточности
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.10.05 17:06
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Но, как и сегодня, кроме притивных игрулек там ничего не будет запускаться.


Ну, да. Примитивные игрульки вроде Дум 3, Хаф-Лайф 2, Квэйк 4... Разве это программы по сравнению с тем что в это же время будет на полноценных ПК? Конечно нет. Мы же считаем Дум 2 и Квэйк 1 сегодня примитивными, а только их и могут запускать сегодняшние КПК.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Немного о многопоточности
От: ironwit Украина  
Дата: 30.10.05 09:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


AVK>>Опять ты меня не слышишь. В 90% случаев нужно получить всю коллекцию. И в этом случае GetFiles эффективнее.


PD>Эффективнее оно быть не может, потому хотя бы, что внутри себя вызывает FindFirst/NextFile . А насчет 90% — сомневаюсь. Вот тебе еще пример


PD>The InstalledFontCollection class defines a class that represents the fonts installed on the system.


PD>Скажи, пожалуйста, для каких задач мне может понадобиться узнать все шрифты. установленные в системе.


В редакторе отобразить список шрифтов чтобы юзер выбрал нужный?
... << RSDN@Home 1.2.0 alpha rev. 618>>
играет: Ветер нашим кондиционером
Я не умею быть злым, и не хочу быть добрым.
Re[7]: Немного о многопоточности
От: stalcer Россия  
Дата: 15.11.05 10:48
Оценка:
Здравствуйте, Gaperton, Вы писали:


S>>На сервере все немножко по-другому — там больше задач одинакового класса. Но для них параллельность обеспечивается за счет наложения фаз.


G>По крайней мере понятно, что с теорией ты знаком. Это хорошо.


Наложение фаз — это типа пока один читает с диска, второй юзает CPU? Или нет?

Интересуюсь темой. Где можно почитать? И какие вообще есть методы для оптимизации выполнения большого колиества задач одного класса параллельно?
Re: Немного о многопоточности
От: SergeCpp Россия http://zoozahita.ru
Дата: 15.11.05 13:07
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>(В скобках — весьма существенный фактор. что их нет в 9x.


MSDN

CreateFiber

The CreateFiber function allocates a fiber object, assigns it a stack, and sets up execution to begin at the specified start address, typically the fiber function. This function does not schedule the fiber.

...........................

Requirements
Client: Requires Windows XP, Windows 2000 Professional, Windows NT Workstation 3.51 SP3 and later, Windows Me, or Windows 98.

...........................

Джеффри Рихтер, вроде, тоже писал, что есть в 9x
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.