Процесс в linux и windows

Отличие работы процессов Windows и Unix

Windows использует событийное управление – другими словами ждет когда произойдёт какое-нибудь событие. Процессы в Windows представлены как объекты. Процессы Unix – при необходимости использует системные вызовы для получения конкретных услуг. Unix работает с процессами как с файлами, вписывая и извлекая из них необходимые данные. В Unix имеется однозначная связь между вызовами и процедурами (около 100 процедур в POSIX). Windows использует Win32 API – в котором в зависимости от версии Windows может содержаться несколько тысяч вызовов никак не регламентируемых. При этом вызовы от версии к версии могут быть на стороне ядра, так и на стороне пользователя (например, отрисовка окна).

Потоки (нити и веретено)

Операция создания процесса сама по себе достаточно длительная. Чтобы сократить это время, можно использовать существующее адресное пространство процесса для исполнения процессов. Тем более если это 64-битный адресный процесс, который содержит 2^64=18.446.744.073.709.551.616 адресов. Действительно, если адресация процесса позволяет разместить в нем несколько потоков управления, можно сэкономить на выделении дополнительных ресурсов и времени переключения контекста.

Потоки содержат свои регистровый (стек) и пользовательский контексты (данные), а системный контекст у них общий. В Windows поток запускается вызовом CreateThread

Рис. 26 Потоки

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

Пример выгоды многопоточного приложения можно посмотреть на следующем примере:

Рис 27. Работа 1 и 2 потоков

Потоки обладают ещё одной особенностью – размер выделяемой им памяти существенно меньше объема адресного пространства выделяемого для полного процесса. В среднем для потока выделяется около 1 Мб. Таким образом, теоретически в одном процессе x86 (с адресным пространством 4Гб) можно запустить 4096 потоков. Однако для Windows существуют существенные ограничения: во-первых адресное пространство процесса делится пополам и для пользовательских потоков выделяется только его половина. Таким образом, для пользовательских потоков остается 2Гб адресного пространства, но и оно используется не полностью. Часть адресного пространства отъедается для диспетчеризации потоков. Максимальное количество пользовательских потоков на процесс – 2034. Для Linux максимальное количество потоков на процесс задается параметрами ядра /proc/sys/kernel/thread-max. Для x86 RedHat 6.5 – 7722.

Максимальное количество полноценных процессов меньше количества потоков, поскольку расходуется больше адресного пространства. Для Windows 1.25Мб – 1550,Для Linux число процессов и число потоков одинаково RHEL — 7722 процессов, поскольку система не делает между ними различий. (x86 – Windows может управлять 3 миллионами потоков, Linux – более 59 миллионами.)

Читайте также:  Linux partition start sector

Переход на 64 адресацию позволяет запустить большее количество потоков и процессов в адресном пространстве. Windows x64 – около 32000 потоков и процессов. Для RHEL x64 – около 64000 потоков и процессов.

Источник

Отличия между моделями процессов/потоков в windows и linux -архитектура

vedro-compota's picture

В среде Microsoft Windows процесс, – это контейнер для потоков (именно этими словами о процессах говорит Джефри Рихтер в своей классической книге «Программирование приложений для Microsoft Windows»). Процесс-контейнер содержит как минимум один поток. Если потоков в процессе несколько, приложение (процесс) становится многопоточным.

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

. Для обозначения процессов этого типа, применяется специальный термин – легкие процессы (lightweight processes).

Прилагательное «легкий» в названии процессов- потоков вполне оправдано. Поскольку этим процессам не нужно создавать собственную копию адресного пространства (и других ресурсов) своего процесса- родителя, создание нового легкого процесса требует значительно меньших затрат, чем создание полновесного дочернего процесса.

Key Words for FKN + antitotal forum (CS VSU):

Источник

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

Система LINUX и процесс создания системного процесса WINDOWS

Процесс создания процесса Windows

Имя интерфейса функции создания, предоставляемого системой Windows пользователям, — CreateProcess (). Ниже мы объясним, как работает система, анализируя конкретный процесс реализации этой функции в системе.
Добавляет новый процесс в работу операционной системы с нуля.

Источник: «Исследование модели потоков» многие ко многим (M: N) «Ли Цзинь

Во-первых, поток, который инициирует поведение создания, открывает объект файла для выполнения и создает новый объект области памяти.Этот объект является дескриптором файла, в котором находится функция функции, которую процесс должен выполнить. Затем создайте объект исполнительного процесса Windows, включая создание блока EPROCESS, создание начального адресного пространства процесса, инициализацию блока процесса KPROCESS и создание PEB. После завершения структуры управления, связанной с процессом, следующим шагом является создание начального потока, его стека и среды выполнения.

