グースファクトリーアタックOSシリーズ(2):3つの進歩

グースファクトリーアタックOSシリーズ(2):3つの進歩

今日は風が強くて美しいです。家にしゃがんだり、10時の3分の間に笛を聞いたりしたので、山や川が何世代にもわたって無害であることを願っていました。
午後にドラマが終わった後、一時的にドラマはなくなり、家で勉強して次の面接をするようにggに告げたところ、彼に書いた方がいいとのことでした、ははは、今日もハイディラオを食べる日です。
午後に目が覚め、ようやく今朝のブログが完成しました。

1.最初の知り合いのプロセス

1.プロセスとは

プロセスの古典的な定義は、実行中のプログラムのインスタンスですシステム内のすべてのプログラムは特定のプロセスのコンテキストで実行されます。OSを学習すると、教科書に記載されているコンテキストの概念がよく見られます。実際、コンテキストは、プログラムが正しく実行するために必要な状態で構成されています。この状態には、メモリに格納されたプログラムのコードとデータ、そのスタック、汎用レジスターの内容、プログラムカウンター、環境変数、および開いているファイル記述子のセットが含まれます。

プロセスはプログラムのインスタンスと見なすことができます。ほとんどのプログラムは同時に複数のインスタンスプロセスを実行できます(メモ帳、描画、ブラウザなど)。一部のプログラムは1つのインスタンスプロセスしか開始できません(NetEase Cloud Music、360 Security Guardなど)。

プロセスは、リソースの割り当てとスケジューリングのためのシステムの独立したユニットであり、プロセスには、プログラムセグメント、データ、PCBが含まれます。

プロセスといえば、当然スレッドについて考えます。以下のいくつかの側面からの比較は、プロセスとスレッドの概念をよりよく理解するのに役立ちます。

プロセス
プログラムは命令とデータで構成されていますが、これらの命令を実行してデータを読み書きするには、命令をCPUにロードし、データをメモリにロードする必要があります。コマンドの実行時には、ディスク、ネットワーク、その他のデバイスも必要です。プロセスは、命令のロード、メモリの管理、およびIOの管理に使用されます。プログラムが実行されると、プログラムのコードがディスクからメモリにロードされ、プロセスが開始されます。
スレッド
は、プロセス内で1つ以上のスレッドに分割できます。スレッドは命令ストリームです。命令ストリーム内の各命令は、特定の順序でJavaで実行するためにCPUに渡されます。スレッドは小さなスケジューリング単位であり、プロセスはリソース割り当ての小さな単位です。ウィンドウでは、プロセスはスレッドのコンテナーと同様に非アクティブです。

両者の関係は電車と車の関係と同じで、スレッドはプロセスの実体です。
ここに画像の説明を挿入
どうしてそんなこと言うの?車は1つの列車に属しますが、列車には複数の車があり、前進することは常に移動する車と見なすことができます。など:

  • スレッドは1つのスレッドにのみ属します。
  • プロセスは複数のスレッドを持つことができます。
  • スレッドはプロセッサで処理されます。
  • 異なるプロセスのスレッドは、メッセージ通信を使用して同期を実現します。

ただし、よく見ると、スレッドとプロセスは大きく異なります。それについて4つの側面から話しましょう。

  • スケジューリング:スレッドはシステムのスケジューリングと割り当ての単位であり、プロセスはシステムリソースを所有する基本単位です。

  • オーバーヘッド:各プロセスには独立したコードとデータスペース(プログラムコンテキスト)があり、プログラム間の切り替えには大きなオーバーヘッドがあります。スレッドは軽量プロセスと見なすことができ、同じタイプのスレッドがコードとデータスペースを共有します。各スレッドには独自の独立した実行スタックとプログラムカウンター(PC)があり、スレッド間の切り替えのオーバーヘッドはわずかです。

  • 並行性:同じプロセスまたは異なるプロセス内のスレッドを同時に実行できます。ユーザーレベルのスレッドの場合、スレッドはプロセスによって管理され、OSにはスレッドの概念が存在しないため、プロセスを同時に実行でき、プロセス内のスレッドはシリアルに実行され、カーネルレベルのスレッドはプロセス内にあります。スレッドは同時に実行することもできます。

  • メモリの割り当て:システムの実行中、システムは各プロセスに異なるメモリ領域を割り当てます。CPUを除くスレッドの場合、システムはスレッドにメモリを割り当てません(スレッドが使用するリソースは、それらが属するプロセスのリソースから取得されます)。スレッドグループ間で共有できるのはリソースのみです。プロセスには独自の独立したアドレス空間があるため、クラッシュしても問題はありませんが、スレッドには独自の独立したスタックがありますが、独立したアドレス空間はありません。

