目次
序文:
最近は試験対策や新しい知識の習得に忙しく、また流行の返品ポリシーなどの理由により、ブログの内容はしばらく更新されていませんでした。しかし、今日から、私はまだ正しい軌道に乗っており、知識を要約するプロセスを続けています. 2023年も皆様にとって良い年となりますよう、新年を迎えるにあたり、更なる飛躍を遂げ、一日も早く夢を実現し、理想の会社に入社して参ります!! !
さて、本編は本編に戻ります。マルチスレッドについて学び始めます。今日の主な要約は、オペレーティング システムの予備的な理解に加えて、プロセスとメモリ管理の関連部分の要約です。
1. オペレーティング システム:
まず、オペレーティングシステムとは何かを知る必要があります.Windowsシステム、Linuxシステム、iOSシステム、Unixシステム、Androidシステムなどは、市場で聞いた比較的一般的なオペレーティングシステムです. オペレーティング システムは、コンピュータ リソースを管理するソフトウェアのグループの総称です。
オペレーティング·システム:
ソフトウェアを動作させるための安定した動作環境を提供し、ハードウェアデバイスを管理するため。
一言で言えば、オペレーティング システムは、ユーザー、ソフトウェア、およびハードウェア間の相互作用の媒体です。
私たちの日常生活で最も身近でよく使われているのは Windows システムです. Linux システムは、開発と展開に特に適しているため、すべてのプログラマーが知っておくべきシステムです.
オペレーティング システムの位置付け:
これを理解するには、絵を描く必要があります。
一般に、オペレーティング システムの位置付けは、上で述べた「ソフトウェアが上にあり、ハードウェアが下にある」というものです。
ここでこれらの言葉をどのように理解しますか?
応用:
言うまでもなく、アプリケーション プログラムは、携帯電話のアプリ、qq、wx、ゲーム、およびコンピューターにダウンロードされたその他のソフトウェアです。
システムコール:
システム コールは、オペレーティング システムによってアプリケーションに提供される API として簡単に理解できます. ソフトウェアがハードウェア デバイスを操作したい場合は、システム コールを通じてオペレーティング システム カーネルに通知する必要があり、オペレーティング システム カーネルは、デバイスを操作するためにドライバーを呼び出します。対応するハードウェア デバイス。
オペレーティング システム カーネル:
オペレーティング システム カーネルは、具体的にはオペレーティング システムのコア機能であるリソース管理を指します。リソース管理は、ソフトウェアの動作に安定した動作環境を提供し、ハードウェア デバイスを管理します。
運転者:
ドライバは、各ハードウェアデバイスの開発者が開発用に設定した対応ドライバであり、対応ドライバがインストールされた場合にのみ、当社のコンピュータはハードウェアデバイスを認識することができます。
ハードウェア機器:
ハードウェア デバイスは言うまでもなく、コンピュータの背面カバーを開くと、ハードウェア デバイスしか表示されません。
2. プロセス:
プロセスとは
プロセスとは、オペレーティングシステムが実行中のプログラムを抽象化したものであり、プログラムの実行中のプロセスをプロセスと呼ぶことができます。
これまで見てきたアプリケーションのように、実行していないときはプロセスとは言えませんが、開いて実行しているときはプロセスと呼ぶことができます。「実行されていないプログラムはプロセスではありません!」
同時に、オペレーティング システム内では、プロセスはオペレーティング システムによるリソース割り当ての基本単位です。
Ctrl+alt+delete を同時に押した場合:
プロセスの説明と構成:
私たちは通常、プロセスを説明的で組織化されたものと考えています。
説明:
処理の記述はC言語の構造体で実現しています。オペレーティング システムは通常、C/C++ で記述されます。記述に使用される構造は「PCB (Process Control Block)」と呼ばれます。
整理:
プロセスの編成は、双方向リンク リストを使用してこれらの PCB をつなぎ合わせるのと同じです。(注: 単純な二重リンク リストではありません。実際にはもっと複雑です)。
このように理解できます。プロセスを作成することの本質は、そのような PCB オブジェクトを作成し、その PCB をリンク リストに挿入することであり、プロセスを破棄することは、対応する PCB オブジェクトをリンク リストから削除することです。これまで見てきたタスク マネージャーから見たプロセスは、リンクされたリストを走査することと同じです。
PCB の機能 (属性)
1. pid pid はプロセスの ID であり、ID カードに相当します.各プロセスには一意の pid があります。
2. メモリ ポインタ ここで話しているポインタは C/C++ のポインタではないことに注意してください. 私たちはそれをポインタだと言います. 単なる鮮やかなステートメントです. このメモリ ポインタは非常に重要です. それは関連するプログラムの情報を記述します.メモリをより適切に割り当てるために、プログラムがロードされるメモリの場所などを記述します。
3. ファイル記述子テーブル このファイル記述子テーブルには、プロセスが使用する他のリソース (ハードディスク上のファイルやその他のリソースを含む) に関する情報が記述されています。
4. プロセス スケジューリング情報 このモジュールは非常に重要です. CPU リソース割り当ての問題を解決します. 内容は比較的大きくて複雑なので、以下でこの部分について詳しく説明します.
上記の PCB のいくつかの機能は、主にリソース割り当てにおけるプロセス識別、メモリ割り当て、および CPU リソース割り当ての問題を解決します。
4 番目の項目を除いて、最初の 3 つの項目は、プロセスが保持するハードウェア リソースを示します。CPU リソースの割り当ては比較的複雑です。現在、私たちが使用しているコンピュータのほとんどはマルチコア CPU です。たとえば、私のコンピューター:
私のコンピュータは 16 コアの CPU です. 通常, 私たちのコンピュータには多くのプロセスがあります. たとえば, この時点で私のコンピュータ上のプロセスの数:
これにより、オオカミが増え、肉が減るという状況が生まれます。では、コンピュータの CPU はこの問題をどのように解決するのでしょうか?
これには、プロセスのスケジューリングの問題が関係しています。
CPU 割り当て - プロセス スケジューリング:
プロセス スケジューリングの関連プロパティ:
1. プロセスのステータス
プロセスの状態には、次の 3 つの状態があります。
1)準備完了状態: プロセスはいつでも CPU 上で実行する準備ができています (オンコール)
2)実行状態: CPU 上で実行中
3)ブロック状態: 短時間ブロックされ、応答する方法がありません。
(注: 多くのオペレーティング システムは、実際には準備完了状態と実行状態を区別しません)
2. 優先度
優先順位とは、妊婦や軍人を優先して列に並ぶようなもので、どちらが先に与えられ、どちらがより多くのポイントを与えられるかなど、資源の配分にも優先順位があります。プロセスをスケジュールするとき、オペレーティング システムは「平均的」ではありません。限られたコアで複数のプロセスを実行するには、並列処理と同時実行の概念について言及する必要があります。
並列性:同じ瞬間をマクロに見てもミクロに見ても、2 つのコアのプロセスは同時に実行されます。
並行性:同時に、1 つのコアで実行できるプロセスは 1 つだけです。しかし、このコアで実行するさまざまなプロセスをすばやく切り替えた場合 (切り替えるかどうかわからないほど高速)、つまり、実際には、これらのプロセスはミクロレベルでは同時に実行されません。しかし、マクロレベルでは同時に動いていると考えられます。私のコンピューターは 3.20Ghz です。つまり、1 秒間に 32 億の命令を実行できます。これは私たち人間の目では判断できないことです。
したがって、通常、並列処理と並行処理をまとめて並行処理と呼びます。(特別なリクエストなし)
3. 文脈
上記のCPU上の処理は常に切り替えていますが、切り替え処理がその後の動作に影響を与えないようにする必要があるため、切り替え時の中間状態を記録する必要があり、中間状態が記録されていない場合は、再度元に戻します。このとき、CPU は正常に処理を実行できません。ゲームをプレイするときに「セーブ」する必要があるようなもので、時間内にセーブしないと、もう一度開いたときに最初からやり直す必要があります。したがって、「アーカイブ」、「ファイルの読み取り」と単純に理解できます。コンテキストは、基本的に「アーカイブ」するものです。プロセスのコンテキストは、CPU の各レジスタに格納されている値です。レジスタは、データを格納するために CPU に組み込まれているモジュールです。
プロセスのコンテキストを保存するとは、CPU レジスタの値をメモリに保存することであり、プロセスのコンテキストを復元することは、これらの値を再度ロードすることです。
4. 会計情報
アカウンティング情報とは、オペレーティング システムが CPU 上の各プロセスの実行時間と実行された命令の数を記録し、実行時間と命令の数に従ってスケジュール方法を決定することを意味します。
3. メモリ管理:
仮想アドレス空間:
仮想アドレス空間とは何ですか? このように言えば、通常メモリと呼ばれるものは仮想アドレス空間です。プログラムで取得されるメモリアドレスは、実際の物理アドレスではなく、抽象化層の後の仮想アドレスです。
では、なぜそれを抽象化して仮想アドレスに変換するのでしょうか?
主な理由は、バグの発生を減らすことです。(工程間の相互影響を避ける)
例えば:
このような状況が発生すると、qq と WeChat のコードが正常な場合、実行中の 2 つのプログラムは安全で健全であると想像できますが、このとき、WeChat のコードが突然境界を越え、メモリが交差することは明らかです。 WeChat のバグ. , しかし QQ を台無しにしました: 明らかに QQ をよく開いてから WeChat を開き、WeChat がクラッシュし、QQ もクラッシュしました。QQは間違っていないと言ってください!
したがって、このような競合の発生を回避するために、抽象化が導入され、アドレスの仮想化が実行されます (アドレス変換はオペレーティング システムとハードウェア デバイスによって実行されます)。
この方法により、プロセス 1 のアドレスがそのアクセスの範囲を超えていることをオペレーティング システムが検出した場合、オペレーティング システムはエラーを報告します (具体的には、SIGN SEGEMENT FAULT シグナルを送信し、プロセスをクラッシュさせます)。この場合、プロセス 1 にバグがあると、プロセス 1 がクラッシュし、プロセス 2 は影響を受けません。(バグを持っている人は誰でもクラッシュします)。
プロセス間の相互影響の問題を解決した後も、私たちの前にはまだ問題があります。相互に作用する必要のあるプロセスがある場合はどうなるでしょうか? 次に、パブリックスペースを導入する必要があります。両方のプロセスがアクセスできる空間なので、この問題は解決できます。
ここでは、オペレーティング システム、プロセス、およびメモリ管理に関する知識を共有しますが、この部分の内容は依然として非常に重要であり、特にプロセス スケジューリングのプロセスについては、注意深く理解する必要があります。知っていることを知るのが一番です。ありがとう!! !