0

プロセスへのメモリ割り当てに関する次の行を読みました。

  One of the important considerations in main memory management is: how should an
  OS allocate a chunk of main memory required by a process. One simple approach
  would be to somehow create partitions and then different processes could 
  reside in different partitions.

この段落は、ページングの概念の前にあり、プロセス全体へのメモリ割り当てについて一度に話していることに注意してください。私の質問は:

   Why should we create partitions? We can just keep track of holes in the memory 
   and keep pointers to the beginning and end of the holes. When we allocate a
   process some memory, we can associate the pointer to the beginning and end of 
   the process with the process and end pointer of the process serves as the 
   pointer to the beginning of a new hole. 
4

1 に答える 1

1

その答えは「効率」だと思います。穴だけを追跡したい場合、最悪のケースは、指定されたメモリ ブロックのバイトの半分に等しい穴の数を持つことです (メモリ ブロックの 2 番目のバイトはすべて「穴」になります)。指定されたサイズのブロックには、ブロックのサイズの半分に等しい追加の数のポインターが必要です。たとえば、次のようになります。

ブロックサイズ: 1024B

「穴」の最大数: 1024/2 = 512

単一の「ホール」を追跡するための各ポインタは 4B (32 ビット アーキテクチャ上) であるため、512 * 4 = 2048B ! これが最善の解決策ではないことをあなたに納得させる必要がないことを願っています. 一部の賢明な人々は、問題を「解決」するには、より大きな「粒度」のメモリが必要であることを発見しました。つまり、OS は一定サイズのチャンク (ページと呼ばれる) にのみメモリを割り当てます。通常、1 ページは 4KiB (4096B) です。このように考えることができます: メモリ割り当てについて話しているとき、OS は小売業者ではありません。OS はメモリをページ単位でのみ割り当てます。プロセスレベルでは、はるかに小さな粒度の割り当てが必要です-Cライブラリの実装がそこで機能します(Cライブラリ割り当てルーチンは小売業者です)mallocfree機能と友達。これらの関数は、OS から (ページ単位で) メモリを割り当て、"使用済み" および "未使用" のチャンクを追跡します (これは単なる単純化です: それよりもはるかに複雑で、サイズに応じて異なる "戦略" があります)。要求されたチャンク)。

PS これが非常に一般的であることは知っていますが、この件に関するあなたの現在の知識がどれほど広いかはわかりません。

于 2012-10-23T10:18:15.977 に答える