前の章で未完了のトピックをここで完了したいと思います。ゾンビ プロセスについて最後に説明したのは、子プロセスは終了したが、親プロセスはまだ実行中であり、リサイクルする時間がないことを意味します。この時点では、子プロセスはプロセスはゾンビプロセスです。
しかし、親プロセスが実行を終了し、リサイクルされずに終了した場合、子プロセスは誰が保守するのでしょうか?
このとき、オーファンプロセスは1 番の init プロセスで採用されることになり、当然init プロセスで再利用する必要があります。
尾部が完成したので、本題に入りましょう。
目次
プロセスの優先順位
基本的な考え方
1. CPUがリソースを割り当てる順序は、プロセスの優先順位を表します。
2.優先度の高いプロセスが最初に実行する権利を持ちます。プロセス優先度の構成は、マルチタスク環境の Linux に役立ち、システムのパフォーマンスを向上させることができます。
3. 指定した CPU でプロセスを実行することも可能で、重要でないプロセスを特定の CPU に割り当てることで、システム全体のパフォーマンスを大幅に向上させることができます。
一言で言えば、プロセスの優先順位は、誰が最初にリソースを取得し、誰が後でリソースを取得するかを確認することです。
では、なぜ優先順位が必要なのでしょうか?
本質は、CPU が限られており、プロセスが多すぎるためです。
プロセスが多すぎるので、チケットを買うために並ぶときに兵士が優先されたり、一般の人が並んだりして兵士の優先順位が比較的高いなど、何らかの方法でリソースを奪い合う必要があります。
コンピュータでは、データ優先順位を示すことができます。優先順位だけでは十分ではありません。判断が必要です。たとえば、あなたが学校で 1 位であれば、あなたが何年生であるかは誰も気にしません。離島では学校内だけで、先生や指導者がこの成績で判断するので効果的です。
これらの評価優先度はスケジューラーと呼ばれ、この優先度がスケジューリング指標であり、優先度の高いものが最初に実行するために CPU にディスパッチされます。
プロセスの優先順位を表示する
まず結論からお話します。Linux における優先順位の具体的な方法は次のとおりです。
Priority = old priority + nice valueこれについては後で説明します。
まずはプログラムを書いてみましょう。
次に、実行中、監視中の古い操作
このプロセスには 2 つの属性もあることがわかります。 ps -al は、より詳細なプロセス情報を表示するためのものです。
このうちPRIはこの処理が実行できる優先度を表し、値が小さいほど早く実行されます。
NI はナイスバリューの略です。
別途ご紹介させていただきます。
PRI 和 NI
PRI と NI については、次の点を知っておく必要があります。
1. PRI はまだ比較的理解しやすいもので、プロセスの優先度、平たく言えば CPU によるプログラムの実行順序であり、PRI 値が小さいほどプロセスの優先度が高くなります。
2. NI は、ナイス値と呼ばれるもので、実行可能なプロセスの優先順位の変更された値を表します。
3. PRI 値が小さいほど、実行が速くなり、nice 値を追加すると、PRI はPRI(new)=PRI(old)+nice になります。
4. このように、nice の値が負の場合、プロセスの優先度の値は小さくなり、つまり優先度が高くなり、より速く実行されます。 Linux の場合 次のステップは、プロセス6の nice 値を調整することです。nice の値の範囲は -20 ~ 19 で、合計 40 レベルです。
プロセスの優先度を調整する方法
プロセスの優先度を調整するということは、上でも述べたとおり、nice 値を調整することになります。
まず「top」コマンドを入力し、「r」キーを押します。
このような文が表示され、nice 値を変更するプロセスを入力するように求められます。
実行したばかりのプロセスの PID は 23494 だったので、23494 と入力します。
次に、適切な値を入力しましょう。15 を入力します。このときのプロセスの優先順位は、前の 80+15=95 になるはずです。
もう一度見てみましょう:
プロセス優先度は予想どおり 95 であり、NI 値は 15 に調整した値になっていることがわかります。
各調整はベンチマーク値として 80 から始まり、現在の PRI 値の影響を受けないことに注意してください。
この時点では -15 を入力します
95-15 で 80 になるのではなく、80-15=65 の 80 から始まります。
結果はまさに私たちが言ったとおりです。
PRIとNIの違い
PRIはプロセスの優先度、NI(nice)値はプロセスの優先度の補正データです
プロセスのnice値はプロセスの優先度ではなく、概念ではありませんが、プロセスのnice値はプロセスの優先度の変更に影響します。
他の概念
競争力
競争力:システム プロセスは多数ありますが、CPU リソースは少量か 1 つしかないため、プロセスは競争力があります。タスクを効率的に完了し、関連リソースをより合理的に獲得するために、タスクには優先順位があります。
独立
独立性:マルチプロセス操作では、さまざまなリソースを排他的に使用する必要があり、マルチプロセス操作中に相互に干渉しません。たとえば、ブラウザがハングアップしても、qq の通常の使用には影響しません。子プロセスの場合、がハングアップしても、親プロセスには影響しません。親プロセスがハングアップしても、子プロセスには影響しません。
平行
並列処理: 複数のプロセスが複数の CPU の下で個別に同時に実行されます。これを並列処理と呼びます。
同時実行性
同時実行性:複数のプロセスは、 1 つの CPU の下でプロセス スイッチングを使用して、一定期間内に複数のプロセスを進めることができます。これを同時実行性と呼びます。
ここで、プロセス切り替え方式が同時実行に使用されている場合、プロセスが完了せずに別のプロセスに切り替えた場合、次回このプロセスに切り替えるとき、どこから開始するのでしょうか? ゼロから始めます?効率が低すぎるため、元の位置から開始する必要があります。では、CPU はどのようにして最後の実行場所を知るのでしょうか?
コンテキスト
最初に現象について話します。プロセス A が実行されている場合、プロセス A の一時データはCPU のレジスタに保存される必要があります。これらの一時データは A のコンテキストと呼ばれ、関数の最後の戻り値、実行ステータス、実行場所などが含まれます。
したがって、プロセス A が一時的にオフになった場合、プロセス A は独自のコンテキスト データを削除する必要があります。これは、プロセス A にコンテキスト データを保存するのと同じです。
一時保存の目的: 次回取り出す必要があり、復元できれば、中断されていないかのように、以前のロジックに従って逆方向に実行を続けることができます。
CPU にはレジスタが 1 つしかありませんが、さまざまなプロセスに対応する複数のコンテキストが存在します。レジスタごとに読み取れるコンテキストのコピーは 1 つだけです。
環境変数
コンセプト
環境変数 (環境変数) は、一般に、オペレーティング システムの動作環境を指定するためにオペレーティング システムで使用されるいくつかのパラメータを指します。たとえば、
C/C++ コードを作成するとき、リンクするとき、リンクのダイナミクスは決してわかりません。は静的ライブラリですが、コンパイラがライブラリを見つけるのに役立つ関連する環境変数があるため、正常にリンクして実行可能プログラムを生成できます。
環境変数には通常、何らかの特別な目的があり、システム内でグローバルな特性を持っています。
問題の導入
次のようなことに気づいたことはありますか?
自作の実行可能プログラムを実行するには ./ (つまり、現在のパス) を追加する必要がありますが、 ls、touch、rm などのコマンドを実行する場合には ./ を追加する必要はありません。をクリックしてパスを追加します。
これらの ls コマンドと私たちが作成したコマンドの唯一の違いは、1 つは自分で作成したもので、もう 1 つはシステムに付属のコマンドであることです。システムはすでに環境変数を構成しているため、パスを追加せずに直接実行できます。 。
これで環境変数の役割がわかりました。後ほど理解します。
共通の環境変数
道
環境変数メソッドの表示
echo $PATH
それらの間のパスは次のように区切られていることに注意してください。
ls を入力すると、システムは最初のパスから検索し、存在する場合は直接実行します。存在しない場合は、見つかるまで逆方向に検索を続けます。検索後にパスが存在しない場合は、エラーが発生します。が報告されます。コマンドが見つかりません。コマンドが見つかりませんでした。
したがって、コマンドを実行したい場合にパスを追加する必要はありません。実行可能プログラムをこれらの PATH パスに書き込むこともできますが、他の人がすでに書き込んだコマンド プールを汚染するため、これはお勧めしません。
したがって、記述した内容を環境変数に入れることができます。これは 1 つの に相当します。
PATH環境変数をインポートする
次のコマンドを入力します。
export PATH=$PATH:/home/liqi/process
この中に: 以下は実行可能ファイルのパスです。pwd を使用して表示できます。
次に、環境変数をもう一度見てみましょう。
無事にインポートされていることが分かりました。
この時点で、プロセスの下で実行可能プログラムを直接実行できます。
ログアウトして再度ログインすると、環境変数は元の状態に初期化されます。
家
現在のユーザーのホーム ディレクトリを記録して表示します。
先ほどの cd ~ は自分のホームディレクトリに入りますが、実際にはこの HOME に従って実行されます。
シェル
現在のシェル (通常は /bin/bash) を表示します。
環境変数に関連するコマンド
1. echo: 環境変数値を表示します。
2. export: 新しい環境変数を設定します
。 3. env: すべての環境変数を表示します。
4. unset: 環境変数をクリアし
ます。 5. set: ローカルに定義されたシェル変数と環境変数を表示します。
環境変数の構成方法
各プログラムは文字ポインターの配列である環境テーブルを受け取り、各ポインターは「\0」で終わる環境文字列を指します。
環境変数を取得する
コードを通じて環境変数を取得する
実際、メイン関数には int argc、char* argv[] の 3 つのパラメータがあります。これら2 つはコマンド ライン パラメータであり、これについては後で説明します。
char* env[]は環境変数パラメータです。
これはポインターの配列であり、前のセクションのテーブルです。
次のようなプログラムを書くことができます。
その後終了し、コンパイルを行ってから実行します
すべての環境変数がこの方法で出力されることがわかります。
システムコールを通じて環境変数を取得または設定する
インターフェイスは 2 つあります。
putenv を使用して設定します。これについては後で説明します。
getenv、環境変数を取得します。
たとえば、PATH 環境変数を取得したいとします。
コードを入力する:
次に、make がコンパイルされて実行されます。
PATH を HOME に置き換えます。
同様に出力もされます。
誰がこれらの環境変数をこれらの変数にインポートしたのか 、というような質問はありますか?
実際には、親プロセスの環境変数を継承します。デフォルトでは、すべての環境変数が子プロセスに継承されます。親プロセスはbashで、これは単純なプロセスの置き換えです。これについては後で説明します。
これは、環境変数にはグローバル属性があるという事実も示しています。
多くの子プロセスからアクセスできるためです。
環境変数には通常、グローバル プロパティがあります。
それを証明するために実験をしてみましょう:
環境変数名を myenv に変更しました。
何もなくセグメントエラーが発生していることが分かります。
この時点で、myenv という名前の別の環境変数をインポートします。
export myenv="hello,world"
このとき、bash には既に環境変数 myenv が設定されています。プログラムを実行するには、まず子プロセスを作成する必要があり、子プロセスは親プロセスを継承します。これは、環境変数がグローバル属性を持っているためです。
この時点で、コンパイルして make を再度実行すると、この環境変数が正常に出力されたことがわかります。
これは次の 2 つのことを示しています。
1. 子プロセスの環境変数は親プロセスから取得されます。
2. デフォルトでは、すべての環境変数は子プロセスに継承されます (環境変数はグローバル属性を持ちます)。
そうすれば、子プロセスの子プロセスも子プロセスの環境変数を継承します。
コマンドラインパラメータ
これはアドオンです。
環境変数について説明したとき、 main() 関数には 3 つのパラメーターがあると言いました。最後のパラメーターは、最初の 2 つのパラメーターであり、これら 2 つのパラメーターは コマンド ライン パラメーター と呼ばれます。
これが何であるかを確認するプログラムを書いてみましょう。
実際には、argv に入力したオプションがパラメータとして渡され、具体的な数値は argc によって決定されることがわかりました。
これらのコマンドラインパラメータには何の意味があるのでしょうか?
最大の機能は、同じプログラムで異なるオプションを使用して異なるサブ関数を使用できるようにすることです。
これは、ls -a、ls -a、または ls -a -l に当てはまります。
これらはすべてコマンド ライン パラメーターを使用して内部的に行われます。
あるいは、単純な実装を行います。
シナリオは次のようになります。
これがコマンドラインパラメータの実際の使用法です。