LINUX.ORG.RU

Потоки и легковесные процессы.

 , , ,


1

5

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

что потоки и легковесные процессы в линукс это одно и тоже. т.е. потоки в линуксе реализованы через легковесные процессы?

Да. В gdb потоки так до сих пор и называются, LWP.

i-rinat ★★★★★
()
Ответ на: комментарий от igormat

насколько я понимаю любые «новые сущности для шедулера» создаются при помощи системного вызова clone(2), или его аналогов типа fork, который по сути clone с некоторыми зафиксированными аргументами.

Результат - новый поток, новый процесс или что-то ещё - зависит от флагов для clone, которые указывают что из {адресное пространство, открытые файлы, сигналы, многое другое мне непонятное} будет общее с исходным процессом, а что - новое.

Чем больше общего, тем легковеснее. Поэтому понятие «легковесный процесс» требует уточнения

GPFault ★★
()
Ответ на: комментарий от GPFault

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

igormat
() автор топика

Есть треды юзерспейса, они стандардизированны документом POSIX threads extensions. И есть треды ядра. Они создаются только ядром и нужны для выполнения всякой бекграундовой ерунды внутри ядра. Вот их могут иногда называть легковесными, но о них кроме как кернелдевам знать не надо. Обычно легковесными называют просто процессы юзерспейса, созданные clone с флагами расшаривания памяти, сигналов итп.

anonymous
()

Помогите разобраться, пожалуйста.

Ю.Вахалия «UNIX изнутри» (Uresh Vahalia UNIX internals: the new frontiers), глава 3: «Нити и легковесные процессы».

В Linux легковесных процессов нет.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от anonymous

ага, книга 96 года

Сам термин LWP еще более раннего происхождения.

да еще и по-русски

Для тех, кто не владеет русским, я привел английское название.

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

Как создать нить?

«Связь времён прервётся без шпагата» (C)

anonymous
()
Ответ на: комментарий от tailgunner

pthread_create

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

Я правда считал, что ты не будешь играть дурачка, отвечая «pthread_create».

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

давай ему подскажем

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);
anonymous
()
Ответ на: комментарий от igormat

правильно ли утверждение, что любой поток в линуксе это легковесный процесс, но не любой легковесный процесс - поток?

Выше уже сказали про clone(). В линуксе есть только task'и, которыми вертит планировщик. Разные task'и могут разделять общие ресурсы в зависимости от параметров вызова clone(). С точки зрения ядра разница невелика. С более высокой колокольни это всё видится под разными терминами.

const86 ★★★★★
()
Ответ на: комментарий от const86

В линуксе есть только task'и

Так было до NPTL. Потом в ядре появилась специальная поддержка для POSIX-нитей - группы нитей.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Потом в ядре появилась специальная поддержка для POSIX-нитей - группы нитей.

Ну да. Я имел в виду, что именно task привязан к состоянию процессора, набору fd, адресному пространству и прочему. Одним и тем же образом, будь то однопоточный процесс или один из потоков. Кстати, реализация групп нитей и cgroups как-нибудь пересекаются? Цели на вид довольно схожие.

const86 ★★★★★
()
Ответ на: комментарий от const86

Извините за слегка оффтопиковый вопрос, но это меняется с BFS, например? (Сторонний планировщик процессов ядра).

DeadEye ★★★★★
()
Ответ на: комментарий от const86

реализация групп нитей и cgroups как-нибудь пересекаются? Цели на вид довольно схожие.

Схожие в чем? Thread group не является единицей потребления ресурсов. AFAIK, реализации не пересекаются.

tailgunner ★★★★★
()
Ответ на: комментарий от igormat

любой поток в линуксе это легковесный процесс, но не любой легковесный процесс - поток?

Есть чёткое деление видов нитей/потоков: с поддержкой ядра (kernel threads + LWP) и без поддержки (user threads). Потоки без поддержки ядра это так называемые green threads, coroutines и fibers. Поэтому под потоком/нитью может подразумеваться разные вещи.

gh0stwizard ★★★★★
()
Ответ на: комментарий от tailgunner

Это переводится как «нить».

