Евгений
с другой стороны потоки не такие легковесные
Ну так, потому идея n:m тредов и крута. Жалко что нет способа управлять шедулингом потоков своих из юзерспейса нормально
Vlad
Ну так, потому идея n:m тредов и крута. Жалко что нет способа управлять шедулингом потоков своих из юзерспейса нормально
Ходят слухи, что под виндой как-то можно. Но всем пофигу на форточу, так что да, жаль
Anton
В винде кстати потоки - намного легковеснее
Anton
это не полноценные проццесы
Anton
В расте были фиберы, жаль их выпилили
Anton
слелали бы опциональными
big
а про macOS есть инфа? как там все устроено?
Anton
к сожалению я не вкурсе, думаю похоже на линух
Vlad
Там же микроядро
Anton
с другой стороны там потомок match
big
Там же микроядро
хибридо-ядро*
Vlad
А POSIX вроде в юзерспейсе вообще запилен...
Anton
микро сервис микросервисом погоняет
Евгений
Я слышал, что майкрософт заявляет, что виндовые потоки легковесные, но так и не знаю в чём именно
Alex
а что, в линуксе потоки - тяжелые?
big
у них есть тема GCD для мультипоточности. Говорят что ее нельзя портировать нормально, т.к. у форточек и линухов не хватит возможностей
LexsZero
тяжелые = скедулятся через контекст-свитчи и скедулер в ring0
Anton
кратко
Anton
а что, в линуксе потоки - тяжелые?
По сравнению с виндовыми да - шедулятся в общем порядке, единственное что меньше накладных расходов при создании
Vlad
Хотя по другим слухам в винде вообще максимально неадекватный шедулинг
Vlad
Короче винда полна слухов, нихрена непонятно. Все как обычно
Евгений
тяжелые = скедулятся через контекст-свитчи и скедулер в ring0
А как можно шедулить ещё потоки, если их нужно между разными ядрами перекидывать?
Anton
Так а что такого что шедулятсч они также?
Наверно что больше переключений контекст - userspace -> kernel с копированием всех структур туда обратно
Vladimir
Мы говорим про нативный потоки, они и должны а кернелспейсе жить
Anton
Сори, чет туплю
LexsZero
А как можно шедулить ещё потоки, если их нужно между разными ядрами перекидывать?
перекидка между ядрами событие очень редкое. тут скорее проблема в том, что юзерспейсный скедулинг требует кооперативной многозадачности (на уровне рантайма)
Anton
А как можно шедулить ещё потоки, если их нужно между разными ядрами перекидывать?
Ну тут плюс - раз в линухе можно привязать проццес к ядру, то можно и потоки
Anton
папить по ядрам
Anton
мапить*
Anton
Так а что такого что шедулятсч они также?
Те кто шарят глубоко в винде, утверждают, что накладных расходов у виндовых потоков меньше, хз почему
Vladimir
Как я понимаю "тяжелость" в исходном контексте определяется ресурсами на создание потока, то что они шедулятся ядром берём за основу. И тут вот вопрос, почему потоки тяжелые по сравнению с виндой?
Vladimir
Ну если там просто сравнивают отношение создание процесса/ создание потока. То мб
Anton
Ща поищу
Anton
В принципе ничего нового - виндовые потоки более легкие потому что более тупые =)
Anton
А может дело вовсе в другом - Такие системы, как Windows NT и OS/2, как говорят, имеют «дешёвые» потоки выполнения и «дорогие» процессы. В других операционных системах разница между потоками выполнения и процессами не так велика, за исключением расходов на переключение адресного пространства, которое подразумевает использование буфера ассоциативной трансляции.
Anton
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%82%D0%BE%D0%BA_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F
Anton
Может в винде просто процессы настолько тяжелые - что потоки легкие =)
Makc
Те кто шарят глубоко в винде, утверждают, что накладных расходов у виндовых потоков меньше, хз почему
Потому что в линуксах что потоки что процессы одно и тоже, фактически. Разлючающиеся только доступом к общей памяти и ещё некоторыми ключами при вызове clone()
Anton
Средства синхронихации в Win32 есть двух типов: реализованные на уровне пользователя, и на уровне ядра. Первые — это критические секции (critical section), к второму набору относят мьютексы (mutex), события (event) и семафоры (semaphore). Критические секции — легковесный механизм синхронизации, который работает на уровне пользовательского процесса и не использует тяжелых системных вызовов. Он основан на механизме взаимных блокировок или спин локов (spin lock). Поток, который желает обезопасить определенные данные от race conditions вызывает функцию EnterCliticalSection/TryEnterCriticalSection. Если критическая секция свободна — поток занимает ее, если же нет — поток блокируется (т.е. не выполняется и не отъедает процессорное время) до тех пор, пока секция не будет освобождена другим потоком с помощью вызова функции LeaveCriticalSection. Данные функции — атомарные, т.е. вы можете не переживать за целостность ваших данных ;)
Anton
https://habrahabr.ru/post/40227/
Anton
Ну нинай, единственный сомнительный плюс виндовых потоков - синк на уровне юзер спейс
Евгений
Ну нинай, единственный сомнительный плюс виндовых потоков - синк на уровне юзер спейс
Ключевой вопрос -- они шедулятся ядром или нет? 99% накладных расходов это переключение контекста же
Anton
Итак. Модель 1:1 — самая простая модель. Согласно ее принципам, любой поток созданный в любом процессе управляется напрямую планировщиком ядра ОС. Т.е. имеем отображении 1 к 1 потока пользовательского процесса на поток ядра. Такая модель реализована в Linux начиная с ядра 2.6, а также Windows.
LexsZero
критикал секшнс - это futex?
Anton
инфа из 2008го =)
Евгений
Ну всё понятно, легковесность -- маркетинговый ход
Anton
Ну исходники закрыты, можно сказать что там ИИ задачи переключает =)
Евгений
Typical for proprietary world
Anton
ВоошпЕ эта тема была популярны в 2000х думаю, проблема там и осталась, сколько ядер с тех пор утекло
分解物質
分解物質
и от форка отличается лишь шаред памятью
ещё общим pid и общим набором сигнал-хендлеров
Vlad
Эти 2 последних сообщений не противоречат друг другу?
分解物質
нет
Vlad
Ну ладно
分解物質
Vlad
До какого-то момента pid был разный у потоков одного *процесса*. Потом прикостылили этот tid и сделали чтоб pid одинаковый был. Реализация от этого сильно не изменилась
Anton
Там много костылей =)
Anton
Непомню точно, попмоему gid процеса это pid * -1
分解物質
начиная с linux 2.4.0
分解物質
уже 16 лет как
Vlad
но сейчас то разные
Ну так не за то и речь.
Vlad
А о том, что поток и процесс с точки зрения ядра одо и то же
分解物質
может шедулер из этого какие-то выводы делает, хз
big
ведь я так понимаю что шедулер должен знать что выгоднее переключать потоки (процессы) из одного процесса (группы потоков)
分解物質
execve() тушит не только взывающий поток но и весь thread group
分解物質
сискол tkill() -- как kill() но доставляет сигнал конкретному потоку