スレッドには独立したアドレス空間がなく、それらはすべて破棄されるため、メモリ割り当ての違いを深く理解することは、いくつかのマルチスレッドおよびシングルスレッドの質問に答えるのに役立ちます。

2.プロセス制御ブロックPCB

プログラム(データを含む)を独立して実行できるようにするには、プロセス制御ブロックを構成する必要があります。プロセス制御ブロックは、オペレーティングシステムがプロセスの現在のステータスを記述し、プロセスの動作を制御するために必要なすべての情報を記録します。このPCBは非常に重要なので、その重要性はどのように反映されますか?

オペレーティングシステムがプロセスの実行をスケジュールする場合は、このプロセスのPCBから現在のステータスと優先順位確認する必要があります。スケジュール後、PCBに保存されている処理とステータス情報に従ってプロセスを再開するように設定する必要もあります。サイトを実行し、PCB内のプログラムとデータのメモリ開始アドレスに従って、対応するプログラムとデータを見つけます。実行プロセス中に、他のプロセスとの同期通信を実現したい場合は、PCBにアクセスする必要があります。プロセスを中断する場合は実行時には、PCBにブレークポイントのプロセッサ環境を保存する必要もあります。

当然、PCBはシステムから頻繁にアクセスされるものであるため、メモリに配置する必要があります。システムは、すべてのPCBをいくつかのリンクリスト(後述)に編成し、OSで特別に開発されたPCB領域に保存します。

PCBの主な内容は、識別情報、説明情報、オンサイト情報、および管理情報の4つの主要な部分です。

[外部チェーンイメージの転送に失敗しました。ソースサイトに盗難防止チェーンメカ​​ニズムがある可能性があります。イメージを保存して直接アップロードすることをお勧めします(img-iO60ANuP-1586013085439)(C:\ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200404112409940.png)]

これに関連して、3つの異なるプロセス制御ブロックキュー、実行キュー、準備キュー、ブロッキングキューがあります。
ここに画像の説明を挿入

3.プロセスの基本的な状態

多くの本でプロセスの基本的な状態を紹介する場合、一般的に3つの状態があります。

1)準備完了ステータス

CPU以外の必要なリソースすべてにプロセスを割り当てた後は、CPUを取得できればすぐに実行でき、このときのプロセスの状態をレディ状態と呼びます。システム内に準備完了状態のプロセスが複数ある場合があり、それらは通常、準備完了キューと呼ばれるキューに配置されます。

2)実行ステータス

プロセスがCPUを獲得し、そのプログラムが実行されています。シングルプロセッサシステムでは、1つのプロセスのみが実行状態にあり、マルチプロセッサシステムでは、複数のプロセスが実行状態にあります。

3)ブロッキング状態

実行中のプロセスがイベントのために一時的に続行できない場合、プロセッサは破棄され、一時停止状態になります。つまり、プロセスの実行はブロックされます。この一時停止状態は、ブロック状態と呼ばれ、待機状態とも呼ばれますブロックされた状態。

プロセスをブロックさせる一般的なイベントは、I / Oの要求、バッファスペースの適用などです。通常、この種のブロッキングプロセスもキューに入れられます。一部のシステムは、さまざまなブロッキングの理由に従って、ブロックされた状態のプロセスを複数のキューに配置します。

ディスパッチャがプロセッサを割り当てた後、準備完了状態のプロセスを実行できるため、プロセスは準備完了状態から実行状態に変わります。実行中のプロセスは現在のプロセスとも呼ばれ、割り当てられたタイムスライスが完了したために実行が中断されると、プロセスは実行状態から準備完了状態に戻ります。たとえば、プロセスが重要なリソースへのアクセスを要求し、そのリソースが別のプロセスによってアクセスされている場合、実行を継続できなくなると、プロセスは実行状態からブロッキング状態に変わります。

[外部チェーンイメージの転送に失敗しました。ソースサイトに盗難防止チェーンメカ​​ニズムがある可能性があります。イメージを保存して直接アップロードすることをお勧めします(img-frlXfZ7S-1586013085440)(C:\ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200404111331045.png)]

