プログラムの主要な5つのメモリ領域(ヒープ領域、スタック領域、グローバル静的領域、リテラル定数領域、プログラムコード領域)の割り当て+バッファ記述

プログラムメモリの割り当て:
1. ヒープ領域(ヘッド):
通常、プログラマによって確保、解放されますが、プログラマが解放しない場合、プログラム終了時にOSにより再利用される場合があります。
データ構造はヒープとは異なり、割り当てはリンク リストに似ていることに注意してください。
2. スタック領域(スタック):
リニアテーブルの片端でのみ動作可能な特殊なリニアテーブルであり、スタックの上端では動作可能、下端では動作できません。スタックの特徴は次のとおりです。 先入れ後出し スタックの先頭から要素を入れる操作をスタッキング(スタックのプッシュ)といい、要素を取り出すことをスタックのポップ(スタックのポップ)といいます。
スタックの特徴: Java のスタック メモリは先入れ後出し、スタック データ構造であり、最初に呼び出されたメソッドは後から呼び出されるメソッドが終了するまでポップ (ポップ) されず、コンパイラが自動的に割り当てと解放を行います。
関数のパラメータ値やローカル変数の値などを保存します。動作モードはデータ構造におけるスタックに似ています。
3. グローバル領域(静的領域-静的)
グローバル変数と静的変数をまとめて格納し、初期化済みのグローバル変数と静的変数を一つの領域に、初期化していないグローバル変数と初期化していない静的変数を隣接して別の領域に配置します。番組終了後にシステムにより解放されます。
4. リテラル定数領域:
より多くの定数文字列がここに配置されます。番組終了後にシステムにより解放されます。
5. プログラムコード領域:
関数本体のバイナリコードを格納します。
6. バッファ:
1. 概念
バッファはキャッシュとも呼ばれ、メモリ空間の一部です。つまり、メモリ空間内に特定の記憶空間が確保され、これらの記憶空間は入力または出力データをバッファリングするために使用され、確保された空間のこの部分はバッファと呼ばれます。
バッファは、入力デバイスに対応するか出力デバイスに対応するかによって、入力バッファと出力バッファに分けられます。
2. バッファを導入する理由
たとえば、ディスクから情報をフェッチする場合、まず読み取ったデータをバッファに入れ、次にコンピュータはバッファから直接データをフェッチし、バッファ内のデータがフェッチされた後にディスクから読み取ります。バッファ上での読み取りと書き込みの回数、およびコンピュータの動作はディスク上での動作よりもはるかに高速であるため、バッファを適用するとコンピュータの動作速度が大幅に向上します。
別の例として、プリンターを使用してドキュメントを印刷すると、プリンターの印刷速度が比較的遅いため、最初にドキュメントをプリンターの対応するバッファーに出力し、その後プリンターが段階的に印刷します。 、私たちのCPUは他のことを処理できます。

基本的には理解できたと思いますが、バッファとは、入出力デバイスと CPU の間でデータをキャッシュするために使用されるメモリ領域です。低速入出力デバイスと高速 CPU が調和して動作できるようにし、低速入出力デバイスによる CPU の占有を回避し、CPU を解放して効率的に動作できるようにします。
バッファの種類
バッファには、フル バッファ、ライン バッファ、バッファなしの 3 種類があります。

  1. 完全にバッファリング
    この場合、実際の I/O 操作は、標準 I/O バッファがいっぱいになった後に実行されます。フル バッファリングの典型的な例は、ディスク ファイルの読み取りと書き込みです。
  2. 行バッファリング
    この場合、入出力で改行文字が検出されたときに実際の I/O 操作が実行されます。このとき、入力した文字は一旦バッファに格納され、Enterキーを押して改行した時点で実際のI/O操作が行われます。代表的なものは標準入力 (stdin) と標準出力 (stdout) です。
  3. バッファリングなし
    とはバッファリングがないことを意味し、標準エラー状態 stderr が代表的なものであり、エラー情報を直接かつできるだけ早く表示できます。
    ANSI C (C89) では、キャッシュに次の特性が求められます。
    標準入力と標準出力は、対話型デバイスが関与しない場合にのみ完全にバッファリングされます。
    標準エラーが完全にバッファリングされることはありません。

ただし、標準入出力が対話型デバイスを参照している場合、標準入出力がバッファリングされていないのかラインバッファリングされているのか、また標準出力がバッファリングされていないのかラインバッファリングされているのかはわかりません。
ほとんどのシステムは、デフォルトで次のタイプのキャッシュを使用します。
標準エラーはキャッシュされません。
エンドデバイスが関与するストリームの場合はラインバッファリングされ、それ以外の場合はフルバッファリングされます。
標準の入出力ストリームを使用することがよくありますが、ANSI C には stdin、stdout、および stderr のキャッシュ特性に関する必須の規定がないため、システムごとに stdin、stdout、および stderr のキャッシュ特性が異なる場合があります。現時点での主なキャッシュ特性は、stdin と stdout はライン キャッシュ、stderr はキャッシュなしです。
バッファのサイズ
自分でバッファを設定しない場合、システムはデフォルトで標準入出力用のバッファを設定します。このバッファのサイズは通常 4096 バイトで、これはコンピュータのページング メカニズムに関連しています。プロセス ページングとセグメンテーションのメカニズムは、コンピューターにメモリを割り当てるために使用されます。各ページのサイズは 4096 バイトであるため、通常、バッファーのサイズは 4096 バイトに設定されます。
バッファリフレッシュ(クリア)
バッファは次の状況でリフレッシュされます:
①バッファがいっぱいのとき、
②行バッファが復帰に遭遇したとき、
③ファイルを閉じたとき、
④特定の関数を使用してバッファをリフレッシュします。
C言語プログラムをウィンドウ内で実行している場合、プログラム内にscanf()やgetc()などの関数がある場合、ウィンドウ内に一連の文字データを入力すると、これらの文字データはバッファにのみ格納されます。 scanf() 、 getc() 、および「オブジェクト」に対応するその他の関数に書き込まれていない場合、バッファがリフレッシュされると、これらの関数に対応する「オブジェクト」に入ります。
この一連の文字をウィンドウに入力すると、ウィンドウから入力内容が表示されるのはなぜですか?
前のプリンターの例によれば、印刷するデータはバッファー領域に保存され、CPU が解放されます (常にプリンターにデータを読み書きする必要はありません。印刷時間は CPU の読み書きよりもはるかに長くなります)キャッシュを使用すると、CPU は一度にデータのバッチをキャッシュに読み込むことができ、プリンターはキャッシュからデータを印刷し、CPU は他のタスクを実行できます)。ウィンドウに文字を入力すると、文字が表示されます。これにより、対話性が向上します (プリンターにキャッシュがないのと同じように、CPU がメモリー内のデータを読み取ると、プリンターはデータを印刷します)。バッファー領域はリフレッシュされないため、対応するオブジェクトには書き込まれません。 scanf() と getc() へ

おすすめ

転載: blog.csdn.net/Demondai999/article/details/123875264