进程概念:
进程 : 进行中的程序(用户角度), 运行一个程序需要描述一个程序的运行,通过一个task_struct结构体描述,统称为PCB(操作系统角度)
程序 : 一堆代码, 存储在硬盘中,
程序运行起来就会被加载到内存中,删除硬盘中的程序,并不会使进程关闭
操作系统管理进程 : 描述进程,
PCB—struct task_struct{} 操作系统通过PCB来管理运行中的程序,
其本质是一个task_struct结构体
描述信息 : 进程标识符(PID) , 进程状态, 优先级, 程序计数器, 上下文数据, 记账信息 内存指针, IO状态信息等
查看进程信息 |
|
cat /proc/self/limits
查看详细的当前进程的资源限制,普通用户修改资源上限值,最大不超过硬限制,root用户可超过限制
/proc
进程运行信息存放目录
ps -ef -aux -ajx
查看系统上的进程信息
getpid()
获取调用进程的进程ID
env
查看当前进程的环境变量
杀死进程:
kill -9 pid
杀死进程
kill -9 -pid
杀死进程组
通过系统调用创建进程:
#include
pid_t fork(void);
通过复制调用进程,创建一个子进程
子进程复制的就是父进程的PCB(父子进程数据, 代码看起来都一样)
特点: 代码共享, 数据独有
进程状态:
运行R, 可中断睡眠S, 不可中断睡眠D, 停止T, 死亡X, 僵死Z
僵尸进程:
子进程结束运行后,没有被父进程回收PCB,这种情况导致系统资源泄露
产生僵尸进程的代码:
int main()
{
int pid = fork();
if(pid > 0)
{
while(1)
{
printf("i'm parent %d
", getpid());
sleep(1);
}
}
if(pid == 0)
{
printf("i'm child %d
", getpid());
}
}
孤儿进程:
父进程先于子进程结束,子进程称为孤儿进程,子进程的父进程成为1号进程,init进程,init进程领养孤儿进程
产生孤儿进程的代码
int main()
{
int pid = fork();
if(pid > 0)
{
while(1)
{
printf("i'm parent %d
", getpid());
}
}
if(pid == 0)
{
while(1)
{
printf("i'm child %d
", getpid());
sleep(1);
}
}
}
守护进程:
脱离了与终端和会话的关联的孤儿进程
进程优先级:
优先级: 决定资源的优先分配权的等级划分
为什么要有优先级:
让操作系统运行的更加合理
交互式进程: 一旦有操作, 优先处理
批处理进程: 一直处理数据, 但是对cpu要求不高
设置: ps -efl
PRI 优先级 NI nice值: PRI无法直接设置, 但是可可以通过设置NI值,调整PRI至
PRI = PRI + NI
renice -n size -p pid