目次
(2) ディスクのフォーマットとディスクのパーティショニング
3.4 - サイクリック スキャン (C-SCAN) アルゴリズム
3.5 - NStep-SCAN スケジューリング アルゴリズム
1. バッファ管理
バッファは、専用のハードウェアレジスタまたはメモリ で構成される記憶域です。
レジスタで構成されるバッファは小さく高価であるため、一般にメモリ管理に使用される連想メモリやデバイス コントローラで使用されるデータ バッファなど、非常に高速性が必要な場合にのみ使用されます。多くの場合、メモリはバッファとして使用されます。
(1) シングルバッファとダブルバッファ
プロデューサとコンシューマの間にバッファが設定されていない場合、プロデューサとコンシューマは時間内にお互いを制限します。例えば、プロデューサはデータの生成を完了したが、コンシューマがそれを受け取る準備ができていないため、プロデューサは生成したデータをコンシューマに渡すことができず、このとき、プロデューサは、コンシューマの準備が整うまで一時停止して待つ必要がある。プロデューサとコンシューマの間にバッファが設定されている場合、プロデューサはコンシューマの準備が完了するのを待たずにデータをバッファに出力できます。//例えばメッセージキュー
1.1 - 単一バッファ
ユーザー プロセスが I/O リクエストを発行すると、オペレーティング システムはメイン メモリ内にバッファを割り当てます。
バッファーは共有リソースであるため、バッファーを使用する場合、プロデューサーとコンシューマーは相互に排他的である必要があります。Consumer がバッファ内のデータを取得していない場合、Producer が新しいデータを生成しても、そのデータをバッファに送信することができず、Producer は待機します。
1.2 - ダブルバッファ
入出力速度を高速化し、デバイスの使用率を向上させるために、バッファ スワッピング (バッファ スワッピング) とも呼ばれるダブル バッファ メカニズムが導入されています。デバイスが入力されると、データは最初に最初のバッファに送信され、次にバッファがいっぱいになると 2 番目のバッファに送信されます。// 表面的には、追加のバッファ容量にすぎません
2台のマシン間の通信にダブルバッファを適用する
2 台のマシン間の通信で1 つのバッファのみを使用する場合、マシン間では一度に一方向のデータ送信のみが可能になります。たとえば、A から B へ、または B から A へデータを送信することのみが許可され、両方の当事者が同時にデータを相互に送信することは許可されません。//半二重通信
双方向のデータ送信を実現するには、両方のマシンに 2 つのバッファを設定する必要があります。1 つは送信バッファとして使用され、もう 1 つは受信バッファとして使用されます。
(2) リングバッファ/マルチバッファ
リング バッファは、それぞれが同じサイズの複数のバッファで構成されます。バッファは、次の図に示すように、空のバッファ R、データで満たされたバッファ G、および使用中のバッファ Cの 3 つのタイプに分類できます。//複数のバッファ
したがって、リング バッファには複数のポインタも含まれます。たとえば、ポインタ Nextg はデータのある次のバッファ G を示し、ポインタ Nexti は次に使用可能な空のバッファ R を示し、ポインタ Current は使用中のバッファ C を示します。
// 循環キューなどのスペースの循環使用。
(3) バッファプール(バッファプール)
システムが大規模な場合、多くの循環バッファが存在し、大量のメモリ空間を消費するだけでなく、使用率も低くなります。バッファの使用率を向上させるために、入力と出力の両方に使用できる共通バッファ プールを使用し、プール内にプロセスで共有できる複数のバッファを設定します。//一元管理バッファ
バッファ プールとバッファの違いは、バッファは単なるメモリ ブロックのリンク リストであるのに対し、バッファ プールには管理データ構造と、複数のバッファを管理するための一連の操作関数の管理メカニズムが含まれていることです。//モニターの考え方と同様に、一連のセマフォを統一的に管理する
3.1 - バッファプールの構成
バッファプールは複数のバッファを管理し、各バッファはバッファヘッダとバッファボディで構成されます。
- バッファ ヘッダー:バッファーの識別と管理に使用され、通常はバッファー番号、デバイス番号、デバイス上のデータ ブロック番号、同期セマフォ、およびキュー リンク ポインターが含まれます。
- バッファ:データを保存するために使用されます。
管理の便宜上、通常、バッファ プール内の同じタイプのバッファは 1 つのキューにリンクされるため、次の 3 つのキューを形成できます。
- バッファキューemq を空にします。空のバッファのキュー。その先頭ポインタ F(emg) と末尾ポインタ L(emq) は、それぞれキューの先頭バッファと末尾バッファを指します。
- 入力キューinq. 入力データで満たされたバッファのキュー。その先頭ポインタ F(ing) と末尾ポインタ L(inq) は、それぞれ入力キューの先頭バッファと末尾バッファを指します。
- 出力キューoutq. 出力データで満たされた連鎖バッファーのキュー。その先頭ポインタ F(outq) と末尾ポインタ L(outq) は、それぞれキューの先頭バッファと末尾バッファを指します。
上記の 3 つのキューに加えて、入力データを保持するための作業バッファ、入力データを抽出するための作業バッファ、出力データを保存するための作業バッファ、および出力データを抽出するための作業バッファの 4 つの作業バッファが必要です。。
3.2 - バッファプールの仕組み
- 封じ込め入力。空のバッファ キュー emqの先頭から空のバッファを取得し、それをストレージ入力作業バッファ hin として使用します。バッファー hin データがいっぱいになると、それを入力キュー inq queue にハングします。// 空のキュー -> 入力キュー
- 入力を抽出します。入力キュー inqの先頭から抽出入力ワークバッファ sin としてバッファを取得し、バッファ sin からデータを取り出した後、空のバッファキュー emqにハングします。//入力キュー -> 空のキュー
- 封じ込め出力。空のバッファ キュー emqの先頭から空のバッファをストレージ出力作業バッファ hout として取得します。バッファ hout が出力データでいっぱいになると、出力キュー outqの最後にバッファをハングします。// 空のキュー -> 出力キュー
- 出力を抽出します。出力キューoutq の先頭から出力データが詰まったバッファを取り出し用出力作業バッファsoutとして取得します。バッファ出力データは抽出された後、空のバッファ キューの最後でハングします。// 出力キュー -> 空のキュー
// バッファー プールの作業は、3 つのキューの操作と変換プロセスです。
2. ディスクストレージのパフォーマンスとスケジューリング
ディスク I/O の速度とディスク システムの信頼性は、システムのパフォーマンスに直接影響します。
ディスク システムのパフォーマンスを向上させる方法はいくつかあります。第一に、適切なディスク スケジューリング アルゴリズムを選択することで、ディスクのシーク時間を短縮できます。第二に、ディスク I/O の速度を上げてファイル アクセスの速度を向上できます。第三に、冗長テクノロジを採用して、パフォーマンスを向上できます。ディスクシステムの信頼性を高め、信頼性の高いファイルシステムを構築します。
(1) ディスクのデータ構成とフォーマット
ディスク デバイスには 1 つまたは複数の物理ディスクを含めることができ、各ディスクは 1 つまたは 2 つの記憶面(Surface)に分割され、各ディスク面には複数のトラック(Track) があり、トラック間には必要なギャップ(Gap) があります。//物理ディスク -> 記憶面 -> トラック -> セクタ (データ ブロック)
処理を簡単にするために、同じ数のビットを各トラックに保存できます。このように、ディスクの密度、つまり 1 インチあたりに格納されるビット数は、明らかに、内側トラックの密度が外側トラックの密度よりも高くなります。
各トラックは論理的に複数のセクター(セクター)に分割され、フロッピー ディスクは約 8 ~ 32 セクター、ハードディスクは数百ものセクターに達する場合があります。セクタはディスクブロック(またはデータブロック)と呼ばれ、各セクタ間には一定の隙間(Gap)が確保されています。
物理レコードはセクターに保存され、ディスクに保存できる物理レコード ブロックの数は、ディスクのセクター、トラック、およびサイドの数によって決まります。たとえば、10GB 容量のディスクには 8 つの両面保存可能なプラッタ、合計 16 の記憶面 (ディスク面) があり、各面には 16383 個のトラック (シリンダとも呼ばれます) と 63 個のセクタがあります。// 10G/16 = 64M/ストレージ領域
(2) ディスクのフォーマットとディスクのパーティショニング
データをディスクに保存するには、まずディスクを低レベル フォーマットする必要があります。// ディスク容量分割
以下はトラックをフォーマットする場合です。各トラック (Track) には 30 個の固定サイズのセクター(Sector) が含まれており、各セクターの容量は 600 バイトで、そのうち 512 バイトにはデータが格納され、残りは制御情報の格納に使用されます。
各セクターは次の 2 つのフィールドで構成されます。
- ラベル フィールド(ID フィールド): SYNCHのバイトの 1 つは、フィールドの区切り文字として特定のビット イメージを持ち、トラック番号(Track)、ヘッド番号(Head #)、およびセクター番号(Sectors #) を使用して、ラベル フィールドを識別します。セクター; CRC フィールドはセグメント検証に使用されます。
- データフィールド: 512 バイトのデータを格納します。
異なるトラック (Track)、各トラックの異なるセクタ (Sector)、および各セクタの異なるフィールド (Field) の間で、磁気ヘッドの識別を簡素化および容易にするために、次のことを強調する価値があります。磁気ヘッドの識別を容易にする1バイトから数バイトまでの異なる長さの(Gap、ギャップとも呼ばれる)がギャップ。
ディスク パーティション: ディスクをフォーマットした後、通常はディスクのパーティションを作成する必要があります。論理的には、各パーティションは独立した論理ディスクです。各パーティションの開始セクターとサイズはパーティション テーブルに記録されます。// ディスク パーティションとは、物理ディスクを複数の論理ディスクに分割することです
(3) ディスクスケジューリングアルゴリズム
ディスク スケジューリング アルゴリズムの目的は、ファイルへのアクセス時間を短縮し、ディスクへの各プロセスの平均アクセス時間を最小限に抑えることです。
ディスクにアクセスする時間は主にシーク時間であるため、ディスク スケジューリングの目標は、ディスクの平均シーク時間を最小限に抑えることです。
3.1 - 先着順 (FCFS)
最も単純なディスク スケジューリング アルゴリズム。プロセスがディスクへのアクセスを要求する順序に従ってスケジュールを設定します。
このアルゴリズムの利点は、公平かつシンプルであり、各プロセスの要求を順番に処理することができ、特定のプロセスの要求を長時間満たせないという事態が発生しないことです。
ただし、このアルゴリズムはシークを最適化しないため、平均シーク時間が長くなる可能性があります。
3.2 - 最短シーク時間優先 (SSTF)
このアルゴリズムは、アクセスするトラックが現在のヘッドが位置するトラックに最も近い処理を選択し、毎回のシーク時間が最も短くなるようにしていますが、平均シーク時間の最短化を保証するものではありません。// 飢餓が発生する可能性があります
3.3 - ディスク スキャン (SCAN) アルゴリズム
SSTF アルゴリズムの本質は優先度ベースのスケジューリング アルゴリズムであるため、優先度の低いプロセスでは「飢餓」(Starvation) が発生する可能性があります。
スキャン (SCAN) アルゴリズムでは、アクセスされるトラックと現在のトラックの間の距離だけでなく、磁気ヘッドの現在の移動方向も考慮されます。// 距離 + 移動方向
磁気ヘッドは内側から外側に移動し、最外周トラックに到達した後は外側から内側に移動してディスク全体を走査しますが、このアルゴリズムにおけるヘッド移動の法則はエレベーターの動作に似ており、そのため、エレベーター スケジュール アルゴリズムと呼ばれることがよくあります。//問題は、現時点では不要であるにもかかわらず、最外層が毎回スキャンされることです
3.4 - サイクリック スキャン (C-SCAN) アルゴリズム
SCAN アルゴリズムは、シーク パフォーマンスを向上させるだけでなく、「スターベーション」を防ぐこともできます。このプロセスは、磁気ヘッドが内側から外側にスキャンを続けるまで待機し、アクセスされるすべてのトラックを外側から内側にスキャンする必要があります。プロセスのリクエストを処理する前に処理が行われるため、プロセスのリクエストが大幅に遅延します。// 処理リクエストは延期される
この遅延を軽減するために、C-SCAN アルゴリズムでは、磁気ヘッドが内側から外側へのみ移動するなど、一方向に移動するように規定されており、磁気ヘッドが最外周のトラックに移動してアクセスすると、磁気ヘッドは磁気ヘッドの内側から外側へのみ移動します。ヘッドは直ちにアクセス対象の最内周トラックに戻り、最小トラック番号の後に最大トラック番号が続くサイクルを形成し、循環走査が行われます。//この時点で、頭は固定された外側の開始点には戻らなくなります。
3.5 - NStep-SCAN スケジューリング アルゴリズム
SSTF、SCAN、C-SCAN のスケジューリング アルゴリズムでは、磁気アームが特定の場所に留まる場合があります。例えば、1つまたは複数のプロセスが特定のトラックへのアクセス頻度が高く、つまり特定のトラックに対するI/O操作を繰り返し要求することにより、ディスク装置全体が独占される。私たちはこの現象を「アームスティッキーネス」と呼んでいます。これは高密度ディスクで発生する傾向があります。
N ステップ SCAN アルゴリズムは、ディスク要求キューを長さ N のいくつかのサブキューに分割し、ディスク スケジューリングは FCFS アルゴリズムに従ってこれらのサブキューを順番に処理します。そして、SCAN アルゴリズムに従ってキューが処理されるたびに、あるキューが処理された後、他のキューが処理されます。サブキューの処理中に新しいディスク I/O 要求が発生すると、その新しい要求プロセスは別のキューに配置されるため、スタックが回避されます。// 前のキューの処理要求を先に処理し、次のキューの処理要求を処理します。各キューの容量は固定です
N の値が非常に大きい場合、N ステップ スキャン法のパフォーマンスは SCAN アルゴリズムのパフォーマンスに近くなります。N = 1 の場合、N ステップ SCAN アルゴリズムは FCFS アルゴリズムに縮退します。
3.6 - F-SCAN スケジューリング アルゴリズム
F-SCAN アルゴリズムは本質的に N ステップ SCAN アルゴリズムを簡略化したものです。つまり、F-SCAN はディスク要求キューを 2 つのサブキューに分割するだけです。1 つは、ディスク I/O を要求する現在のすべてのプロセスによって形成されるキューで、SCAN アルゴリズムに従ってディスク スケジューリングによって処理されます。もう 1 つは、ディスク I/O を要求するすべての新しく出現したプロセスを、スキャン中に保留中の要求のキューに入れることです。こうすることで、すべての新しいリクエストは次のスキャンまで延期されます。//現在のプロセスキュー + スキャン中のプロセスキュー