Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
я всем настоятельно рекомендую использовать западную терминологию и не пытаться найти ей русскоязычный аналогEither we are using English and then English terminology is obviously fine — or we are using Russian и тогда у нас есть потоки и процессы. Не надо умножать сущности без необходимости.
Так же тред может работать даже после завершения программы — это тред-демон (daemon-thread), особый тип тредов.Где вы такое вычитали? В системах где потоки и процессы являются разными сущностями процесс — это контейнер для потоков. Процесс может завершить работу только с последним потоком. Иногда выход из главного потока убивает все остальные, иногда — процесс существует пока есть хотя бы один поток, но если поток жив, то жив и «охватывающий» его процесс.
Для высокой производительности как раз важно отличать их друг от друга. Даже Linux на самом деле вынужден учитывать особенности threads в планировщике, особенно для SMP, SMT и мультиядерной архитектуры.Он там учитывает много чего: квоты на группы, доступ к памяти и т.д. и т.п.
Формально оформляя threads как процессы, в планировщике они вынуждены признать, что эти процессы особенные, например, у них у всех одно адресное пространство и нужно оптимизировать переключения задач так, чтобы поменьше переключаться между пространствами и не трешить TLB и прочие внутренние буферы процессора.И что? Они, например, вынуждены учитывать тот факт, что на NUMA-системах мигрировать процесс с ноды, в которой живёт большая часть этого процесса нежелательно — по этому поводу ещё какую-нибудь сущность введём? И тоже будем утверждать что она суперфундаментальна?
Главная идея thread – это виртуализация регистров центрального процессора – эмуляция на одном физическом процессоре нескольких логических процессоров, каждый из которых имеет свое собственное состояние регистров (включая указатель команд) и работает параллельно с остальными.
Предлагаю выбрать что-то одно в качестве единицы исполнения (пусть это будет thread), а что-то другое – как контейнер.А кому и зачем он нужен — этот контейнер? Почему связанные между собой процессы (неважно — общее у них адресное простанство или нет) просто не поместить в группу процессов? Google Chrome — это одна программа или 100?
И в ядре тоже есть куча всего, связанного с поддержкой threadsГде, я извиняюсь? Есть несколько флагов в одной функции и несколько хинтов для планировщика (притом что он учитывает вагон других вещей в своей работе).
Смотрим, например, современные исходники ядра Linux. Слов thread встречается более, чем в 2000 файлов!А вы эти исходники смотрели или только grep напустили? Слово thread используется в ядре совсем не в том контексте, в каком вы бы этого хотели: threads в ядре вовсе не обязаны разделять адресное пространство! Более того — адресного пространства там может просто не быть (так называемые kernel threads). Никакого отношения к Posix Threads эти структуры не имеют и иметь не могут: на уровне ядра этих вещей просто нет.
Если мы хотим для себя построить ясную систему понятий, а не просто описать одну любимую исторически сложившуюся ОС, то логично разделить понятия thread и процесса (контейнера, содержащего (в том числе) и threads работающие в одном адресном пространстве).Зачем всё это нужно? Да, в ядро Linux'а было добавлено несколько трюков, которые позволяют делать NPTL вид что потоки и процессы — разные сущности (скажем getpid в NPTL-потоке возвращает PID не самого потока, а его предка, что позволяет считать PID самого потока TID'ом). Но затронуто этим процессом было с десяток функций — никакой новой сущности при этом никто не вводил…
Что такое нити (threads)?