Целесообразно ли переключиться с Cygwin 32bit на Cygwin 64bit?

Я использовал Cygwin (в течение длительного времени). В частности, я использую его (включая gcc/g++) для Win7 для разработки. Недавно я заметил, что существует 64-разрядная версия.

У меня нет конкретной необходимости, которая требует перехода на 64-битный, но мне было интересно, делать это в любом случае. Целесообразно? Каковы плюсы и минусы? Известны ли проблемы переустройства при переходе?

Ответ 1

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

Самое большое преимущество использования 64-разрядного Cygwin - доступ к большему количеству памяти. Есть два разных способа, которыми обладает преимущество:

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

    Если вы используете версию Cygwin R с большими наборами данных, например, вы должны переключиться на 64-разрядный Cygwin ASAP, потому что R хочет загрузить весь набор данных в ОЗУ, поэтому использование 32-разрядного Cygwin на 64-битной машине искусственно ограничивает то, что R может выполнить под Cygwin.

  • То, как Cygwin имеет дело с DLL перед вызовами fork(), требует, чтобы они были загружены по фиксированному адресу памяти.

    (Это механизм rebase, обычно запускается автоматически в конце каждого запуска Cygwin setup.exe.)

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

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

Вы можете одновременно установить и запустить обе версии Cygwin. Вы можете даже иметь окно MinTTY для каждого из них одновременно. Тем не менее, лучше всего рассматривать их как отдельные миры, так как два Cygwins принципиально несовместимы. У вас возникнут проблемы, если вы попытаетесь заставить их взаимодействовать.

Эта фундаментальная несовместимость может укусить вас несколькими способами:

  • Несмотря на то, что 64-разрядная программа Cygwin может запускать 32-разрядную программу Cygwin, и наоборот, на этой границе не будет работать несколько механизмов межпроцессного взаимодействия: разделяемая память POSIX, передача файлов, getppid(2)...

  • Даже некоторые вещи, о которых вы не думаете, как кросс-процесс, не удастся, если вы попытаетесь сделать два разных Cygwins взаимодействующими. Большая часть содержимого Cygwin /proc поступает из DLL, например, поэтому он будет отличаться между двумя Cygwins, хотя они работают одновременно на одной машине.

  • Предположим, вы хотели поделиться /usr/local между Cygwins, поэтому вам не нужно иметь две копии всего программного обеспечения, которое вы создали из источника.

    После прочтения первого пункта выше вы понимаете, что не можете делиться /usr/local/bin или /usr/local/lib.

    Подумав об этом, вы решили, что хотите просто поделиться /usr/local/src, чтобы у вас, по крайней мере, не было дубликатов исходных деревьев. У вас все еще будут проблемы, если вы создадите какую-либо из этих программ в исходном дереве, как это обычно бывает. (т.е. ./configure && make && make install)

    Это происходит по двум причинам:

    • Сгенерированные двоичные файлы (*.o, *.so, *.a, *.exe...) будут несовместимы между двумя Cygwins, поэтому, если вы не используете make clean при переключении между Cygwins, они оставаясь позади, вызывая путаницу.

    • Даже если вы запомните make clean, вывод ./configure под каждым Cygwin, вероятно, будет другим, поэтому попытка создать программу под 64-разрядным Cygwin, которая была настроена под 32-разрядным Cygwin (или наоборот) может потерпеть неудачу.

    В этой ловушке есть несколько путей:

    • Откажитесь от совместного использования /usr/local/src.

    • Помните make clean && ./configure при каждом переключении Cygwins.

    • Постройте построить вне дерева отдельно для каждого варианта Cygwin.

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

Если у вас нет веских причин для решения таких проблем, установите одну или другую версию, а не обе версии.

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

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

Ответ 2

Коринна Виншен, ведущий разработчик Cygwin, сказала следующее, как часть Cygwin 1.7.25 примечания к выпуску:

О ВЫХОДЕ 64 BIT

Это только четвертый официальный релиз Cygwin, который публично доступный как 64-разрядная версия для систем AMD64 Windows, поэтому он все еще довольно новый.

В настоящее время дистрибутив Cygwin на 64 бит не поставляется с таким количеством пакетов как 32-битная версия, но она стабильна, как 32-битная версия версия и другие пакеты будут доступны со временем.

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

Ответ 3

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

Ответ 4

Есть несколько больших преимуществ с Cygwin x64. Один из них - лучшее управление памятью. Я экспериментировал много address already in use или fork: retry: Resource temporarily unavailable, что заставило меня запускать rebaseall несколько раз в день.

С Cygwin x64 у меня никогда не было таких проблем.

Ответ 5

Установите оба. Это не занимает много времени или места на диске, а некоторые пакеты недоступны для cygwin64. (Поместите их в разные каталоги!)

Я не знаю, может ли sqlite3 в cygwin64 индексировать базы данных размером около 4G, но я знаю, что sqlite3 в cygwin32 не может, и sqlite3 в 64-разрядной Linux может.

cygwin64 все еще не имеет pdftk (инструментарий PDF).

Ответ 6

Недостаточно репутации, чтобы прокомментировать выбранный ответ, так вот:

Как насчет установки Cygwin64 в c:\cygwin (через setup-x86_64.exe), выполните дополнительную установку Cygwin32 в c:\cygwin32 (через setup-x86.exe), затем добавьте /cygdrive/c/cygwin32/<for_each_of_the_bin_dirs> в конец $PATH?

Это должно запускать 64-разрядные приложения по умолчанию, но разрешать вызывать 32-разрядные приложения, если 64-разрядная версия отсутствует.

Было бы полезно, если бы setup-x86_64.exe смог представить унифицированный список всех приложений Cygwin, поддерживающий версию, и установить 32-разрядную установку только тогда, когда это необходимо (с всплывающим меню, предлагающим делать 64-битный порт).