プロセスには5つの状態があり、3つの状態に基づいて作成状態と終了状態が追加されます。

1)状態を作成する

通常、2つのステップでプロセスを作成します。最初に、新しいプロセス用のPCB作成し、必要な管理情報を入力します。次に、プロセスを準備完了状態にして、準備完了キューに挿入します新しいプロセスが作成されると、システムはそのプロセスにPCBを割り当て、プロセスIDとその他の情報を入力しましたが、メインメモリリソースなど、プロセスに必要なリソースまたはその他の情報が割り当てられていません。プロセスにはすでに独自のPCBがありますが、プロセス自体はまだメインメモリに入っていません。つまり、作成作業は完了しておらず、プロセスの実行をスケジュールできません。現在の状態は作成状態です。

作成状態の導入は、プロセス制御ブロックの操作の整合性を保証するために、作成作業が完了した後にプロセスのスケジューリングを確実に実行する必要があることを保証することです。同時に、作成状態の導入によって管理の柔軟性も向上し、オペレーティングシステムは、システムパフォーマンスやメインメモリ容量の制限に応じて、作成状態プロセスの送信を延期できます。作成状態のプロセスでは、必要なリソースを取得してPCBを初期化した後、プロセス状態を作成状態から準備完了状態に移行できます。

2)終了ステータス

終了のプロセスにも2つのステップが必要です。最初にオペレーティングシステムが余波を処理するのを待ってから、PCBをクリアし、PCBスペースをシステムに戻します。プロセスが自然なエンドポイントに到達するか、乗り越えられないエラーが発生するか、オペレーティングシステム、または終了する権利を持つ別のプロセスによって終了すると、プロセスは終了状態になります。終了状態に入ったプロセスは後で実行することはできませんが、オペレーティングシステムに記録が残ります。このレコードには、他のプロセスが収集するためにステータスコードと一部のタイミング統計が保存されます。他のプロセスが終了状態のプロセスに関する情報の抽出を完了すると、オペレーティングシステムはプロセスを削除します。

[外部チェーンイメージの転送に失敗しました。ソースサイトに盗難防止チェーンメカ​​ニズムがある可能性があります。イメージを保存して直接アップロードすることをお勧めします(img-PuNtgXDE-1586013085443)(C:\ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200404112125420.png)]

もちろん、一時停止状態があります。さらに、一時停止の様子はさらに複雑になるため、ここでは詳しく説明しません。

4.ユーザーモードとカーネルモード

インタビュアー:クラスメートの皆さん、オペレーティングシステムについて質問しましょう。ユーザーモードとカーネルモードについての理解を話してください。

私:それはプロセスから始まります...

2つの異なるモードを実装することにより、アプリケーションが実行できる命令と、アプリケーションがアクセスできるアドレス空間の範囲を制限できます

プロセッサは通常、制御レジスタのモードビットを使用してこの機能を向上させ、このレジスタはプロセスが現在持っている特権を記録します。モードビットが設定されている場合、プロセスはカーネルモードあり、カーネルモード実行されているプロセスは、命令セット内の任意の命令を実行し、システム内の任意のメモリ位置にアクセスできます

次に、モードビットが設定されていない場合、プロセスは明らかにユーザーモードですユーザーモードのプロセスは、特権命令の実行を許可されていません。特権命令とは何ですか?

img

たとえば、プロセッサの停止、モードビットの変更、I / O操作の開始は、すべて特権付きの命令です。ユーザーモードのプロセスは、アドレス空間のカーネル領域のコードやデータを直接参照することができ、権限を超えていることがわかります。慌てる必要はありません。システムコールインターフェイスを介して間接的にカーネルコードとデータにアクセスするだけです。

この時点で、いくつかの基本的な概念についての説明を終えましたが、おそらくあなたも私と同じくらい興味があります。ここで、ユーザーモードからカーネルモードに切り替える唯一の方法は、割り込み、障害、または現在のシステムコールなどの例外を介したものであることが少しわかります。簡単に言うと、Linuxは/proc文件系统このメカニズムを提供して、ユーザーモードプロセスがカーネルデータ構造のコンテンツにアクセスできるようにします。次の記事によると、特定のユーザー状態をカーネル状態に変更するプロセスは、最初に穴を埋めます。

5.コンテキストスイッチ

同時実行性の高いJavaを学ぶとき、私はこの単語をよく見、理解していませんでした。今日、それを引き出して話しました。

