Юридический портал. Льготный консультант

Наиболее заметный прогресс в развитии возможностей Windows после появления Windows NT и Windows 95 связан с приходом 64-разрядного программирования и расширением Win32 до Win64. На объединенный API обычно ссылаются просто как на Windows API, и именно такой практики мы придерживались на протяжении всей книги. API Win64 обеспечивает возможность выполнения в Windows наиболее крупных и требовательных в отношении ресурсов приложений уровня предприятий и приложений для научных расчетов. 64-разрядные системы позволяют программам использовать гигантские адресные пространства, которые выходят далеко за предел 4 Гбайт, обусловленный 32-битовой адресацией.

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

Нынешнее состояние Win64

В данном разделе анализируется состояние поддержки компанией Microsoft интерфейса Win64 на различных системах и процессорах, сложившееся к концу первого полугодия 2004 года. Поскольку ситуация постоянно меняется, приведенную ниже информацию следует рассматривать лишь в качестве "моментального снимка" реального положения дел. Тем не менее, на охватываемых здесь аспектах программирования эволюция поддержки Win64 никак не сказывается.

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

Поддержка процессоров

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

Семейство процессоров Itanium (Itanium Processor family, IPF) компании Intel, архитектура которых полностью отличается от известной архитектуры Intel x86. IPF предоставляет большие регистровые файлы (включающие 128 регистров общего назначения), каналы многоадресных команд, встроенные трехуровневые кэши, а также множество других средств, обеспечивающих высокую производительность и 64-битовую адресацию. В настоящее время на рынок поставляются процессоры Itanium 2, и хотя их предшественник - процессор Itanium - является теперь уже устаревшим, нам будет удобно ссылаться на все семейство просто как на "процессоры Itanium".

Процессоры Opteron и Athlon 64 (AMD64) компании AMD, предназначенные, соответственно, для серверов и рабочих станций. Архитектуру AMD64 можно рассматривать как расширение архитектуры Intel x86, допускающее 64-битовую виртуальную адресацию и параллельное выполнение 32– и 64-битовых операций.

32/64-разрядные процессоры компании Intel, сравнимые с процессорами AMD64. Во время написания этой книги ожидалось, что технология 64-разрядного расширения будет применена в первую очередь в процессорах Xeon. Как и прогнозировалось, такие процессоры появились на рынке в конце 2004 года.

Поддержка Windows

API Win64 компании Microsoft предназначен для поддержки 64-разрядных архитектур таким способом, при котором в существующие исходные и двоичные коды требуется вносить лишь минимальные изменения. В настоящее время имеется несколько отдельных версий Win64.

Windows XP 64-bit Edition доступна в виде, по крайней мере, двух версий. Бета-версия компании Microsoft поддерживает только процессор AMD Opteron. Компания Hewlett Packard выводит на рынок несколько моделей рабочих станций на базе процессоров Itanium с уже установленной системой Windows XP-Itanium2.

Windows Server 2003 Enterprise Edition for 64-bit Extended Systems в настоящее время также проходит бета-тестирование. Эта версия обеспечивает поддержку процессоров AMD Opteron и Intel Xeon с использованием технологии 64-разрядного расширения.

Windows Server 2003 Enterprise Edition for 64-bit Itanium-based Systems поддерживает, как говорит само ее название, серверы и рабочие станции, использующие один или несколько процессоров Itanium. Существует также версия Datacenter Edition. Например, эта версия устанавливается на системах Integrity компании Hewlett Packard, которые в настоящее время также появляются на рынке.

Поддержка сторонних компаний

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

Обзор 64-разрядной архитектуры

С точки зрения программиста основная трудность при переходе от 32-разрядной модели к 64-разрядной заключается в том, что размер указателей и таких системных типов данных, как size_t и time_t, теперь может составлять 64 бита. Поэтому виртуальное адресное пространство процесса уже не ограничивается 4 Гбайт (фактически доступны приложениям только 3 Гбайт). Таким образом, перенос программ из Win32 в Win64 по существу требует лишь "удлинения" указателей, с чем связаны лишь самые минимальные последствия для пользовательских данных в модели Windows.

Необходимость в 64-битовой адресации

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

Приложения для обработки изображений. Системы, использующие адресные пространства размером 4 Гбайт, в состоянии обеспечить лишь 20-секундное воспроизведение телевизионного изображения высокой четкости (High-Definition Television, HDTV) в реалистичных цветах.

Автоматизированное проектирование механических (Mechanical Computer-Aided Design, MCAD) и электронных (Electronic Computer-Aided Design, ECAD) устройств. Для проектирования сложных сборочных узлов требуется наличие более 3 Гбайт памяти, а проектирование микросхем предъявляет к памяти несоизмеримо более высокие требования.

Базы данных и хранилища данных. Использование файлов с размерами в несколько сотен Гбайт не является чем-то необычным, и возможность доступа к виртуальным адресным пространствам сопоставимых размеров значительно упрощает обработку таких файлов.

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

Потребность в 64-битовой адресации диктуется теми же факторами, которые делают столь желательными и необходимыми файлы гигантских размеров (свыше 4 Гбайт), и теперь, когда имеются достаточно мощные микропроцессоры Itanium, AMD64, а также процессоры, использующие технологию 64-разрядного расширения, вполне естественно ожидать, что Windows должна будет эволюционировать для удовлетворения этих запросов. Использование 64-разрядных ОС существенно в тех случаях, когда Windows отводится заметная роль в прикладных корпоративных и профессиональных системах.

Тем не менее, многие 32-разрядные приложения смогут работать нормально и на новой платформе, и на первом этапе для их переноса не надо будет ничего предпринимать. Для таких персональных приложений, как Microsoft Office или Adobe PageMaker, в течение некоторого времени переход к 64-битовой адресации, по-видимому, не потребуется. Следовательно, Windows будет поддерживать обратную совместимость.

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

Опыт UNIX

PC-системы всегда отставали от универсальных вычислительных систем (мэйнфреймов) и систем на основе UNIX в том, что касается базовых функциональных возможностей и масштабируемости. То же самое остается справедливым и в случае 64-разрядных архитектур.

Основные поставщики UNIX-систем предоставляют 48– и 64-разрядные микропроцессоры с начала 90-х годов прошлого столетия.

Основные поставщики UNIX-систем поддерживают 64-разрядные API на протяжении примерно того же периода времени.

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

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

Опыт перехода от 16-разрядных версий Windows к 32-разрядным

Переход от 16-разрядных версий Windows к 32-разрядным начался в начале 90-х годов прошлого столетия с появлением Windows NT, и набрал ускорение после того, как использование Windows 95 стало обычным делом. Каким бы соблазнительным ни казалось предположение о том, что нас ожидает повторение той же истории, рассматриваемые нами ситуации отличаются в нескольких аспектах.

