процессы и потоки
помогите пожалуйста разобраться с понятиями процесса и потока в самом общем виде. я понимаю их так:
1. процессы существуют на уровне операционной системы. она при создании очередного потока выделяет ему ресурс, в первую очередь в виде кусочка оперативной памяти.
2. если в системе существуют несколько процессов, то они не могут взаимодействовать.
3. например если в одном процессе запущен браузер, а во втором процессе запущена игра, то игра никак не может узнать какие вкладки браузера открыты в данный момент.
4. при этом если процесс браузера породит дочерний поток(например в виде отдельного окна для диспетчера задач браузера), то они могут взаимодействовать потому что связаны отношением «родитель-наследник».
5. потоки создаются средствами языка программирования и существуют в пределах процесса.
6. при этом они могут взаимодействовать в пределах своего процесса.
7. например иметь доступ к переменной: менять её, удалять и т.д.
8. а также получать друг от друга сигналы типа mutex, semafor и т.д.
9. при этом потоки, которые живут в разных процессах не могут взаимодействовать.
10. если завершается процесс, то завершаются все его потоки тоже.
11. процессы выполняются по очереди. ОС выделяет каждому определённое время. в это время он выполняется, а остальные процессы не активны. далее по очереди каждый процесс становится активным, а остальные неактивными
12. ОС сама решает по какому принципу усыплять и оживлять процессы. в зависимости от типа ОС этот принцип бывает разный
если я что-то неправильно понимаю, то пожалуйста укажите на это и, если можно, посоветуйте что почитать чтобы вополнить пробел.
Если забанили в гугле , то восполняем пробел . Их много у него. 🙂 https://m.youtube.com/watch?v=Ni8udz5bRmU
Таненбаум в помощь — у него все это подробно описано
Всё не то чтобы так, у тебя очень много теоретических допущений, которые на практике диаметрально противоположны оказываются. Лучше посмотри как это на самом деле реализовано и работает, скажем, на примере си и линукса (это лишь 1 из вариантов, точнее даже несколько).
1.И тот и другой регистрируются в ОС, процесс более сложен — память, образ на диске, переменные окружения, командная строка и проч. 2. нет
4.просто могут, не потому что
5.создаются вызовом ОС, это объект для ОС, не языка
Поток содержит код и данные. Процесс выполняет код выбранный из потока
Не путай человека, и сам не путайся
Тема обширная, чтобы тут расписывать, но пожалуй стоит сказать, что на уровне железа и процесс, и поток существуют. Для проца оба являются одним и тем же «задачей» (task), и разница только в том, какие области памяти и ресурсы ядра «видят» две/три/15 разных задач. Могут иметь общую память, а могут не иметь, смотря кому что отмапит ядро ос. На уровне ос разница уже существеннее, т.к. процесс это еще и учетная единица, где есть главный поток, есть ресурсы ядра вроде дескрипторов или примитивов синхронизации, есть состояние навроде cwd, есть ipc — shm, mmap, etc. Это ос создает различие на базе одного общего механизма многозадачности, которому самому абсолютно похрен на это все. Можешь рассматривать процесс как некую структуру в ядре, у которой есть не менее одного потока (на самом деле не менее нуля, если считать zombie за процессы). И потоки внутри процесса шарят как эту «структуру», так и память и прочее.
В теории можно написать такую ос, где можно было бы создать межпроцессный поток, который видел бы память и ядерные ресурсы двух процессов, а они (их главные потоки) друг друга не видели бы, но отдельным процессом он бы не был. И жил бы он пока оба процесса не кончились. Но так не делают. Но например низкоуровневый отладчик вроде gdb такое легко провернул бы, если бы захотел, прямо на линуксе.
3. например если в одном процессе запущен браузер, а во втором процессе запущена игра, то игра никак не может узнать какие вкладки браузера открыты в данный момент.
Сфига-ли? Хэндлы окон совершенно не против, чтобы их перехватывали и творили там что угодно, хоть член нарисуй в натуральную величину.
Ну, если лезть в дебри программирования. То есть два класса: Process и Thread. Чем они отличаются? Свойствами, вестимо. Я не знаю как ты, а я с первого раза в гугле нашел, чем отличается поток от процесса. Процесс — не лезет в другие участки памяти, кроме выделенного своего. Иначе- BSoD. Поток — лезет в участки памяти, но только своих приложений, которых может быть несколько. Ну, это грубо говоря.
Всё равно что инкапсуляцию и полиморфизм обьяснять на пальцах. Один хрен, не поймут.
В случае с Linux потоки — это тоже процессы, просто у потоков одного процесса есть общие сегменты памяти.
Процесс создаётся через системный вызов clone() (можно через fork(), но glibc’шный враппер fork() использует clone()), поток создаётся через clone(). Почитай ман этого системного вызова, там описано, какие части контекста процесса можно шарить.
Процессы и нити в Линукс
Чем отличаются процессы и нити в Линукс? В книге Дмитрия Кетова я прочитал, что процесс состоит из нитей. Но ведь у нитей тоже есть PID и свойства, как у обычных процессов, и порождать другие нити они тоже могут.
2 ответа 2
Определение
Раз уж говорим о *nix системах, то не лишним будет опираться на определения POSIX (вольный перевод):
Thread (досл. нить, она же поток ¹ ) — это один из потоков выполнения (flow control) в составе процесса. У каждой нити есть свой thread ID, приоритет и политика планировщика, errno , своё обособленное хранилище формата ключ/значение, и необходимые ресурсы, чтобы поддерживать поток выполнения. Любой объект, адрес которого может определить нить будет доступен всем нитям данного процесса, включая, но не ограничиваясь, статическими переменными, памятью, полученным посредством malloc() , другим областям памяти, к которым возможен прямой доступ по адресу, и автоматическим переменным.
Процесс — адресное пространство с одной или более нитью, исполняющейся в контексте оного, а также необходимые ресурсы для данных нитей.
Замечание: многие системные ресурсы разделяются (используются совместно) разными нитями одного процесса. В том числе различные идентификаторы (PID, PPID, PGID, SSID, различные SUID’ы и SGID’ы), текущий рабочий каталог, корневой каталог, umask и файловые дескрипторы.
Отсюда вырисовываются следующие ассоциации ресурсов.
- Адресное пространство (включая код, а также статические и динамические данные программы)
- Одна или более нить
- Таблица файловых дескрипторов
- Другие системные ресурсы и идентификаторы
При этом у каждой нити процесса также есть:
- Поток выполнения, на практике это значит:
- Свой стек и, как следствие, свои локальные переменные.
- Свои регистры процессора
Особенности реализации потоков в Linux.
Фактически, потоки в Linux реализованы, как «легковесные процессы». Другими словами со стороны ядра linux нет чёткого разграничения между оными: все они представляются в ядре, как задачи task_struct , при этом, например, task->mm указывает на дескриптор адресного пространства ( mm_struct ), а task->files на таблицу файловых дескрипторов ( files_struct ) и для потоков одного процесса оба эти указателя будут просто указывать на один объект. ИМХО прежде всего это сделано в силу исторических причин, хотя такая реализация и не лишена своей красоты.
И всё бы ничего, но это породило просто невообразимую терминологическую кашу. Например, со стороны пользовательского пространства идентификатор процесса (то что возвращает getpid() , он должен быть одинаковый для всех потоков процесса) называется PID; но на стороне ядра под pid ‘ом подразумевается идентификатор задачи, а вызов getpid() возвращает то что называется tgid (thread group ID, ID группы потоков). Но при этом через /proc экспортируется информация именно в терминах ядра.
Также такая реализация предполагает определённые ухищрения, частично на стороне ядра, частично на стороне пользовательского пространства, например, системный вызов setuid(2) в linux устанавливает только EUID потока, поэтому приходится прибегать к сложным манипуляциям в обёртке в libc, чтобы добиться поведения соответствующего POSIX и, как следствие, возникают проблемы с реализацией этой функции в языках независимых от Си, например Rust или Go.
Но ведь у нитей тоже есть PID и свойства, как у обычных процессов,
Не совсем так: единственное, что у них есть — это приоритет и политика в планировщике. всё остальное — баги и/или особенности реализации.
и порождать другие нити они тоже могут.
Да, но здесь стоит заметить, что в отличии от порождения процесса, «родителем» новой нити становится исходный процесс, а не тот что породил нить.
¹я предпочитаю термин «поток», но дабы не разгребать терминологическую путаницу с flow буду использовать «нить» в данном разделе
Процесс и потоков в Linux
Изучение
Программисты должны быть знакомы с такими терминами, как процесс и потоки, но даже те, кто не знаком с ними, также могут извлечь выгоду из их понимания. Linux может помочь вам определить, какие приложения создают трудности на вашем компьютере и нужно ли вам добавлять дополнительную оперативную память для повышения производительности, управляя процессами и потоками. Давайте погрузимся в сферу компьютерных систем и разберемся, что означают эти термины. Некоторые концепции будут упрощены и обобщены, но общие принципы, которые мы обсуждаем, должны помочь проиллюстрировать различия между этими терминами.
Как этот процесс работает в Linux
Недостаточно предоставить компьютеру двоичный код, который сообщает ему, что выполнять программу. Для запуска программы требуется много памяти и других ресурсов операционной системы. Итак, » Процесс » — это программа, загруженная в память со всеми необходимыми ресурсами. Управление ресурсами вашей программы — это работа операционной системы.
Счетчик программ, регистры и стек — все это критически важные ресурсы для каждого процесса. ЦП содержит набор регистров для хранения данных. Регистры могут содержать информацию, необходимую процессу, такую как инструкции или адреса хранения. Компьютеры отслеживают, где они находятся в своих программах, используя «счетчик программ», также известный как «указатель команд». Стеки данных используются в компьютерных программах как временное пространство, поскольку они содержат информацию об активных подпрограммах. Динамически выделяемая память отличается от «кучи» — процесса, который является автономным и неограниченным.
Отдельная программа может выполняться более чем в одном экземпляре, и каждый из них называется » Процессом «. Адресное пространство памяти для каждого процесса является отдельным, поэтому он может работать независимо и быть изолированным от других процессов. Приложение не может напрямую обращаться к данным, которые используются другими процессами. При переключении одного процесса на другой сохраняются и загружаются регистры, карты памяти и другие ресурсы, загрузка которых займет некоторое время.
Операционные системы пытаются разделить процессы по отдельности, чтобы отказ одного процесса не повлиял на другие процессы. Например, вы, вероятно, столкнулись с ситуацией, когда одно из ваших компьютерных приложений зависает или дает сбой, и все же вы смогли остановить его, не затрагивая другие приложения. Каждый процесс имеет собственное адресное пространство, поэтому у каждого свой набор данных.
Как поток работает в Linux
» Поток » — это набор инструкций, выполняемых в процессе, который может варьироваться от одного потока до нескольких. Процесс — это процесс, который выделяет память и ресурсы, которые позже используются потоком. Иногда это называют легковесным процессом, потому что они могут получить доступ к общим данным, имея собственный стек. Поскольку оно работает параллельно, производительность приложения также будет улучшена. Наличие одного и того же адресного пространства потоков и процессов означает, что обмен данными между потоками не требует больших затрат. Недостатком является то, что отказ одного потока определенно повлияет на другие потоки и сделает процесс менее жизнеспособным. В графическом представлении ниже вы можете увидеть, как работает процесс и потоки.
Разница между процессом и потоками Linux
Заметные различия отмечены на следующем изображении:
Заключение
Термины «процесс» и «поток» могут сбивать с толку новичков. Итак, эта статья написана с учетом этого момента, и вы должны иметь основную идею после прочтения статьи. После этого он объяснил основные различия между ними. Поток — это часть процесса, которая распределяет свои ресурсы по другим потокам. Это улучшит производительность приложения, поскольку теперь ресурсы разделены.