Отличие работы процессов 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 миллионами.)

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

ГЛАВА 4

Наши рекомендации