Windows NT и Windows 95 были первыми из широко используемых "реальных" операционных систем для PC в том смысле, что обе системы поддерживали обмен страницами по запросу, потоки, вытесняющую многозадачность и множество других возможностей, которые были описаны в главе 1.

Хотя API Win32 значительно расширил полезное адресное пространство, что делает и Win64, усовершенствования этим не ограничивались. Неуклюжие и устаревшие, несмотря на свою популярность, модели расширенной памяти были заменены другими. Аналогичная модель расширенной памяти (не описывается в данной книге) была введена и в Windows 2000, однако общие последствия этого шага в данном случае были не столь существенными.

В API Win32 было введено множество новых функциональных возможностей, чего нельзя сказать о Win64.

Надолго ли хватит 64 бит?

Что касается мира PC, в котором возникла Windows, то можно утверждать, что первоначальная 16-разрядная модель Intel x86 (фактическое адресное пространство которой является 20-битовым) просуществовала в течение более десяти лет, и столько же времени уже существует и 32-разрядная архитектура. Однако переход к Win64 и 64-разрядному программированию, вообще говоря, происходит медленнее, чем происходил аналогичный переход к 32 битам. Вместе с тем, в обоих случаях переход миникомпьютеров и серверов на следующий уровень осуществлялся, по крайней мере, за 10 лет до того, как это начинало происходить с PC. Тогда вполне естественно задаться вопросом о том, следует ли ожидать перехода серверов или PC к 128 битам в будущем. Берусь утверждать, что любое расширение такого рода произойдет не раньше, чем через 10 лет, исходя из одной лишь величины 64-разрядного адресного пространства.

Предсказания - вещь ненадежная, однако, воспринимая это серьезно лишь наполовину, можно напомнить о часто цитируемом законе Мура, согласно которому отношение "стоимость/производительность" уменьшается вдвое каждые 18 месяцев. В свою очередь, быстродействие и емкость устройств каждые 18 месяцев примерно удваиваются. Применяя эти рассуждения к адресному пространству, можно ожидать, что дополнительный бит адреса нам будет требоваться через каждые 18 месяцев, откуда следует, что 64-разрядная модель будет исправно служить еще целых 48 лет (то есть почти столько же времени, сколько насчитывает вся история современных компьютеров). Оправданы ли такие неформальные выводы, которые встретились мне в одном из официальных источников, покажет время, однако в прошлом запросы к ресурсам PC возрастали гораздо быстрее, чем утверждается в приведенном прогнозе.

Модель программирования Win64

В зависимости от выбора способа представления таких стандартных типов данных С, как указатели и целочисленные типы данных (long, int и short), a также от того, вводятся или не вводятся нестандартные типы данных, возможны несколько вариантов модели 64-разрядного программирования. Напомним, что в стандарте ANSI С размеры типов данных не определяются строго, хотя и требуется, чтобы размер данных типа long int был не меньше размера данных типа int, а размер данных типа int был не меньше размера данных типа short int.

Цели

Цель состоит в том, чтобы ввести единое определение Windows API (то есть, общее для Win32 и Win64), благодаря чему можно будет использовать единый базовый исходный код. Использование этого единого определения может потребовать внесения некоторые изменений в исходный код, но эти изменения должны быть сведены к минимуму.

Microsoft выбрала модель LLP64 (целые числа типа long и 64-битовые указатели), на которую обычно ссылаются просто как на модель Р64. В частности, существуют следующие определения типов данных, применимые как к данным со знаком, так и к данным без знака:

Char - 8 бит, и wchar - 16 бит.

Short - 16 бит.

Int - 32 бита.

Long int - также 32 бита.

Размер указателя любого типа, например PVOID, составляет 64 бита.

Для тех случаев, когда требуются данные строго определенного размера, предусмотрены дополнительные типы данных. Так, компилятор Microsoft различает следующие типы данных: _int16, _int32 и _int64.

Типы данных

Приведенные в этой главе таблицы взяты непосредственно из оперативной справочной системы и представляют единую модель данных Windows (Windows Uniform Data Model). Определения типов можно найти в заголовочном файле BASETSD.H, входящем в состав интегрированной среды разработки приложений Microsoft Visual Studio .NET (версия 7.0) и версию 6.0 этой системы.

Типы данных фиксированной точности

Обозначения типов данных фиксированной точности получаются из обычных обозначений типов данных Win32, таких как DWORD или LONG, добавлением суффикса размера, как показано в табл. 16.1.


Таблица 16.1. Типы данных фиксированной точности

Тип данных Описание
DWORD32 32-битовое целое без знака
DWORD64 64-битовое целое без знака
INT32 32-битовое целое со знаком
INT64 64-битовое целое со знаком
LONG32 32-битовое целое со знаком
LONG64 64-битовое целое со знаком
UINT32 Целое типа INT32 без знака
UINT64 Целое типа INT64 без знака
ULONG32 Целое типа LONG32 без знака
ULONG64 Целое типа LONG64 без знака

Типы данных, соответствующие точности указателей

Процитируем выдержку из статьи Microsoft под названием "The New Data Types" (доступна на Web-сайте компании Microsoft): "Точность этих типов данных отражает изменение точности указателей (то есть, они становятся 32-битовыми в коде Win32 и 64-битовыми в коде Win64). Поэтому приведение указателей к одному из этих типов при выполнении арифметических операций с указателями является безопасным; при 64-битовой точности указателей размер данных этого типа будет составлять 64 бита. Также и типы данных, соответствующие счетчикам, отражают максимальный размер данных, на которые может ссылаться указатель." Таким образом, эти типы данных обеспечивают автоматическое изменение размеров целочисленных типов данных в зависимости от изменения размеров указателей, в связи с чем их иногда называют полиморфными (polymorphic data types) или платформо-масштабируемыми (platform scaled data types) типами данных. Типы данных, соответствующие точности указателей, перечислены в табл. 16.2, взятой из той же статьи.

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

Наконец, заметьте, что в Win64 размер данных типа HANDLE составляет 64 бита.


Таблица 16.2. Типы данных, соответствующие точности указателей

Тип данных Описание
DWORD_PTR Длинное целое без знака, соответствующее точности указателей.
HALF_PTR Половина размера указателя. Используется в структурах, содержащих указатель и два поля небольшого размера.
INT_PTR Целое со знаком, соответствующее точности указателей.
LONG_PTR Длинное целое со знаком, соответствующее точности указателей.
SIZE_T Максимальное количество байтов, на которые может ссылаться указатель. Используется для счетчиков, которые должны охватывать весь диапазон возможных значений указателей.
SSIZE_T Тип SIZE_T со знаком.
UHALF_PTR Тип HALF_PTR без знака.
UINT_PTR Тип INT_PTR без знака.
ULONG_PTR Тип LONG_PTR без знака.

