про потоки в линуксе

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

про потоки в линуксе

Сообщение nadge »

Собственно, как они реализованы (fork, общее адресное пр-во и т.п.) я примерно представляю. Интересует, насколько это эффективно (в плане производительности, расходования памяти и т.п.) в сравнении хотя бы с той же виндой.

З.Ы. Просто внешне выглядит как костыль.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: про потоки в линуксе

Сообщение drBatty »

nadge писал(а):
19.12.2007 15:52
З.Ы. Просто внешне выглядит как костыль.

А это и есть костыль(сейчас будут бить) - судите сами: один процессор заставляют делать две задачи сразу. В winNT реализовано примерно так-же эффектно как в Linux(сейчас вообще убьют). В DOS(win9x/Me) вообще отсутствует.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: про потоки в линуксе

Сообщение nesk »

nadge писал(а):
19.12.2007 15:52
Собственно, как они реализованы (fork, общее адресное пр-во и т.п.) я примерно представляю. Интересует, насколько это эффективно (в плане производительности, расходования памяти и т.п.) в сравнении хотя бы с той же виндой.

З.Ы. Просто внешне выглядит как костыль.

это вы на них не правильно смотрите. совсем это не костыль.
Даже не представляю с какой стороны это выглядит как костыль. Костыль к чему?

про эффективность в сравнение с виндой.. (пытаюсь подобрать слова) мне кажется - это глупый вопрос. Надо сравнивать не разницу в эффективности, а разницу в реализации... Я не буду развивать эту темы.

По поводу термина "поток": в unix системах есть такая вещь как stream, и это слово никак кроме как "поток" не переведёшь. Поэтому thread на русском надо бы называть или "нить" или длинно "поток команд"

Может корректней было бы сравнивать многонитивые программы с "многопроцесснами" программами (программами, которые для выполнение параллельных действий создают отдельный процессы )

Так вот нити процесса имеют общее виртуальное адресное пространство. Что из этого следует?
1) несколько независимых потоков команд которые имею общую память без посредничества ОС, не надо использовать IPC
2) Даже если процессор один, когда происходит переключение процессов на процессоре (CPU) (переключение контекста) Все кеши процессора помечаются как испорченные (грязные), тоже самое происходит и с TLB процессора (Потому что новый процесс работает в другом виртуальном адресном пространстве, то есть его виртуальные адреса должны транслироваться совсем в другое адреса страниц физической памяти).
А если на CPU происходит переключение между нитями одного процесса, то мы остаёмся в том же виртуальном адресном пространстве и кеш и TLB процессора не портятся.

Мда.. не очень понятно объяснил

.
И еще !!
Нити (потоки команд) создаются не при помощи fork, а при помощи clone.
С помощью fork как раз таки создаются новые процессы.(Правда процесс в современном представлении - это просто контейнер для нитей и после fork будет создан новый процесс, в котором конечно будет одна нить.)

Короче, Вам бы надо какую-нить книжку почитать.
Но вот на ум ничего не приходит.
Может стоит начать с Робачевского "Операционная система Unix"
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: про потоки в линуксе

Сообщение BlackStar »

nesk писал(а):
19.12.2007 18:21
Нити (потоки команд) создаются не при помощи fork, а при помощи clone.

В любом случае вызвается do_fork, естественно с разными аргументами.

ЗЫ. Кстати мне тоже не понятно почему это потоки(нити) в Linux это костыль?
LightLang Team
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: про потоки в линуксе

Сообщение drBatty »

BlackStar писал(а):
19.12.2007 18:26
ЗЫ. Кстати мне тоже не понятно почему это потоки(нити) в Linux это костыль?
Потому, что для того что бы ходить необходимы две ноги. Если у вас(не дай Бог) одна - вам понадобится костыль. Для решения двух задач одновременно надо 2 компьютера. На одном тоже можно, но не так эффективно как на двух. И ещё дополнительные подпорки нужны ввиде особого процессора, и особой ОС.



nesk писал(а):
19.12.2007 18:21
про эффективность в сравнение с виндой.. (пытаюсь подобрать слова) мне кажется - это глупый вопрос.
Интерестно, а в чем хуже?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: про потоки в линуксе

Сообщение BlackStar »

drBatty писал(а):
19.12.2007 18:47
Потому, что для того что бы ходить необходимы две ноги. Если у вас(не дай Бог) одна - вам понадобится костыль. Для решения двух задач одновременно надо 2 компьютера. На одном тоже можно, но не так эффективно как на двух. И ещё дополнительные подпорки нужны ввиде особого процессора, и особой ОС.

Причем здесь Linux?
LightLang Team
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: про потоки в линуксе

Сообщение drBatty »

BlackStar писал(а):
19.12.2007 18:54
Причем здесь Linux?
не причём. В winAPI вообще какие-то дикие нити/процессы, я так и не понял, как ими пользоваться :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: про потоки в линуксе

Сообщение nesk »

drBatty писал(а):
19.12.2007 18:47
Интерестно, а в чем хуже?

Я не говорил про хуже или лучше!


