系统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;
在此示例中,curthread 是使用的全局变量。