Пример: использование указательных типов данных

Аргументом потока, передаваемым функции потока при вызове CreateThread и _beginthreadex (см. главу 7), является указатель типа PVOID. Иногда программист может захотеть передать функции потока только целочисленное значение, указывающее, например, номер потока или индекс данных в глобальной таблице. Тогда функцию потока, интерпретирующую параметр как целое без знака, можно было бы написать следующим образом:

DWORD WINAPI MyThreadFunc(PVOID Index_PTR) {
Index = (DWORD_PTR)Index_PTR;

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

for (Ix = 0; Ix < NumThreads; Ix++) {
hTh = _beginthreadex(NULL, 0, MyThreadFunc, (PVOID)Ix, 0, NULL);

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

Предостережение

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

Различия между Windows и UNIX

В Windows и UNIX выбраны различные стратегии. Большинство поставщиков UNIX-систем реализуют модель LP64, в которой размер как длинного целочисленного, так и указательного типов данных составляет 64 бита. Такую модель иногда называют моделью "I32, LP64", чтобы подчеркнуть тот факт, что размер данных типа int по-прежнему составляет 32 бита. Таким образом, различие между обеими системами в рассматриваемом нами смысле сводится к различию в размерах целых чисел типа long. К тому же, типы данных, перечисленные в таблицах 16.1 и 16.2, приняты только в Windows.

Для каждой из двух моделей имеются разумные обоснования, и в белых страницах "Aspen", фигурирующих в списке дополнительной литературы к этой главе, приводятся аргументы, объясняющие выбор, сделанный в UNIX. И все же, было бы гораздо удобнее, если бы в обеих ОС действовали одни и те же соглашения.

Перенос имеющегося программного кода

Единая модель данных Windows призвана минимизировать объем возможных изменений исходного кода, но полностью избежать необходимости внесения изменений невозможно. Например, такие функции, как HeapCreate и HeapAlloc (глава 5), которые имеют дело непосредственно с распределением памяти и размерами блоков памяти, должны использовать либо 32-битовое, либо 64-битовое поле, в зависимости от модели. Точно так же, следует всегда тщательно проверять код, чтобы выяснить, не используются ли в нем скрытые допущения относительно размеров полей и указателей.

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

Изменения, связанные с использованием API

Наиболее заметные изменения, связанные с использованием API, затрагивают функции управления памятью, введенные в главе 5. В новых определениях в полях счетчиков используется тип данных SIZE_T (см. табл. 16.2). Например, теперь прототип функции HeapAlloc будет иметь следующий вид:

LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);

Количество запрошенных байтов, указываемое в третьем поле, выражается данными типа SIZE_T и поэтому является 32– или 64-битовым целым без знака. Ранее данные в этом поле имели тип DWORD (всегда 32 бита).

Данные типа SIZE_T используются в соответствии с необходимостью в главе 5.

Изменения, связанные с устранением неявных допущений относительно предполагаемых размеров элементов данных

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

Тип DWORD больше нельзя использовать при указании размера блоков памяти. Вместо него следует применять типы данных SIZE_T или DWORD64.

Необходимо тщательно проверять размеры полей, используемых взаимодействующими процессами, независимо от того, выполняются ли они на одной и той же или на разных системах. Так, в главе 12 для того, чтобы перенос программы на системы UNIX или Win64 не приводил к возникновению 64-битовых полей, поля размера в сообщениях сокетов определялись с использованием типа данных LONG32. При организации связи между процессами Windows, использующими разные модели, размеры блоков памяти не должны превышать 2 Гбайт.

Для вычисления размера структур или типов данных следует использовать функцию sizeof; эти размеры будут разными для Win32 и Win64, если в структуру данных входят указатели или элементы данных SIZE_T. Литеральные константы размеров должны быть исключены (разумеется, этому совету было бы неплохо следовать при любых обстоятельствах).

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

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

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

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

При выводе на печать указателей вместо спецификатора формата %x используйте спецификатор %p, а при выводе платформо-масштабируемых данных, например типа SIZE_T, - спецификатор %ld.

Функции setjmp и longjmp должны использовать заголовочный файл , а не какие-либо допущения относительно возможного размера переменной jmp_buf, в которой должен храниться указатель.

Пример: перенос программы sortMM (программа 5.5)

В программе sortMM (программа 5.5) интенсивно используются указатели, и в частности, арифметика указателей. Подготовка этой программы к переносу, в результате чего ее можно будет компоновать и выполнять под управлением как Win32, так и Win64, иллюстрирует обычно используемые методики, а также демонстрирует, как легко невольно сделать допущения относительно размера указателя.

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

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

Входящий в состав Microsoft Visual Studio 7.0 (.NET) компилятор C++ компании Microsoft может конфигурироваться для выдачи таких сообщений. Для этого достаточно задать в командной строке компилятора опции –Wp64 и –W3. В Visual Studio для установки этих опций потребуется выполнить следующие действия:

Выберите страницу Project Properties (Свойства проекта).

Откройте папку C++.

Щелкните на кнопке General (Общие).

Выберите вкладку Detect 64-bit Portability Issues (Определять элементы переноса в 64 разряда) и выберите вариант Yes (/Wp64) (Да (/Wp64)). Оставьте для уровня диагностики (warning level) значение 3.

После этого, в процессе сборки проекта в окне вывода будут отображаться соответствующие предупреждающие сообщения. При построении в Microsoft Visual Studio 7.0 проектов, которые находятся на Web-сайте книги, вывод предупреждающих сообщений конфигурировался именно так, как описано выше.

Код до подготовки к переносу

Большая часть программного кода sortMM.с не приводит к выдаче предупреждающих сообщений, но один участок кода на шаге 6 (см. программу 5.5) вызывает их генерацию. Соответствующий фрагмент кода вместе с номерами строк представлен в программе 16.1. Имейте в виду, что в последующих версиях этой программы номера строк могут поменяться.

Программа 16.1. sortMM.с: код до подготовки к переносув Win64, часть 1
55 TCHAR _based (pInFile) *pIn;
132 for (iKey = 0; iKey < FsX / RSize; iKey++) {
133 WriteFile(hStdOut, &ChNewLine, TSIZE, &nWrite, NULL);
135 /* Приведение типа рХ играет весьма важную роль, поскольку это
136 указатель на байт, а нам нужны четыре байта указателя типа _based. */
137 pIn = (TCHAR _based(pInFile)*)*(LPDWORD)pX;
139 while ((*pIn != CR || *(pIn + 1) != LF) && (DWORD)pIn < FsIn) {
140 WriteFile(hStdOut, pIn, TSIZE, &nWrite, NULL);

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

Предупреждающие сообщения компилятора

Предупреждающие сообщения компилятора для этого фрагмента кода отчетливо демонстрируют неявное предположение о том, что размер указателя составляет 4 байта.

SORTMM.C(137) : warning C4312: "type cast" : conversion from "DWORD" to "TCHAR __based(pInFile) *" of greater size
SORTMM.C(139) : warning C4311: "type cast" : pointer truncation from "TCHAR __based(pInFile) *" to "DWORD"

Первое предупреждение (строка 137) является существенным. Разыменование рХ после его приведения (type cast) к типу LPDWORD приводит к 32-битовому значению, которое затем назначается указателю pIn. Почти с полной уверенностью можно утверждать, что разыменование pIn вызовет исключение или приведет к возникновению иной серьезной ошибки. Правильным решением для строки 137 будет замена приведения к типу LPDWORD приведением к типу указателя LPTSTR следующим образом:

pIn = (TCHAR _based(pInFile)*)*(DWORD_PTR)pX;

Сообщение для строки 139 довольно интересно, поскольку мы сравниваем базовый указатель с размером файла. Если предположить, что файл не является гигантским, то на это предупреждение можно не обращать внимания. При этих условиях можно было бы проигнорировать и сообщение для строки 137. Однако мы учтем перспективу и приготовимся к работе с гигантскими файлами, пусть даже типом FsSize пока и является DWORD. Допуская полный диапазон значений указателя, мы должны преобразовать строку 139 следующим образом:

while ((*pIn != CR || *(pIn + 1) != LF) && (SIZE_T)pIn < (SIZE_T)FsIn) {

Второй сегмент, относящийся к шагу 2b, порождает дополнительные предупреждающие сообщения, связанным с усечением типов (pointer truncation). Соответствующий фрагмент кода представлен в программе 16.2.

Программа 16.2. sortMM: код до подготовки к переносу в Win64, часть 2
174 /* Шаг 2b: Получить первый ключ; определить размер и начальный адрес ключа. */
177 /* Вычисляем адрес начала поля ключа. */
178 while (*pInScan !=""&& *pInScan != "\t") pInScan++;
179 /* Вычисленный конец поля ключа. */
181 KSize = ((DWORD)pInScan – KStart) / TSIZE;

Компилятор выводит следующие предупреждающие сообщения:

SORTMM.C(176) : warning C4311: "type cast" : pointer truncation from "TCHAR __based(pInFile) *" to "DWORD"
SORTMM.C(181) : warning C4311: "type cast" : pointer truncation from "TCHAR __based(pInFile) *" to "DWORD"

Исправления сводятся к использованию DWORD_PTR в качестве типа данных в строке 40 и при приведении типов в строках 176 и 181.

Дополнительные сообщения такого же характера появляются на шаге 2с в конце функции CreateIndexFile. На Web-сайте книги находится видоизмененный файл sortMM64.с, который пригоден как для Win32, так и для Win64, и использование которого позволяет избавиться от появления предупреждающих сообщений.

Предупреждающие сообщения и необходимые изменения, касающиеся других программ

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

В то же время, программа atouEX (программа 14.2) потребовала нескольких изменений, вызванных необходимостью использования типа данных DWORD_PTR для целочисленной переменной, хранящейся в поле hEvent структуры OVERLAPPED. Это обусловлено тем, что в Win64 размер данных типа HANDLE составляет 64 бита. Необходимые изменения отмечены в листинге программы, находящемся на Web-сайте.

Некоторые предупреждения могут быть проигнорированы. Например, такие функции, как strlen(), возвращают значения типа size_t. Длина строки будет часто назначаться переменным типа DWORD, вызывая появление предупреждающих сообщений относительно "потери точности" ("loss of precision"). Во всех практических ситуациях на предупреждения такого рода можно не обращать внимания.

Резюме

64-разрядный Windows API обеспечивает возможность выполнения на Windows-платформах, использующих 64-разрядные процессоры следующего поколения, большинства корпоративных, научных и инженерных приложений с высокими запросами к ресурсам. Предприняв всего лишь нескольких мер предосторожности, можно гарантировать выполнение программ как на платформе Win32, так и на платформе Win64.

Дополнительная литература

Наилучшими информационными источниками являются библиотеки MSDN и информация, размещенные на Web-сайте компании Microsoft. Ниже приведены некоторые рекомендованные ссылки, почерпнутые на Web-сайте компании Microsoft и из других источников.

Подготовленная специалистами компании Microsoft статья "New Data Types" доступна по адресу http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win64/win64/the_new_data_types.asp. Таблицы 16.1 и 16.2 взяты именно из этой статьи.

"Introduction to Developing Applications for the 64-bit Version of Windows" - неплохое краткое введение в различные модели программирования. Эта статья доступна по адресу http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetserv/html/ws03-64-bitwindevover.asp. Статья содержит также краткий обзор архитектуры процессоров Itanium, хотя Itanium - не единственные процессоры, на которых может выполняться Win64.

Описание схемы UNIX "Aspen", подводящей прочный фундамент под модель LP64, доступно по адресу http://www.opengroup.org/public/tech/aspen/lp64_wp.htm.

В статье "Migration Tips", доступной по адресу http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win64/win64/migration_tips.asp, вы найдете хорошие советы по переносу программ с 32-разрядных на 64-разрядные платформы, а также ряд полезных ссылок. Произведя поиск в Web, вы сможете найти дополнительную информацию и рекомендации.

Если вас интересуют общие вопросы архитектуры компьютеров, обратитесь к книге , являющейся стандартом в этой области. Информация, касающаяся процессоров Itanium, приводится в .

Обширная информация, касающаяся архитектур, основанных на 64-разрядном расширении, представлена на Web-сайтах компаний Intel и AMD:

http://www.intel.com и http://www.amd.com/us-en

Упражнения

16.1. Предположим, что p1 и р2 - указатели, связанные соотношением p1 > р2, и вы хотите получить расстояние между двумя элементами, вычитая один указатель из другого. При каких условиях будет действительным выражение: (DWORD)p1 – (DWORD)р2? Следует ли заменить это выражение на (DWORD)(p1 – р2), если расстояние между элементами невелико? Подсказка. Примите во внимание свойства обеих комплементарных арифметик.

16.2. Избавьтесь от выдачи компилятором предупреждающих сообщений относительно 64-битовых переменных, если таковые выводятся, в других программах, например, sortBT (программа 5.1) и ThreeStage (программа 10.5), в которых интенсивно используются указатели.

16.3. Если у вас имеется доступ к системе Win64, протестируйте 64-разрядные программы. Убедитесь также, что компоновка программ в 32-разрядном режиме по-прежнему осуществляется корректно.

Ваш компьютер, вероятнее всего, работает на 64-разрядной версии Windows. Но если открыть «Диспетчер задач», то Вы увидите, что большинство программ в Вашей системе все еще 32-разрядные. Действительно ли это проблема?

Есть много различий между 64-разрядными и 32-разрядными версиями Windows. 64-разрядные версии Windows могут выполнять 32-разрядное программное обеспечение, но 32-разрядные версии Windows не могут выполнить 64-разрядное программное обеспечение.

Как узнать разрядность программы?

Давайте воспользуемся диспетчером задач, чтобы увидеть, какие из ваших программ являются 64-разрядными, а какие 32-разрядными. Щелкните правой кнопкой мыши на панели задач и выберите пункт «Диспетчер задач» или нажмите комбинацию клавиш Ctrl + Shift + Esc, чтобы открыть его.

Посмотрите на столбец с названиями процессов. Если Вы будете использовать 64-разрядную версию Windows 8.1 или 8, то Вы увидите слово «(32-bit)» после каждого имени 32-разрядной версии программы. Если Вы будете использовать 64-разрядную версию Windows 7, то Вы увидите вместо этого «*32».

32-разрядные программы обычно устанавливаются в папку C:\Program Files (x86)\ на 64-разрядных версиях Windows, в то время как 64-разрядные программы обычно устанавливаются в папку C:\Program Files\.
Это - просто правило. Но ни кто не говорит, что нет другого правила, в котором запрещается устанавливать 64-разрядные программы в папку C:\Program Files (x86)\. Например, Steam - 32-разрядная программа, таким образом, она устанавливается в «C:\Program Files (x86)\» по умолчанию. Игры, которые Вы устанавливаете в Steam, установлены в папку C:\Program Files (x86)\Steam по умолчанию, в т.ч. даже 64-разрядные версии игр.

Если Вы сравните две различные папки Program Files, то Вы найдете, что большинство Ваших программ, вероятнее всего, установлены в папку C:\Program Files (x86). И, эти программы в большинстве своём являются 32-разрядными.

Работа 32-разрядного программного обеспечения на 64-разрядной операционной системе

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

Windows выполняет 32-разрядные программы через уровень совместимости WoW64 на 64-разрядных версиях Windows. Однако 64 -разрядные процессоры Intel и AMD обратно совместимы и могут напрямую выполнять 32-разрядное программное обеспечение. Все ваши 32-разрядные Windows-программы будут работать так же, как они работали бы на 32-разрядной версии Windows. Таким образом, нет никаких препятствий к выполнению этих программ на 64-разрядной операционной системе.

Даже если каждая программа, которую Вы используете, является все еще 32-разрядной, то Вы извлечете выгоду, потому что Ваша операционная система сама будет работать в 64-разрядном режиме. А, 64-разрядная версия Windows является более безопасной.

64-битные программы и 32-битные программы: что лучше?

32-битные программы запускаются без проблем на 64-битных версиях операционных систем Windows. Но было бы лучше, если бы все ваши программы были бы 64-битными?

Есть определенно преимущества у 64-битных программ. 32-разрядные программы могут использовать только 2 ГБ памяти, в то время как 64-битные программы могут использовать гораздо больше. Если программа, скорее всего, попала под атаку, дополнительные функции безопасности, применяемые к 64-битных программ, могут помочь. Google Chrome в настоящее время является 32-битным приложением даже на 64-битных версиях ОС Windows, но уже появилась 64-битная бета версия этой программы. И Google обещает, что 64-битная версия Chrome будет быстрее, более безопасной и более стабильной.

Некоторые программы предлагают 64-разрядные версии. Например: Photoshop, Itunes, Microsoft Office, и некоторые из самых популярных программ для Windows, и все они доступны в 64-битном виде. Последние игры тоже часто являются 64-разрядными, чтобы они могли использовать более 2 ГБ памяти.

Многие программы не сделали переход на 64-бита, и большинство никогда его не сделают. Вы все еще можете запускать сегодня большинство 32-битных программ Windows, даже те которые были выпущены десять лет назад, на 64-битной версии Windows, даже если их разработчики уже обновляют.

Разработчик, который хочет обеспечить 64-разрядную версию своей программы, должен выполнять много дополнительной работы. Он должен убедиться, что существующий код компилируется и правильно работает как 64-битное программное обеспечение. Он должен обеспечить и поддерживать две отдельные версии программы, так как пользователи под управлением 32-разрядной версии ОС Windows, не могут использовать 64-разрядную версию.

Давайте возьмем, в качестве примера программу Evernote для настольной версии Windows. Даже если они выпустили бы 64-разрядную версию Evernote, пользователи, вероятнее всего, не заметили бы разницы вообще. 32-разрядная программа может прекрасно работать и на 64-разрядной версии Windows, и если нет заметных преимуществ, то нет и смысла в 64-битной версии.

Где найти 64-разрядные приложения

Вы, как правило, не будете способны выбирать между 32-битной и 64-битной версий программного обеспечения. Например, при установке Itunes для Windows, веб-сайт компании Apple автоматически направляет вас к 32-разрядной или 64-разрядной версии установщика в зависимости от версии Windows. При установке Photoshop для Windows, как правило устанавливаются и 32-разрядные, и 64-разрядные исполняемые файлы. Photoshop автоматически выбирает из них. Иногда вы можете увидеть отдельные ссылки для загрузки 32-битных и 64-битных версий программ, но это не так распространено.

Важно не заниматься поиском 64-битных приложений, а найти приложения, которые работают хорошо для вас. Для большинства приложений, на самом деле не имеет значения 64-битная версия или 32-битная.

Легко задаться вопросом, почему так много приложений все еще 32-битные, когда вы открываете ваш менеджер задач. Но это не очень большая проблема и вот почему. Потому, что большинство приложений ни чего не выигрывают при переходе на 64-битные редакции версии программ. Даже если разработчики сделали всю работу и выпустили 64-битные версии всех маленьких настольных приложений и утилит, которые вы используете в Windows, то вы не смогли бы заметить разницу для большинства из них.

Еще пару лет назад на большинстве домашних компьютеров работала 32-битная версия Windows, а 64-битный вариант использовали исключительно профессионалы (например, для ресурсоемких программ видеомонтажа). При этом процессоры с 64-разрядной архитектурой выпускаются уже с 2003 года, а двумя годами позже на рынок вышла Windows XP в 64-битном варианте.Однако на большинстве новых компьютеров 64-битные версии Windows начали устанавливать только после появления Windows 7. Какие же преимущества дает 64-битная архитектура? Действительно ли она работает быстрее? С какими проблемами столкнутся пользователи? Об этом читайте далее.

Преимущества 64-разрядной системы

Разрядность может быть 32 или 64 бита, но на экране обе версии Windows 7 выглядят одинаково. Возможности систем также идентичны: в комплекте те же дополнительные программы, например Windows Media Player или Paint. Однако «под капотом» все же есть существенные различия.

  • Увеличенная рабочая скорость. С 64-битной версией Windows компьютер может обрабатывать за единицу времени в два раза больше данных, чем с 32-битной. При этом он использует расширенные возможности 64-разрядных процессоров, которые за один такт способны обрабатывать 64 бита данных (8 байт). Поэтому программы, оптимизированные для 64-битных ОС, умеют работать быстрее, чем их аналоги для процессоров, обрабатывающих всего 32 бита (4 байта) за один такт.
  • Больше оперативной памяти. 32-битные версии Windows могут использовать максимум 4 Гб памяти, причем не вся она доступна программам. Например, 1 Гб занимает сама операционная система, к тому же до 1 Гб (в зависимости от ПК) резервируется для видеопамяти. Так что для самих программ остается не более 2 Гб. Если они «прожорливы», памяти может не хватить.

Для 64-битных версий Windows подобного ограничения нет. Максимальная рабочая память в Windows 7 Home Premium выросла до 16 Гб; версии Professional, Ultimate и Enterprise могут работать даже со 192 Гб. Благодаря большей доступной памяти Windows реже приходится выгружать разделы программ на сравнительно медленный жесткий диск (в файл подкачки ), поэтому и компьютер работает быстрее.

Требования к компьютеру

  • Процессор. Важнейшим необходимым условием для работы 64-битной операционной системы является процессор с 64-битной архитектурой. Изготовитель процессоров AMD называет эту технологию AMD64, а его конкурент Intel - EM64T.
  • Процессоры с 64-битной архитектурой уже стали скорее правилом, чем исключением. Примерно с 2006 года большинство новых компьютеров и ноутбуков оснащается именно ими, хотя многие все еще работают под 32-битной Windows. Узнать, какой именно процессор установлен на вашем ПК, можно с помощью программы CPU-Z (см. рис. внизу).
  • Оперативная память. 64-битная Windows имеет смысл лишь в том случае, если у компьютера не меньше 4 Гб оперативной памяти.
  • В остальном 64-битные версии ОС не предъявляют особых требований к аппаратной части (например, к HDD или видеокарте) по сравнению с 32-битными.

Если в 64-битной Windows работают 32-битные программы, то в Диспетчере задач они помечаются соответствующим образом (*32). -Диспетчер задач можно запустить, нажав комбинацию клавиш Ctrl+Shift+Esc<

Как узнать версию операционной системы?

Это очень просто: щелкните по кнопке "Пуск", затем правой кнопкой мыши - по "Компьютер" и затем выберите "Свойства" . В открывшемся окне напротив "Тип системы" увидите версию системы.

Недостатки 64-разрядной системы

  • Нужны новые драйверы . Все устройства требуют для 64-битной Windows 7 соответствующих драйверов (аналоги для 32-битной ОС работать не будут). Для современных устройств это обычно не проблема, но для устаревших моделей многие производители не разрабатывают 64-битные версии драйверов. Поэтому прежде чем переходить на 64-битную Windows, зайдите на веб-страницу производителя устройства и убедитесь, что для вашего оборудования доступна 64-битная версия драйвера.
  • Требуется больше памяти. Многие структуры данных в 64-битных программах имеют размер 8 байт (64 бит). Поэтому программы занимают на 10-20% больше места на жестких дисках, чем соответствующие 32-битные версии с 4-байтными структурами. Потребность в оперативной памяти для 64-битного ПО также повышается - примерно на 15 про-центов.

Работает ли Windows 7 на нетбуках?

Первые процессоры для нетбуков, например Intel Atom N270, не были 64-битными. Только с появлением семейства Pineview (N450 и выше) процессоры Atom стали поддерживать 64-разрядные операции и, соответственно, 64-битные ОС. Впрочем, большинство нетбуков оснащалось всего 1 Гб оперативной памяти, поэтому даже при апгрейде до 2 Гб они едва-едва соответствовали минимальным требованиям 64-битной Windows 7. То есть обычные нетбуки не выполняют одно из главных условий эффективного использования 64-разрядной ОС, каковым является наличие не менее 4 Гб оперативной памяти.

Лучшая пятерка программ для 64-битной ОС

Эти программы прекрасно работают в 64-битной операционной системе и пользуются повышенным спросом у пользователей.

  • 7-ZIP Программа-архиватор, предназначенная для сжатия файлов. Может быть полезна, например, когда требуется скопировать много больших файлов на USB-драйв.
  • Nitro PDF Reader Настоящий «швейцарский нож» для работы с PDF-файлами. Эта простая программа позволяет легко создавать, просматривать и редактировать документы данного формата.
  • nHancer Утилита обеспечивает доступ к настройкам графической платы NVIDIA. Работает со всеми распространенными моделями видеокарт и даже с SLI-конфигурациями. Можно выбирать профили настроек для разных игр.
  • ProgDVB Если в вашем ПК установлен цифровой ТВ-тюнер, с помощью ProgDVB удастся просматривать телевизионные передачи и записывать их на жесткий диск. Программа работает с TВ-тюнерами разных производителей. Кроме бесплатного варианта, есть расширенная платная версия.
  • Blender Программа для работы с трехмерными объектами. В ее состав входят средства для моделирования, анимации, рендеринга, постобработки видео, а также создания интерактивных игр.

Работают ли 32-битные программы под 64-битной Windows?

Подсистема преобразования под названием Windows-on-Windows 64-bit (WoW64) обеспечивает совместную работу 32-битного ПО в 64-битной операционной системе (см. рис. вверху). С ее помощью большинство 32-битных программ работает безупречно но, к сожалению, есть исключения. Трудности обычно возникают с программами следующих категорий.

  • Резервное копирование. Программы для создания бэкапов напрямую работают с системными папками Windows. Но WoW64 иногда перенаправляет доступ 32-битного ПО в другие папки. Если программа этого не учитывает, резервное копирование может оказаться неполным или даже ошибочным.
  • Оптимизация Windows. Старые, рассчитанные на 32-битную Windows программы оптимизации нельзя запускать на 64-битной Windows 7. Подчас они способны больше навредить, чем помочь.
  • Антивирусы. Если требуется надежная защита для ПК, используйте в 64-битной Windows только 64-битные версии антивирусов и аналогичных программ. Устаревшее 32-битное защитное ПО неспособно контролировать все системные папки, а значит, может пропустить вредителей, разработанных специально для атак на 64-битную Windows. Современные антивирусные пакеты известных производителей, например «Лаборатории Касперского», Norton или Symantec, подходят как для 32-, так и для 64-битной Windows.

Совет. Если программа под 64-битную Windows работает со сбоями, избавиться от них нередко помогает установка новейшей версии и всех обновлений с веб-сайта изготовителя. К тому же в «Центре совместимости Windows 7» можно проверить, совместимы ли ваши устройства и программы с 64-битной системой.

В 64-битной Windows программы работают быстрее

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

64-битные программы реализуют свои преимущества, лишь если с самого начала разрабатывались и оптимизировались для применения в 64-битных Windows. В тесте ComputerBild такие программы в среднем работали на 13% быстрее 32-битных «собратьев».

Старое 32-битное ПО в 64-битной Windows работает даже медленнее, чем в 32-битной системе; причина - преобразование подсистемой WoW64.

Список 64-битных программ

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

Программа Версия Категория Интернет-адрес Цена
7-Zip 9.20 Архиватор www.7-zip.org.ua/ru бесплатно
AVG Anti-Virus Free 2011 Антивирусная программа www.freeavg.com бесплатно
Blender 2.59 Редактирование 3D-моделей www.blender.org бесплатно
CCleaner 3.10 Очистка системы www.piriform.com бесплатно
Defraggler 2.06 Дефрагментатор www.piriform.com бесплатно
GIMP 2.7.3 Обработка изображений www.gimp.org бесплатно
Image Composite Editor 1.4.4 Создание панорам www.microsoft.ru бесплатно
Internet Explorer 9 Интернет-браузер www.microsoft.ru бесплатно
iTunes 10.4 Воспроизведение музыки и видео www.apple.com/ru/itunes бесплатно
Mathematics 4.0 Математическая программа www.microsoft.ru бесплатно
MediaCoder 2011 R8 Конвертирование видео www.mediacoderhq.com бесплатно
Mixxx 1.9.0 DJ-программа www.mixxx.org бесплатно
nHancer 2.5.9 Оптимизация графических плат www.nhancer.com бесплатно
Nitro PDF Reader 2.0 Редактирование PDF-файлов www.nitroreader.com бесплатно
Office 2010 Офисный пакет www.microsoft.ru от 3 тыс. руб.
Paint.NET 3.5.8 Обработка изображений www.getpaint.net бесплатно
Partition Manager 11 Управление разделами жестких дисков www.paragon.ru 590 руб.
PDF Xchange Viewer 2.5.197 Просмотр PDF www.tracker-software.com бесплатно
ProgDVB 6.70.6 Просмотр и запись ТВ-передач www.progdvb.com бесплатно
SafeErase 5.0 Надежное удаление данных www.oo-software.com 1200 руб.
Sandboxie 3.58 Защищенное окружение www.sandboxie.com бесплатно
Total Commander 7.56а Файловый менеджер www.wincmd.ru от 1750 руб.
SyncToy 2.1 Синхронизация www.microsoft.ru бесплатно
Thunderbird 6.0.1 Почтовая программа www.mozilla.org/ru/thunderbird бесплатно
Vegas Pro 10 Программа видеомонтажа www.sonycreativesoftware.com 28 тыс. руб.
Virtual Dub 1.9.11 Конвертирование видео www.virtualdub.org бесплатно
Virtual PC 6.1 Программа виртуализации www.microsoft.ru бесплатно
WinRAR 4.01 Архиватор www.rarlab.com 850 руб.


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

WoW64 (Windows-on-Windows 64-bit) - подсистема операционной системы Windows, позволяющая запускать 32-битные приложения на всех 64-битных версиях Windows.

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

  • программы, скомпилированные для 16-разрядных операционных систем;
  • программы режима ядра, скомпилированные для 32-разрядных операционных систем.

Накладные расходы

Существуют различия WoW64 в зависимости от архитектуры процессора. Например, 64-битная версия Windows разработанная для процессора Intel Itanium 2 использует WoW64 для эмуляции инструкций. Такая эмуляция весьма ресурсоемка по сравнению с WoW64 для архитектуры , так как происходит переключение с 64-битного режима в режим совместимости при выполнении 32-битных программ.

WoW64 на архитектуре Intel 64 (AMD64 / x64) не требует эмуляции инструкций. Здесь подсистема WoW64 эмулирует только 32-битное окружение за счет дополнительной прослойки между 32-битным приложением и 64-битным Windows API. Где-то эта прослойка тонкая, где-то не очень. Для средней программы потери в производительности из-за наличия такой прослойки составят около 2%. Для некоторых программ это значение может быть больше. Два процента - это немного, но следует учитывать, что 32-битные приложения работают немного медленнее под управлением 64-битной операционной системы Windows, чем в 32-битной среде.

Компиляция 64-битного кода не только исключает необходимость в WoW64, но и дает дополнительный прирост производительности. Это связано с архитектурными изменениями в микропроцессоре, такими, как увеличение количества регистров общего назначения. Для средней программы можно ожидать в пределах 5-15% прироста производительности от простой перекомпиляции.

Преимущество 64-битной среды для 32-битных программ

Из-за наличия прослойки WoW64 32-битные программы работают менее эффективно в 64-битной среде, чем в 32-битной. Но все-таки простые 32-битные приложения могут получить одно преимущество от их запуска в 64-битной среде. Вы, наверное, знаете, что программа, собранная с ключом /LARGEADDRESSAWARE:YES, может выделять до 3-х гигабайт памяти, если 32-битная операционная система Windows запущена с ключом /3gb. Так вот, эта же 32-битная программа, запущенная на 64-битной системе, может выделить почти 4 GB памяти (на практике около 3.5 GB).

Перенаправления

Подсистема WoW64 изолирует 32-разрядные программы от 64-разрядных путем перенаправления обращений к файлам и реестру. Это предотвращает случайный доступ 32-битных программ к данным 64-битных приложений. Например, 32-битное приложение, которое запускает файл DLL из каталога %systemroot%\System32, может случайно обратиться к 64-разрядному файлу DLL, который несовместим с 32-битной программой. Во избежание этого подсистема WoW64 перенаправляет доступ из папки %systemroot%\System32 в папку %systemroot%\SysWOW64. Это перенаправление позволяет предотвратить ошибки совместимости, поскольку при этом требуется файл DLL, созданный специально для работы с 32-разрядными приложениями.

Подробнее с механизмами перенаправления файловой системы и реестра можно познакомиться в разделе MSDN "Running 32-bit Applications ".

Почему невозможно использовать в 64-битной программе 32-битные DLL? Можно ли это обойти?

Загрузить 32-битную DLL из 64-битного процесса и выполнить код из неё невозможно. Невозможно в силу дизайна 64-битных систем. В принципе, невозможно. Не помогут ни хитрости, ни недокументированные пути. Для этого нужно загрузить и проинициализировать WoW64, не говоря уже о структурах в ядре. Фактически нужно будет на лету превратить 64-битный процесс в 32-х битный. Подробнее эта тема рассмотрена в посте "Недокументированные функции; Загрузка 32-х битных DLL в 64-х битный процесс ". Единственное, что можно порекомендовать, - это создание суррогатного процесса и взаимодействия с ним посредством технологии COM. Об этом рассказывается в статье "Accessing 32-bit DLLs from 64-bit code ".

А вот загрузить ресурсы из 32-битной DLL в 64-битный процесс совсем несложно. Это можно сделать, если при вызове LoadLibraryEx указать флаг LOAD_LIBRARY_AS_DATAFILE.

Постепенный отказ от поддержки 32-битных программ

Вполне естественно, если компания Microsoft будет стимулировать переход на 64-битные системы, постепенно отказываясь от поддержки 32-битных программ в ряде версий операционной системы Windows. Конечно, это будет очень медленный процесс. Но все-таки первые шаги в этом направлении уже сделаны.

Многие администраторы знают про относительно новый режим установки и работы серверной версии операционной системы под названием Server Core. Это тот режим, о котором участники войн "Windows vs Linux" говорили очень давно. Одним из аргументов сторонников использования Linux на сервере была возможность установить серверную ОС без графического интерфейса (GUI). Но вот и в Windows Server появилась такая возможность. Установка в этом режиме позволяет получить только командную строку без пользовательского интерфейса.

Эта возможность (установка Server Core) появилась в Windows Server 2008. Но в Windows Server 2008 R2 появилось нововведение, приближающее 64-битное будущее. При установке Windows Server 2008 R2 (Server Core) поддержка запуска 32-битных приложений стала опциональной . Причем по умолчанию эта поддержка выключена. И при попытке запуска 32-битного приложения в режиме Server Core пользователь получит сообщение о невозможности запуска. Конечно, можно добавить поддержку 32-битных программ:

start /w ocsetup ServerCore-WOW64

В обычном (Full Installation) режиме 32-битные приложения по умолчанию запускаются, а вот в Server Core уже нет.

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

Дополнительная информация

Интересным источником информации по системе WoW64 является блог Алексея Пахунова: http://blog.not-a-kernel-guy.com/ . Алексей является сотрудником компании Microsoft и принимает непосредственное участие в разработке подсистемы WoW64.

У меня есть компьютер с Windows 10 (домашняя версия), в котором есть 4 ГБ RAM и i5-процессор. Мне нужно запустить старую 32-битную учетную программу. Поставщик сказал, что он не выпустит 64-битную версию (хотя существует 64-битная версия, ей не хватает ключевых функций из старой версии).

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

Какие у меня варианты?

Я провел довольно немного исследований, но, похоже, он напуганы.

1) WoW64

По-видимому, это должно позволить вам запускать 32 бита на 64-битной Windows. Однако я не знаю, как его установить. Я думаю, что это только для веб-серверов. Однако этот поток стека переполнения говорит, что он может работать на Windows 7, но не объясняет, как его настроить (или если он будет работать в Windows 10).

2) Режим XP

32-битный эмулятор Windows XP. Однако, похоже, для Windows 7. Также в соответствии с этим потоком переполнения стека вам требуется Windows Professional.

3) Виртуальная машина

Давайте подражать Windows. Кажется, слишком много для моих целей. Кроме того, мне нужно будет купить 32-битную лицензию Windows. Я думаю, что это будет медленно работать с 4 ГБ Рама.

4) Диспетчер разделов на 32-битные и 64-разрядные версии. По-видимому, вы можете использовать бесплатный инструмент EaseUS, чтобы разделить диск на два, а затем установить отдельные 32-битные и 64-разрядные версии.

