カーネルに断片化されたメモリを圧縮させる方法
私は走っていFedora 26ます。 これは、アルゴリズムの教授から与えられた非常に奇妙な割り当てです。割り当ては言う: Cでのメモリの断片化: 以下を実行するCプログラムを設計、実装、および実行します。これは、3mそれぞれ800,000要素のサイズの配列のシーケンスにメモリを割り当てます。次に、すべての偶数番号の配列を明示的に割り当て解除し、mそれぞれサイズが900,000要素の配列のシーケンスを割り当てます。プログラムが最初のシーケンスの割り当てと2番目のシーケンスの割り当てに必要な時間を測定します。mプログラムで使用できるメインメモリのほぼすべてを使い果たすことを選択してください。」 これの全体的な目標は、メモリを断片化してから、連続したチャンクとして利用できる量よりもわずかに多くを要求し、オペレーティングシステムにメモリの最適化または最適化を強制することです。 クラスでは、メモリが視覚化されており、実際には隣接していないため、これをどのように行うべきかを尋ねました。彼は「[仮想メモリ]をオフにする必要があります」と答えました。他の何人かの学生は、クラスでこの「ガベージコレクション」に到達したときにどのように知るべきかを尋ね、彼は次のように述べました。 少し調べたところ、仮想メモリを無効にするのに最も近いのは、でスワップメモリを無効にすることでしたswapoff -a。デスクトップ環境を無効にして、ネイティブターミナルからプログラムをコンパイルして実行しました(他のプロセス、特にデスクトップ環境のような重いプロセスからの干渉を避けるため)。私はこれをm行い、2番目の割り当てのタイミングが最初の割り当てよりも大きくなるポイントに到達するまで、プログラムを増やしながら実行しました。 私は増加してプログラムを実行し、m最終的に2番目の割り当ての時間が最初の割り当ての時間よりも多くなるポイントを見つけました。しかし途中で、2番目の割り当ての前にプロセスが強制終了されるポイントに到達しました。私dmesgはそれをチェックして、それがoom-killer によって殺されたことを確認しました。私はoom-killer に関するいくつかの記事を見つけて読み、カーネルによるメモリの過剰割り当てを無効にできることを発見しました。 私はこれを実行してプログラムを再度実行しましたが、今回のみm、2番目のタイミングが最初のタイミングよりも高いようなものを見つけることができませんでした。結局、mを大きくすると(割り当て超過が有効になっている場合よりもはるかに小さくなりますが)、mallocが失敗し、プログラムが終了します。 3つの質問があります。最初の質問はそれほど重要ではありません。 ガベージコレクションはこれの正しい用語ですか?私の教授はこれはガベージコレクションであると言っていますが、ガベージコレクションはプログラミング言語によって行われるものであり、これはより最適化されていると考えられると思い込んでいました。 Linuxシステムで彼が望んでいるような圧縮は可能ですか? スワップを無効にしても、メモリの割り当て超過が有効になっているときに、2番目の割り当ての時間が最初の割り当てよりも長くなる点に到達できたのはなぜですか?圧縮は実際に行われましたか?もしそうなら、メモリの割り当て超過を無効にした後、圧縮が発生するポイントに到達できなかったのはなぜですか?