Чем отличается процесс от потока linux

процессы и потоки

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

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 за процессы). И потоки внутри процесса шарят как эту «структуру», так и память и прочее.

Читайте также:  Mount windows share with linux

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

3. например если в одном процессе запущен браузер, а во втором процессе запущена игра, то игра никак не может узнать какие вкладки браузера открыты в данный момент.

Сфига-ли? Хэндлы окон совершенно не против, чтобы их перехватывали и творили там что угодно, хоть член нарисуй в натуральную величину.

Ну, если лезть в дебри программирования. То есть два класса: Process и Thread. Чем они отличаются? Свойствами, вестимо. Я не знаю как ты, а я с первого раза в гугле нашел, чем отличается поток от процесса. Процесс — не лезет в другие участки памяти, кроме выделенного своего. Иначе- BSoD. Поток — лезет в участки памяти, но только своих приложений, которых может быть несколько. Ну, это грубо говоря.

Всё равно что инкапсуляцию и полиморфизм обьяснять на пальцах. Один хрен, не поймут.

В случае с Linux потоки — это тоже процессы, просто у потоков одного процесса есть общие сегменты памяти.

Процесс создаётся через системный вызов clone() (можно через fork(), но glibc’шный враппер fork() использует clone()), поток создаётся через clone(). Почитай ман этого системного вызова, там описано, какие части контекста процесса можно шарить.

Источник

Тема3,4,5: процессы и потоки ос Linux

Основными активными сущностями в ос Linuxявляются процессы. Процессы в Linux — классические, последовательные процессы. Каждый процесс выполняет одну программу и изначально получает один поток управления. У процесса есть один счетчик команд, который отслеживает следующую исполняемую команду. Linuxпозволяет процессу создавать дополнительные потоки. Также Linux представляет собой многозадачную систему, так, что несколько независимых процессов могут работать одновременно. У каждого процесса в Linux есть пользовательская часть, в которой работает программа пользователя, однако, когдаодин из потоков делает системный вызов,то происходит эмулированное прерывание с переключением в режим ядра. После этого поток начинает работу в контексте ядрас другой картой памяти, своимстеком ядра, счетчиком команд в режиме ядра и полным доступом ко всем ресурсам машины. Ядро ОC Linux внутренним образом представляет процессы как задачи при помощи структуры задачtask_struct. Процесс с одним потоком представляется одной структурой задач, а многопоточный процесс будет иметь по одной структуре задачи для каждого из потоков пользовательского уровня. Само ядро является многопоточным и имеет потоки уровня ядра, которые не связаны ни с какими пользовательскими процессами и выполняют код ядра. Для каждого процесса в памяти находится его дескриптор типа task_struct. Он содержит важную информацию, необходимую ядру для управления всеми процессами. Дескриптор процесса создается при создании процесса. Для совместимости с другими системами unix процессы в Linux идентифицируются при помощи идентификатора процессаPID(ProcessIdentifier). Ядро организует все процессы в двунаправленный список структур задач. Информация в дескрипторе процесса подразделяется на следующие категории:

  1. Параметры блокирования (приоритет процесса, израсходованное за последний учитываемый период времени, количество проведенного в режиме ожидания времени)
  2. Образ памяти (указатели на сегмент текста, данных и стека) Когда процесса нет в памяти, то здесь так же хранится, как найти его части на диске.
  3. Сигналы (маски, указывающие, какие сигналы перехватываются, какие временно заблокированы, и какие находятся в процессе доставки).
  4. Машинные регистры. Когда происходит эмулированное прерывание в ядро, то машинные регистры сохраняются здесь
  5. Состояние системного вызова (здесь хранится информация о текущем системном вызове)
  6. Таблица дескрипторов файлов (Когда делается системный вызов, использующий дескриптор файла, то файловый дескриптор используется как индекс в этой таблице для обнаружения соответствующей этому файлу структуры данных).
  7. Учетные данные (Указатель на таблицу, в которой отслеживается использованное процессом пользовательское и системное время процесса).
  8. Стек ядра (фиксированный стек для использования той частью процесса, которая работает в режиме ядра)
  9. Разное (текущее состояние процесса, ожидаемое процессом событие, PID процесса, идентификаторы родительского процесса, группы)
  1. Выделение структуры задач для потомка
  2. Заполнение структуры задач потоком данными родителя
  3. Выделение памяти для стека и области пользователя дочернего процесса
  4. Заполнение области пользователя дочернего процесса
  5. Выделение идентификатора для дочернего процесса
  6. Настройка дочернего процесса на использование программы родительского процесса
  7. Копирование таблицы страниц для данных и стека
  8. Настройка совместного использования открытых файлов
  9. Копирование регистров родительского процесса в дочерний процесс
  1. Поиск исполняемого файла
  2. Проверка разрешения на выполнение
  3. Чтение и проверка заголовка
  4. Копирование аргументов, среды в ядро
  5. Освобождение нового адресного пространства
  6. Копирование аргументов среды в стек
  7. Сбрасывание сигнала
  8. Инициализация регистров
Читайте также:  Kali linux on cloud

Для продолжения скачивания необходимо пройти капчу:

Источник

Что из этого является потоками?

введите сюда описание изображения

Доброго времени суток. Не могу разобраться, что из этого является именно потоками, и как их вообще отличать от процессов. Самой системы Linux на PC нет, опираюсь на скриншоты. Именно этот сделан в командной строке с «top H». Очень надеюсь на Вашу помощь, т.к. сам разобраться не смог, да и в сети что-то так и не нашел однозначного ответа на то, как их отличать.

Всё что вы видите это потоки — кто вам такое сказал . Читаем man: The top program provides a dynamic real-time view of a running system. It can display system summary information as well as a list of processes or threads А опция H означает, что треды печаются отдельно, а НЕ суммируются внутри процесса: *H — Instructs top to display individual threads. Without this command-line option a summation of all threads in each process is shown. Later this can be changed with the `H’ interactive command.

@Sergey: да, каждая строчка это поток — всё что вы видите (каждая строчка в таблице) это потоки. Я тоже man процитировать могу: «top -H :Threads-mode operation Instructs top to display individual threads. Without this command-line option a summation of all threads in each process is shown.» [выделение моё]¶ Используйте \@-синтаксис, если хотите, чтобы мне уведомления о вашем комментарии приходили.

Вы как раз и процитировали то место, в котором говорится, что ооция -H показывать треды отдельно. Т.е. можно показывать треды внутри процесса-хозяина, а можно — отдельно. Но далеко не все процессы содержат треды. Процесс — первичен, а тред — вторичен.

Читайте также:  Смена пароля grub astra linux

@Sergey: каждый процесс содержит как минимум один поток, поэтому каждой строчке в таблице соответствует поток¶ У вас похоже проблемы с чтением как документации так и комментариев — даже после подсказки не способны \@-синтаксис использовать.

Источник

Оцените статью
Adblock
detector