web-dev-qa-db-ja.com

Cygwin 32ビットからCygwin 64ビットに切り替えることをお勧めしますか?

Cygwin (長い間)を使用しています。具体的には、Win7で開発作業に使用します(gcc/g ++を含む)。 64ビットバージョン が存在することに最近気付きました。

64ビットへの移行を必要とする特定のニーズはありませんが、とにかくそれを行うかどうか疑問に思っていました。お勧めですか?長所と短所は何ですか?移行の際に、アーク放電の問題が知られていますか?

58
einpoklum

昔々、64ビットCygwinには32ビットCygwinに存在する多くのパッケージがありませんでしたが、今日 そのようなパッケージのリスト は非常に短いです。これが64ビットWindowsシステムに新しい32ビットCygwinインストールを作成する最後の重要な理由であったため、今日それを行う正当な理由があるとは考えられません。

64ビットCygwinを使用する最大の利点は、より多くのメモリにアクセスできることです。利点が示す2つの非常に異なる方法があります。

  1. 多くのCygwinプログラムは、できるだけ多くのRAMを使用します。

    たとえば、大きなデータセットでCygwinバージョンの [〜#〜] r [〜#〜] を使用している場合は、Rがロードするため、できるだけ早く64ビットCygwinに切り替える必要があります。データセット全体をRAMに格納するため、64ビットマシンで32ビットCygwinを使用すると、RがCygwinで実行できることを人為的に制限します。

  2. Cygwinがfork()呼び出しに直面してDLLを処理する方法では、DLLを固定メモリアドレスにロードする必要があります。

    (これは rebaseメカニズム です。通常、Cygwinの_setup.exe_の各実行の最後に自動的に実行されます。)

    この結果の1つは、32ビットCygwinで非常に多くのパッケージをインストールして、rebaseがすべての一意の読み込みアドレスを与えようとしてアドレス空間を使い果たしたということです。 64ビットアドレス空間の指数関数的に大きいサイズは、すべての実用的な目的のために、この可能性を今除去します。

場合によっては、64ビットのCygwinも少し高速になります。

Cygwinの両方のバージョンを同時にインストールして実行できます。 MinTTYウィンドウを同時に開くこともできます。それにもかかわらず、2つのCygwinは 基本的に互換性がない であるため、それらを別々の世界として扱うのが最善です。それらを相互運用させようとすると、問題が発生します。

この根本的な非互換性は、いくつかの方法で噛みつきます。

  1. 64ビットのCygwinプログラムは32ビットのCygwinプログラムを起動できますが、その境界を越えていくつかのクロスプロセスメカニズムが機能しません:POSIX共有メモリ、ファイルハンドルの受け渡し、getppid(2)。 。

  2. 2つの異なるCygwinを相互運用しようとすると、クロスプロセスであるとは思わないことでも失敗します。たとえば、Cygwinの_/proc_の内容の多くはDLL内から取得されるため、同じマシン上で同時に実行されていても、2つのCygwinの間で異なります。

  3. Cygwinsの間で_/usr/local_を共有したいので、ソースからビルドしたすべてのソフトウェアの2つのコピーを用意する必要はありません。

    上記の最初の項目を読んだ後、_/usr/local/bin_または_/usr/local/lib_を共有できないことに気付きます。

    それについて考えた後、あなたは_/usr/local/src_を共有したいだけだと決めたので、少なくともソースツリーを複製する必要はありません。通常のように、ソースツリーでこれらのプログラムのいずれかをビルドすると、引き続き問題が発生します。 (つまり_./configure && make && make install_)

    これは、次の2つの理由で発生します。

    • 生成されたバイナリ(_*.o_、_*.so_、_*.a_、_*.exe_...)は2つのCygwinの間で互換性がないため、Cygwinを切り替えるときに_make clean_ 、それらは取り残され、混乱を引き起こします。

    • _make clean_を覚えていても、各Cygwinでの_./configure_の出力はおそらく異なるため、32ビットCygwinで構成された64ビットCygwinでプログラムをビルドしようとします(またはその逆) )失敗する可能性があります。

    このトラップから抜け出す方法はいくつかあります。

    • _/usr/local/src_の共有もあきらめます。

    • Cygwinsを切り替えるときは、必ず_make clean && ./configure_を忘れないでください。

    • ビルド ツリーからビルド Cygwinバリアントごとに個別に。

      これは前のオプションよりもクリーンで高速で信頼性が高いですが、すべてのソースツリーがこれを許可するように設定されているわけではありません。

