目次
2.8 コードを通じて環境変数を取得する (main 関数の 3 番目のパラメーター)
2.9 システムコールによる環境変数 getenv および putenv の取得または設定
2.10 環境変数には通常、グローバル プロパティがあります
1. プロセスの優先順位
1.1 基本概念
- CPU リソースの割り当ての順序は、プロセスの優先順位を指します。
- 優先度の高いプロセスが最初に実行する権利を持ちます。
- プロセス優先度の構成は、マルチタスク環境の Linux に役立ち、システムのパフォーマンスを向上させることができます。指定した CPU でプロセスを実行することもでき、重要でないプロセスを特定の CPU に割り当てることで、システム全体のパフォーマンスを大幅に向上させることができます。
1.2 システムプロセスを確認する
Linux または UNIX システムで ps -l コマンドを使用すると、同様に次が出力されます。
次のようないくつかの重要な情報に簡単に気づくことができます。
UID : 実行者の ID を表します
PID: このプロセスのコード名を表します
PPID: このプロセスがどのプロセスから派生したか、つまり親プロセスのコード名を表します。
PRI: この処理が実行できる優先度を表し、値が小さいほど早く実行されます。
NI: このプロセスの優れた価値を表します
1.3 PRI と NI
- PRIも比較的わかりやすい、プロセスの優先度、平たく言えばCPUがプログラムを実行する順番であり、値が小さいほどプロセスの優先度が高くなります。
- NI についてはどうでしょうか? これは、私たちが話している素晴らしい値であり、実行可能なプロセスの優先順位の変更された値を表します。
- PRI 値が小さいほど、実行が速くなります。nice 値を追加すると、PRI は次のようになります: PRI(new)=PRI(old)+nice
- このように、nice の値が負の場合、プログラムの優先度の値は小さくなり、優先度が高くなり、より早く実行されます。
- したがって、Linux でプロセスの優先順位を調整することは、プロセスの nice 値を調整することになります。
- nice の値の範囲は -20 ~ 19 で、合計 40 レベルです。
1.4 PRI 対 NI
- プロセスのnice値はプロセスの優先度ではなく、概念ではありませんが、プロセスのnice値はプロセスの優先度の変更に影響を与えることを強調しておく必要があります。
- nice値がプロセス優先度の補正データであることが分かります
1.5 プロセス優先度のコマンドを表示する
既存のプロセスの適切性を変更するには、top コマンドを使用します。
トップ トップに入った後
「r」を押す –> プロセス PID を入力 –> 適切な値を入力します (設定値は大きすぎたり小さすぎたりすることはできません)
優先度が設定されるたびに、プロセスの初期デフォルト優先度に基づいて設定されます。
1.6 その他の概念
- 競争力: システム プロセスは多数ありますが、CPU リソースは少量か 1 つしかないため、プロセスは競争力があります。タスクを効率的に完了し、関連リソースをより合理的に獲得するために、タスクには優先順位があります。
- 独立性: マルチプロセス操作ではさまざまなリソースを排他的に使用する必要があり、マルチプロセス操作中に相互に干渉しません。
- 並列処理: 複数のプロセスが複数の CPU で個別に同時に実行されます。これを並列処理といいます。
- 同時実行性: 複数のプロセスが 1 つの CPU の下でプロセス スイッチングを使用して、一定期間内に複数のプロセスを進めることができます。これを同時実行性といいます。
CPU にはレジスタが 1 つだけありますが、異なるプロセスに対応する複数のコンテキストが存在する可能性があります。(コンテキスト保護)
2. 環境変数
2.1 基本概念
- 環境変数 (環境変数) は、通常、オペレーティング システムの動作環境を指定するためにオペレーティング システムで使用されるいくつかのパラメーターを指します。
- たとえば、C/C++ コードを作成する場合、リンクされた動的ライブラリと静的ライブラリがどこにあるかはリンク時にわかりませんが、デバイスの検索をコンパイルするのに役立つ関連環境変数があるため、正常にリンクして実行可能プログラムを生成することができます。
- 環境変数には通常、いくつかの特別な目的があり、システム内でグローバルな特性を持っています。
2.2 一般的な環境変数
PATH : コマンドの検索パスを指定します
HOME: ユーザーのメイン作業ディレクトリ (つまり、ユーザーが Linux システムにログインするときのデフォルトのディレクトリ) を指定します。
SHELL : 現在のシェル。その値は通常 /bin/bash です。
2.3 環境変数の表示方法
echo $NAME //NAME: 環境変数名
実行中のシステム プログラムは、上図の各環境変数パスの下でこのプログラムを検索し、存在する場合は直接実行します。
2.4 テストパス
1. hello.cファイルを作成する
#include <stdio.h> int main() { printf("hello world!\n"); return 0; }
2. ./hello 実行と hello 実行を比較する
3. 一部の命令はパスなしで直接実行できるのに、バイナリ プログラムの実行にはパスが必要なのはなぜですか?
4. プログラムが配置されているパスを環境変数 PATH に追加し、export PATH=$PATH: hello プログラムが配置されているパス 5. 比較テスト
6. パスを使用せずに直接実行する他の方法はありますか?
パスを環境変数に設定すると、./ なしでどこでも直接実行できます。
PATH は、指定されたパスの検索を指定します。
2.5 ホームのテスト
1. root ユーザーと一般ユーザーでそれぞれ echo $HOME を実行し、違いを比較 ~ と HOME の関係に対応する cd ~; pwd を実行
その中で、一般ユーザー cd ~ は現在のユーザーのホームディレクトリに入ります
root、ルートのホームディレクトリに入ります
2.6 環境変数に関するコマンド
1. echo: 環境変数の値を表示します。
2. エクスポート: 新しい環境変数を設定します。
3. env: すべての環境変数を表示します。
4. unset: 環境変数をクリアします
5. set: ローカルに定義されたシェル変数と環境変数を表示します。
2.7 環境変数の構成
各プログラムは文字ポインターの配列である環境テーブルを受け取り、各ポインターは「\0」で終わる環境文字列を指します。
char *env【】その各パラメータは環境テーブルであるchar*のパラメータです
2.8 コードを通じて環境変数を取得する (main 関数の 3 番目のパラメーター)
コマンドラインの 3 番目のパラメータ
#include <stdio.h> int main(int argc, char *argv[], char *env[]) { int i = 0; for(; env[i]; i++){ printf("%s\n", env[i]); } return 0; }
サードパーティの変数環境を通じて取得
#include <stdio.h> int main(int argc, char *argv[]) { extern char **environ; int i = 0; for(; environ[i]; i++){ printf("%s\n", environ[i]); } return 0; }
libc で定義されているグローバル変数 environ は環境変数テーブルを指しており、environ はヘッダー ファイルには含まれていないため、使用する場合は extern で宣言する必要があります。
2.9 システムコールによる環境変数 getenv および putenv の取得または設定
10v
getenv() 関数は、環境リストで環境変数名を検索し、対応する値文字列へのポインタを返します。
#include <stdio.h> #include <stdlib.h> int main() { printf("%s\n", getenv("PATH")); return 0; }
プテンフ
1. putenv() の機能は、環境変数の値を追加または変更することです。
2. パラメータ文字列の形式は、名前=値です。name が環境に存在しない場合は、文字列が環境に追加され、name が存在する場合は、環境内の name の値が value に変更されます。
3. string が指す文字列は環境の一部となるため、文字列を変更すると環境も変更されます。
4. 戻り値 putenv() 関数は、成功した場合は 0 を返し、エラーが発生した場合は 0 以外を返します。
5. エラーが発生した場合、その理由を示す errno が設定されます。エラー 新しい環境を割り当てるための十分なスペースがありません。
2.10 環境変数には通常、グローバル プロパティがあります
環境変数には通常、グローバル属性があり、子プロセスに継承できます。
#include <stdio.h> #include <stdlib.h> int main() { printf("%s\n", getenv("testFor_11")); return 0; }
1. 子プロセスは親プロセスの環境変数を継承します。
2. デフォルトでは、すべての環境変数は子プロセスに継承されます。
環境変数をexport testFor_11=Helloで設定し、その情報の設定値をシステムコールgetenvで取得することで、上記の結論が導けます。
2.11 main 関数の他の 2 つのパラメータ
int argc: 実行中のプロセスと、プロセス自体を含む後続の入力文字列の数を記録します。/
char *argv[]: 各文字列の内容を記録します
図に示すように、argc は 3 で、対応する argv は「./argctest」、「-a」、「-b」です。
したがって、次のコードになります。
#include<stdio.h> #include<string.h> int main(int argc,char *argv[]){ if(argc < 2){ printf("usage:%s! Lack of options\n",argv[0]); } if(argc == 3 && strcmp("-a",argv[1]) == 0 && strcmp("-b",argv[2]) == 0){ printf("这是选项-a-b\n"); return 0; } if(strcmp("-a", argv[1]) == 0){ printf("这是选项-a\n"); }else if(strcmp("-b",argv[1]) == 0){ printf("这是选项-b\n"); }else{ printf("无此选项\n"); } return 0; }
したがって、Linux コマンド ライン プログラムとそのオプションは、グローバル属性の環境変数を設定し、関連する int argc と char *argv[] の 2 つのコマンド ライン パラメータを渡すことによって判断され、実行されることがわかります。