ЗЫ Сейчас меня осенило! Все прояснилось. Мне кажется, просто nadge думает, что в unix есть только процессы, а в windows только нити.

рекомендуется к прочтению man pthreads
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: про потоки в линуксе

Сообщение Portnov »

А очень известная книжка. Э.Реймонд, "Искусство программирования для UNIX".
Суть в следующем. Программы с многими нитями - это в принципе костыль (да, иногда без него никак не обойтись), т.к. нити - это сложный в реализации, часто небезопасный и ненадежный (в плане защиты от дурака на месте программиста) механизм взаимодействия между процессами (IPC). В системах, где другие методы IPC развиты слабо и сложны в использовании (примеры: win32, vms), нити становятся одним из главных механизмов IPC. В unix традиционно хорошо развиты простые и эффективные методы IPC (сигналы, пайпы, сокеты, shared memory, в конце концов sysV message queues и STREAM), и нити обычно вообще не нужны. Хотя да, вполне можно напридумывать примеров задач, в которых самым эффективным решением будет иметь несколько процессов в одном адресном пространстве (т.е. нитей). Именно поэтому в современные unix-системы всё-таки добавили возможность создания нитей.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: про потоки в линуксе

Сообщение nesk »

drBatty писал(а):
19.12.2007 18:47
Для решения двух задач одновременно надо 2 компьютера.

Неправда :)
вот я сейчас сижу в интернете, слушаю музыку,пишу отчет в ворде, общаюсь в аське. И все это на одном процессоре, при этом утилизация процессора не более 15%.
По Вашей логике мне бы для решение моих задач потребовалось бы 4 процессора? (при этом их утилизация была бы ничтожной)

Так вот, многозадачность на одном процессоре называется модным сейчас словом - виртуализация. Каждой задаче кажеться что она одна монопольно использует все время CPU и все адресное пространства памяти.
А основное приемущество виртуализации - это повышения процента утилизации.
Тоесть многозадачность дает возможность более эффективно использовать возможность моей вычислительной системы.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
AWSVladimir
Сообщения: 138
ОС: пока Мандривка

Re: про потоки в линуксе

Сообщение AWSVladimir »

nesk писал(а):
19.12.2007 22:10
Тоесть многозадачность дает возможность более эффективно использовать возможность моей вычислительной системы.


А можно мне?

Нити нужны когда в фоне, что то параллельно делается, но не критично к центральному выполняемому алгоритму.
Нити жрут процессор, но по остаточному принципу. В винде приоритет равен или ниже приоритета головной программе (в лине тоже).

PS:
За все время работы (15 лет) программером, делал нити, только ради теста/изучения.
Ну вроде 1 или 2 раза были в проекте, когда данные выводятся на экран (быстро), а потом в фоне обрабатываются и по запросу подставлялись обработанные. Но эт было еще на вин98.

Теперь вся работа только по запросу (порционно).
Программа выполняется со скоростью просто фантастичекой и неукладыв-ся в головы 95-2000 годов.
Поэтому давно уже отказались от нитей.
Если что то нужно запустить параллельно, то заускаем отдельным процессом и позволяем самой операц. системе управлять такими "нитями" . :)

PS: Напишите, для чего хотите применить нити/потоки.
Просто интересно.
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: про потоки в линуксе

Сообщение nesk »

AWSVladimir писал(а):
20.12.2007 11:51
Тоесть многозадачность дает возможность более у.
Нити жрут процессор, но по остаточному принципу. В винде приоритет равен или ниже приоритета головной программе (в лине тоже).

Насколько я понимаю, в современных ОС единицей планирования является нить, а не процесс.
Как я писал выше, нити позволяют уменьшить количество накладных расходов при переключении контекста на CPU.
Нити почти всегда применяются, когда создаётся сервер для сетевого приложения. Тут для обработки каждого запроса, стартует своя нить.
Можно в качестве примера рассмотреть реализацию NFS сервера (в HP-UX).
При работе NFS по UDP протоколу, для обработки запросов клиентов стартуют отдельные процессы. Что интересно процессы стартуют сразу при старте сервера и их количество тоже определено заранее (обычно 16 штук). А дальше процессы весят в памяти и либо ничего не дают, либо максимально в один момент времени могут обрабатывать лишь 16 запросов (остальные запросы будут накапливаться в буфере udp сокета, а он может переполниться).
А для работы NFS по верх TCP, запускается один многонитевой процесс, и для обработки каждого запроса стартует новая нить.
все современные веб сервера - многонитевый.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: про потоки в линуксе

Сообщение Debris »

nesk, хм, у меня сейчас есть предмет в универе Real Time Operation System, насколько я понял основой планирования ос все таки являются управление процессами и их потоками. Кстати чем отличается нить от потока кто нибудь может обьяснить?
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: про потоки в линуксе

Сообщение nesk »

Debris писал(а):
20.12.2007 19:06
Кстати чем отличается нить от потока кто нибудь может обьяснить?

в данном контексте ничем, по английски это thread
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: про потоки в линуксе

Сообщение BlackStar »

