в чем разница между потоком и процессом

Процессы и потоки in-depth. Обзор различных потоковых моделей

Здравствуйте дорогие читатели. В данной статье мы рассмотрим различные потоковые модели, которые реализованы в современных ОС (preemptive, cooperative threads). Также кратко рассмотрим как потоки и средства синхронизации реализованы в Win32 API и Posix Threads. Хотя на Хабре больше популярны скриптовые языки, однако основы — должны знать все 😉

Потоки, процессы, контексты.

Системный вызов (syscall). Данное понятие, вы будете встречать достаточно часто в данной статье, однако несмотря на всю мощь звучания, его определение достаточно простое 🙂 Системный вызов — это процесс вызова функции ядра, из приложение пользователя. Режим ядра — код, который выполняется в нулевом кольце защиты процессора (ring0) с максимальными привилегиями. Режим пользователя — код, исполняемый в третьем кольце защиты процессора (ring3), обладает пониженными привилегиями. Если код в ring3 будет использовать одну из запрещенных инструкций (к примеру rdmsr/wrmsr, in/out, попытку чтения регистра cr3, cr4 и т.д.), сработает аппаратное исключение и пользовательский процесс, чей код исполнял процессор в большинстве случаях будет прерван. Системный вызов осуществляет переход из режима ядра в режим пользователя с помощью вызова инструкции syscall/sysenter, int2eh в Win2k, int80h в Linux и т.д.

И так, что же такое поток? Поток (thread) — это, сущность операционной системы, процесс выполнения на процессоре набора инструкций, точнее говоря программного кода. Общее назначение потоков — параллельное выполнение на процессоре двух или более различных задач. Как можно догадаться, потоки были первым шагом на пути к многозадачным ОС. Планировщик ОС, руководствуясь приоритетом потока, распределяет кванты времени между разными потоками и ставит потоки на выполнение.

На ряду с потоком, существует также такая сущность, как процесс. Процесс (process) — не что более иное, как некая абстракция, которая инкапсулирует в себе все ресурсы процесса (открытые файлы, файлы отображенные в память. ) и их дескрипторы, потоки и т.д. Каждый процесс имеет как минимум один поток. Также каждый процесс имеет свое собственное виртуальное адресное пространство и контекст выполнения, а потоки одного процесса разделяют адресное пространство процесса.

Классификация потоков

Классификация потоков по отображению в режим ядра

Модель N:M отображает некоторое число потоков пользовательских процессов N на M потоков режима ядра. Проще говоря имеем некую гибридную систему, когда часть потоков ставится на выполнение в планировщике ОС, а большая их часть в планировщике потоков процесса или библиотеки потоков. Как пример можно привести GNU Portable Threads. Данная модель достаточно трудно реализуема, но обладает большей производительностью, так как можно избежать значительного количества системных вызовов.

Модель N:1. Как вы наверное догадались — множество потоков пользовательского процесса отображаются на один поток ядра ОС. Например волокна.

Классификация потоков по многозадачной модели

Однако, кооперативная многозадачность со временем показала свою несостоятельность. Росли объемы данных хранимых на винчестерах, росла также скорость передачи данных в сетях. Стало понятно, что некоторые потоки должны иметь больший приоритет, как-то потоки обслуживания прерываний устройств, обработки синхронных IO операций и т.д. В это время каждый поток и процесс в системе обзавелся таким свойством, как приоритет. Подробнее о приоритетах потоков и процессов в Win32 API вы можете прочесть в книге Джефри Рихтера, мы на этом останавливатся не будем 😉 Таким образом поток с большим приоритетом, может вытеснить поток с меньшим. Такой прицип лег в основу вытесняющей многозадачности (preemptive multitasking). Сейчас все современные ОС используют данный подход, за исключением реализации волокон в пользовательском режиме.

Классификация потоков по уровню реализации

Win32 API Threads

Если вы все еще не устали, предлагаю небольшой обзор API для работы с потоками и средствами синхронизации в win32 API. Если вы уже знакомы с материалом, можете смело пропускать этот раздел 😉

Потоки в Win32 создаются с помощью функции CreateThread, куда передается указатель на функцию (назовем ее функцией потока), которая будет выполнятся в созданом потоке. Поток считается завершенным, когда выполнится функция потока. Если же вы хотите гарантировать, что поток завершен, то можно воспользоватся функцией TerminateThread, однако не злоупотребляйте ею! Данная функция «убивает» поток, и отнюдь не всегда делает это корректно. Функция ExitThread будет вызвана неявно, когда завершится функция потока, или же вы можете вызвать данную функцию самостоятельно. Главная ее задача — освободить стек потока и его хендл, т.е. структуры ядра, которые обслуживают данный поток.

Поток в Win32 может пребывать в состоянии сна (suspend). Можно «усыпить поток» с помощью вызова функции SuspendThread, и «разбудить» его с помощью вызова ResumeThread, также поток можно перевести в состояние сна при создании, установив значение параметра СreateSuspended функции CreateThread. Не стоит удивлятся, если вы не увидите подобной функциональности в кроссплатформенных библиотеках, типа boost::threads и QT. Все очень просто, pthreads просто не поддерживают подобную функциональность.

Средства синхронихации в Win32 есть двух типов: реализованные на уровне пользователя, и на уровне ядра. Первые — это критические секции (critical section), к второму набору относят мьютексы (mutex), события (event) и семафоры (semaphore).

Критические секции — легковесный механизм синхронизации, который работает на уровне пользовательского процесса и не использует тяжелых системных вызовов. Он основан на механизме взаимных блокировок или спин локов (spin lock). Поток, который желает обезопасить определенные данные от race conditions вызывает функцию EnterCliticalSection/TryEnterCriticalSection. Если критическая секция свободна — поток занимает ее, если же нет — поток блокируется (т.е. не выполняется и не отъедает процессорное время) до тех пор, пока секция не будет освобождена другим потоком с помощью вызова функции LeaveCriticalSection. Данные функции — атомарные, т.е. вы можете не переживать за целостность ваших данных 😉

Posix Threads или pthreads

Сложно представить, какая из *nix подобных операционных систем, не реализует этот стандарт. Стоит отметить, что pthreads также используется в различных операционных системах реального времени (RTOS), потому требование к этой библиотеке (вернее стандарту) — жестче. К примеру, поток pthread не может пребывать в состоянии сна. Также в pthread нет событий, но есть гораздо более мощный механизм — условных переменных (conditional variables), который с лихвой покрывает все необходимые нужды.

Поговорим об отличиях. К примеру, поток в pthreads может быть отменен (cancel), т.е. просто снят с выполнения посредством системного вызова pthread_cancel в момент ожидания освобождения какого-нибудь мьютекса или условной переменной, в момент выполнения вызова pthread_join (вызывающий поток блокируется до тех пор, пока не закончит свое выполнение поток, приминительно к которому была вызвана функция) и т.д. Для работы с мьютексами и семафорами существует отдельные вызовы, как-то pthread_mutex_lock/pthread_mutex_unlock и т.д.

Conditional variables (cv) обычно используется в паре с мьютексами в более сложных случаях. Если мьютекс просто блокирует поток, до тех пор, пока другой поток не освободит его, то cv создают условия, когда поток может заблокировать сам себя до тех пор, пока не произойдет какое-либо условия разблокировки. Например, механизм cv помогает эмулировать события в среде pthreads. Итак, системный вызов pthread_cond_wait ждет, пока поток не будет уведомлен о том, что случилось определенное событие. pthread_cond_signal уведомляет один поток из очереди, что cv сработала. pthread_cond_broadcast уведомляет все потоки, которые вызывали pthread_cond_wait, что сработала cv.

Прощальное слово

На сегодня пожалуй все, иначе информации станет слишком много. Для интересующихся, есть несколько полезных ссылок и книг внизу 😉 Также высказывайте свое мнение, интересны ли вам статьи по данной теме.

UPD: дополнил статью небольшой информацией о режиме ядра и режиме пользователя.
UPD2: исправил досадные промахи и ошибки. Спасибо комментаторам 😉

Источник

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

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.

Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.

Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.

Источник

Русские Блоги

Разница между потоком Java и процессом, и как создать поток

public class ThreadByEx extends Thread <
/**
* Перепишите метод run
*/
@Override
public void run() <
System.out.println(“I’m a thread that extends Thread!”);
>
>

Реализовать интерфейс Runnable

public class MainTest <

Код довольно прост, но много объяснений. Здесь следует отметить, что после вызова метода start () многопоточный код выполняется не сразу, а поток становится работоспособным. Время запуска многопоточного кода определяется операционной системой.

Интеллектуальная рекомендация

Tree Дерево отрезков линии】 COGS 2632

Ссылочный блогАвтор:dreaming__ldxИсточник: CSDN Портал последовательности операций 【Название описания】 Последовательность длины n, вес порядкового номера в начале равен 0, есть m операций Поддерживают.

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

