[.NET] вопрос про нити

Eugenia_2005

чем отличаются нити из пула, просто нити, и то, что делает в юниксе fork?

bastii

только наверно правильно говорить потоки, нити в винде другое означают
а fork аналогов в винде не имеет

a_tischkevich

а fork аналогов в винде не имеет
в Win32 - нет
"в винде" - да

bastii

ok

rosali

правильно говорить потоки, нити в винде другое означают
А что они означают? Я только "thread" знаю - это вроде как нить. А потоки как раз есть совсем другие - "stream"

bastii

To : просто в винде есть threads и fibers, поэтому threads переводят как потоки, чтобы fibers переводить как нити, вроде так
To : с другой стороны про винду в широком смысле (в том числе и 9х) можно сказать, что есть только win32 api

rosali

нити из пула, просто нити
Нити из пула - это так называемые used threads. Они очень похожи на обычные нити, но OS про них ничего не знает, они полностью вынесены в user space. Ну это если вкратце . От этого они немного быстрее работают (точнее, быстрее стартуют но у них может не быть полноценного параллелизма.
Имея библиотеку работы с тредами, fork выразить у меня что-то не получается, а вот через специфический вариант fork (кажись clone называется) можно выразить старт обычного треда.
 
start_thread(run_me); //Не знаю правильного API-ного названия :(
эквивалентно
 
if(clone(/*сюда правильные параметры*/) == 0)
{ //i'm child
run_me;
exit; //или чего сюда?
}
"правильные параметры" должны обозначать "расшарить фсе!" то есть virtual space, file descriptors и т.п.
Не, вообще то все маленько сложнее, надо же для другого треда сделать _свой_ стек, но чтобы он был виден из исходного треда... Да тяжко наверное было posix threads на unix реализовывать
Короче: fork на треды ваще не похож, никаким боком, разве что тоже два параллельных процесса получается.

bastii

просто эта терминология пошла после перевода ADVANCED WINDOWS, JEFFRY RICHTER

Marinavo_0507

Про fork только вот это угадал:
тоже два параллельных процесса получается
остальное, извини, фигня...

Marinavo_0507

> это так называемые used threads. Они очень похожи на обычные нити, но OS про них ничего не знает, они полностью вынесены в user space.
Это то, что обычно называют co-routines?

Marinavo_0507

fork создаёт настоящие процессы, а нити - они и есть нити
основное отличие - у процессов адресное пространство различное, наборы файловых дескрипторов свои и т.д.
у нитей это всё общее

rosali

остальное, извини, фигня...
Чего фигня-то. Рассказывай тогда как правильно

rosali

fork создаёт настоящие процессы, а нити - они и есть нити
Передергиваешь! Читай
man clone
И будем дальше спорить.

Marinavo_0507

Какое отношение clone имеет к обсуждаемому вопросу?

bastii

Тредпул возвращает потоки (threads, буду писать треды). И смысл в том, что он старается держать запасные потоки в спящем режиме (это управляется через SetMinThreads). Поэтому, когда ты ставишь на очередь операцию, то она не ждет пока создастся новый тред, а сразу начинается в одном из разбуженный тредов.
Его имеет смысл использовать, когда у тебя много операций, которые регулярно появляются и должны выполняться параллельно, при этом они непродолжительные, и поэтому общее число одновременно выполняемых операции ограниченно (вроде даже есть ограничение на 25 в текущей реализации)

rosali

Ну да, это я стормозил. Мне казалось, что если делать clone, то ребенок с того же места стартует, что и родитель (как в fork а оказывается, clone просто обыкновенный тред стартует.

bastii

На сколько я понимаю, в винде работа с fibers реализована исключительно в kernel32.dll, т.е. в user space
Вообще fibers очень специфическая вещь и очень редко используется. Из известных примеров знаю только, что SQL Server ими может пользоваться. Причем SQL Server 2005 хостит .NET CLR и может реализовывать Threads через виндовые fibers.

Dasar

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