このような問題に耐える十分な理由がない場合は、両方ではなく、どちらかのバージョンをインストールしてください。

機能する32ビットCygwinセットアップがあり、64ビットCygwinの利点を必要としない場合、それを64ビットインストールに置き換える必要があると感じる必要はありません。 32ビットのCygwinはすぐになくなりません。

同時に、新しい64ビットWindowsボックスをセットアップする場合、必要なパッケージが移植されていないことが事前にわかっていない限り、64ビットCygwinをインストールします。自分でポートをやる気があります。安定しており、ほぼ完全です。

89
Warren Young

Cygwin の共同リード開発者であるCorinna Vinschenは、 Cygwin 1.7.25リリースノート の一部として次のように述べています。

64ビットリリースについて

これは、AMD64 Windowsシステム用の64ビットバージョンとして公開されているCygwinの4番目の公式リリースであるため、まだかなり新しいものです。

現在、64ビットCygwinディストリビューションには32ビットバージョンほど多くのパッケージが付属していませんが、32ビットバージョンと同じくらい安定しており、今後さらに多くのパッケージが利用可能になります。

64ビットWindowsマシンで32ビットバージョンのCygwinを既に実行している場合は、引き続き実行できます。 64ビットWindowsマシンでCygwinの新規インストールを計画している場合、64ビットリリースでまだ利用できない特定のパッケージが必要でない限り、新しい64ビットCygwinバージョンの使用を検討してください。

6
einpoklum

64ビットへの「アップグレード」に関する他の問題は、32ビットのインストールにあったパッケージの同じリストを自動的に再インストールする方法がないため、苦労してリストを作成する必要があることです。再インストールする前の場所に戻るために、新しいインストールでそれらをすべて念入りにチェックします。

4
Pablo Halpern

Cygwin x64にはいくつかの大きな利点があります。それらの1つは、メモリ管理の向上です。私はたくさんのaddress already in use、またはfork: retry: Resource temporarily unavailable 1日に何度かrebaseallを実行せざるを得なかった。

Cygwin x64では、このような問題は一度もありませんでした。

2
nowox

両方をインストールします。多くの時間やディスクスペースは必要ありません。また、cygwin64で利用できないパッケージもあります。 (異なるディレクトリに入れてください!)

Cygwin64のsqlite3が約4Gを超えるサイズのデータ​​ベースのインデックスを作成できるかどうかはわかりませんが、cygwin32のsqlite3ができないこと、64ビットLinuxのsqlite3ができることを知っています。

cygwin64にはまだpdftkがありません(PDFツールキット)。

1
Phil Goetz

選択した回答にコメントするには評判が足りないため、次のようにします。

Cygwin64をc:\cygwinsetup-x86_64.exe経由)にインストールし、c:\cygwin32にセカンダリCygwin32をインストール(setup-x86.exe経由)し、最後に/cygdrive/c/cygwin32/<for_each_of_the_bin_dirs>を追加します$ PATH?

デフォルトでは64ビットアプリが実行されますが、64ビットバージョンが存在しない場合は32ビットアプリの呼び出しが許可されます。

setup-x86_64.exeがすべてのCygwinアプリのバージョン対応の統合リストを提示でき、必要な場合にのみ32ビットインストールを実行できれば便利です(ポップアップで64ビットポートの実行を提案します)。

0
BobC