Опять же, кажется излишним, и похоже, мне нужно купить 32-битную лицензию Windows 10.

Это мои единственные варианты?

Изображений

Первый запуск (из сообщения об ошибке я предполагаю, что это 16-разрядная программа)

Нажав на программу

3 Solutions collect form web for “Запуск 32-разрядных приложений в Windows 10 64 бит”

Проще говоря, если вы хотите использовать более старую 16-разрядную программу, вы должны запустить 32-разрядную версию Windows. 64-разрядные версии операционной системы просто не поддерживают его, поскольку им не хватает уровня совместимости (однако они совместимы с более широко используемым 32-разрядным программным обеспечением). Существуют и другие ограничения 64-разрядной Windows , но ключевым моментом здесь является то, что 16-разрядные программы не будут выполняться.

Редактировать: после повторного рассмотрения этого вопроса спустя некоторое время я хотел бы обратиться к вашим выводам в OP.

  1. WoW64 позволяет запускать 32-разрядные программы в 64-битной среде Windows. Он встроен в операционную систему Windows и не требует дополнительной установки. Аналогично, 32-разрядные установки Windows могут запускать 16-разрядные программы.
  2. Режим XP был особенностью Windows 7 Professional, Enterprise и Ultimate, что позволило вам запустить более популярную в то время Windows XP на виртуальной машине.
  3. Virtual Box или любое программное обеспечение виртуальной машины (другой пример – VMWare) позволяет вам установить операционную систему внутри и запустить ее внутри вашей основной машины. Это было бы самым легким способом достижения вашей цели, поскольку вы могли бы просто установить программное обеспечение на 32-разрядную виртуальную ОС. Если вы предоставили VM 2GB доступ к памяти, то при 32-разрядной установке он будет работать нормально. Вялый, но все в порядке.
  4. Разделение вашего диска позволит вам установить двойную загрузку Windows. Это более постоянное решение, и не следует делать IMO, если вы не можете запустить виртуальную машину.

Это не 32-разрядный, это 16-разрядный

Это потребует, чтобы вы могли запускать 16-битное пространство WoW-памяти.

WoW16 – это Windows для Windows.

WoW запущен в Windows 3.0, часто называемый Windows для рабочих групп.

Поскольку это 16-битное пространство памяти больше не доступно, вы можете установить DOSBox в систему, установить Windows 3.1 в DOSBox и запустить приложение оттуда.

Другой вариант – установить 32-битную версию Windows 10 в качестве виртуальной машины и запустить ее оттуда.

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter
ПОДЕЛИТЬСЯ:
Юридический портал. Льготный консультант