目次
プログラムが実行されるとき、main 関数がどのように呼び出されるか、コマンド ライン パラメータがプログラムにどのように渡されるか、一般的な記憶域スペースのレイアウトはどのようなものか、他の記憶域スペースを割り当てる方法、プロセスが環境変数をどのように使用するか、終了プロセスの知識など、いずれもプロセス制御の基礎知識です。
プロセスの起動と終了
プロセスの終了状況
プロセスの起動と終了の図
atexit関数
終了関数
_e(E)xit 関数
ISO C この関数を定義する目的は、終了ハンドラーやシグナル処理関数を実行せずにプロセスがプログラムを終了する方法を提供することです。ただし、ISO C が標準 I/O ストリームをフラッシュするかどうかは、オペレーティング システムの実装によって異なります。 UNIX ではフラッシュは実行されません。
exit 関数と _e(E)ixt 関数のステータス コード
wait 関数と waitpid 関数の違いは次のとおりです:
unixカーネルは環境文字列をチェックしません、その解釈は各アプリケーションプロセスに完全に依存します
存储空间分配函数
函数间跳转策略
寄存器变量会存在回滚现象的探究
ホームページ 運用・保守 Linuxの運用と保守 プロセス環境 - プロセス管理

プロセス環境 - プロセス管理

Jul 23, 2017 am 11:16 AM
環境 プロセス

プログラムが実行されるとき、main 関数がどのように呼び出されるか、コマンド ライン パラメータがプログラムにどのように渡されるか、一般的な記憶域スペースのレイアウトはどのようなものか、他の記憶域スペースを割り当てる方法、プロセスが環境変数をどのように使用するか、終了プロセスの知識など、いずれもプロセス制御の基礎知識です。


プロセスの起動と終了

カーネルがCプログラムを実行するとき、カーネルはexec関数を使用して特別な起動ルーチンを呼び出し、カーネルからコマンドラインパラメータと環境変数の値を取得します。

プロセスの終了状況

5つの正常終了状況:

(1)从main函数返回;
(2)调用exit;
(3)调用_exit和_Exit函数;
(4)最后一个线程调用pthread_exit;
(5)最后一个线程从其启动例程返回;
ログイン後にコピー

3つの異常終了状況

(1)调用abort;
(2)接到一个信号;
(3)最后一个线程对取消请求做出响应;
ログイン後にコピー

プロセスの起動と終了の図

プロセス環境 - プロセス管理

atexit関数

プロセスは最大32個の関数(:signal関数など)を登録できます)、これらの関数は exit 関数によって自動的に呼び出されます。これらの関数は、プログラムが終了するときに呼び出され、プロセスを終了する前に仕上げ作業を実行する終了ハンドラーを形成します。 exit 関数は、atexit 関数の登録レコードを使用して、どの関数を呼び出すかを決定します。

終了関数

この関数は ISO C によって定義されており、その操作には終了ハンドラーの処理とすべての標準 I/O ストリームの終了が含まれます。 ファイルディスクリプタ、マルチプロセス(親子プロセス)、ジョブ制御には対応していないことに注意してください。

_e(E)xit 関数
ISO C この関数を定義する目的は、終了ハンドラーやシグナル処理関数を実行せずにプロセスがプログラムを終了する方法を提供することです。ただし、ISO C が標準 I/O ストリームをフラッシュするかどうかは、オペレーティング システムの実装によって異なります。 UNIX ではフラッシュは実行されません。

exit 関数と _e(E)ixt 関数のステータス コード

プロセスがどのように終了しても、カーネル上で同じコードが実行されます (プロセスの起動と終了の図からわかるように)。このコードは、すべてのファイル記述子を閉じ、すべてのストレージ領域を解放します。

プログラムが終了したら、終了コードを使用して親プロセスにプロセスを通知します。親プロセスは、wait または waitpid 関数を使用して、子プロセスの処理を完了します (子プロセスに関する情報を取得し、子プロセスが占有しているリソースを解放します)。親プロセスが子プロセスの終了ステータスを処理しない場合、子プロセスはゾンビプロセスになります。逆に、親プロセスが子プロセスより先に終了した場合、子プロセスは孤立プロセスになります。孤立したプロセスは、プロセス番号 1 (init プロセス) によって受け取られます。一般的な処理は次のとおりです。プロセス。子プロセスの終了は非同期イベントであるため、この信号も非同期信号です。このシグナルは通常、デフォルトでは親プロセスによって無視されます。あるいは余波に対処するための信号処理機能を提供します。 wait 関数と waitpid 関数は信号処理関数の一部です。

wait 関数と waitpid 関数の違いは次のとおりです:

(1)进程终止时,内核逐个检查所有活动的进程;
(2)分析查找该终止进程的子进程;
(3)将该进程的子进程的父进程ID改为1;
ログイン後にコピー

ここでの呼び出し元は親プロセスを指します

環境テーブルと環境変数環境テーブルの構造図

プロセス環境 - プロセス管理すべてのプログラムは、環境テーブル

  • 環境テーブルは文字ポインタの配列でもあります

  • enrivonは環境ポインタと呼ばれます

  • ポインタの配列は環境テーブルと呼ばれます

  • 各ポインタが指す文字列は環境文字列と呼ばれます

  • 環境変数

unixカーネルは環境文字列をチェックしません、その解釈は各アプリケーションプロセスに完全に依存します

  • 通常、環境変数をシェル起動ファイルに設定して、シェル

  • 環境を変更または追加する 変数が使用される場合、変数は現在のプロセスと、生成および呼び出される後続の子プロセス (以前のプロセスには影響を与えません) の環境にのみ影響を与えますが、その環境には影響を与えません。親プロセス

  • 環境変数に関連する関数は次のとおりです:

    (1)wait会阻塞调用者进程等待直至第一个终止的子进程到来;
    (2)waitpid可以通过参数设置,来实现调用者进程不阻塞,或选择要阻
    塞等待的子进程;
    ログイン後にコピー
  • これらの関数はどのように環境テーブルを変更するのでしょうか? 環境テーブルと環境文字列は通常、メモリ空間の上位アドレス (先頭) に格納されます。したがって、その値を変更する場合、メモリは上位アドレスまで拡張し続けることはできませんが、その下にはスタック フレームがあるため、下方へ拡張することはできません。値を変更する手順は次のとおりです。

(1) 環境テーブルを変更する

#include<stdlib.h>
char *getenv(const char *name);
      返回值:指向与name关联的value的指针;若未找到,返回NULL

int putenv(char *str);
                       返回值:若成功,返回0;若出错,返回非0
                       
int setenv(const char *name, const char *value,
            int rewrite);
int unsetenv(const char *name);
                两个函数返回值:若成功,返回0;若出错,返回-1</stdlib.h>
ログイン後にコピー

(2) 環境テーブルを追加する

1)新value = 旧value,调用malloc函数,在堆区开辟新的存储空间,
将新value复制到这里,再将这片存储区首地址写到环境表相应的位置处。
ログイン後にコピー

注: この方法で変更された

環境変数は、現在のプログラムでは、実行時に有効です。プログラムが終了すると、対応する記憶領域がシステムによって再利用され、これらの変更は無効になります。 メモリ格納構造の補足説明

メモリ管理構造図

未初期化データセグメント(シンボルで始まるブロック): プロセス環境 - プロセス管理プログラムの実行開始前

、カーネルはこのセグメント内のデータを0に初期化します。または null ポインタ;
  • スタック: 関数が呼び出されるたびに、その戻りアドレスと呼び出し元の環境情報 (一部のマシン レジスタの値など) がスタックに格納されます。

  • 共享库:只需在所有进程都可引用的存储区中保存这种库例程的一个副本;

存储空间分配函数

#include<stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nojy, size_t size);
void *realloc(void *ptr, size_t newsize);
         3个函数返回值:若成功,返回非空指针;若出错,返回NULL</stdlib.h>
ログイン後にコピー
  • malloc函数:初始值不确定;底层通过调用sbrk函数实现;

  • calloc函数:初始值为0;

  • realloc函数:增加或减少以前分配区的长度;当增加长度时,可能将以前分配区的内容移到另一个足够大的区域,以便在分配区末尾增加存储区,而新增存储区初始值不确定(例如:可变数组的使用);

注意:这些动态分配的函数一般在分配存储空间时,会比要求的大。因为在开辟空间的前后部分存储记录管理信息。因此,在使用时,千万不要越界访问,以免造成不可预知的后果。

函数间跳转策略

在c语言中,goto语句是不能跨函数跳转的。尤其是在函数深层调用时的跳转需求,在出错处理的情况下非常有用。

#include<setjmp.h>
int setjmp(jmp_buf env);
          返回值:若直接调用,返回0;若从longjmp返回,返回非0
void longjmp(jmp_buf env, int val);</setjmp.h>
ログイン後にコピー

变量值回滚问题:自动变量和寄存器变量会存在回滚现象。利用volatile属性来避免此类情况的发生。(在给变量赋值时,赋的值回首先存储在内存(存储器变量)中,然后在由cpu取走,存储在cpu的寄存器上(寄存器变量)。在做系统优化时,那些频繁使用的变量,会直接存储到寄存器中而不经过内存。)

寄存器变量会存在回滚现象的探究

在调用setjmp函数时,内核会把当前的栈顶指针保存在env变量中,所以在调用longjmp函数返回该位置时,全局变量、静态变量、易失变量和自动变量如果在调用setjmp和longjmp函数之间它们的值被修改过,是不会回滚到setjmp函数调用之前的值(当然,编译器将auto变量优化为寄存器变量除外)。因为,这些存储器变量的值是存储在内存相应的段中,回到原先栈顶状态时,同样访问的还是原先的内存空间。

然而,对于寄存器变量来说,首先要明确一点:寄存器变量是用动态存储的方式。意思是寄存器变量的值可能存在不同的寄存器中。如果在调setjmp和longjmp函数之间它们的值被修改过,这个值可能不会存到setjmp之前的对其赋值的寄存器中,而在调用longjmp函数后,又回到了调用setjmp函数时的状态。这个时候再读取寄存器变量的值时,读到的是原先那个寄存器中存储的值而不是修改过的那个寄存器中存储的值,所以出现的回滚现象。

以上がプロセス環境 - プロセス管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Explorer.exe プロセスとは何かを説明する Explorer.exe プロセスとは何かを説明する Feb 18, 2024 pm 12:11 PM

Explorer.exe とは何のプロセスですか? Windows オペレーティング システムを使用しているときに、「explorer.exe」という用語をよく聞きますが、このプロセスが何であるか知りたいですか?この記事では、プロセスexplorer.exeとは何か、その機能と効果について詳しく説明します。まず、explorer.exe は Windows オペレーティング システムの重要なプロセスであり、Windows エクスプローラー (ウィンドウ) の管理と制御を担当します。

com サロゲートのプロセスは何ですか? com サロゲートのプロセスは何ですか? Sep 14, 2022 pm 02:56 PM

「com サロゲート」は「C:\Windows\System32\dllhost.exe」のプロセスです。このプロセスが発生すると、通常は「COM+」コンポーネントが動作しなくなったことを意味します。このプロセスは多くのスペースを占有し、さらには占有しないこともあります。直接応答してください。これは、コンピュータがファイル アイコンを読み込んでいるためです。場合によっては、問題が発生してコンピュータがフリーズすることがあります。スタックした問題は、コンピュータのプロパティ設定で解決できます。

ccsvchst.exe はどのようなプロセスですか? ccsvchst.exe はどのようなプロセスですか? Feb 19, 2024 pm 11:33 PM

ccsvchst.exe は、Symantec Endpoint Protection (SEP) ソフトウェアの一部である共通プロセス ファイルです。SEP は、有名なネットワーク セキュリティ会社 Symantec によって開発されたエンドポイント保護ソリューションです。ソフトウェアの一部として、ccsvchst.exe は SEP 関連のプロセスの管理と監視を担当します。まず、SymantecEndpointProtection(

Windows 回復環境を起動できない Windows 回復環境を起動できない Feb 19, 2024 pm 11:12 PM

Windows 回復環境 (WinRE) は、Windows オペレーティング システムのエラーを修復するために使用される環境です。 WinRE に入ると、システムの復元、出荷時設定へのリセット、アップデートのアンインストールなどを実行できます。 WinRE を起動できない場合、この記事では問題を解決するための修正方法を説明します。 Windows 回復環境を起動できない Windows 回復環境を起動できない場合は、以下の修正プログラムを使用してください。 Windows 回復環境のステータスを確認する 他の方法を使用して Windows 回復環境に入る Windows 回復パーティションを誤って削除しましたか?以下の Windows のインプレース アップグレードまたはクリーン インストールを実行します。これらすべての修正については詳しく説明しています。 1]Wiをチェックする

Python と Anaconda の違いは何ですか? Python と Anaconda の違いは何ですか? Sep 06, 2023 pm 08:37 PM

この記事では、Python と Anaconda の違いについて学びます。パイソンとは何ですか? Python は、行をインデントし空白を入れることでコードを読みやすく理解しやすくすることに重点を置いたオープンソース言語です。 Python は柔軟性と使いやすさを備えているため、オンライン アプリケーションの作成や開発だけでなく、科学コンピューティング、人工知能、データ サイエンスなどのさまざまなアプリケーションに最適です。 Python はインタープリタ言語であるため、テストされるとすぐに機械語に翻訳されます。 C++ などの一部の言語は、理解するためにコンパイルが必要です。 Python は理解、開発、実行、読み取りが非常に簡単であるため、Python の習熟度は重要な利点となります。これにより Python が作成されます

Linux でゾンビプロセスを適切に強制終了する方法 Linux でゾンビプロセスを適切に強制終了する方法 Feb 19, 2024 am 10:40 AM

Linux システムでは、ゾンビ プロセスは終了したもののシステムにまだ残っている特別なプロセスです。ゾンビ プロセスは多くのリソースを消費しませんが、多すぎるとシステム リソースの枯渇を引き起こす可能性があります。この記事では、ゾンビ プロセスを正しく削除してシステムの正常な動作を保証する方法を紹介します。 1Linux ゾンビ プロセス 子プロセスがタスクを完了した後、親プロセスが時間内にステータスを確認しないと、子プロセスはゾンビ プロセスになります。子プロセスは親プロセスからの確認を待っており、システムは完了するまでリサイクルしません。そうしないと、ゾンビ プロセスがシステム内でハングし続けます。システム内にゾンビ プロセスがあるかどうかを確認するには、コマンド top を実行して、実行中のすべてのプロセスとゾンビ プロセスの可能性を表示します。 Linux における「top」コマンドの結果は、上の図から見ることができます。

Linuxのプロセス優先度調整方法を詳しく解説 Linuxのプロセス優先度調整方法を詳しく解説 Mar 15, 2024 am 08:39 AM

Linuxのプロセスの優先度調整方法を詳しく解説 Linuxシステムでは、プロセスの優先度によってプロセスの実行順序やシステム内のリソースの割り当てが決まります。プロセスの優先順位を合理的に調整すると、システムのパフォーマンスと効率が向上します。この記事では、Linuxでプロセスの優先度を調整する方法と具体的なコード例を詳しく紹介します。 1. プロセス優先度の概要 Linux システムでは、各プロセスには優先度が関連付けられています。優先順位の範囲は通常 -20 ~ 19 で、-20 は最高の優先順位を表し、19 は最高の優先順位を表します。

Windows 11 でタスク マネージャーのプロセス更新を停止し、タスクをより簡単に強制終了する方法 Windows 11 でタスク マネージャーのプロセス更新を停止し、タスクをより簡単に強制終了する方法 Aug 20, 2023 am 11:05 AM

Windows 11 および Windows 10 でタスク マネージャーのプロセス更新を一時停止する方法 CTRL + Window キー + Del キーを押してタスク マネージャーを開きます。デフォルトでは、タスク マネージャーは [プロセス] ウィンドウを開きます。ここでわかるように、すべてのアプリが際限なく動き回っており、選択するときにそれらを指すのが難しい場合があります。したがって、CTRL を押したままにすると、タスク マネージャーが一時停止されます。アプリを選択したり、下にスクロールしたりすることもできますが、常に CTRL ボタンを押し続ける必要があります。

See all articles