直观概念:程序的一个执行实例,正在执行的程序等
- 内核观点:担当分配系统资源(CPU时间,内存)的实体
操作系统是如何管理进程的呢?先把进程描述起来,再把进程组织起来。
描述进程-PCB:进程信息被放在一个叫做程序控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
- 组织进程:内核采用双向链表来组织task_struct
task_struct部分内容:
进程标识符(PID):别名进程号,在操作系统中不会重复
状态:任务状态,退出代码,退出信号等
优先级:相对于其他进程的优先级
内存指针:指向程序地址空间
程序计数器:保存进程即将要执行的下一条指令的地址
上下文数据:保存上一次执行时,寄存器当中的值
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
记账信息:当前进程启动的时间,当前进程占用CPU的时间
程序计数器&&上下文数据 应用实例:
进程状态
运行:正在CPU上面运算
就绪状态:程序已经准备好,在就绪队列中等待CPU资源
阻塞状态:等待I/O就绪R:运行状态
S:可中断睡眠状态
D:磁盘睡眠状态,不可以被打断
T:暂停状态(可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。)前台进程:“+”代表前台进程
后台进程:没有“+”代表后台进程t:跟踪状态---gdb调试程序的时候可以发现程序是t状态
X:死亡状态
Z:僵尸状态
了解了进程状态之后,如何来查看进程的一些属性呢
LInux下我们通过ps aux | grep 程序名
来查看一个进程相关信息
//测试代码
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
//sleep(1);
}
return 0;
}
在另一台终端输入ps aux | head -1; ps aux | grep ./test | grep -v grep
(分号前面的指令是为了打印标题,后面的指令是用来查看进程信息的,grep -v grep是为了过滤)
不加grep -v
加上后效果
执行指令后我们可以读出进程标识符PID,以及进程状态(为R+)。
加上sleep(1)后,我们可以发现此时进程状态为S+。
那么如何把一个前台进程变为后台进程呢,在可执行程序后加 & 即可。
相信大家在Linux下对 ctrl+c 非常熟悉,不管遇见什么难倒我们的事情,第一件事情就是无脑 ctrl+c,看是否解决问题 /滑稽 。我们可以使用 ctrl+c 关闭任何一个我们想要关闭的前台进程,但是对于后台进程他却无能为力。kill -9 pid可谓linux最强的命令了,只需知道进程的pid就可以杀死这个进程。我们来试试
kill命令能干掉后台进程,可是我们不想这么粗暴,还有其他办法吗?答案是有的:Linux下还有一个 fg 命令,他可以把最后一次放到后台的进程恢复为前台进程。然后就可以用ctrl+c关闭啦
僵尸状态我们在后文赘述。
关于进程的相关信息我们还可以通过ll /proc/进程PID
来进行查看,例如查看1号进程打开的文件描述符:ll /proc/1/fd
进程优先级
进入top后按“r”–>输入进程PID–>输入nice值 即可完成NI值修改
PRI && NI辨析
#include <unistd.h>
pid_t fork(void);
//返回值:子进程中返回0,父进程返回子进程id,出错返回-1
//测试代码
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t ret = fork();
if(ret < 0)
{
//error
perror("fork error");
return 0;
}
else if(ret > 0)
{
//father
while(1)
{
printf("i am father, ret=%d, pid=%d, ppid=%d\n", ret, getpid(), getppid());
sleep(1);
}
}
else
{
//child
while(1)
{
printf("i am child, ret=%d, pid=%d, ppid=%d\n", ret, getpid(), getppid());
sleep(1);
}
}
return 0;
}
解释:
pid_t getpid(void) //谁调用返回谁的进程pid
pid_t getppid(void) //谁调用返回谁的父进程pid
运行结果:
其他相关概念:
总结:
原文:https://blog.51cto.com/14289099/2622962