オペレーティングシステムカーネルは、コンテキスト切り替えと呼ばれる異常な制御フローの上位レベルの形式を使用して、マルチタスクを実現します。カーネルは、各プロセスのコンテキスト維持します。コンテキストは、実際には、プリエンプトされたプロセスを再起動するためにカーネルが必要とする状態です。汎用レジスタ、浮動小数点レジスタ、プログラムカウンタ、ユーザースタック、カーネルスタック、およびその他のデータ構造の値が一緒になってコンテキストを構成します。 。

この本で言及されているCSAPP:

プロセス実行中のある時点で、カーネルは現在のスレッドをプリエンプトすることを決定でき、バグは以前にプリエンプトされたプロセスを開始します。この決定はスケジュールされ、スケジューラになるカーネルのコードによって処理されます。

カーネルが実行する新しいプロセスを選択すると、カーネルはこのプロセスをスケジュールすると言いますもちろん、対応するスケジューリングアルゴリズム(タイムスライスローテーション、先着順など)があります。カーネルが新しいプロセスの実行をスケジュールした後、現在のプロセスをプリエンプトし、コンテキストスイッチングと呼ばれるメカニズムを使用して、新しいプロセスに制御を移す必要があります(この文は少し一口かもしれません)。

コンテキストの切り替えは主に3つのことを行います。最初に現在のプロセスのコンテキストを保存し、次に以前に横取りされたプロセスが保存されたコンテキストを復元し、最後にこの新しく復元されたプロセスに制御を渡します。

img

コンテキストはいつ切り替わりますか?カーネルがユーザーに代わってシステムコールを実行すると、割り込みが発生する可能性があります。たとえば、sleepシステムコールは、呼び出し元のプロセスにスリープを明示的に要求します。

第二に、プロセスの作成と終了

1.プロセスの作成

プロセスがどのように作成されるかは、プロセスの作成を引き起こしたイベントから始まります...オペレーティングシステムでは、次のことがプロセスを作成します。

  • 1)ユーザーログイン:タイムシェアリングシステムでは、ユーザーがターミナルでログインコマンドを入力します。
  • 2)ジョブのスケジューリング:バッチ処理システムにジョブをロードします。
  • 3)サービスの提供:サービスプロセスは、オペレーティングシステムコア(システムプログラムモジュール)によって作成されます。印刷依頼など。
  • 4)アプリケーション要求:既存のプロセスが新しいプロセスを作成します。アプリケーションプロセス(親プロセス)によって作成されます。

では、プロセスはどのようにして生まれますか?前回の記事では、プロセスの構成を理解している必要があります。そうです、プロセスの誕生はその構成、特にPCBに関連しています。作成状態を紹介する際、すでに簡単に紹介しました。

1)空のPCBを申請する:プロセス識別子を割り当て、PCBセットから空のPCBを申請します。
2)メモリなどのリソースを新しいプロセスに割り当てます。
3)プロセス制御ブロックPCBを初期化します。

  • 識別子情報を初期化します。新しいPCBにプロセスIDと親プロセスIDを入力します。

  • プロセッサのステータス情報を初期化します。プログラムカウンタがプログラムのエントリアドレスを指し、スタックポインタがスタックの先頭を指すようにします。

  • プロセッサ制御情報を初期化します。プロセスを準備完了状態にします。

4)新しいプロセスをレディキューに挿入します。

2.プロセスの終了

プロセスは結局終了する必要がありますプロセスは正常に終了するか、異常終了するか、または外部の介入で終了します。

バッチ処理システムでは、プログラム実行がHolt指令割り込みに遭遇し場合、オペレーティングシステムにプロセスが終了したことを通知するために割り込みを生成する必要があります。これは正常終了です。タイムシェアリングシステムでは、プロセスが完了Logs offし、割り込みが生成されて通知されます。オペレーティングシステム。

異常終了した場合、違法な命令、実行タイムアウト、待機タイムアウト、I / O失敗などの状況があります。デッドロックなどの外部介入については、親プロセスが子孫プロセスを終了するように要求したり、親プロセスが終了したりします。

上記の状況が発生すると、終了プリミティブを呼び出して、次のプロセスに従って終了する必要があります。

  • 終了したプロセスの識別子に従って、PCBセットからそれを見つけ、プロセスのステータスを読み取ります。
  • 実行状態の場合は、直ちに終了し、スケジューリングフラグをtrueに設定します(プロセスが終了後に再スケジュールされる必要があることを示します)。
  • このプロセスに子供と孫がいる場合、その子供と孫も殺すべきです。
  • プロセスを終了させるすべてのリソースを没収します。子孫プロセスの場合は親プロセスに戻します。親プロセスの場合はシステムに戻します。
  • プロセスを終了したPCBをキューから削除します。