Раньше так, действительно, некоторые говорили, но сейчас все говорят «поток».

Как ты переведёшь multithreaded program? «Многопоточная программа» или «многонитевая»? Или, может быть, «программа-холст»?

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от proud_anon

Раньше так, действительно, некоторые говорили, но сейчас все говорят «поток».

Некоторые и сейчас говорят «нить».

Как ты переведёшь multithreaded program? «Многопоточная программа» или «многонитевая»?

«Многонитевая», естественно.

может быть, «программа-холст»?

Любишь тряпки? Вот отличный вариант для тебя: уток

Кстати, как ты переводишь «fiber» - «струйка»?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от proud_anon

Раньше так, действительно, некоторые говорили, но сейчас все говорят «поток».

Волокна, даешь волокна в обиход речи, а «multithreaded program» пускай будет много... эээ... волосатое приложение.

pathfinder ★★★★
()
Ответ на: комментарий от tailgunner

«Многонитевая», естественно.

Ну, у каждого свои закидоны.

Кстати, как ты переводишь «fiber» - «струйка»?

Я ещё когда написал своё сообщение, задумался, а как перевести слово «fiber», и пришёл к выводу, что можно говорить «струя». Но, конечно, все говорят «файбер».

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от proud_anon

пришёл к выводу, что можно говорить «струя»

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

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

поищи в man clone термин LWP.

Не нашёл. «Ой-ей-ей?! Все пропало!»

To make the remainder of the discussion of CLONE_THREAD more readable, the term «thread» is used to refer to the processes within a thread group.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

поищи в man clone термин LWP.

Не нашёл.

Потому что в Linux нет легковесных процессов. Процессы есть, нити есть, а легковесных процессов нет.

«Ой-ей-ей?! Все пропало!»

Как скажешь.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

«Linux uses lightweight processes to offer better support for multithreaded applications.

Bovet, Daniel P. (2005-11-17). Understanding the Linux Kernel (Kindle Location 2608). O'Reilly Media. Kindle Edition. »

A straightforward way to implement multithreaded applications is to associate a lightweight process with each thread. In this way, the threads can access the same set of application data structures by simply sharing the same memory address space, the same set of open files, and so on; at the same time, each thread can be scheduled independently by the kernel so that one may sleep while another remains runnable.

Bovet, Daniel P. (2005-11-17). Understanding the Linux Kernel (Kindle Locations 2611-2614). O'Reilly Media. Kindle Edition.

Вот цитататы из книги.

igormat
() автор топика
Ответ на: комментарий от igormat

LWP - это терминология Solaris, и там этот термин имеет совершенно определенный смысл. Процессы, имеющиеся в Linux, ему не отвечают.

Вот цитататы из книги.

Поговори с автором о том, почему он использовал именно такой термин.

tailgunner ★★★★★
()
Ответ на: комментарий от igormat

Эмммм... что имеется ввиду?

Смотря что понимать под легковесностью.

А что такое тогда «тяжеловесные» процессы и потоки?

Например форки, легковесные?

Ожидаемая точка зрения - нет, но по сравнению с процессом практически можно сказать да.

swwwfactory ★★
()
Ответ на: комментарий от igormat

A straightforward way to implement multithreaded applications is to associate a lightweight process with each thread.

Ты уже определись кернелтреды тебе нужны или юзертреды. Тут скорее всего говорится о 1:1 отношении юзер-кернел тред.

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

Я там выше и линки на книги приводил в ответ таилганеру.

anonymous
()
Ответ на: комментарий от anonymous

«So, effectively we can say that threads and light weight processes are same. It’s just that thread is a term that is used at user level while light weight process is a term used at kernel level.»

Мне важно понять дело только в терминологии или еще в чем-то?

это отдельные штуки, о которых тебе знать не надо

Это еще почему?

igormat
() автор топика
Ответ на: комментарий от igormat

Увы, но терминологические споры можно продолжать бесконечно долго. Какой-то сакральной истины с выражении «легковесный» нет. Пользуйся терминами процесс и поток/нить.

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

Если я в чем-то не прав, пусть меня поправят.

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.