На этом этапе также устанавливается структура данных управления потоком процесса в системе Windows. Первый шаг — увеличить значение счетчика потока в объекте процесса; второй шаг — создать и инициализировать блок управления потоком управления ETHREAD; третий шаг — сгенерировать идентификатор потока для нового потока; четвертый шаг — это установить TEB в адресном пространстве пользовательского режима процесса; Пятый шаг сохраняет начальный адрес пользовательского потока в ETHREAD; шестой шаг вызывает KelnitThread, чтобы установить блок KTHREAD.
Структура данных, которая определяет идентификатор процесса и идентификатор потока в системе, является структурой данных уровня управления, в то время как структура данных основного уровня не имеет таких элементов для различения, но напрямую использует идентификатор управления в слое. Это также полностью отличает иерархическую структуру в системе Windows: уровень управления отвечает за управление и различение нескольких структур одного типа; основной уровень не отвечает за различение задач управления, а только обрабатывает задачи, поставленные уровнем управления.
На рисунке два модуля управления процессами имеют указатель заголовка связанного списка, а оба блока управления потоками имеют член LIST_ENTRY, подключенный к связанному списку. Таким образом, общая архитектура этих четырех структур данных ясна: уровень управления и базовый уровень сохраняют две очереди потоков для процесса соответственно, а структура данных потока висит в соответствующих очередях в соответствии с уровнем операционной системы; указатель заголовка очередь потоков на одном уровне помещается в структуру данных процесса на этом уровне, так что создается иерархическая структура потоков «многие к одному».
После завершения создания и инициализации этих четырех структур данных поток создания вызывает любые зарегистрированные общесистемные подпрограммы уведомления о создании потока и устанавливает токен доступа потока. Основная работа по построению завершена. Наконец, уведомите подсистему Windows о новом процессе, запустите выполнение исходного потока и выполните инициализацию процесса в новой среде процесса, чтобы процесс был инициализирован и ожидает выполнения.

Читайте также:  Rsync linux примеры копирования

Процесс создания процесса Linux

Процесс в Linux создается системой, вызывающей библиотечные функции fork () и vfork (), и они используют соответствующие флаги параметров для вызова clone (). В этой функции функция copy_process () завершает работу по созданию процесса. Имя показывает, что в основном это делается для копирования содержимого родительского процесса и создания на его основе дочернего процесса. Ниже приведен конкретный поток выполнения функции copy_process ():
1. Создайте стек ядра, структуру thread_info и структуру task_struct процесса и скопируйте все значения связанной структуры данных родительского процесса в адресное пространство дочернего процесса. Видно, что система Linux создает Первоначальная цель состояла в том, чтобы полностью воспроизвести тот же процесс.
2. Очистите статистику выполнения процесса в дескрипторе процесса. Поскольку эта информация напрямую копируется из родительского процесса и не имеет ссылочного значения в дочернем процессе, ее все же необходимо пересчитать как новую статистику процесса.
3. Установите состояние дочернего процесса на непрерывный сон, чтобы предотвратить пробуждение дочернего процесса некоторыми обработчиками сигналов от родительского процесса в середине его создания, и программа перейдет в неизвестный статус.
4. Установите флаг процесса PF_FORKNOEXEC, который еще не вызвал функцию exec (). Специальная структура управления потоками процессов Linux на отдельном уровне делает программный сегмент по умолчанию в начале создания программным сегментом родительского процесса. Таким образом, когда целью вызова fork () является создание потока с общими ресурсами вместо процесса, который должен запускаться новой программой, процесс загрузки сегмента программы может быть сохранен один раз, что позволяет сэкономить очень много накладные расходы на создание процесса.
5. Назначьте новому процессу идентификатор процесса, который не используется другими процессами. С этого момента процесс будет отличаться от других процессов.
6. Определите состояние дочернего процесса на основе идентификаторов ресурсов, таких как открытые файлы и функции обработки сигналов в родительском процессе. При создании нового процесса приведенное выше содержимое полностью отличается от родительского процесса, и эту информацию необходимо скопировать из таблицы параметров функции создания процесса. Если создается новый поток, адресное пространство, в котором расположены эти идентификаторы доступа, напрямую устанавливается для совместного использования с новым потоком.
Из потока выполнения вышеупомянутого процесса создания системы Linux мы видим, что это процесс, в котором родительский процесс копирует дочерний процесс, а затем непрерывно характеризует дочерний процесс в соответствии с потребностями пользователя. . Поскольку большинство сложных структур данных в процессе создания выделяют пространство памяти через распределитель slab и напрямую хранят структурированные данные родительского процесса, нет процесса инициализации элемента за элементом, как в других системах, поэтому система Linux — это управление процессами. должны быть накоплены и эффективны.

Читайте также:  Linux softether vpn server

Традиционный системный вызов fork () напрямую копирует все ресурсы родительского процесса во вновь созданный процесс, но впоследствии разработчики обнаружили, что большой объем данных, скопированных во время вновь созданного процесса, не будет использоваться совместно, и если новому процессу потребуется для создания Когда создается новый образ, большая часть предыдущих копий будет немедленно заменена без использования. Поэтому в системах Linux используется механизм копирования при записи, чтобы избежать таких ненужных операций. Основной механизм реализации — создать новый процесс без предварительного создания для него нового адресного пространства, но позволить родительскому процессу и дочернему процессу совместно использовать копию адресного пространства. В это время поля mm двух процессов указывают в ту же структуру mm_struct в памяти. Поскольку Linux будет отдавать приоритет запуску родительского процесса, поэтому, если дочерний процесс напрямую вызывает функцию Excec () для загрузки нового образа программы, мы избежим этих сложных и бесполезных операций, таких как копирование сегмента кода родительского процесса, что в значительной степени улучшает новый процесс Скорость создания.
** Linux, написанный в исходной работе, будет отдавать приоритет дочернему процессу. Я думаю, что это может быть неправильно.

Источник

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