3、プロセスのブロックとウェイクアップ

1.プロセスをブロック/覚醒させる方法

イベント 解説
システムサービスのリクエスト プロセスはOSにサービスの提供を要求しましたが、OSはすぐには満足できませんでした。 システムはプリンタを他のプロセスに割り当てましたが、要求しているプロセスには割り当てていません。このとき、プロセスはブロックされます。
オペレーションを開始する プロセスが操作を開始するときに、操作の完了後にプロセスを続行する必要がある場合は、最初にプロセスをブロックして、操作が完了するのを待つ必要があります。 WPSを介してプリンター(I / Oデバイス)を起動しましたが、この時点でプリンターは他のドキュメントを印刷(他のI / O操作を実行)しているため、印刷が完了するまで待つ必要があり、WPSプロセスは引き続き実行されます。
新しいデータが到着していません 相互に連携するプロセスの場合、データの処理前にプロセスの1つが他の(連携)プロセスから提供されたデータを取得する必要がある場合、必要なデータが到着しない限り、プロセスはブロック(待機)するだけです。 プロセスは2つあり、プロセスAはデータの入力に使用され、プロセスBは入力データを処理します。Aがデータの入力を完了していない場合、必要な処理データがないため、プロセスBはブロックします。プロセスAがデータの入力を完了すると、プロセスBはウェイクアップできます。
新しい仕事はありません 多くの場合、システムは特定の機能を持ついくつかのシステムプロセスをセットアップし、そのようなプロセスがタスクを完了すると、新しいタスクが到着するのを待つようにブロックします。 システムの送信プロセスの主なタスクはデータを送信することです。データが完全に送信され、それを実行するための新しい作業がない場合、データはブロックされます。

2.プロセスブロックプロセス

プロセスのブロックはアクティブな動作であり、プリミティブによってblock()完了されます。プロセスが実行状態からブロッキング状態に変化した場合、最初にすぐに実行を停止し、PCBの状態をブロックされた状態に変更して、PCBをブロッキングキューに入れる必要があります。次に、再スケジューリングにより、CPUリソースが他の準備ができているプロセスに割り当てられ、コンテキストが切り替えられます。

3.プロセスのウェイクアッププロセス

プリミティブを目覚めさせることによってwakeup()達成ます。最初に、ブロックされたプロセスをブロックキューから削除し、次にPCBのプロセスステータスを変更してから、PCBをレディキューに入れます。1つのレディキューがあり、いくつかのブロッキングキュー(異なるイベントのブロッキングキュー)が存在する場合があります。

第四に、一時停止とアクティベーションのプロセス

ここでは、プロセス遷移図を組み合わせて理解することをお勧めします。スペースの制限により、このブログでは、一時停止やアクティブ化などのプロセスのステータスについて具体的に説明していません。

1.プロセスの一時停止

ユーザープロセス要求はそれ自体を中断でき、親プロセス要求はそれ自体の子プロセスの1つを中断できます。システムはsuspend()、指定されたプロセスまたはブロック状態のプロセスをプリミティブを介して一時停止します。

[外部チェーンイメージの転送に失敗しました。ソースサイトに盗難防止チェーンメカ​​ニズムがある可能性があります。イメージを保存して直接アップロードすることをお勧めします(img-LCUGEzOi-1586013085445)(C:\ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200404223112475.png)]

2.プロセスのアクティブ化

親プロセスまたはユーザープロセスが指定されたプロセスのアクティブ化を要求した場合、プロセスが外部メモリにあり、メモリに十分なスペースがある場合、外部メモリで静的準備完了状態にあるプロセスをメモリにスワップできます。この時に使用されるプリミティブはactive()です。

     [外部チェーンイメージの転送に失敗しました。ソースサイトに盗難防止チェーンメカ​​ニズムがある可能性があります。イメージを保存して直接アップロードすることをお勧めします(img-LqReijJr-1586013085446)(C:\ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200404224013894.png)]

201件のオリジナル記事を公開 Like9 訪問者10,000以上

おすすめ

転載: blog.csdn.net/weixin_40992982/article/details/105319814