1.什么是进程
进程是正在运行的程序。
UNIX标准将进程定义为:其中运行着一个或者多个线程的地址空间和这些线程所需要的系统资源(分配给线程线程共享系统资源)。
组成:进程由程序代码、数据、变量(占用着系统内存)、打开的文件(文件描述符)、环境组成。
2.进程的结构
PID:进程标识符——取值范围为2 到 32768(各系统最大值不一样)的正整数,进程被启动时,系统会按顺序将下一个未被使用的数字作为进程PID,转完一圈又会重新从2开始。
3.进程表——PCB
进程表,也称进程控制块(PCB),将当前加载到内存的所有进程的有关信息记录在一个表中,其中包括进程PID、进程的状态、命令字符串和其他一些ps命令输出的各类信息(进程描述信息和控制信息)。每个进程占用其中一个表项,PID是进程表的索引,操作系统通过PID对进程进行管理。
在典型的系统中包含如下关键字段:
3.1进程管理相关
包含三大类信息;
1)标识信息:用于唯一地标识一个进程,包括进程ID、父进程、进程组等。
2)现场信息:用于保留一个进程在运行时存放在处理器现场中的各种信息。它们用于在进程切换是保存处理器现场和恢复处理器现场。包括通用寄存器、PSW、堆栈指针、程序计数器等。
3)控制信息:用于管理和调度一个进程。包括进程开始时间、使用CPU的时间等。
3.2存储管理相关
1)正文段指针
2)数据段指针
3)堆栈段指针
等
3.3文件管理相关
根目录、工作目录、文件描述符、用户ID、组ID等
4.查看进程
1.ps命令可以查看所有者当前正在运行的程序、其他用户正在运行的程序、系统正在运行的所有程序。
UID:该进程执行的用户ID
PID:进程标识符
PPID:父进程标识符
C:cpu的占用率,形式是百分数
STIME:进程的启动时间
TTY:终端设备,显示进程是从哪一个终端启动的
TIME:进程目前为止占用cpu的时间(进程的执行时间)
CMD:启动进程时所用的命令 / 该进程的名称或对应的路径
2.ps常用组合命令
ps -ef|grep 进程名称
同时运行多个进程可以将进程放在后台运行
./b& ./a&
5.进程创建原理
Lnux上创建新进程的方式:fork()+exec();
使用写时拷贝技术,复制bash的一部分,然后再进行替换。
bash:命令解释器,允许用户向操作系统输入需要执行的命令。
打开一个终端,会默认运行bash进程,直到退出终端bash终止。(注:同一个程序,每次运行起来的PID都不会相同,因为PID唯一标识进程)
不同的终端,默认的bash不同(PID不相同)
6.进程替换exec系列
/*man execl看帮助手册*/
//path:新替换的程序的路径名称
//arg:传给新程序主函数的第一个参数,一般为“程序的名字”,还可以将替换的新程序改名字,同样会替换成功
//arg后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数以此来结尾
/*
...为可变参数,例如:printf函数有可变参数,printf("%d%d%s",m,p,q)参数可变
*/
int execl(const char* path, const char * arg,...);
int execlp(const char* file, const char * arg,...);//在环境变量PATH指定的路径里面搜索;
int execle(const char* path, const char * arg,...,char* const envp[]);
int execv(const char * path, char* const argv[]);//把参数都放在了一个数组中
int execvp(const char * file, char* const argv[]);
int execve(const char * path, char* const argv[],char* const envp[]); //系统调用
//前五个是库函数,最后一个是系统调用,所以本质上:前5个都是通过底层调用第六个系统调用实现的。