Linux进程

2020-09-02  本文已影响0人  Sharkchilli

前言

进程是分配系统资源的基本单位
linux的进程与Windows的一样使用的是虚拟内存,而Linux虚拟地址物理地址的转换是通过MMU(分页内存管理单元)实现的。用户空间映射到物理内存是独立的。

那么系统是如何管理进程的呢?
进程控制块(PCB)是系统为了管理进程设置的一个专门的数据结构。系统用它来记录进程的外部特征,描述进程的运动变化过程。同时,系统可以利用PCB来控制和管理进程,所以说,PCB(进程控制块)是系统感知进程存在的唯一标志。
说白话就是每个进程都有一个PCB结构体来管理进程

使用grep查找PCB结构体

sudo grep -rn "struct task_struct {" /usr/

光标停留在{上,按% ,可以到结构体的结尾。400多行,由于此结构体太大我就不贴出来了。只选取一些关键的成员看看

进程相关API

创建一个新的子进程
pid_t fork(void);

返回值:

获得当前进程pid
pid_t getpid(void);

获得当前进程父进程的id
pid_t getppid(void);

父子进程

init进程是所有进程的祖先

查看进程
ps

杀死进程命令
kill

exec族函数

exec族函数换核不换壳,将其代码考到原先进程的代码块中,并没有开启新的进程

执行其他程序,需要加路径
int execl(const char *path, const char arg, ... / (char *) NULL */);

执行程序的时候,使用PATH环境变量,执行的程序可以不用加路径
int execlp(const char *file, const char arg, .../ (char *) NULL */);

孤儿进程与僵尸进程

孤儿进程:父亲死了,子进程被init进程领养。
僵尸进程:子进程死了,父进程没有回收子进程的资源(PCB)

如何回收僵尸进程:杀死父亲,init领养,负责回收。

子进程回收

回收子进程,知道子进程的死亡原因
pid_t wait(int *status);

作用:

参数:

返回值:

子进程的死亡原因:

回收子进程,可不阻塞
pid_t waitpid(pid_t pid, int *status, int options);

参数:

返回值:

上一篇 下一篇

猜你喜欢

热点阅读