4

以下は、書籍「オペレーティング システムの概念」第 7 版 Galvin、Gagne の第 3 章のハードコピー自体からの抜粋です。


次の変数は、プロデューサー プロセスとコンシューマー プロセスによって共有されるメモリ領域に存在します。

#define BUFFER_SIZE 10

typedef struct {
 . . .
} item;

item buffer[ BUFFER_SIZE ];
int in = 0;
int out = 0;

共有バッファーは、inoutの 2 つの論理ポインターを持つ循環配列として実装されます。変数inは、バッファー内の次の空き位置を指します。outは、バッファ内の最初の完全な位置を指します。in==out;バッファが満杯の場合、バッファは空((in+1)%BUFFER_SIZE)==outです。

このスキームBUFFER_SIZE-1では、同時にバッファ内に最大でアイテムを許可します。


混乱している点を太字で強調しました。その章のオンライン スライドへのリンクを次に示します (ただし、本の数行を編集しています)。セクション「共有メモリを使用した生産者と消費者の例」に進んでください。

http://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/3_Processes.html

BUFFER_SIZE-1バッファにアイテムが存在するのはなぜですか? buffer[0]からまで開始すると、アイテムの数buffer[BUFFERSIZE-1]と同じではありませんか? BUFFER_SIZE著者は、バッファのインデックスが を超えることはできないと言うつもりですか?しかし、同時に項目数を超えることはできないBUFFER_SIZE-1と明確に書いています。全体を説明してください。BUFFER_SIZE-1

4

1 に答える 1

16

リング バッファがある場合、通常、バッファ内のデータstartを示す 2 つのポインタまたはオフセットがあります。==endのときにバッファが空かどうかを判断する一般的な規則。startend

この規則によりBUFFER_SIZE - 1、リング バッファー内のアイテムの総数が制限されます。に満たすことを許可した場合、これは==BUFFER_SIZEを意味するため、バッファーが完全に空か完全に満杯かを判断することは不可能になります。startend

バッファ内のアイテム数を保持するもう 1 つの変数を作成すると、これを区別して、バッファを最大まで満たすことができます。ただし、それを行わずにアイテムの最大数を 1 減らす方が簡単です。

于 2013-04-21T07:19:54.787 に答える