![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Абабо |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 14.1.2005 Репутация: нет Всего: 1 |
В этом случае всё ясно и довольно прозрачно.
--------------------
С уважением, Абабо. |
|||
|
||||
| archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Имел ввиду что можно отключить расширение Concurent GC, не более:
В общем я уже сам запутался -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
ясно. А я и забыл про gcConcurrent
Но это ведь дело не меняет - из какого потока не запустился бы GC, он-то все равно все потоки блокирует. Другое дело, что все мучаются, думают как теперь поднимать производительность. Вот такая инфа: - для участков с неуправляемым кодом применяется технологию "взлом" Hijacking. Смысл в том, что если поток находится в неуправляемом коде, CLR в его стеке встраивает загрушку, которая перехватывает управление на себя, когда поток вернется в управляемый код. Когда она получает управление, она работу потока останавливает и дает GC убрать мусор. - для участков с управляемым кодом применяется технология Safe Points (безопасные точки). Компилятор для всех функций встраивает в код эти точки. Они говорят о отм, что если код до них дошел, то можно спокойно удалять мусор. Если код выполняется и GC собирается чистить кучу, то он не рубит все потоки безжалостно, а дает возможность каждому потоку дойти до ближайшей safe point и там только поток останавливает. Вот еще накопал http://rsdn.ru/article/dotnet/GCnet.xml Рихтер в картинках ну и, как обычно, немного переведенного MSDN. там и тесты на производительность приведены. -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| archeg |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Не совсем понимаю...
С http://rsdn.ru/article/dotnet/GC.xml:
Это сообщение отредактировал(а) archeg - 17.5.2007, 21:19 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
||||
|
|||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Теперь я не понял
т.е. ты хочешь сказать, что пусть там GC строит свои дурацкие графы, а мы все равно и ссылок новых добавим, и в очередную вложенную функцию войдем, нам баловаться некогда, работать надо!!! Я так понимаю: как выше говорилось, GC работает в своем потоке. По умолчанию. Т.е. как раз когда
но можно сделать так, чтобы не было для него отдельного потока. Тогда как раз будет описанный тобой случай, т.е. ситуация станет просто еще хуже. Не знаю, трудно сказать. Авторов много, и говорят они друг на друга непохоже. Такое ощущение по этой статье, что или чего-то он не договаривает. Все о поколенях, да о поколениях... Хотел об оптимизации сказать, да что-то мало инфы реальной. Ни про Safe Points, ни про хакинг не сказал. А ведь это есть! Можно в гугле набрать, посмотреть... Я Рихтеру верю больше А вот уважаемый автор http://rsdn.ru/article/dotnet/GC.xml - точно нет P.S. Кстати, вот подтверждение и от Рихтера, по крайней мере в книжке его я про Safe Points и хакинг инфы не увидел, из другого источника знаю, а в гугле - нашел! http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/ "Performance for Multithreaded Applications" P.S.S. И еще, специально для твоего успокоения Отдельный поток GC: и для мониторинга памяти, в том числе, нужен. Должна же CLR понять, когда памяти начинает нехватать и нужно GC вызывать, правда? Да, GC строит графы в своем потоке. А где он должен их строить? В код программы директивы что-ли встроить, чтобы через каждые три такта прыгать на построение графов, а вдруг памяти мало, много сборок в домен загрузили? А системмных потоков, на самом деле, еще больше. Есть еще один зарезервированный поток для финализатора. Те корни, что поддерживают финализаторы в этом, отдельном от простых корней, потоке завершаются. Да и другие... Например, для многопроцессорной системы на каждый процессор - отдельный GC со своим потоком. Как говориться, потоков у нас для всех хватит. Так что не зацикливайся на потоках. Вот статья http://blogs.msdn.com/yunjin/archive/2005/07/05/435726.aspx (я упоминал уже ее) точно описывает сколько и какие потоки существует в CLR: Finalizer thread Debugger helper thread Concurrent GC thread Server GC threads App Domain unload helper thread Threadpool threads ( и, добавлю от себя, еще столько Thread-ов, сколько ты сможешь создать с помощью new Thread(ThreadStart) ) не получилось без авторитетов Суть в другом: потоки выполнения блокируются. Еще ни один чел не сказал, что сборка мусора не тормозит приложение. А как приложение может тормозить? Только приостановкой потоков выполнения. Это сообщение отредактировал(а) tol05 - 17.5.2007, 23:45 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Кажется я понял.. Вся функция Concurrent GC заключается в том, чтобы сократить по минимуму остановку. В самом деле, остановка потока имеет место, но она довольно короткая. Остановка рабочего потока осуществляется не на время сборки всего мусора, а только в момент, изменения ссылок с которыми сейчас, в данный момент работает GC и добавление новых.
Concurrent GC действует только во втором поколении - в первом и нулевом он не имеет смысла. Рихтера стоит почитать, жалею что нету его под рукой :( Это сообщение отредактировал(а) archeg - 17.5.2007, 23:36 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |