Процессы и потоки в ос: Процессы и потоки — Win32 apps

Процессы и потоки 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) — не что более иное, как некая абстракция, которая инкапсулирует в себе все ресурсы процесса (открытые файлы, файлы отображенные в память. ..) и их дескрипторы, потоки и т.д. Каждый процесс имеет как минимум один поток. Также каждый процесс имеет свое собственное виртуальное адресное пространство и контекст выполнения, а потоки одного процесса разделяют адресное пространство процесса.

Каждый поток, как и каждый процесс, имеет свой контекст. Контекст — это структура, в которой сохраняются следующие элементы:

  • Регистры процессора.
  • Указатель на стек потока/процесса.

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

В общем случае, справедливы следующие рекомендации:

  • Если ваша задача требует интенсивного распараллеливания, используйте потоки одного процесса, вместо нескольких процессов. Все потому, что переключение контекста процесса происходит гораздо медленнее, чем контекста потока.
  • При использовании потока, старайтесь не злоупотреблять средствами синхронизации, которые требуют системных вызовов ядра (например мьютексы). Переключение в редим ядра — дорогостоящая операция!
  • Если вы пишете код, исполняемый в ring0 (к примеру драйвер), старайтесь обойтись без использования дополнительных потоков, так как смена контекста потока — дорогостоящая операция.

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

Какбы-то нибыло, но волокна не сыскали должной популярности. Они были реализованы в свое время в множестве BSD ОС, но со временем выбрасывались оттуда. Win32 API также реализует механизм волокон, но используется он лишь для облегчения портирования софта, написанного под другую ОС. Следует отметить, что за переключение волокон ответственен либо планировщик уровня процесса, либо переключение должно быть реализовано в самом приложении, проще говоря вручную 🙂

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

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

  • По отображению в ядро: 1:1, N:M, N:1
  • По многозадачной модели: вытесняющая многозадачность (preemptive multitasking), кооперативная многозадачность (cooperative multitasking).
  • По уровню реализации: режим ядра, режим польователя, гибридная реализация.

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

Как я уже упомянул, потоки могут быть созданы не только в режиме ядра, но и в режиме пользователя. Планировщиков потоков в ОС может быть несколько:

  • Центральный планировщик ОС режима ядра, который распределяет время между любым потоком в системе.
  • Планировщик библиотеки потоков. У библиотеки потоков режима пользователя может быть свой планировщик, который распределяет время между потоками различных процессов режима пользователя.
  • Планировщик потоков процесса. Уже рассмотренные нами волокна, ставятся на выполнение именно таким способом. К примеру свой Thread Manager есть у каждого процесса Mac OS X, написанного с использованием библиотеки Carbon.

Итак. Модель 1:1 — самая простая модель. Согласно ее принципам, любой поток созданный в любом процессе управляется напрямую планировщиком ядра ОС. Т.е. имеем отображении 1 к 1 потока пользовательского процесса на поток ядра. Такая модель реализована в Linux начиная с ядра 2.6, а также Windows.

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

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

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

Во времена DOS, когда однозадачные ОС перестали удовлетворять потребителя, программисты и архитекторы задумали реализовать многозадачную ОС. Самое простое решение было следующим: взять общее количество потоков, определить какой-нибудь минимальный интервал выполнения одного потока, да взять и разделить между всеми -братьями- потоками время выполнения поровну. Так и появилось понятие кооперативной многозадачности (cooperative multitasking), т. е. все потоки выполняются поочередно, с равным временем выполнения. Никакой другой поток, не может вытеснить текущий выполняющийся поток. Такой очень простой и очевидный подход нашел свое применение во всех версиях Mac OS вплоть до Mac OS X, также в Windows до Windows 95, и Windows NT. До сих пор кооперативная многозадачность используется в Win32 для запуска 16 битных приложений. Также для обеспечения совместимости, cooperative multitasking используется менеджером потоков в Carbon приложениях для Mac OS X.

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

Такой прицип лег в основу вытесняющей многозадачности (preemptive multitasking). Сейчас все современные ОС используют данный подход, за исключением реализации волокон в пользовательском режиме.

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

Как мы уже успели обсудить, реализация планировщика потоков может осуществлятся на разных уровнях. Итак:

  1. Реализация потоков на уровне ядра. Проще говоря, это классическая 1:1 модель. Под эту категорию подпадают:
    • Потоки Win32.
    • Реализация Posix Threads в Linux — Native Posix Threads Library (NPTL). Дело в том, что до версии ядра 2.6 pthreads в Linux был целиком и полностью реализован в режиме пользователя (LinuxThreads). LinuxThreads реализовывалf модель 1:1 следующим образом: при создании нового потока, библиотека осуществляла системный вызов clone, и создавало новый процесс, который тем не менее разделял единое адресное пространство с родительским. Это породило множество проблем, к примеру потоки имели разные идентификаторы процесса, что противоречило некоторым аспектам стандарта Posix, которые касаются планировщика, сигналов, примитивов синхронизации.
      Также модель вытеснения потоков, работала во многих случаях с ошибками, по этому поддержку pthread решено было положить на плечи ядра. Сразу две разработки велись в данном направлении компаниями IBM и Red Hat. Однако, реализация IBM не снискала должной популярности, и не была включена ни в один из дистрибутивов, потому IBM приостановила дальнейшую разработку и поддержку библиотеки (NGPT). Позднее NPTL вошли в библиотеку glibc.
    • Легковесные ядерны потоки (Leight Weight Kernel Threads — LWKT), например в DragonFlyBSD. Отличие этих потоков, от других потоков режима ядра в том, что легковесные ядерные потоки могут вытеснять другие ядерные потоки. В DragonFlyBSD существует множество ядерных потоков, например поток обслуживания аппаратных прерываний, поток обслуживания программных прерываний и т.д. Все они работают с фиксированным приоритетом, так вот LWKT могут вытеснять эти потоки (preempt). Конечно это уже более специфические вещи, про которые можно говорить бесконечно, но приведу еще два примера.
      В Windows все потоки ядра выполняются либо в контексте потока инициировавшего системный вызов/IO операцию, либо в контексте потока системного процесса system. В Mac OS X существует еще более интересная система. В ядре есть лишь понятие task, т.е. задачи. Все операции ядра выполняются в контексте kernel_task. Обработка аппаратного прерывания, к примеру, происходит в контексте потока драйвера, который обслуживает данное прерывание.
  2. Реализация потоков в пользовательском режиме. Так как, системный вызов и смена контекста — достаточно тяжелые операции, идея реализовать поддержку потоков в режиме пользователя витает в воздухе давно. Множество попыток было сделано, однако данная методика популярности не обрела:
    • GNU Portable Threads — реализация Posix Threads в пользовательском режиме. Основное преимущество — высокая портабельность данной библиотеки, проще говоря она может быть легко перенесена на другие ОС. Проблему вытиснения потоков в данной библиотеке решили очень просто — потоки в ней не вытесняются 🙂 Ну и конечно ни о какой мультмпроцессорности речь идти не может. Данная библиотека реализует модель N:1.
    • Carbon Threads, которые я упоминал уже не раз, и RealBasic Threads.
  3. Гибридная реализация. Попытка использовать все преимущества первого и второго подхода, но как правило подобные мутанты обладают гораздо бОльшими недостатками, нежели достоинствами. Один из примеров: реализация Posix Threads в NetBSD по модели N:M, которая была посже заменена на систему 1:1. Более подробно вы можете прочесть в публикации Scheduler Activations: Effective Kernel Support for the User-Level Management of Parallelism.

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. Данные функции — атомарные, т.е. вы можете не переживать за целостность ваших данных 😉

О мьютексах, событиях и семафорах было сказано достаточно много, по этому детально останавливатся я на них не буду. Следует заметить, что у всех этих механизмов есть общие черты:

  • Они использует примитивы ядра при выполнении, т.е. системные вызовы, что сказывается не производительности.
  • Могут быть именованными и не именованными, т.е. каждому такому объекту синхронизации можно присвоить имя.
  • Работают на уровне системы, а не на уровне процесса, т.е. могут служить механизмом межпроцессного взаимодействия (IPC).
  • Используют для ожидания и захвата примитива единую функцию: WaitForSingleObject/WaitForMultipleObjects.

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.

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

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

«Windows 2000 для профессионалов» — Джефри Рихтер.
GNU Portable Threads
Scheduler Activations: Effective Kernel Support for the User-Level Management of Parallelism

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

Поток и процессы в операционной системе, процессоре и программировании

Поток, процесс, задача, операционная система, программа, программирование — это все звенья одной системы. Что такое потоки в процессоре? Что такое процесс в программировании? Что такое потоки и процессы в операционной системе? Эти и другие вопросы часто ставят врасплох начинающих программистов. Во всех этих определениях можно не запутаться, если понимать, о чем идет речь. Сегодня в статье мы разложим все «по полкам» простым и понятным языком.

Процессы и потоки в операционной системе (ОС)

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

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

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

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

  • оперативная память;

  • время процессоров.

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

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

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

Что такое потоки в операционной системе и процессоре

Мы выяснили, что процесс в операционной системе является неким объектом, которому выделяются системные ресурсы, но самостоятельно он не выполняет код программы. У одного процесса может быть несколько потоков, которые будут выполняться одновременно и параллельно. Важно отметить, что несколько потоков одного процесса будут выполнять отдельные части кода одной программы.

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

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

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

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

Что такое потоки в процессоре

Может ли исполняться сразу несколько потоков? Конечно. Современные компьютеры имеют продвинутые процессоры, у которых есть по несколько ядер. Каждое отдельное ядро способно обработать минимум один поток. Но производители ядер научились в состав одного ядра внедрять многопоточность, позволяя одному ядру одновременно выполнять несколько потоков: 4, 6, 8, 12 и т. д. Можно умножить это количество возможностей на количество ядер, и тогда несложно посчитать, сколько потоков одновременно могут выполнять ядра.

Однако и тут есть тонкость. Для того чтобы программа выполнялась в несколько потоков, она изначально должна быть на это запрограммирована. То есть программист при разработке программы должен заложить в ней многопоточное исполнение, чтобы код программы мог исполняться параллельно. Если этого не сделать, программа не сможет работать в несколько потоков. Параллельное программирование сложнее однопоточного, поэтому не все программисты применяют такой подход, убегая от трудностей. Распараллеливание программ приводит к их ускорению и повышению их производительности, поэтому все равно за таким программированием будущее. Другой момент, что применение многоядерных компьютеров для вычисления однопоточных программ — это неэффективное использование мощности устройства.

Так что такое потоки в процессоре? Поток в процессоре — это «канал» исполнения потока процесса. Раньше было так: одно ядро имело один поток, а один поток — это выполнение одной команды. Теперь научились делать ядра многопоточными, а это означает, что одно ядро может одновременно выполнять количество команд по числу потоков. Допустим, в одном ядре 4 потока, значит, ядро может выполнить одновременно 4 команды.

Но не нужно путать ядра и потоки. Допустим, мы имеем два компьютера:

  • один с 4 ядрами по 2 потока, то есть всего 8 потоков;

  • второй с 8 ядрами по одному потоку, то есть тоже 8 потоков.

Потоки не равны ядрам, поэтому второй компьютер будет производительней и мощнее. Хотя наличие нескольких потоков в одном ядре тоже улучшает производительность. Разницу между количеством потоков и количеством ядер можно оценить по следующей ситуации. Допустим, у нас есть куча кирпичей. Мы можем переносить ее одно рукой (один поток), а можем переносить двумя руками (двумя потоками). Две руки быстрее, чем одна, но человек-то все равно один, а значит, быстрее устанет. Лучше переносить кирпичи одной рукой, но в два человека, чем двумя руками, но одним человеком.

Заключение

Что такое потоки в процессоре? Это «каналы» для одновременного исполнения команд. Чем больше потоков, тем больше команд может обработать процессор, а значит, многопоточная программа будет работать быстрее.

Что такое процесс в ОС? Простыми словами, процессом в операционной системе является каждое отдельно запущенное приложение. Процессы в ОС не взаимосвязаны, поэтому могут работать по отдельности.

Что такое поток в программировании? Это возможность разрабатываемой программы работать параллельно в несколько «веток» (потоков). Потоки в программировании взаимосвязаны. Потоки одной программы не могут работать отдельно друг от друга.

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

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

Просмотр обсуждения

Улучшить статью

Сохранить статью

  • Уровень сложности: Easy
  • Последнее обновление: 12 окт, 2022

  • Читать
  • Обсудить
  • Посмотреть обсуждение

    Улучшить статью

    Сохранить статью

    Процесс: Процессы — это в основном программы, которые отправляются из состояния готовности и планируются в ЦП для выполнения. PCB (блок управления процессом) содержит концепцию процесса. Процесс может создавать другие процессы, которые называются дочерними процессами. Процессу требуется больше времени для завершения, и он изолирован, что означает, что он не использует память совместно с каким-либо другим процессом.

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

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

    Для завершения потока требуется меньше времени, чем для процесса, но, в отличие от процесса, потоки не изолируются.

    Процесс против потока

    S.NO Процесс Поток
    1. Процесс означает выполнение любой программы. Поток означает сегмент процесса.
    2. Завершение процесса занимает больше времени. Завершение потока занимает меньше времени.
    3. На создание уходит больше времени. На создание уходит меньше времени.
    4. Также требуется больше времени для переключения контекста. Для переключения контекста требуется меньше времени.
    5. Процесс менее эффективен с точки зрения коммуникации. Поток более эффективен с точки зрения связи.
    6.  Мультипрограммирование поддерживает концепцию многопроцессорности. Нам не нужны несколько программ в действии для нескольких потоков, потому что один процесс состоит из нескольких потоков.
    7. Процесс изолирован. Потоки совместно используют память.
    8. Этот процесс называется тяжеловесным. Поток является легковесным, поскольку каждый поток в процессе совместно использует код, данные и ресурсы.
    9. Переключение процессов использует интерфейс в операционной системе. Переключение потоков не требует вызова операционной системы и вызывает прерывание ядра.
    10. Если один процесс заблокирован, это не повлияет на выполнение других процессов Если заблокирован поток пользовательского уровня, то будут заблокированы все остальные потоки пользовательского уровня.
    11. Процесс имеет собственный блок управления процессом, стек и адресное пространство. Поток имеет родительскую плату, собственный блок управления потоком, стек и общее адресное пространство.
    12. Изменения в родительском процессе не влияют на дочерние процессы. Поскольку все потоки одного и того же процесса совместно используют адресное пространство и другие ресурсы, любые изменения в основном потоке могут повлиять на поведение других потоков процесса.
    13. В нем задействован системный вызов. Системный вызов не задействован, он создается с помощью API.
    14. Процесс не обменивается данными друг с другом. Потоки обмениваются данными друг с другом.

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

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

    Ключевая разница между процессом и потоком
    • Процесс означает, что программа выполняется, тогда как поток означает сегмент процесса.
    • Процесс не является упрощенным, тогда как потоки являются упрощенными.
    • Для завершения процесса требуется больше времени, а для завершения потока требуется меньше времени.
    • Для создания процесса требуется больше времени, тогда как для создания потока требуется меньше времени.
    • Процессу, вероятно, требуется больше времени для переключения контекста, тогда как потоку требуется меньше времени для переключения контекста.
    • Процесс в основном изолирован, тогда как потоки совместно используют память.
    • Процесс не обменивается данными, а потоки обмениваются данными друг с другом.

    Что такое процесс?

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

    Операции процесса можно легко контролировать с помощью печатной платы (блока управления процессом). Вы можете рассматривать его как мозг процесса, который содержит всю важную информацию, связанную с обработкой, такую ​​как идентификатор процесса, приоритет, состояние и содержимое регистра ЦП и т. д.

    Что такое нить?

    Поток — это исполнительная единица, являющаяся частью процесса. Процесс может иметь несколько потоков, и все они выполняются одновременно. Это единица выполнения в параллельном программировании. Поток легковесен и может независимо управляться планировщиком. Это поможет вам улучшить производительность приложения, используя параллелизм.

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

    1. Потоки уровня ядра
    2. Потоки пользовательского уровня
    3. Гибридные нити

    Свойства процесса

    Вот важные свойства процесса:

    • Создание каждого процесса требует отдельных системных вызовов для каждого процесса.
    • Это изолированный исполняемый объект, который не передает данные и информацию.
    • Процессы используют для связи механизм IPC (межпроцессное взаимодействие), что значительно увеличивает количество системных вызовов.
    • Управление процессами требует больше системных вызовов.
    • Процесс имеет свой стек, динамическую память с памятью и карту данных.

    Свойства потока

    Вот важные свойства потока:

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

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

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

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

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

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