システムgetpid
コールは、呼び出しプロセスのプロセスIDを返します。カーネルはどのプロセスがシステムコールを呼び出すかをどのように決定しますか?
答え1
カーネルはジョブスケジューリングを実行し、システムコールを提供します。
プロセスが実行されると、カーネルはランタイムを予約し(特にPIDを割り当てる)、この情報はカーネルアドレス空間(たとえば、作業構造)内のデータ構造に格納されます。
したがって、プロセスがgetpid()
システムコールを呼び出すとき、カーネルは次のものだけを必要とします。作業構造の表示呼び出し(つまり、現在実行中)プロセスの
答え2
システムコールが実行されると、実行コードがユーザーモードコードで禁止するより多くのコマンドを実行し、データにアクセスできるようにする権限スイッチがあります。
ただし、プロセスコンテキストの切り替えがないため、カーネルコードは呼び出しプロセスのコンテキストで実行され続けます。これは、カーネルがどのプロセスが自分自身を呼び出すかを取得する必要はなく、すでに知っていることを意味します。 getpidシステムコールコードは、独自のプロセス/スレッド固有の情報を含む内部構造へのポインタからプロセスIDを取得します。この構造は、オペレーティングシステムの実装によって異なります。
たとえば、Illumos(OpenSolaris)の場合、構造名はprocです。 http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/sys/proc.h#131
答え3
単一のCPUシステムには、実行中のプロセスまたは現在のスレッドのproc構造を指すグローバル変数があります。 proc 構造にはプロセス ID が含まれています。
マルチCPUシステムでは、各CPUは同様のポインタを持つか、MMUコンテキストを使用してシステムコールのグローバル変数を設定します。
int64_t
getpid(void)
{
rval_t r;
proc_t *p;
p = ttoproc(curthread);
r.r_val1 = p->p_pid;
この例では、corthreadが使用されたグローバル変数です。