nesk писал(а):
20.12.2007 14:45
все современные веб сервера - многонитевый.

Если мне не изменяет память, самый что ни на есть современный веб сервер - Apache - использует потоки, а не нити.
LightLang Team
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: про потоки в линуксе

Сообщение nesk »

BlackStar писал(а):
20.12.2007 23:24
nesk писал(а):
20.12.2007 14:45
все современные веб сервера - многонитевый.

Если мне не изменяет память, самый что ни на есть современный веб сервер - Apache - использует потоки, а не нити.

В данном контексте потоки и нити это одно и тоже!
Я же писал выше, что по английски это будет thread. Я так же написал причину того, что я использую термин "нить", а не "поток"
А вопрос был в противопоставлении многопоточных (или многонитевых (как синоним)) приложений и приложений, которые используют для организации параллельных действий несколько независимых процессов плюс средства IPС для обмена данными.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: про потоки в линуксе

Сообщение Debris »

nesk, так тогда и писал бы thread или поток, ведь есть же еще и fibers (волокна), собственно про них я и подумал.
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: про потоки в линуксе

Сообщение BlackStar »

BlackStar писал(а):
20.12.2007 23:24
Если мне не изменяет память, самый что ни на есть современный веб сервер - Apache - использует потоки, а не нити.

Блин, процессы конечно же.
LightLang Team
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: про потоки в линуксе

Сообщение drBatty »

BlackStar писал(а):
21.12.2007 11:09
Блин, процессы конечно же.
Господа, определимся с терминологией?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: про потоки в линуксе

Сообщение xorader »

2Nesk: респект за обьяснения (я бы уже давно плюнул).

В апаче используется и то и то (в зависимости от настроек и сборки). Смотрите в сторону: mpm-worker и тд...

В ядре 2.4 нити действительно реализованы были не очень хорошо (практически только на уровне библиотек). Начиная с 2.6 - на уровне ядра (шедулер ядра) - т.е. стало сравнимо с Free(*)BSD системами.

> Программы с многими нитями - это в принципе костыль....

Смотря для каких задач. Nesk очень грамотно описал примеры.
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: про потоки в линуксе

Сообщение drBatty »

nesk писал(а):
19.12.2007 22:10
Неправда :)
вот я сейчас сижу в интернете, слушаю музыку,пишу отчет в ворде, общаюсь в аське. И все это на одном процессоре, при этом утилизация процессора не более 15%.
Ну и что, если за год надо дойти до туалета, можно и с костылём :)

Если серьёзно, сервер - это хороший пример нужной многозадачности. Но и тут это костыль - иначе бы не пихали несколько процессоров с несколькими ядрами. Поставили бы один, в два(в N) раз лучше.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
pryga
Сообщения: 12
ОС: Debian

Re: про потоки в линуксе

Сообщение pryga »

Portnov писал(а):
19.12.2007 21:35
В системах, где другие методы IPC развиты слабо и сложны в использовании (примеры: win32, vms), нити становятся одним из главных механизмов IPC.

Почему в винде методы IPC слабы и сложны? Каналы, проецируемые в память файлы и тп и тд там вполне нормально работают.
Нити не могут быть механизмом IPC, так как по определению - IPC == interprocess communication, то есть взаимодействие между процессами, а это разные вещи.
К слову, переключение между нитями осуществляется быстрее, нежели между процессами, так как нити находятся в виртуальном адресном пространстве одного процесса.

AWSVladimir писал(а):
20.12.2007 11:51
PS: Напишите, для чего хотите применить нити/потоки.
Просто интересно.

Ну например. Нужно найти слово. Пусть ищем в двух файлах. Файлы расположены на разных дисках, или имеется двуядерный процессор. Используем потоки. Планировщик сам сделает так, чтобы операции ввода-вывода происходили параллельно.
Или вот еще. Есть программа с графическим интерфейсом, например шахматы. После хода пользователя программа должна сделать свой ход. Она думает. Долго думает. Прога занята. А кто будет обрабатыватьсообщения от пользователя, например, выбор какого-нибудь пункта меню? Никто. Поэтому для обдумывания хода также выделяется отдельный поток, и графический интерфейс начинает адекватно реагировать на происходящее.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: про потоки в линуксе

Сообщение drBatty »

pryga писал(а):
26.12.2007 19:43
Ну например. Нужно найти слово. Пусть ищем в двух файлах. Файлы расположены на разных дисках, или имеется двуядерный процессор.

в обоих случаях будет быстрее и проще поискать сначала в одном файле, потом в другом. А вот про шахматы("доооолго думает") - хороший пример.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
pryga
Сообщения: 12
ОС: Debian

Re: про потоки в линуксе

Сообщение pryga »

drBatty писал(а):
26.12.2007 20:02
в обоих случаях будет быстрее и проще поискать сначала в одном файле, потом в другом.


Почему? Когда мы ищем в двух файлах последовательно, то все время поиска - сумма времен поиска в каждом файле.
А если параллельно, то все время поиска определяется временем поиска в большем из них.
Спасибо сказали: