コンピュータ オペレーティング システムの最終試験

注: この記事は「コンピュータ オペレーティング システム」(MOOC 版) に基づいています。もちろん、異なるルートを通じて同じ目標を達成します。試験で評価される可能性のあるすべての主要な内容がカバーされます。不足している場合は追加してください。それ。

第1章;序章

オペレーティングシステムの目的と役割

目標:目標
機能:
ここに画像の説明を挿入

オペレーティングシステムの開発

1. シングルチャネルバッチ処理システム: 1 つずつ処理します。
2. マルチチャネルバッチ処理システム: 外部ストレージに配置し、CPU とシステムリソースを共有するアルゴリズムに従って複数のジョブを選択します - 現時点では、 3. タイムシェアリング
システム:マルチチャネル、独立性、適時性、双方向性
4. リアルタイムシステム:マルチチャネル、独立性、適時性、双方向性、信頼性
リアルタイムタスクタイプ5. マイクロコンピュータオペレーティングシステム: 6.組み込み
オペレーティング システム: 小型システム カーネル、合理化されたシステム、高いリアルタイム パフォーマンス、および構成可能性
7. ネットワーク オペレーティング システム: ハードウェアの独立性、インターフェイスの一貫性、リソースの透明性、システムの信頼性、実行の並列性
8. 分散オペレーティング システム:分散型、透明性、同一性、グローバル性—Hongmeng OS

オペレーティングシステム開発の主な原動力

  1. コンピュータ システム リソースの使用率を向上させる
  2. 使いやすい
  3. デバイスは常に更新され、反復されます
  4. コンピュータアーキテクチャの進化
  5. 新しいアプリケーション要件を常に提案する

オペレーティング システムの基本機能

同時、共有、仮想、非同期

  1. 同時実行性: 同じ時間間隔内で 2 つ以上のイベントが発生することを指します。

  2. 共有:
    相互に排他的な共有 - リソースは多くありませんが、多くの人がリソースを必要とし、それぞれがリソースを独占する必要があります。
    同時共有 - 多くの人がリソースを必要としますが、リソースは共有できます。

  3. 仮想:
    時分割多重化テクノロジは、
    プロセッサのアイドル時間を使用して他のプログラムを実行し、プロセッサの使用率を向上させます。

    • 仮想プロセッサ技術: マルチプログラミング技術を使用して各プログラムに少なくとも 1 つのプロセスを作成し、複数のプログラムを同時に実行できるようにします。
    • 仮想デバイス技術: 1 つの物理 I/O デバイスを複数の論理 I/O デバイスに仮想化し、複数のユーザーが 1 つの論理 I/O デバイスを占有できるようにします。

    空間分割多重技術は、
    メモリのアイドル時間を利用して他のプログラムを保存し、メモリ使用率を向上させます。

  4. 非同期:
    リソースが限られているため、プロセスの実行は一度に完了できず、停止したり再開したりするため、各プログラムの実行に必要な合計時間は不明です。

オペレーティングシステムの機能

この写真は参考用です
オペレーティングシステムの主な機能

第 2 章 プロセスの説明と制御

プログラムの同時実行

先行関係を持たないプログラムのみが同時に実行できます。そうでない場合は、同時に実行できません。同時実行は、コンピューター リソースの使用率を高めるためのものです。

  • 断続的: 同時実行とリソースの共有により、重要なリソースを使用するときにリソースの競合が発生し、リソースが取得できない場合は実行が一時停止されます。
  • 閉鎖の喪失
  • 再現性の喪失 閉鎖の喪失は再現性の喪失につながります

プロセスの基本概念、プロセス実体の構造(3 つの部分)、基本特性

概念: プロセスはプログラムの実行プロセスであり、システムによるリソース割り当てとスケジューリングのための独立した単位です。 構造
: プログラムセグメント、関連データ、PCB
基本機能:

  1. ダイナミクス: プロセスの本質はプログラムの実行プロセスであり、常に動的に変化します。プロセスは作成によって生成され、スケジュールによって実行され、キャンセルによって終了します。
  2. 同時実行性: メモリ内に共存し、同時に実行される複数のプロセスを指します。
  3. 独立性 - 参照プロセスの定義
  4. 非同期性: プロセスは非同期で実行されます。つまり、独立した予測不可能な速度で前進します。

PCB - 工程管理テーブル

  1. 概念:
    OS が管理する制御テーブルは、メモリ テーブル、デバイス テーブル、ファイル テーブル、プロセス テーブル (プロセス管理用) に分けられます - PCB はプロセス テーブルです PCB の役割は、独立して実行できないプログラムを作成すること
    ですマルチプログラム環境 (データを含む) は、独立して実行できる基本単位、つまり、他のプログラムと同時に実行できるプロセスになります。
  2. PCBの役割:
  • 独立して機能するベースユニットとしてのロゴ
  • 間欠運転モードを実現
  • 工程管理に必要な情報を提供します
  • プロセスのスケジューリングに必要な情報を提供する
  • 他の情報と同期して通信する
  1. PCB 内の情報
    PCB 内の情報
  2. PCB組織
  • 直線的な道
  • リンク方式
  • インデックスメソッド

プロセスの 3 つの基本状態と状態遷移の理由 (強調)

  1. 準備完了状態 (準備完了): プロセスには CPU を除くすべてのリソースが割り当てられており、準備完了キューに入り、スケジューリングを待ちます。
  2. 実行ステータス (実行中): スケジュールされた後に CPU を取得します
  3. ブロック状態 (ブロック): プロセスがイベントをトリガーすると、プロセスは実行を続行できなくなります。つまり、ブロックされます。OS はプロセッサを他のプロセスに割り当て、ブロックされたプロセスをブロッキング キューに入れます。これは、さまざまな理由によるブロックが別のブロッキング キューに割り当てられ、効率が向上するためです。
  4. 状態の作成: まず、プロセスは空の PCB を適用し、プロセスを制御および管理するための情報を PCB に入力します。次に、プロセスは実行時に必要なリソースを割り当てます。最後に、プロセスの状態を準備完了状態に変換して挿入します。準備ができたキューの真ん中に
  5. 終了状態: まず OS が余波に対処するのを待ち、その後プロセスの PCB をクリアし、PCB スペースを OS に返します。
    プロセス状態遷移理由

サスペンドとサスペンド後のプロセス状態遷移の導入

一時停止操作は次の目的で導入されました。

  • エンドユーザーのニーズ
  • 親プロセスのニーズ
  • 負荷調整の必要性

  • サスペンド操作の導入後のOS 状態遷移の必要性-サスペンド プリミティブ Suspend とアクティベーション プリミティブ Active の導入
    合成された状態遷移図

プロセスの作成

  1. ブランク PCB を申請します - プロセスの作成にはリソースの割り当てと情報の管理が必要なので、システムによる制御を容易にするために最初に PCB を作成する必要があります。
  2. 新しいプロセスの実行に必要なリソース (さまざまな物理リソースや論理リソースなど) を割り当てます。
  3. PCB を初期化する
    • フラグ情報の初期化
    • プロセッサ状態情報の初期化
    • プロセッサ制御情報の初期化
  4. プロセスの準備完了キューが新しいプロセスを受け入れることができる場合は、新しいプロセスを準備完了キューに挿入します。

プロセスの終了

プロセス終了プリミティブを呼び出します。これにより、次の処理が実行されます。

  1. 終了したプロセスの識別子に従って、PCB コレクション内のプロセス PCB を取得し、プロセス PCB からプロセスのステータスを読み取ります。
  2. 終了したプロセスが実行状態にある場合は、プロセスの実行を直ちに終了し、スケジュール フラグを true に設定して、終了後にプロセスを再スケジュールする必要があることを示します。
  3. 終了したプロセスに子や孫が存在する場合、それらが制御不能なプロセスになるのを防ぐために、そのプロセスも終了されます。
  4. 終了したプロセスの全リソースを親プロセスまたはOSに返却します。
  5. 終了したプロセスの PCB をキュー (またはリンク リスト) から削除し、他のプログラムが情報を収集するのを待ちます。

プロセスのブロックとウェイクアップ、一時停止とアクティブ化の実装

  1. プロセスはブロッキング プリミティブ ブロックを呼び出すことで自身をブロックします。したがって、ブロッキングはプロセス自体のアクティブな動作です。
  2. ブロッキング プロセスによって予期されたイベント、つまりブロッキングの原因となったイベントが完了すると、関連するプロセスはウェイクアップ プリミティブ wakeup を呼び出して、イベントを待っているプロセスをウェイクアップします。
    block とweakup はペアで指定する必要があります。そうしないと、プロセスが永久にブロックされる可能性があります。
  3. サスペンド: サスペンドプリミティブ
  4. アクティブ化: アクティブなプリミティブ

プロセス通信方式

  1. パイプライン (Pipe): パイプラインは、アフィニティを持ってプロセス間で通信できる半二重通信方式です。パイプは、匿名パイプ (親プロセスと子プロセス間でのみ使用) または名前付きパイプ (無関係なプロセス間で使用) にすることができます。
  2. 名前付きパイプ: 名前付きパイプは、ファイル システム内の名前付きオブジェクトを介して通信するためのメカニズムです。無関係なプロセスは、名前付きパイプを開いて読み書きすることによって通信できます。
  3. 共有メモリ: 共有メモリは効率的なプロセス間通信方法であり、メモリ領域を複数のプロセスのアドレス空間にマッピングすることで、これらのプロセスは共有メモリを直接読み書きできます。共有メモリは、大量のデータを頻繁に交換する必要があるプロセス間通信に適しています。
  4. メッセージ キュー (メッセージ キュー): メッセージ キューは、異なるプロセス間でメッセージを転送できる通信方法です。プロセスはメッセージ キューにメッセージを送信でき、他のプロセスはメッセージ キューからメッセージを受信できます。メッセージ キューにより、非同期通信と分離が可能になります。
  5. セマフォ: セマフォは、プロセス間の同期と相互排他のためのメカニズムです。共有リソースへのアクセスを制御し、一度に 1 つのプロセスのみがリソースにアクセスできるようにします。(セマフォの仕組みは重要なポイントになりますので後述します)
  6. ソケット: ソケットは、異なるホスト上のプロセス間の通信に使用できるネットワーク通信の方法です。ソケットは、ネットワークベースのプロセス間通信メカニズムを提供します。

  1. 概念:
    プロセスの目的は、複数のプログラムを同時に実行できるようにして、リソースの使用率とシステムのスループットを向上させることです。
    スレッドは、同時実行中のプログラムの時間とスペースのオーバーヘッドを削減するために使用され、OS の同時実行性が向上します。
  2. スレッドとプロセスの比較
    スレッドは従来のプロセスの多くの特徴を備えているため、軽量プロセス (LWP) またはプロセス要素とも呼ばれます。対応する従来のプロセスは重量プロセス (HWP) と呼ばれ、スレッド タスクのみを持ちます。
    • スケジューリングの基本単位: スレッドはコンピュータ リソースの割り当てとスケジューリングの基本単位になり、同じプロセス内でのスレッド切り替えのオーバーヘッドはプロセス切り替えのオーバーヘッドよりもはるかに小さくなります。プロセス切り替えは発生しませんが、2 つのスレッドにスレッドが存在する場合、プロセス切り替えは発生しません。プロセススイッチ プロセススイッチ
    • 同時実行性
    • 資源がある
    • 独立
    • システムのオーバーヘッド
    • マルチプロセッサ システムのサポート
  3. スレッド制御ブロック
    TCB は、PCB に相当するスレッド制御ブロックです。
    • スレッド識別子
    • レジスタのセット
    • スレッドの実行状態
    • 優先順位
    • スレッド固有の記憶領域 - スレッドが切り替わるときに情報を保存します
    • 信号シールド
    • スタック ポインタ - プロシージャ呼び出し。複数の入れ子が存在する可能性があるため、スレッドごとにスタックが設定され、スタックへの 2 つのポインタがあります。ユーザー独自のスタックへのポインタとコア スタックへのポインタで、それぞれスレッドに対応します。ユーザーモードおよびカーネルモードで実行するときに使用されるスタック

第 3 章 プロセッサのスケジューリングとデッドロック

3 つのレベルのプロセッサ スケジューリング

  1. アドバンスト スケジューリング — ジョブ スケジューリング
    スケジューリング オブジェクト: ジョブ
    スケジューリング プロセス: 特定のアルゴリズムに従って、外部メモリ上のバックアップ キュー内のジョブがメモリに転送され、プロセスが作成され、それにリソースが割り当てられ、待機します。レディキュー内のスケジューリング
    アプリケーション用: 主にマルチチャネルバッチ処理システムで使用される いいえ
    —> 作成状態 —> レディ状態の実行頻度が低い
  2. 中間スケジューリング - メモリ スケジューリング
    スケジューリング オブジェクト:暫定的な概要: プロセスがサスペンド状態にある場合、プロセスはメモリから外部メモリに転送されます。 スケジューリング
    プロセス: 中間スケジューリングは、特定のアルゴリズムに従って保留キュー内の適切なプロセスを選択します。 . 外部ストレージ内のデータをメモリに転送 実行
    サスペンド状態→レディ状態 実行頻度
  3. 低レベルのスケジューリング - プロセスのスケジューリング
    スケジューリング オブジェクト: プロセス
    スケジューリング プロセス: 特定のアルゴリズムに従って、レディ キュー内のどのプロセスがプロセッサーを取得するかを決定します。これは、オペレーティング システムの
    最も基本的な
    スケジューリング アプリケーションです。主にマルチチャネルのバッチ処理システムで使用されます。リアルタイム、リアルタイムOS
    準備状態→実行状態での動作周波数が高い

プロセススケジューリングモード

ノンプリエンプティブ: プロセスにプロセッサが割り当てられると、プロセスは継続的に実行され、プロセスが完了するかイベントが発生するまで、クロックの中断などによってプロセスのプロセッサが占有されることはありません。プロセッサは他のプロセスに割り当てられます。——実装が簡単で、システムのオーバーヘッドが低いが、緊急のタスクを時間内に処理できないため、初期のバッチ処理システムに適しています

プリエンプティブ: スケジューラは、特定の原則に従って実行中のプロセスを一時停止し、そのプロセスに割り当てられていたプロセッサを別のプロセスに再割り当てすることができます。(最新の OS で広く採用されています) プリエンプション方式: スケジューラは、特定の原則に従って実行中のプロセスを一時停止し、そのプロセスに割り当てられていたプロセッサを別のプロセスに再割り当てすることができます (最新の OS で広く採用されています)—— より緊急性の高いプロセスは、優先順位を付け、タイムスライスに従って順番にプロセスを実行できます。緊急性の高い処理を優先したり、タイムスライスに応じて順番に処理を行うことができるタイムシェアリング運用に適しており、タイムシェアリングOSやリアルタイムOSに最適です。

プロセッサーのスケジューリングの計算

CPU使用率

CPU使用率

システムスループット

ここに画像の説明を挿入

ターンアラウンドタイム

ここに画像の説明を挿入

スケジュールアルゴリズム

FCFS - 先着順サービスのアルゴリズム

ジョブは到着順、つまり先着順にスケジュールされます。FCFS アルゴリズムでは、ジョブが準備完了キューに入ると、ジョブはキューの最後に配置され、CPU が実行をスケジュールするのを待ちます。現在の CPU がジョブを実行している場合、ジョブが完了するまで次のジョブの実行はスケジュールされません。
長所: 平均待ち時間、平均所要時間は短くなります。
短所: 短いジョブには適していますが、長いジョブには適していません。準備完了キューに短いプロセスが継続的に追加されると、長いプロセスは長時間処理されず、飢餓が発生します。常にサービスが提供されない場合、サービスはブロックされます。

例: 日常生活では、食べ物を買うために列があり、最初に来た人が最前列になり、列に飛び込むことはできません
ここに画像の説明を挿入

SJF - ショートジョブファーストアルゴリズム

アルゴリズムの考え方: 平均待ち時間の最短、平均所要時間の最短、平均重み付け時間の最短を追求します。
非プリエンプティブな短いジョブ優先アルゴリズム: サービス時間の短いプロセスが準備完了キューに到着すると、実行中のプロセスの実行が完了するのを待ってから、サービス時間の短いプロセスをスケジュールします。

例:幼稚園でバスに乗るとき、年齢順に列に並び、最年少の子から先にバスに乗り、列が完成した後、後から来た人が順に列に入れられます。もちろん、この列はまだ空いていますが、バスに乗っている人が、バスに乗らないでまた並ぶように言うこともできません。

プリエンプティブ短ジョブ優先アルゴリズム: 最短残り時間優先アルゴリズムとも呼ばれます。つまり、準備完了キュー内で、どのプロセスの残り実行時間が短く、どのプロセスが最初にスケジュールされるかを示します。

例を挙げてみましょう (これは本当に恥ずかしいことです): あなたが食事をしていて、便が 1 つしかなく、今座っている人が食事を終えるのに 10 分かかるとします。2 つのプロセスの実行時間が同じ場合、その順序に従ってプロセッサを割り当てます (ゴミの例です。これについては言及しない方がよいでしょう)。

長所: 平均待ち時間、平均所要時間は短くなります。
短所: 短いジョブには適していますが、長いジョブには適していません。準備完了キューに短いプロセスが継続的に追加されると、長いプロセスは長時間処理されず、飢餓が発生します。常にサービスが提供されない場合、サービスはブロックされます。

HRRN - 高応答率優先アルゴリズム

高応答率優先スケジューリング アルゴリズム (Highest Response Ratio Next、HRRN) は、SJF スケジューリング アルゴリズムに基づくプロセス スケジューリング アルゴリズムで、長いジョブと短いジョブの優先順位を考慮するように設計されています。
HRRN アルゴリズムは、各プロセスの応答率 (Response Ratio、RR) を計算し、RR が高いものから低いものの順にスケジュールします。
RR = (待ち時間 + サービス時間) / サービス時間-応答率が 1 以上である

RR - タイムスライス回転方式

レディキュー内の全プロセスをFCFS順に並べ、その都度キューの先頭のプロセスを取り出し、実行するプロセスにタイムスライスを割り当て、タイムスライスがなくなったらプロセスを元に戻すレディキューの最後まで読み出し、キューの先頭にある次のプロセスが実行されます。
この仕組みにより、すべてのプロセスが確実に実行され、特定のプロセスが常に CPU を占有し、他のプロセスが枯渇するという事態は発生しません。
ガイドライン: タイム スライス/10> プロセス コンテキストの切り替え時間 - プロセスの切り替えのオーバーヘッドは 1% を超えることはできません

PR - 優先スケジューリング アルゴリズム

優先スケジューリングアルゴリズムでは、各プロセスに優先度が与えられ、CPUは実行可能なプロセスの中から最も優先度の高いプロセスを選択して実行します。優先度が同じ場合、通常はラウンドロビン方式または先入れ先出し方式でスケジューリングします。

  1. ノンプリエンプティブ
    簡単に言うと、レディキューで待機しているプロセスを優先度に従ってソートし、現在実行中のプロセスがプロセッサを積極的に放棄した場合にのみ、ソートされたプロセスがスケジュールされます。
  2. プリエンプティブ
    非プリエンプションに基づいて、レディキューも「監視」され、レディキューが変化するたびに、プリエンプションが必要かどうかを確認する必要があります

注: 優先度には 2 種類があります
静的優先度 : プロセス作成時に優先度が割り当てられ、シンプルでオーバーヘッドは低いですが、硬直的で飢餓が発生します 動的優先度 : プロセス作成時に優先度が割り当てられ
、プロセスが進むにつれて、または時間が増加して変化するにつれて
ここに画像の説明を挿入

マルチレベルフィードバックキュースケジューリングアルゴリズム

マルチレベルキュースケジューリングアルゴリズムでは、プロセスが複数の異なるキューに分割され、各キューに異なる優先度が設定されます。通常、優先度の高いキューのプロセスが最初に実行され、優先度の低いキューのプロセスが最初に実行されることがあります。実行するまで長時間待ちます。プロセスは、その特性に応じて異なるキューに割り当てることができます。たとえば、CPU 集中型のプロセスを優先度の高いキューに割り当て、I/O 集中型のプロセスを優先度の低いキューに割り当てることができます。

デッドロックの定義、原因、予防

デッドロック(Deadlock):複数のプロセスが動作中にリソースを奪い合うことにより発生するデッドロックのことを指し、プロセスがデッドロック状態になると、外部からの力がなければプロセスは先に進むことができなくなります。

デッドロックが発生するために必要な 4 つの条件:

  1. 相互排他条件: プロセスによる割り当てられたリソースの排他的使用を指します。つまり、特定のリソースが一定期間内に 1 つのプロセスによってのみ占有されることを指します。
  2. 要求と保持: プロセスは少なくとも 1 つのリソースを保持していますが、新しいリソース要求を行うと、そのリソースは別のプロセスによって占有されます。このとき、要求元のプロセスはブロックされますが、自身が所有するリソースは保持されます。
  3. 非プリエンプティブ: プロセスによって取得されたリソースは、使い果たされる前に他のプロセスによってプリエンプトされることはなく、アクティブにのみ解放されます。
  4. 循環待機条件: デッドロックが発生した場合、プロセスが存在する必要があります。リソースのリング チェーン、つまり、プロセス セット {P0、P1、P2、...、Pn} 内の P0 がリソースを待機している必要があります。 P1 によって占有されており、P1 は P2 によって保持されているリソースを待機しています...一方、Pn は P0 によってすでに保持されているリソースを待機しています。

デッドロックの防止は、デッドロックに必要な 4 つの条件のうち 1 つ以上を破棄することです。リソース共有には相互排他が必要であるため、破棄することはできませんが、保証する必要があります。

デッドロック回避とバンカーアルゴリズム

デッドロックの回避

ワンタイム ブロック方式: 各プロセス (トランザクション) は使用するすべてのデータをロックし、ロックしないと実行を続行できません。シーケンシャル ブロック方式:
データ オブジェクトのブロック順序を事前に定義し、すべてのプロセス (トランザクション) がロックされます。ロック、
銀行家のアルゴリズム: プロセスが安全なプロセス シーケンスであることを確認します。

銀行家のアルゴリズム

中心的なアイデア: プロセスがリソースの適用を行うとき、まず、その割り当てによってシステムが危険な状態になるかどうかを判断します。安全でない状態になる場合、リクエストは一時的に許可されず、改善プロセスはブロックされ、最初に待機されます。
バンカーズ アルゴリズム (Banker's Algorithm) は、リソース割り当て問題を解決するためのアルゴリズムで、リソースの取得中にプロセスによってシステムが危険な状態にならないようにするために使用されます。主な考え方は、各プロセスにリソースを割り当てる前に、システムのセキュリティ ステータスをチェックして、プロセスのニーズが満たされるかどうかを判断することです。割り当てられる場合はリソースが割り当てられ、割り当てられない場合はプロセスのリクエストが拒否されます。
バンカーのアルゴリズムの手順は次のとおりです。

  • 各プロセスが取得できるリソースの最大数を示す Max マトリックスを定義します。
  • 各プロセスが現在取得しているリソースの数を示す割り当てマトリックスを定義します。
  • Need マトリックスを定義すると、Need[i][j] は、i 番目のプロセスがタスクを完了するためにまだ必要なリソース j の数を示します。必要性[i][j] = 最大[i][j] - 割り当て[i][j]
  • 利用可能ベクトルを定義すると、Available[j] は j 番目のリソースの現在利用可能な数量を示します。
  • システムが安全な状態であることを確認してください。つまり、Need[i] ≤ Available をチェックし、すべてが満たされている場合、システムは安全な状態にあり、リソースを割り当てることができます。そうでない場合、システムは安全でない状態になり、リソースを割り当てることができません。
  • システムが安全な状態にある場合、要求されたリソースはプロセスに割り当てられます。割り当て[i][j] = 割り当て[i][j] + リクエスト[i][j]; 利用可能[j] = 利用可能[j] - リクエスト[i][j];
  • すべてのリソースが割り当てられるまで、手順 5 と 6 を繰り返します。

バンカーのアルゴリズム Java コードの実装

package zhuxuanyu;

import java.util.Arrays;

/**
 * @title: BankerAlgorithm
 * @Author 竹玄羽
 * @Date: 2023/4/19 10:35
 */

public class BankerAlgorithm {
    
    
    private int[] available; // 可用资源向量
    private int[][] max; // 最大需求矩阵
    private int[][] allocation; // 已分配资源矩阵
    private int[][] need; // 需求资源矩阵
    private int[] work; // 工作向量,记录当前系统可用资源

    public BankerAlgorithm(int[] available, int[][] max, int[][] allocation) {
    
    
        this.available = Arrays.copyOf(available, available.length);
        this.max = Arrays.copyOf(max, max.length);
        this.allocation = Arrays.copyOf(allocation, allocation.length);
        this.need = new int[max.length][max[0].length];
        this.work = Arrays.copyOf(available, available.length);
        calculateNeed();
    }

    // 计算需求资源矩阵
    private void calculateNeed() {
    
    
        for (int i = 0; i < max.length; i++) {
    
    
            for (int j = 0; j < max[i].length; j++) {
    
    
                need[i][j] = max[i][j] - allocation[i][j];
            }
        }
    }

    // 判断系统是否处于安全状态
    public boolean isSafe() {
    
    
        boolean[] finish = new boolean[max.length];
        Arrays.fill(finish, false);
        int[] workCopy = Arrays.copyOf(work, work.length);

        int count = 0;
        while (count < max.length) {
    
    
            boolean found = false;
            for (int i = 0; i < max.length; i++) {
    
    
                if (!finish[i] && isLessOrEqual(need[i], workCopy)) {
    
    
                    finish[i] = true;
                    for (int j = 0; j < workCopy.length; j++) {
    
    
                        workCopy[j] += allocation[i][j];
                    }
                    found = true;
                    count++;
                }
            }
            if (!found) {
    
    
                break;
            }
        }

        return count == max.length;
    }

    // 判断资源请求是否安全
    public boolean isSafe(int processId, int[] request) {
    
    
        if (isLessOrEqual(request, need[processId]) && isLessOrEqual(request, available)) {
    
    
            int[] workCopy = Arrays.copyOf(work, work.length);
            int[][] allocationCopy = copy2DArray(allocation);
            int[][] needCopy = copy2DArray(need);

            for (int i = 0; i < request.length; i++) {
    
    
                workCopy[i] -= request[i];
                allocationCopy[processId][i] += request[i];
                needCopy[processId][i] -= request[i];
            }

            boolean[] finish = new boolean[max.length];
            Arrays.fill(finish, false);

            int count = 0;
            while (count < max.length) {
    
    
                boolean found = false;
                for (int i = 0; i < max.length; i++) {
    
    
                    if (!finish[i] && isLessOrEqual(needCopy[i], workCopy)) {
    
    
                        finish[i] = true;
                        for (int j = 0; j < workCopy.length; j++) {
    
    
                            workCopy[j] += allocationCopy[i][j];
                        }
                        found = true;
                        count++;
                    }
                }
                if (!found) {
    
    
                    break;
                }
            }

            if (count == max.length) {
    
    
                return true;
            } else {
    
    
                return false;
            }
        } else {
    
    
            return false;
        }
    }

    // 复制二维数组
    private int[][] copy2DArray(int[][] array) {
    
    
        int[][] copy = new int[array.length][array[0].length];
        for (int i = 0; i < array.length; i++) {
    
    
            for (int j = 0; j < array[i].length; j++) {
    
    
                copy[i][j] = array[i][j];
            }
        }
        return copy;
    }

    // 判断数组a是否小于等于数组b的每个元素
    private boolean isLessOrEqual(int[] a, int[] b) {
    
    
        for (int i = 0; i < a.length; i++) {
    
    
            if (a[i] > b[i]) {
    
    
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
    
    
        int[] available = {
    
    10, 5, 7};
        int[][] max = {
    
    {
    
    7, 5, 3}, {
    
    3, 2, 2}, {
    
    9, 0, 2}, {
    
    2, 2, 2}, {
    
    4, 3, 3}};
        int[][] allocation = {
    
    {
    
    0, 1, 0}, {
    
    2, 0, 0}, {
    
    3, 0, 2}, {
    
    2, 1, 1}, {
    
    0, 0, 2}};

        BankerAlgorithm bankerAlgorithm = new BankerAlgorithm(available, max, allocation);

        // 判断初始状态是否安全
        System.out.println("初始状态是否安全:" + bankerAlgorithm.isSafe());

        // 判断P1再请求(1,0,2)是否安全
        int[] request1 = {
    
    1, 0, 2};
        System.out.println("P1再请求(1,0,2)是否安全:" + bankerAlgorithm.isSafe(1, request1));

        // 判断P0请求(0,2,0)是否可分配
        int[] request2 = {
    
    0, 2, 0};
        System.out.println("P0请求(0,2,0)是否可分配:" + bankerAlgorithm.isSafe(0, request2));
    }
}

第 4 章 プロセスの同期

ミューテックスと同期

同期は協力関係であり、特定のタスクを完了するために確立された複数のプロセスまたはスレッド間の調整された呼び出しであり、順番に待機し、リソース占有を通知するメッセージを送信します。
相互排他は制限的な関係です。1 つまたは複数のプロセスがクリティカル エリアに入るとロックされます。このとき、他のプロセス (スレッド) はクリティカル エリアに入ることができません。そのプロセス (スレッド) が他のプロセス (スレッド) を使用して他のプロセス (スレッド) をロック解除する場合にのみ、クリティカル エリアに入ることができます。このテクニックはブロックすることでよく行われます。

重要なリソースと重要なセクション

重要なリソース

  • システム内の一部のリソースは、一度に 1 つのプロセスによってのみ使用が許可されており、そのようなリソースはクリティカル リソース、相互排他的リソース、または共有変数と呼ばれます。
  • このようなリソースの共有を実現するには、プロセス間で相互に排他的な方法を採用する必要があります。

クリティカルセクション

クリティカル セクションは、マルチスレッドまたはマルチプロセス環境で共有リソースにアクセスするコード セグメントまたは領域の部分を指します。クリティカル セクションでは、共有リソースへのアクセスは相互排他的であり、関連する操作を同時に実行するためにクリティカル セクションに入ることを許可されるのは 1 つのスレッドまたはプロセスのみであり、他のスレッドまたはプロセスは待機する必要があります。
クリティカル セクションの目的は、共有リソースへの同時アクセスが安全であることを確認し、競合状態やデータの不整合を回避することです。重要なセクションを保護する適切な同期メカニズムがなければ、複数のスレッドまたはプロセスが共有リソースに同時にアクセスすると、データの破損、一貫性のない結果、または予期しない動作が発生する可能性があります。

クリティカルセクションの問題

クリティカル セクションの問題とは、競合状態 (Race Condition)、デッドロック (Deadlock)、ライブロック (Livelock) など、マルチスレッドまたはマルチプロセス環境での共有リソースへのアクセスによって引き起こされる可能性のある一連の同時実行性の問題を指します。等
クリティカルセクションを解決する同期メカニズムは、次の 4 つのガイドラインに従う必要があります。
ここに画像の説明を挿入

セマフォの仕組み

信号量

セマフォ (セマフォ) は、共有リソースへのアクセスを制御するために使用される古典的な同期メカニズムです。これは、リソースに同時にアクセスするスレッドまたはプロセスの数を制限するために使用できるカウンターです。
セマフォには、P (待機、待機) と V (信号、信号) という 2 つの主な操作があります。

  • P (待機) 操作: スレッドまたはプロセスが共有リソースにアクセスしたい場合、最初に P 操作を実行して、アクセスを取得したいことを示します。セマフォのカウンタが 0 より大きい場合、つまり使用可能なリソースがある場合、カウンタは 1 減分され、スレッドまたはプロセスは実行を継続してリソースにアクセスできます。カウンタが 0 の場合は、使用可能なリソースがないことを示し、スレッドまたはプロセスはブロックされ、待機状態になります。
  • V (シグナリング) 操作: スレッドまたはプロセスが共有リソースへのアクセスを終了すると、V 操作を実行して、リソースを解放したことを示します。これにより、セマフォのカウンターが 1 つ増加します。リソースを待機している他のスレッドまたはプロセスがある場合、それらの 1 つが起動してアクセスを取得します。
    ここに画像の説明を挿入

整数セマフォ

整数変数をセマフォとして使用して、システム内の特定のリソースの数を示します。
操作は 3 つだけです: 初期化、P および V
欠点: プロセスがビジーであるなど。

//初始化整型信号量,表示当前的临界资源
int S = 1;

//P操作
void wait(int S){
    
    
	//检查临界资源是否被其他人持有
	while(S<=0);
	//如果资源满足就持有一个
	S--;
}

//V操作
void signal(int S){
    
    
	//使用完资源后释放资源
	S++;
}

レコードセマフォ

並行プログラミングでは、レコード セマフォ (レコード セマフォ) は特別なタイプのセマフォであり、アカウンティング セマフォとも呼ばれます。従来のバイナリ セマフォやカウント セマフォとは異なり、レコード セマフォは、リソースをカウントするだけでなく、各スレッドのリソース使用状況を追跡します。
操作: リソースのステータス、P および V を記録します。
整数値 S.value に加えて、各セマフォ S には、セマフォ内でブロックされている各プロセスの PCB を格納するプロセス待機キュー S.list もあります。

  • セマフォには、初期化と 2 つの標準プリミティブ PV を介してのみアクセスできます。プロセス スケジューリングによって中断されず、OS コア コードとして実行されます。
  • 初期化では、アイドル状態のリソース (「リソース セマフォ」とも呼ばれる) の合計数を示す、負ではない整数値を指定します。 - - 非負の値の場合は、現在のアイドル状態のリソースの数を示します。負の値。その絶対値は、プロセスが現在クリティカル セクション番号を待っていることを示します。
typedef struct{
    
    
	//剩余资源数
	int value;
	//等待队列
	struct process control_block *list;
}semaphore;

//请求一个资源
void wait(semaphore *S){
    
    
	//减少资源
	S->value--;
	if(S->value < 0 ){
    
    
		//进程自我阻塞
		block(S->list);
	}
}

//释放一个资源
void signal(semaphore *S){
    
    
	//资源增加一个
	S->value++;
	if(S.value <= 0 ){
    
    
		//唤醒等待队列中的一个进程
		wakeup(S.list);
	}
}

モニター

モニターは、データ構造と、同時プロセスによって (データ構造上で) 実行できる一連の操作 (関数) を定義します。この一連の操作により、プロセスを同期し、モニター内のデータを変更できます。

  1. 相互排除:
    • モニター内の変数には、モニター内の操作によってのみアクセスできます。
    • モニター内では常に 1 つのプロセスのみが動作します
    • コンパイラによって行われる
  2. 同期:
    • 条件変数
    • ウェイクアップおよびブロック操作

ここに画像の説明を挿入

第 5 章 メモリ管理

ここに画像の説明を挿入

プログラムのロードとリンク

ここに画像の説明を挿入

プログラムのロード

  1. 絶対ロード モード
    。つまり、コンパイル中に生成されるアドレスは絶対アドレスです。プログラムが変更されるたびに再コンパイルする必要があります。
  2. 再配置可能なロード方式 - 静的再配置 コンパイル
    されたオブジェクト モジュールは相対アドレスを使用します - プロセスのロード時に 1 回限りのアドレス変換が完了します
  3. 動的ランタイムでのロード方法
    コンパイルおよびリンク後にロードされたモジュールは相対アドレスを使用します。メモリにロードされた後も相対アドレスのままであり、レジスタの再配置の助けが必要です。

プログラムリンク

静的リンク

静的リンクでは、コンパイラはすべてのオブジェクト ファイルとライブラリ ファイルのコードとデータを 1 つの実行可能ファイルに結合します。この方法で生成された実行可能ファイルには、外部ライブラリ ファイルに依存せずに、必要なコードとデータがすべて含まれており、実行中に独立して実行できます。静的リンクの利点は、単純さ、独立性、外部依存関係の必要がないことですが、欠点は、実行可能ファイルが大きく、コードの冗長性と無駄が発生する可能性があることです。

ダイナミックリンク

動的リンクでは、コンパイラはプログラムが実行されるまでプログラムのオブジェクト ファイルおよびライブラリ ファイル内のシンボリック参照を未解決のままにし、リンカはそれをオペレーティング システムまたはランタイム環境の共有ライブラリ ファイルにリンクします。この方法で生成される実行可能ファイルは小さく、プログラムのコードとデータのみが含まれ、共有ライブラリ ファイルは実行時にシステムによってロードおよびリンクされるため、実行可能ファイルのサイズとメモリ使用量が削減されます。ダイナミック リンクの利点は、メモリとディスク領域が節約され、共有と更新が簡単であることですが、欠点は、外部の共有ライブラリ ファイルに依存する必要があり、バージョンと互換性によって制限される可能性があることです。

スワップアンドカバー

交換

スワッピングは、他のプロセスに十分なメイン メモリ領域を解放したり、メモリ リソースの動的割り当て要件を満たすために、プロセスをメイン メモリ (RAM) から補助ストレージ (ハードディスクなど) に一時的に移動する手法です。スワップ テクノロジを使用すると、オペレーティング システムは、プロセスのメモリ要件とシステム リソースの可用性に応じて、プロセスの一部またはすべてのページをメイン メモリから動的に削除できるため、システムのメモリ使用率が最適化されます。
ステップ:

  1. ページ置換: メイン メモリのスペースが不十分な場合、オペレーティング システムは、新しいページ用のスペースを確保するために、メイン メモリから削除する 1 つ以上のページを選択する必要があります。ページ置換アルゴリズムは、置換するページを選択するための決定アルゴリズムです。一般的なページ置換アルゴリズムには、最適、先入れ先出し (FIFO)、最後に未使用 (LRU)、クロックなどが含まれます。
  2. ページ スケジューリング: ページをメイン メモリから移動する必要がある場合、オペレーティング システムはページの内容を補助メモリに書き戻し、ページをメイン メモリに再ロードできるようにページの位置情報を記録する必要があります。将来必要になったときに。ページング アルゴリズムは、ページが補助記憶装置に書き戻されるタイミングと順序、およびページがメイン メモリに再ロードされるタイミングと場所を決定するために使用されます。
  3. ページのロード: ページを補助記憶装置からメイン メモリにロードする必要がある場合、オペレーティング システムは、ページのコンテンツをメイン メモリに読み取り、ページのステータス情報を更新する必要があります。通常、ページの読み込みには、補助記憶装置からの読み取り操作と、メイン メモリ内のページの割り当て操作が含まれます。

カバー

オーバーレイは、プロセスのさまざまな部分をメモリに交互にロードする手法です。メモリがプロセス全体を収容するのに十分でない場合、オペレーティング システムはプロセスを複数の論理セグメント (オーバーレイ) に分割し、毎回実行する必要がある部分のみをロードし、他の部分は外部メモリに保持します。 。プロセスの異なる部分を切り替えるとき、オペレーティング システムは適切な部分をメモリにロードし、前の部分を置き換えます。

スワップと上書きは、メモリ不足に対処するための 2 つの主な手法です。スワッピングはプロセス全体をメモリから外部メモリに移動することですが、オーバーレイはプロセスの異なる部分をメモリに交互にロードすることです。これらは、データの移動方法、遅延、システム パフォーマンス、プログラマの作業負荷が異なります。オペレーティング システムは、特定の状況と戦略に応じて適切なメモリ管理テクノロジを選択し、メモリ使用率とシステム パフォーマンスを最適化します。

動的パーティション割り当て

データ構造

  1. 空きパーティション テーブル
    - 1 つの空きパーティションが 1 つのエントリを占有します
    - 1 つのエントリにはパーティション番号、パーティション サイズ、パーティション開始アドレスが含まれます
  2. フリー パーティション チェーン
    - 双方向の単一リンク リスト構造

逐次検索に基づく動的割り当てアルゴリズム

FF - ファーストフィットアルゴリズム

アドレスがインクリメントされ、高いアドレスを持つ大きな空きパーティションが予約されます。
ここに画像の説明を挿入

NF - ループファーストフィットアルゴリズム

アドレスが増分され、空きパーティションがより均等に分散されます。
ここに画像の説明を挿入

BF - ベストフィットアルゴリズム

ここに画像の説明を挿入

WF - 最悪適合アルゴリズム

ここに画像の説明を挿入

インデックスベースの動的割り当てアルゴリズム

高速適応アルゴリズム

ここに画像の説明を挿入

バディシステム

ここに画像の説明を挿入

ハッシュアルゴリズム

ここに画像の説明を挿入

記憶の回復

  1. リカバリ領域は、挿入ポイントで前の空きパーティションに隣接しています。2 つの空きパーティションをマージし、パーティションのサイズを変更します。
  2. リカバリ領域は、挿入ポイントで最後の空きパーティションに隣接しています。2 つの空きパーティションをマージし、
    開始アドレスとパーティション サイズを変更します。
  3. 再利用された領域は、挿入ポイントの前後の 2 つの空き領域に同時に隣接しています。3 つの空き領域をマージし、
    領域の開始アドレスとサイズを変更します。
  4. リカバリ領域の前後に隣接する空きパーティションはありません。新しいエントリを作成し、リカバリ領域の開始アドレスとサイズを入力します。
    ここに画像の説明を挿入

ページングストレージ管理方式

ページと物理ブロック

  1. ページ: ページング ストレージ管理では、プロセスのアドレス空間を複数のページに分割し、各ページに番号、つまりページ番号を付けません。
  2. ページフレーム: メモリ空間もいくつかのブロックに分割されており、数字はページフレーム番号です
  3. ページ サイズ: 2 のべき乗である必要があります

アドレス構造

ここに画像の説明を挿入

ページテーブル

ページングの際、各プロセスはページ テーブルを持ち、ページ テーブルはメモリ内に常駐し、ページとページ フレーム間の対応関係のデータ構造を記録します。

  1. プロセスはページテーブルに対応します
  2. プロセスの各ページは、ページ テーブル エントリに対応します。
  3. 各ページテーブルエントリは「ページ番号」と「ブロック番号」で構成されます。
  4. ページテーブルは、プロセスページと実際に保存されているメモリブロック間の対応を記録します。

ページテーブルエントリのアドレス a = ページテーブル A のベースアドレス + ページ番号 n × エントリ w のバイト数

住所翻訳会社

システムは、メモリ内のページ テーブルの開始アドレスとページ テーブルの長さを格納するページ テーブル レジスタを設定します。ここに画像の説明を挿入

ここに画像の説明を挿入

速い時計

このメカニズムでは、各データ/命令アクセスには 2 つのメモリ アクセスが必要です。1 つはページ テーブルへのアクセス、もう 1 つはデータ/命令へのアクセスです。二重アクセス問題の解決策は、変換テーブル バッファ (TLB) または連想レジスタと呼ばれる、小さいながらも専用の高速ハードウェア バッファです。
ここに画像の説明を挿入
ここに画像の説明を挿入

2 レベルのページ テーブルとマルチレベルのページ テーブル

マルチレベルのページテーブルは無限の人形です
ここに画像の説明を挿入

セグメント化されたストレージ管理

アドバンテージ

  1. 簡単なプログラミング
  2. 情報の共有
  3. 情報保護
  4. ダイナミックリンク
  5. ダイナミックな成長

基本的

セグメント化されたストレージ管理では、ジョブのアドレス空間がいくつかのセグメントに分割され、各セグメントは一連の論理情報を定義します。各セグメントには
独自の名前があり、通常はセグメント名の代わりにセグメント番号が使用されます。セグメントの長さは、
対応する論理情報群の長さによって決まり、各セグメントの長さは異なります。
ここに画像の説明を挿入

セグメントテーブル

ページングシステムと同様に、システム内のプロセスごとにセグメントマッピングテーブル(セグメントテーブル)が確立され、論理セグメントから物理メモリ領域へのマッピングが実現されます。
各セグメントはテーブル内のエントリを占有し、メモリ内のセグメントの開始アドレス (ベース アドレス) とセグメントの長さが記録されます。セグメント テーブルはメモリに格納され、そのアドレスは制御レジスタによって保存されます

アドレス変換

ここに画像の説明を挿入

ページングとセグメンテーションの違い

ここに画像の説明を挿入
ここに画像の説明を挿入

セグメント化されたページングストレージ管理

セグメンテーションとページングの原則の組み合わせ。つまり、最初にユーザー プログラムをいくつかのセグメントに分割し、次に各セグメントを複数のページに分割し、各セグメントにセグメント名を割り当てます。

構造

ここに画像の説明を挿入

アドレス変換

ここに画像の説明を挿入

第 6 章 仮想ストレージ

地域性の原則

これは、プログラムがメモリにアクセスするとき、メモリに完全にランダムにアクセスするのではなく、最後のアクセスに比較的近いデータまたは命令にアクセスする可能性が高いことを意味します。

  1. 時間的局所性: プログラムが特定の時間に特定の記憶装置にアクセスする可能性が高いこと、つまり、記憶装置に一度アクセスすると、近い将来に再度アクセスされる可能性が高いことを意味します。
  2. 空間的局所性: プログラムが、特定の時刻に、特定のストレージ ユニットの近くのストレージ ユニットにアクセスする可能性が高いことを意味します。つまり、ストレージ ユニットに一度アクセスすると、その後はその近くのストレージ ユニットにアクセスされる可能性が高くなります。さて。

リクエストページングストレージ管理方式

リクエストページテーブルメカニズム

基本的な機能は依然として、ユーザー アドレス空間の論理アドレスをメモリ空間の物理アドレスにマップすることです
ここに画像の説明を挿入

  • ステータス ビット (存在ビット) P : ページがメモリにロードされているかどうかを示すために使用されます。
  • アクセスフィールド A : 一定期間内のこのページへのアクセス数を記録するために使用されます。
  • 変更ビット M : ページがメモリにロードされた後に変更されたかどうかを示します。
  • 外部メモリアドレス: 外部メモリ上のページのアドレスを指すために使用されます。

ページフォルト割り込みメカニズム

デマンドページング方式では、アクセスしようとするページがメモリ上に存在しない場合、ページフォルト割り込みが発生し、OSに対して不足しているページをメモリ上に転送するよう要求されます。
ページフォールト割り込みは特別な割り込みであり、主に次の 2 つの点で一般的な割り込みとは明らかに異なります。

  • 命令実行中に割り込み信号を生成して処理する
  • 命令は実行中に複数のページフォールト割り込みを生成する可能性があります

住所翻訳会社

ここに画像の説明を挿入

メモリ割り当て戦略とアルゴリズム

  1. ローカル置換による固定割り当て (ローカル置換による固定割り当て): 各プロセスには、プロセスの実行中に常に占有される固定数のページが割り当てられます。プロセスがさらに多くのページを必要とする場合、他のプロセスがページを解放するまで待つ必要があります。「ページフォールト」は、プロセスが固定されたページ割り当てよりも多くのページを必要とするときに発生します。
  2. グローバル置換による変数割り当て: この戦略では、すべてのプロセスが可変サイズのメモリ プールを共有します。プロセスがページを必要とする場合、オペレーティング システムはそのページに一定数のページを割り当てます。さらに多くのページが必要な場合は、メモリ プールからページを割り当てることができます。メモリプールに十分なページがない場合は、ページの置き換え(置き換え)が必要です。
  3. ローカル置換による変数割り当て: この戦略では、各プロセスは可変サイズのメモリ プールからページを割り当てることができます。プロセスにさらに多くのページが必要な場合は、メモリ プールからページを割り当てることができます。メモリプールに十分なページがない場合は、ページの置き換え(置き換え)が必要です。変数割り当てのグローバル構成とは異なり、各プロセスには独自のページ置換アルゴリズムがあります。つまり、プロセスがページ置換を実行する必要がある場合、すべてのプロセスのページではなく、そのプロセス内のページのみが考慮されます。
  1. 均等割り当てアルゴリズム: システム内のすべての利用可能な物理ブロックが各プロセスに均等に割り当てられます。
  2. 比例割り当てアルゴリズム: プロセスのサイズに応じて物理ブロックを比例的に割り当てます。
    ここに画像の説明を挿入
  3. 優先度を考慮した割り当てアルゴリズム: 2 つの部分に分けられ、1 つは比例的に割り当てられ、もう 1 つは各プロセスの優先度に応じて割り当てられます。

ページフォールト率

プロセスの論理空間に n ページがあり、割り当てられたメモリ物理ブロックが m (m<=n)、動作中に成功したページ アクセスの数が S、アクセスの失敗の数が F であると仮定します。ページ アクセスの総数プロセスの:
A =S+F
ページフォールト率: f=F/A;
影響要因:

  1. ページ サイズ: ページが大きいほどページ フォールト率は低くなり、それ以外の場合はページ フォールト率が高くなります。
  2. プロセスによって割り当てられる物理ブロックの数: 多いほど少なくなります。
  3. ページ置換アルゴリズム
  4. プログラムの本質的な機能

ページ置換アルゴリズム

最適なページ置換アルゴリズム (OPT)

置換が必要な各ページについて、最後に使用した時間が最も遠いページ、つまり、最も長期間アクセスされていないページを置換対象として選択します。これにより、置換されたページが再度アクセスされなくなり、ページ フォールトの数が最小限に抑えられます。このアルゴリズムは理論上のアルゴリズムであり、最適順列アルゴリズムですが、実際のオペレーティング システムに実装することはできません。
ここに画像の説明を挿入

先入れ先出しページ置換アルゴリズム (FIFO)

先入れ先出しページ置換アルゴリズム (FIFO) は単純なページ置換アルゴリズムであり、その中心的な考え方は、置換のために最初にメモリに入るページを選択することです。ページを置換する必要がある場合、メモリに最も早く入ったページが置換対象として選択されます。FIFO アルゴリズムでは、ページがメモリに入る時間のみが考慮され、ページの使用頻度や将来の使用の可能性などの要素は考慮されないため、パフォーマンスは比較的劣ります。
ここに画像の説明を挿入

最小ページ置換アルゴリズム (LFU)

最も頻繁に使用されない (Least Frequently Used、LFU) ページ置換アルゴリズムは、アクセスされるページの頻度に応じてページ置換を実行するアルゴリズムです。各ページのアクセス回数を維持し、最もアクセス頻度の低いページを見つけて差し替えるのが原則です。

クロックページ置換アルゴリズム

クロック アルゴリズムでは、ページは循環リンク リストに格納され、各ページにはアクセスされたビットと変更されたビットがあります。
ページを置換する必要がある場合、アルゴリズムはリンク リストの先頭からページをスキャンし、ページのアクセス済みビットが 0 (ページがアクセスされていないことを示す) の場合、ページは置換されます。アクセスされたビットが 1 の場合、ページがアクセスされたことを意味し、アクセスされたビットはクリアされ、ページはリンク リストの最後に移動されます。すべてのページのアクセスされたビットが 1 の場合、アルゴリズムはリンク リストの先頭からページをスキャンし、アクセスされたビットが 0 である最初のページを見つけて置換します。
シンプルな CLOCK アルゴリズムでは、使用ビットと呼ばれる追加ビットを各フレームに関連付けます。

  • ページが物理ブロックに収まる場合、位置 1 にアクセスします。
  • ページは物理ブロック内にあり、再度アクセスされているため、アクセス位置は 1 です。
  • ページが置換されると、ポインタは置換される次のページを指します。
  • ページは物理ブロック内にあり、再度アクセスされ、ポインタはアクセスされる次のページを指しています。
  • アクセスビットが 0 の場合、ページの置換が可能 ページの置換時に、アクセスビットが 0 に設定される まとめ :
    物理ブロックを 1 サイクルとみなし、アクセスビットが 0 の場合、置換が可能ポインタはページを見つけるかページを置き換えます アクセス位置は 1 ポインタは次の物理ブロックを指します
    (手描きは本当に疲れます)
    ここに画像の説明を挿入

クロックページ置換アルゴリズムの改善

改良されたクロック ページ置換アルゴリズムでは、ページがアクセスされた回数を記録する使用カウンターが導入されました。このアルゴリズムは、使用回数を除き、従来のクロック ページ置換アルゴリズムと同じように機能します。ページを置換する必要がある場合、アルゴリズムは現在のポインターの位置から検索を開始します。まずサークルを検索します。このサークル内で使用回数が 0 で最初にアクセスしたページを見つけます。そのようなページが見つかった場合、そのページが置換対象として選択されます。見つからない場合、アルゴリズムは 2 番目の検索段階に入ります。このサークル内で使用回数が 1 のページを置換対象として選択します。第 2 段階の検索でも、まずサークルが検索され、そのサークル内で使用回数が 1 のページが選択されます。
ここに画像の説明を挿入

ページングアルゴリズム

ページ バッファリング アルゴリズムは、コンピュータのメモリ内のデータのページまたはブロックを管理するためのアルゴリズムです。メモリ内のデータのページまたはブロックの数を最小限に抑え、最も頻繁に使用されるデータのページまたはブロックを常に迅速に利用できるようにすることを目的としています。アクセス。このアルゴリズムは、データベース管理システムのキャッシュ メカニズムで一般的に使用されます。
ページ バッファリング アルゴリズムの主なアイデアは、メモリを固定サイズのブロックに分割し、ページまたはデータのブロックをブロックに保存することです。特定のページまたはデータ ブロックにアクセスする必要がある場合、アルゴリズムはまずページまたはデータ ブロックが既にメモリ内にあるかどうかを確認し、存在する場合はそのページまたはデータ ブロックに直接アクセスします。そうでない場合は、ページまたはデータ ブロックを削除する必要があります。ディスクからのデータ ブロックがメモリに読み取られ、メモリ内のブロックに格納されます。

第7章 入出力システム

I/O システム階層

ここに画像の説明を挿入
デバイス ドライバーは、デバイス レジスタへのコマンドやデータの書き込みなど、ハードウェア デバイスとの直接対話を担当します。
ユーザー層ソフトウェアは、ユーザーが特定のデバイスを使用する権利を持っているかどうかを確認するなど、ユーザーの権利を管理および検証する責任を負い、デバイス ドライバーは、コマンドやデータをデバイス レジスタに書き込むなど、ハードウェア デバイスとの直接対話を担当します。 。
デバイスに依存しないソフトウェアは、バッファ管理、データのキャッシュとスケジューリングなど、デバイスに依存しない操作を処理します。

I/Oシステムインターフェース

ここに画像の説明を挿入

I/Oデバイスとデバイスコントローラ

分類

ここに画像の説明を挿入
デバイスはCPUと直接通信するのではなく、デバイスコントローラと通信するため、デバイスとデバイスコントローラの間にインターフェースが必要となり、3種類の信号はそれぞれインターフェース内の信号線に対応します。
ここに画像の説明を挿入

デバイスコントローラー

関数

  1. 主な機能: 1 つ以上の I/O デバイスを制御して、I/O デバイスとコンピュータ間のデータ交換を実現します。
  2. デバイス コントローラーは CPU と /O デバイス間のインターフェイスであり、CPU からコマンドを受け取り、I/O デバイスの動作を制御します。
  3. デバイス コントローラはアドレス指定可能なデバイスです。1
    つのデバイスのみを制御する場合、一意のデバイス アドレスは 1 つだけです。
    コントローラが複数のデバイスに接続できる場合は、複数のデバイス アドレスを含める必要があり、各デバイス アドレスは機器に対応します

構成

デバイス コントローラとプロセッサ間のインターフェイス: データ ライン、アドレス ライン、制御ラインを含む CPU とデバイス コントローラ間の通信を実現します デバイス コントローラとデバイス間のインターフェイス: 1 つのデバイス コントローラは 1 つ以上のデバイスを接続でき
ます
I/O O ロジック: デバイスの制御を実現します。
ここに画像の説明を挿入
ドライバは抽象的な I/O コマンドを特定のコマンドやパラメータなどに変換し、デバイス コントローラの対応するレジスタにロードします。コントローラはこれらのコマンドを実行して、 I/Oデバイスの制御。

I/O通道

コンセプト

I/O チャネル (I/O チャネル) は、コンピュータ システムにおける入出力操作を抽象化したものです。これは、さまざまなタイプの入出力デバイスに均一な方法でアクセスするメカニズムを提供し、プログラムがこれらのデバイスと対話できるようにします。チャネルプログラムの実行によるI/0動作の制御

タイプ

バイトマルチプレクサ

ここに画像の説明を挿入

アレイ選択チャネル

ここに画像の説明を挿入

アレイマルチプレクス

ここに画像の説明を挿入

ボトルネックの問題

理由: チャネルは高価であるため、チャネルが不十分だとボトルネックの問題が発生します

  1. チャネルを追加せずにデバイスと CPU 間のパスを増やす
  2. マルチチャンネル方式は「ボトルネック」問題を解決するだけでなく、システムの信頼性も向上します。

シングルパスとマルチパス

単一チャンネル

ここに画像の説明を挿入

マルチチャンネル

ここに画像の説明を挿入

I/Oデバイスの制御方法

ポーリングプログラマブル I/O モード

シリアル操作 - プロセス全体に CPU の介入が必要です

割り込みプログラマブル I/O モード

並列操作 - 開始と終了の場合のみ CPU 介入が必要です

ダイレクト メモリ アクセス (DMA)

ブロックデバイスのメインI/O制御は主にDMAモードを採用

ここに画像の説明を挿入

I/Oチャネルモード

複数のデータ ブロックを転送する場合にのみ介入 - 必要な CPU 介入は最小限に抑えられます

割り込みと割り込みハンドラー

邪魔をして

コンセプト

中断とは、コンピュータの実行中に、現在実行中の命令とは関係のないイベントが発生し、現在の命令の実行を直ちに中断し、代わりにイベントを処理する必要があることを意味します。割り込みが発生すると、コンピュータは現在の実行プロセスを一時停止し、現在のコンテキスト (プログラム カウンタ、レジスタなど) を保存し、割り込みハンドラにジャンプして対応する操作を実行します。割り込みメカニズムにより、コンピュータ システムの同時実行性と応答性が向上します。
割り込みは外部イベントによってトリガーされ、現在の命令とは関係のないイベントを処理するために使用されますが、トラップはシステム コールや例外処理などの操作のためにプログラムによって内部的にトリガーされます。

割り込みベクタテーブル

割り込みベクタ テーブルには、各デバイスの割り込みハンドラのエントリ アドレスが格納され、割り込みベクタ テーブルのエントリに対応する、各デバイスの割り込み要求の割り込み番号として機能します。

割り込み優先度

システムは割り込みソースごとに異なる優先順位を指定します。

複数の割り込みソースの処理

ここに画像の説明を挿入

割り込みハンドラ

ここに画像の説明を挿入

機器の流通とリサイクル

分配

ステップ

  1. デバイス要求: プロセスは、特定のデバイスまたはデバイスのクラスにアクセスするための要求をオペレーティング システムに送信します。
  2. デバイス割り当て戦略: オペレーティング システムは、デバイスの特性と現在のシステム状態に基づいて、適切なデバイス割り当て戦略を選択します。一般的な戦略には、先着順サービス (FCFS)、最短ジョブ優先 (SJF)、優先順位などが含まれます。
  3. デバイスの割り当て: オペレーティング システムは、要求されたデバイスをプロセスに割り当て、プロセスとデバイス間の接続を確立して、プロセスが入出力操作にデバイスを使用できるようにします。

デバイス割り当てアルゴリズム

FCFS - 先着順サービスのアルゴリズム

デバイスが要求された順序でデバイス リソースが割り当てられます。つまり、最初に到着したプロセスまたはユーザーがデバイスを使用する権利を最初に取得します。
FCFS アルゴリズムは次のように機能します。

  1. プロセスまたはユーザーがデバイスの使用を要求すると、オペレーティング システムはそのデバイスをデバイス要求キューの最後に追加します。
  2. 現在のデバイスが空いている場合、オペレーティング システムはそのデバイスをキュー内の最初のプロセスまたはユーザーに割り当て、デバイス操作の実行を開始します。
  3. デバイスの操作が完了すると、オペレーティング システムはプロセスまたはユーザーをキューから削除し、デバイスのリソースを解放し、次の要求プロセスまたはユーザーにデバイスを割り当てます。
  4. このプロセスは、デバイス要求キューが空になるまでループします。

FCFS アルゴリズムはシンプルさと直観性を特徴としており、リクエストの順序でデバイスを割り当てるため、公平で優先順位がありません。ただし、長時間のジョブでは待機時間が増加し、「飢餓」問題が発生する可能性があります。長時間実行されるプロセスが最初にデバイスを要求すると、後続の短いジョブが長時間待機してブロックされる可能性があるためです。

HPF - 最も優先度の高い最初のアルゴリズム

プロセスやジョブの優先度に応じて、デバイスリソースの割り当て順序を決定します。最も優先度の高いプロセスまたはジョブが最初にデバイスにアクセスします。
HPF アルゴリズムは次のように機能します。

  1. プロセスまたはジョブがデバイスの使用を要求すると、オペレーティング システムはその優先度に従ってデバイスを対応する優先キューに挿入します。通常、優先度の高いプロセスがキューの先頭に挿入されます。
  2. 現在のデバイスが空いている場合、オペレーティング システムはそのデバイスを最も優先度の高いプロセスまたはジョブに割り当て、デバイス操作の実行を開始します。
  3. デバイスの操作が完了すると、オペレーティング システムは、同じ優先度のキュー内の次のプロセスまたはジョブにデバイスを割り当て続けるか、スケジューリング ポリシーに従って、より高い優先度のキュー内のプロセスまたはジョブに切り替えるかを決定します。
  4. このプロセスは、すべてのキューが空になるか、システム内に優先度の高いプロセスやジョブがなくなるまでループします。

HPFアルゴリズムの特徴は、優先度に応じて機器を割り当てることであり、優先度の高いプロセスやジョブほど実行優先度が高くなります。リアルタイム システムなど、優先度の高いタスクへの迅速な応答が必要なシナリオに適しています。ただし、システム内に長時間実行される優先度の低いタスクが存在する場合、優先度の低いタスクがデバイスのリソースを長時間待機することになり、リソースの無駄が発生したり、優先度の低いタスクが遅延したりする可能性があります。

リサイクル

  1. デバイスの解放: プロセスがデバイスの使用を終了すると、デバイスを解放し、オペレーティング システムに通知します。
  2. デバイスのリサイクル ポリシー: デバイスのリサイクル ポリシーに従って、オペレーティング システムは、デバイス リソースをすぐに再利用するか、他のプロセスで使用するためにリサイクルを遅らせるかを決定します。
  3. デバイスの再利用: オペレーティング システムは、解放されたデバイス リソースを再利用し、他のプロセスがそれらを再度要求できるように、それらを使用可能としてマークします。

スプールシステム

SPOOLing - スプーリング技術

CPUの高速性とI/O機器の低速性との矛盾を緩和するために、オフライン入力・オフライン出力技術が導入されています。

  • オフライン入力時に周辺制御マシンの機能をシミュレートするプログラムを使用し、低速I/Oデバイス上のデータを高速ディスクに転送します。
  • 別のプログラムを使用して、オフライン出力中に周辺制御マシンの機能をシミュレートし、ディスクから低速出力デバイスにデータを転送します

CPUによるデータ処理と同時に周辺動作を行うことをSPOOLing(Simultaneous Peripheral Operations On-Line)、またはスプーリング技術と呼びます。

システム構成

ここに画像の説明を挿入
ここに画像の説明を挿入

スプーリング システムの仕組み

ここに画像の説明を挿入

特徴

  1. I/O速度の向上
  2. 専用デバイスを共有デバイスに変える
  3. 仮想デバイス機能を実現

SPOOLing テクノロジー - プリンターの例

プリンターは専用の装置です。SPOOLing技術を利用することで、複数のユーザーが共有できるデバイスに変えることができるため、デバイスの稼働率が向上し、ユーザーの利便性が向上します。
ここに画像の説明を挿入
複数のユーザー プロセスが出力印刷を要求した場合、システムはその要求を許可しますが、プリンターをすぐには割り当てませんが、スプール管理プロセスは次の作業を完了します。

  1. ディスク バッファ内のプロセス用の空きバッファを申請し、印刷するデータを一時ストレージとしてそこに送信します。
  2. ユーザープロセスの空のユーザー要求印刷フォームを申請し、ユーザーの印刷要件を記入して、フォームをスプールファイルキューに変更します。
  3. プリンタがアイドル状態のとき、スプール印刷プロセスはスプール ファイル キューの先頭から印刷要求テーブルを取り出し、テーブルの要件に従って印刷対象のデータを出力ウェルから出力バッファに転送します。そしてそれを印刷のためにプリンターに送ります。
  4. この方法ですべての印刷ジョブを一度に処理します

このシステムは主に次の 3 つの部分で構成されます。

  1. ディスクバッファ
  2. プリントバッファ
  3. スプール管理プロセスとスプール印刷プロセス

緩衝地帯

バッファ管理の主な目的は、データの読み取りおよび書き込み操作を最適化して、基盤となるストレージ デバイスへのアクセス数と待ち時間を削減することです。これは、次の側面を通じて実現されます。

  1. キャッシュ: バッファ管理では、キャッシュ メカニズムを使用して頻繁にアクセスされるデータをメモリにキャッシュし、高速アクセスを提供します。アプリケーションがデータを読み取る必要がある場合、最初にバッファ内を検索し、見つかった場合は直接返すため、基礎となるストレージ デバイスへのアクセスが軽減されます。
  2. 先読みと先書き: バッファ管理では、先読みと先書きを通じてバッファにデータを読み込んだり、ストレージ デバイスにデータを事前に書き込んだりして、実際の読み書き操作の遅延を軽減できます。先読みでは、アプリケーションがデータにアクセスする前にデータをバッファーに事前にロードできるため、データの可用性と応答速度が向上します。先行書き込みでは、データをメモリにバッファリングし、定期的にデータをバッチでストレージ デバイスに書き込むことができるため、実際の書き込み操作の数と遅延が削減されます。
  3. バッファ置換戦略: バッファ スペースが限られている場合、バッファ管理は適切なバッファ置換戦略を選択して、どのデータをバッファに保持するか、どのデータを置換するかを決定する必要があります。一般的なバッファ置換戦略には、最も最近使用されていない (LRU)、先入れ先出し (FIFO)、および最も使用頻度が低い (LFU) などがあります。
  4. 同期操作と非同期操作: バッファ管理では、同期操作と非同期操作を通じてデータの読み取りと書き込みを制御できます。同期操作では、アプリケーションは続行する前にデータの読み取りまたは書き込みが完了するまで待機する必要がありますが、非同期操作では、アプリケーションはデータ操作の完了を待たずに他のタスクを続行できます。

一般に、バッファ管理はオペレーティング システムにおいて重要な役割を果たしており、バッファ リソースを合理的に管理することでデータ アクセスの効率とパフォーマンスを向上させ、システム全体の運用効果を向上させます。

関数

  1. CPU と I/O デバイス間の速度の不一致を軽減します。
  2. CPUの割り込み頻度を減らし、CPU割り込み応答時間の制限を緩和します。
  3. データ粒度の不一致の問題を解決し、CPU と I/O デバイス間の並列性を向上させます。

分類

シングルバッファ
ダブルバッファ
リングバッファ
バッファプール

ディスク

ディスク構造

ディスク表面 (ヘッド): ディスク デバイスには 1 つ以上のディスクを含めることができます。各ディスクは 1 つまたは 2 つのディスク表面に分割され、各表面には読み取り/書き込みヘッド トラック (円筒面) があります。各ディスク表面は複数のストリップに分割できます
。トラック
セクター: 各トラックは論理的に同じサイズの複数のセクターに分割されます。各セクターのサイズはディスク ブロック (データ ブロック) に相当します。
各トラックには同じ数のバイナリ ビットを保存できます。
ディスク密度は、各インチに保存されるビット数です。明らかに、内側のトラックの密度は、アウタートラックに比べて密度が高く、高密度です。

ディスクアクセス時間

ここに画像の説明を挿入

ディスク スケジューリング アルゴリズム

ディスク スケジューリング アルゴリズムとは、ディスク アクセス要求の順序を決定するためにオペレーティング システムで使用されるアルゴリズムを指します。ディスク スケジューリング アルゴリズムの目標は、ディスク アクセス効率を最適化し、ディスク アクセスの平均応答時間と待機時間を短縮することです。したがって、ディスクスケジューリングの目標は、ディスクの平均シーク時間を最小限に抑えることです。 ]

早い者勝ち (FCFS)

最も単純なディスクスケジューリングアルゴリズム
プロセスがディスクへのアクセスを要求した順序に従ってスケジューリングする 利点
:公平かつシンプルで、各プロセスの要求を順番に処理でき、プロセスの要求が長時間満たされない状況が発生しない
欠点: シークが最適化されていないため、平均シーク時間が長くなる可能性があります。
FCFS は、ディスク I/O を要求するプロセスの数が少ない場合にのみ適しています。
アクセス要求されたトラックが比較的集中している場合、アルゴリズムのパフォーマンスは許容範囲内ですが、アクセス要求されたトラックが分散している場合、アルゴリズムのパフォーマンスは低下します。

最短シーク時間優先 (SSTF)

現在のトラックに最も近いリクエストを処理対象として選択します。このアルゴリズムにより、磁気ヘッドのシーク距離が短縮され、ディスクのアクセス効率が向上します。
パフォーマンスが良く、平均シーク時間が短いと「スタベーション」現象が発生する可能性があります

例: アクセスする必要があるトラック番号は 10、28、48、39、100、124、37、69 です。現在のヘッドは 50 にあり、SSTF によれば、最も近い
番号 48 にアクセスします。番号 48、48 に最も近い人を確認します。誰が訪問しても - 近接の原則により、頭から遠いトラックにアクセスするには時間がかかり、飢餓が発生する可能性があります。

スキャンアルゴリズム (SCAN)

ヘッドはディスクの境界に達するまで一方向にトラックを順番に訪問し、その後方向を変えてアクセスを続けます。このアルゴリズムにより、ヘッドの頻繁な移動が回避されますが、一部のトラックではアクセス遅延が長くなる可能性があります。


例: アクセスする必要があるトラック番号は 10、28、48、39、100、124、37、69 で、現在のヘッドは 50 であり、トラック番号が増加する方向にヘッドは移動します。、トラック番号は小さいものから大きいものへソートする必要があります。現在のトラック番号は分離され、磁気ヘッドの移動方向に沿ってアクセスされ、端に達すると反転します: ソート: 10、28、37、39
、 48、69、100、124
アクセスシーケンス: 69、100、124、48、39、37、28、10

サイクリックスキャンアルゴリズム(C-SCAN)

スキャン アルゴリズムと同様に、ヘッドは特定の方向に移動し、その移動に合わせてリクエストが継続的に処理されます。ただし、磁気ヘッドがアクセス対象の最外周トラックに移動すると、すぐにアクセス対象の最内周トラックに戻り、戻る際にはリクエストは処理されない。シリンダーをチェーンとして扱い、最後のシリンダーを最初のシリンダーに接続します。これにより、トラック全体でのアクセス時間がより均一になります。


例: アクセスする必要があるトラック番号は 10、28、48、39、100、124、37、69 で、現在のヘッドは 50 であり、トラック番号が増加する方向にヘッドは移動します。、トラック番号は小さいものから大きいものへソートする必要があります。現在のトラック番号は分離され、磁気ヘッドの移動方向に沿ってアクセスされ、端に達すると反転します: ソート: 10、28、37、39
、 48、69、100、124
アクセスシーケンス: 69、100、124、10、28、37、39、48

最適(最適)アルゴリズム(OPT)

今後のディスクアクセス状況に応じて、最適なトラックを選択してアクセスします。このアルゴリズムは将来のリクエストを予測する必要があるため、実際の実装は困難ですが、ディスク スケジューリング アルゴリズムの理想的な標準として評価できます。

NStepScan スケジューリング アルゴリズムと FSCAN スケジューリング アルゴリズム

ここに画像の説明を挿入

第8章 文書管理システム

ファイルシステム階層

  1. I/O 制御層: ファイル システムの最下位層であり、ディスク ドライバーで構成されます。
  2. 基本ファイル システム: メモリとディスク間のデータ ブロックの交換を実現するために使用されます。
  3. ファイル編成モジュール: ディスク I/O に関連する完全なトランザクション
  4. 論理ファイル システム: ファイルに関連する操作を処理および記録します。
    ここに画像の説明を挿入

ファイルの論理構造

分類

ここに画像の説明を挿入

シーケンスファイル

配置

文字列構造:保存時刻に従ってソートされ、レコードの順序はキーワードとは関係ありません - 検索に時間がかかります シーケンシャル
構造:フィールドをキーワードとして指定し、すべてのレコードがキーワードでソートされます - 効果的な検索アルゴリズムが使用できます検索にはハーフサーチ方式、補間サーチ方式、スキップサーチ方式などがあります。

長所と短所

長所:
最高の効率で大量のレコードの読み取りと書き込みを行うことが有利です。
順次ストレージ デバイス (テープ) に保存できます。短所
:
単一レコードの検索または変更:不十分です
。レコードの追加または削除: 困難です
。たとえば、シーケンシャル ファイルに 10,000 レコードがある場合、シーケンシャル検索メソッドを使用して指定されたレコードを検索します。これは平均 5,000 回検索する必要があります。
(統計結果)

レコードのアドレス指定

  1. 暗黙的なアドレッシング
    Rptr、Wptr为读、写指针,L为记录的长度
    固定長レコード: 次のレコードのアドレス Rptr=Rptr+L / Wptr=Wptr+L
    可変長レコード: 次のレコードのアドレス Rptr=Rptr+L; / Wptr=Wptr+Li
  2. キーワードを使用した
    ファイルに記録された場所による明示的なアドレス指定

    ここに画像の説明を挿入

インデックスファイル

  1. キーワードによるインデックスの作成
    可変長レコード ファイルのインデックス テーブルを作成し、
    キーワードによってインデックス テーブルをソートし
    て直接アクセスを実現します
    本身是一个定长记录的顺序文件
  2. 複数のインデックステーブルを持つインデックスファイル
    順編成ファイルのインデックステーブルを複数
    作成 検索条件となるデータ項目ごとにインデックステーブルを設定

インデックスシーケンスファイル

これにより、可変長レコード ファイルは直接アクセスには不便であるという欠点が効果的に克服されます。
シーケンシャル ファイルの重要な機能は維持され、レコードはキーの順序で編成されます。
第 1 レベルのディレクトリの平均ディスクアクセス数 = ディスクブロック数の 1/2
ここに画像の説明を挿入
ここに画像の説明を挿入

ファイルディレクトリ

ファイル ディレクトリはデータ構造でもあり、主に名前によるアクセスを実現するために、システム内のファイルとその物理アドレスを取得用にマークするために使用されます。

ファイル制御ブロック (FCB) と i ノード

ファイル コントロール ブロック (FCB): ファイルのデータ構造を管理および制御し、ファイルに 1 つずつ対応します
ファイル ディレクトリ: ファイル コントロール ブロックの集合、つまりファイル コントロール ブロックはファイル ディレクトリ
アイテムディレクトリ ファイル: ファイルディレクトリもドキュメントとみなされます

FCBに含まれる情報

  1. 基本情報カテゴリ: ファイル名、ファイルの物理的位置、ファイルの論理構造、ファイルの物理構造
  2. アクセス制御情報カテゴリ:ファイル所有者のアクセス権、承認されたユーザーのアクセス権、一般ユーザーのアクセス権
  3. 利用情報カテゴリ:ファイルの作成日時、ファイルの最終変更日時、現在の利用情報

インデックスノード

ここに画像の説明を挿入

ディレクトリ構造

単一レベルのディレクトリ: すべてのユーザー ファイルは同じディレクトリ内にあり、システム全体にはディレクトリ テーブルが 1 つだけあり、各ファイルはディレクトリ エントリを占有します。
2 レベルのファイル ディレクトリ:

  • MFD: メイン ファイル ディレクトリ。ユーザー名と、対応するユーザー ファイル ディレクトリの保存場所が記録されます。
  • UFD: ユーザー ファイル ディレクトリ。ユーザーのファイル FCB で構成されます。

ツリー構造: ファイル管理のツリー ディレクトリ構造は一般的なファイル編成方法であり、ツリー構造を使用してファイル システム内のファイルとディレクトリ間の階層関係を表します。

ツリー構造

  1. ルート ディレクトリ: ルート ディレクトリは、ツリー ディレクトリ構造の最上位ディレクトリであり、ファイル システム全体の開始点です。ルート ディレクトリには、複数のサブディレクトリとファイルを含めることができます。
  2. ディレクトリ: ディレクトリは、ファイルを整理して保存するためのファイル システム内のコンテナです。各ディレクトリには他のディレクトリやファイルを含めることができ、ディレクトリ階層を形成します。ディレクトリを使用してファイルを分類、分類、管理することができ、より優れた整理と検索機能を提供します。
  3. サブディレクトリ: サブディレクトリは、他のディレクトリ内にあるディレクトリであり、ディレクトリ階層を拡張します。サブディレクトリにはさらに他のサブディレクトリやファイルを含めることができ、より深い階層を形成します。
  4. ファイル: ファイルは、テキスト ファイル、画像ファイル、実行可能ファイルなどのデータを保存するエンティティです。ファイルはディレクトリに保存され、ディレクトリ階層を通じて検索してアクセスできます。
  5. パス (Path): パスは、ツリー ディレクトリ構造内のファイルまたはディレクトリの場所を一意に識別するために使用される文字列です。これは、ルート ディレクトリからターゲット ファイルまたはディレクトリまでの一連のディレクトリ階層で構成され、通常は区切り文字としてスラッシュ (/) が使用されます。
  6. ディレクトリの作成と削除: ツリー ディレクトリ構造により、ユーザーは新しいディレクトリを作成したり、既存のディレクトリを削除したりできます。ディレクトリは、オペレーティング システムが提供するコマンドまたはファイル管理インターフェイスを通じて作成および削除できます。
  7. ファイルまたはディレクトリの移動と名前変更: ツリー構造のディレクトリ構造により、ユーザーはファイルまたはディレクトリを別の場所に移動したり、ファイルまたはディレクトリの名前を変更したりできます。このようにして、さまざまなニーズに合わせてファイルとディレクトリを編成および管理できます。
  8. ファイルとディレクトリの権限管理: ツリー ディレクトリ構造は権限制御メカニズムを適用して、ファイルとディレクトリのアクセスと操作を制限できます。ユーザーは、権限設定を通じて機密ファイルとディレクトリのセキュリティを保護できます。
    (Bツリーの匂いがする)
    ここに画像の説明を挿入

ファイル共有

  1. 有向非巡回グラフの実装: ツリー ディレクトリでは、ファイルは複数の親ディレクトリを持つことができ、ファイル ディレクトリにはファイルの物理アドレスなどの情報が含まれます。インデックス ノードを使用して共有を実現し、リンク数を設定します。
  2. シンボリック リンクの実装: ファイルに複数の親ディレクトリを持つことができますが、そのうちの 1 つだけがメインの親ディレクトリであり、他のディレクトリはシンボリック リンクを通じてそのディレクトリにリンクされます。

ファイル保護

アクセス マトリックスを使用してシステムのアクセス制御を記述する

権限

  1. コピー権
    コピー権を使用して、フィールドが所有するアクセス(ii)を同じ列内の他のフィールドに拡張します。
  2. 所有権
    所有権 (所有者権限) を使用して、特定のアクセス権を増加または削除します。
  3. 制御権は、
    マトリックス内の同じ行 (ドメイン) のアクセス権を変更するために使用されます。つまり、ドメイン内で実行されているプロセスのアクセス権を別のオブジェクトに変更します。

第 9 章 ディスクストレージの管理

外部ストレージの構成

継続的な組織

ファイルごとに連続した (連続した) ディスク ブロックのセットを割り当てます
。利点:

  • 順次アクセスは簡単です - 開始ブロック番号と長さだけが必要です
  • シーケンシャルアクセスは高速です。頭の動きは最小限で、最速です。
  • ランダムアクセスをサポート

欠点:

  • 連続したストレージ領域を割り当てる必要があるため、多くの外部フラグメントが生成されるため、外部ストレージ領域の使用率が低くなります
  • ファイルの長さを事前に知っておく必要がある
  • レコードの削除と挿入に柔軟性がない
  • ファイルは動的に拡張できません

リンク組織

ファイルに不連続なディスク ブロックを割り当て、リンク ポインターを介してファイルのすべてのディスク ブロックをリンクします。形成された物理ファイルは、リンク ファイルと呼ばれます。 リンク メソッド
:

  • 暗黙的リンク: ポインタは各ディスク ブロックに保存され、順次アクセスにのみ適しています。
  • 明示的リンク: ポインタはメモリのファイル割り当てテーブル FAT に明示的に保存されます。

アドバンテージ:

  • ディスクの外部断片化を排除し、外部メモリの使用率を向上させます。
  • レコードの挿入、削除、変更が非常に簡単です
  • ファイルは動的に増加する可能性があります

インデックスの構成

システムはファイルごとにインデックス テーブルを作成し、インデックス テーブルにはファイルに対応する各物理ブロックが記録されます。インデックステーブルに格納されるディスクブロックをインデックスブロックと呼びます。ファイルデータが保存されているディスクブロックをデータブロックと呼びます。

  1. リンク方法: インデックス テーブルが大きすぎて 1 つのインデックス ブロックに収まらない場合は、複数のインデックス ブロックをリンクして保存できます。
    欠点: ファイルが非常に大きく、インデックス テーブルが非常に長い場合、多くのインデックス ブロックをリンクする必要があります。インデックス ブロック i を見つけるには、まずインデックス ブロック 0~i-1 を一度に読み取る必要があります
    。ディスクI/Oが多すぎて検索効率が低い
  2. マルチレベル インデックス: 第 1 レベルのインデックス ブロックが第 2 レベルのインデックス ブロックを指すように、マルチレベル インデックスを確立します。ファイルが非常に大きい場合は、3、4、またはそれ以上のレベルのインデックス作成も使用できます。K レベルのインデックス構造が採用され、トップレベルのインデックス テーブルがメモリにロードされない場合、データ ブロックにアクセスするために必要なのは K+1 回のディスク読み取り操作のみです。 欠点: 小さなファイルであっても、データにアクセスする必要があります。ブロックには引き続き
    K+1 ディスク読み取り操作が必要です
  3. 増分インデックス作成: さまざまなインデックス作成方法を組み合わせたもの。たとえば、ファイルのトップレベルのインデックス テーブルには、直接アドレス指定 (データ ブロックを直接指す)、一次間接指定 (単一レベルのインデックス テーブルを指す)、および二次間接指定 (2 レベルのインデックス テーブルを指す) の両方が含まれます。 )
    など: 小規模および中規模のファイルの場合、データ ブロックにアクセスするために必要なディスク時間は少なくなります。

ファイルストレージスペースの管理

  1. 空き領域テーブル方式
    システムは、外部メモリ上のすべての空き領域の空きリストを作成します。これは連続割り当て方式に属します。
  2. フリーリスト方式
    ここに画像の説明を挿入
    ここに画像の説明を挿入
  3. グループチェーン
    ここに画像の説明を挿入
  4. ビットマップ
    ビットマップの方が重要なので、個別に取り出してください

ビットマップ

バイナリ ビットを使用して、ディスク内のディスク ブロックの使用状況を示します
。値が 0 の場合は、対応するディスク ブロックが空いていることを意味します
。値が 1 の場合は、割り当てられていることを意味します。

ディスク上のすべてのディスク ブロックには、それらに対応するバイナリ ビットがあるため、すべてのディスク ブロックに対応するビットのセットが形成されます。これは、ビットマップ ブロック番号と呼ばれます: b=n(i-1)+j —— n は次のとおりです
ここに画像の説明を挿入
。各行の桁数
とブロック番号 b に対応する行番号 i と列番号 j
i=(b-1)/n+1
j=(b-1)/n+1

ディスク割り当て

  1. ビットマップを順番にスキャンして、値が 0 のバイナリ ビットまたはビットのグループを見つけます。
  2. 見つかった 1 つまたはバイナリ ビットのグループを、対応するディスク ブロック番号に変換します。見つかった値が 0 のバイナリ ビットがビットマップの i 番目の行と列に位置し、それに対応するディスク ブロック番号が b=n(i-1)+j であると仮定します。
  3. ビットマップを変更し、map[i, j]=1 にします。

ディスクのリサイクル

  1. 復元したディスクブロックのディスクブロック番号 b をビットマップの行番号と列番号に変換
    i = (b - 1 ) / n + 1
    j=(b - 1 ) % n + 1
  2. ビットマップを変更します。map[i , j] = 0 とします。

オペレーティング システムに関係する数式オペレーティング システムに関係する数式

おすすめ

転載: blog.csdn.net/weixin_53811934/article/details/131404363