PAT-A-1046 кратчайшее расстояние [префикс и]

The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits. Input Specification: Each input fi.

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

Как нарисовать несколько линий ROC на одном графике?

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

Класс коллекции JAVA

Резюме JAVA-коллекции Один, коллекция 1. Характеристики коллекций: коллекции используются только для хранения объектов, длина коллекции является переменной, и в коллекции могут храниться объекты разны.

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

MySQL репликация главный-подчиненный + переключатель главный-подчиненный

MySQL репликация главный-подчиненный + переключатель главный-подчиненный 05 января 2018 10:46:35Протрите протирать прыжок Количество просмотров: 5183Более Персональная категория:база данныхЭксплуатаци.

Источник

Русские Блоги

Разница между процессом и потоком (супер подробно)

Справочник статей

Процессы и темы

обработать

Приложение работает в памяти. Каждый процесс имеет свое независимое пространство памяти. Процесс может иметь несколько потоков. Например, в системе Windows запущенный xx.exe является процессом.

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

Задача выполнения (блок управления) в процессе отвечает за выполнение программы в текущем процессе. У процесса есть хотя бы один поток, процесс может запускать несколько потоков, а несколько потоков могут обмениваться данными.

В отличие от процессов, несколько потоков одного типа совместно используют процессыстексОбласть методаРесурсы, но каждый поток имеет своиСчетчик командСтек виртуальных машинсСобственный стек методовПоэтому, когда система генерирует поток или переключается между потоками, нагрузка намного меньше, чем процесс, и из-за этого поток также называется легковесным процессом.

Java-программы по своей сути являются многопоточными. Мы можем посмотреть на потоки обычной Java-программы через JMX. Код выглядит следующим образом.

Вывод вышеуказанной программы выглядит следующим образом (выходной контент может быть разным, без особой запутанности роли каждого потока ниже, нужно только знать, что основной поток выполняет основной метод):

Краткое изложение разницы между процессом и потоком

Принципиальная разница: Процесс является основной единицей распределения ресурсов операционной системы, а поток является основной единицей планирования и выполнения задач процессора.

Затраты ресурсовКаждый процесс имеет независимый код и пространство данных (программный контекст), и переключение между программами будет иметь большие издержки: потоки можно рассматривать как облегченные процессы, и каждый поток одного типа совместно использует код и пространство данных, каждое Потоки имеют свой собственный независимый рабочий стек и программный счетчик (ПК), и накладные расходы на переключение между потоками невелики.

Выделение памяти: Потоки одного и того же процесса совместно используют адресное пространство и ресурсы процесса, а адресное пространство и ресурсы между процессами не зависят друг от друга

Влияние отношений: После сбоя какого-либо процесса это не повлияет на другие процессы в защищенном режиме, но происходит сбой потока, и весь процесс умирает. Таким образом, многопроцессорность более надежна, чем многопоточность.

Процесс внедренияКаждый независимый процесс имеет точку входа для запуска программы, последовательность последовательного выполнения и точку выхода для программы. Однако потоки не могут быть выполнены независимо и должны быть сохранены в прикладной программе. Прикладная программа обеспечивает управление выполнением нескольких потоков, и оба могут выполняться одновременно.

С точки зрения JVM, отношения между процессами и потоками (важно)

Проиллюстрировать отношения между процессами и потоками

На следующем рисунке показана область памяти Java. На следующем рисунке мы говорим об отношениях между потоками и процессами с точки зрения JVM.

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

Это видно из рисунка выше: в процессе может быть несколько потоков, и несколько потоков совместно используют процессстексОбласть метода (метапространство после JDK1.8)Ресурсы, но каждый поток имеет своиСчетчик командСтек виртуальных машин с Собственный стек методов

Почему счетчик программы частный?

Счетчик программ в основном имеет следующие две функции:

Следует отметить, что если собственный метод выполняется, программный счетчик записывает неопределенный адрес, а программный счетчик записывает адрес следующей инструкции только при выполнении кода Java.

Таким образом, основной целью программного счетчика являетсяПосле переключения потока его можно восстановить до правильной позиции выполнения

Почему стек виртуальной машины и локальный стек методов закрыты?

Таким образом, дляУбедитесь, что локальные переменные в потоке не доступны другим потокамСтек виртуальной машины и локальный стек методов являются частными для потока.

Понять область кучи и метода в одном предложении

Разница между многопоточностью и многопоточностью

Многопроцессорность: одновременно работают несколько программ в операционной системе

Многопоточность: несколько задач выполняются одновременно в одном процессе

Например, многопоточная загружаемая программа может запускать несколько потоков одновременно, но по результатам работы программы обнаруживается, что каждый раз эти результаты противоречивы. Потому что есть функция многопоточности:хаотичность, Причины:Процессор постоянно переключается на обработку каждого потока в одно мгновение, и можно понять, что несколько потоков захватывают ресурсы процессора.

Многопоточность улучшает использование процессора

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

Многопоточность не улучшает скорость работы, но может повысить эффективность работы и повысить загрузку ЦП. Однако, если есть проблемы безопасности с многопоточностью или частыми переключениями контекста, скорость вычисления может быть ниже.

Многопоточность в Java

В процессе работы Java-программы есть несколько потоков: основной поток, поток сбора мусора (фоновый поток) и т. Д.

В Java, когда мы запускаем основную функцию, мы фактически запускаем процесс JVM, и поток, в котором находится основная функция, является потоком в этом процессе, также известным как основной поток.

Интеллектуальная рекомендация

Tree Дерево отрезков линии】 COGS 2632

Ссылочный блогАвтор:dreaming__ldxИсточник: CSDN Портал последовательности операций 【Название описания】 Последовательность длины n, вес порядкового номера в начале равен 0, есть m операций Поддерживают.

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

PAT-A-1046 кратчайшее расстояние [префикс и]

The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits. Input Specification: Each input fi.

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

Как нарисовать несколько линий ROC на одном графике?

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

Класс коллекции JAVA

Резюме JAVA-коллекции Один, коллекция 1. Характеристики коллекций: коллекции используются только для хранения объектов, длина коллекции является переменной, и в коллекции могут храниться объекты разны.

в чем разница между потоком и процессом. Смотреть фото в чем разница между потоком и процессом. Смотреть картинку в чем разница между потоком и процессом. Картинка про в чем разница между потоком и процессом. Фото в чем разница между потоком и процессом

MySQL репликация главный-подчиненный + переключатель главный-подчиненный

MySQL репликация главный-подчиненный + переключатель главный-подчиненный 05 января 2018 10:46:35Протрите протирать прыжок Количество просмотров: 5183Более Персональная категория:база данныхЭксплуатаци.

Источник

В чем разница между процессом и потоком?

В чем техническая разница между процессом и потоком?

Эрланг использует термин «процесс», потому что он не раскрывает модель многопрограммирования с общей памятью. Называя их «потоками», можно предположить, что они имеют общую память.

Процесс
Каждый процесс предоставляет ресурсы, необходимые для выполнения программы. Процесс имеет виртуальное адресное пространство, исполняемый код, открытые дескрипторы для системных объектов, контекст безопасности, уникальный идентификатор процесса, переменные среды, класс приоритета, минимальный и максимальный размеры рабочего набора и, по крайней мере, один поток выполнения. Каждый процесс запускается с одного потока, часто называемого основным потоком, но может создавать дополнительные потоки из любого его потока.

Эта информация была найдена в Документах Microsoft здесь: О процессах и потоках

Microsoft Windows поддерживает вытесняющую многозадачность, которая создает эффект одновременного выполнения нескольких потоков из нескольких процессов. На многопроцессорном компьютере система может одновременно выполнять столько потоков, сколько имеется процессоров на компьютере.

Обработать:

Нить:

Сначала давайте посмотрим на теоретический аспект. Вам необходимо понять, что такое концептуально процесс, чтобы понять разницу между процессом и потоком и тем, что между ними.

У нас есть следующее из раздела 2.2.2 Модель классической резьбы в современных операционных системах 3e от Tanenbaum:

Далее он предоставляет следующую таблицу:

Теперь давайте посмотрим на сторону программного обеспечения. Есть три основных способа реализации потоков на стороне программного обеспечения.

Преимущество потоков ядра в том, что они могут использовать блокирующий ввод / вывод, в дополнение к тому, что все проблемы с планированием оставлены для ОС. Но каждое переключение потоков требует захвата в ядро, которое потенциально относительно медленное. Однако, если вы переключаете потоки из-за заблокированного ввода-вывода, это на самом деле не проблема, поскольку операция ввода-вывода, вероятно, в любом случае заманила вас в ядро.

Другой подход заключается в объединении двух потоков с несколькими потоками ядра, каждый из которых имеет несколько пользовательских потоков.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *