首先我们需要了解什么是进程?
进程
与应用程序相关联
1.是程序的一个执行实例
2.是正在执行的程序
进程的相关命令
1.查看进程:ps
2.查看当前操作系统的所有进程:ps aux
3.查看某个进程:ps aux | grep X(X代表某进程的名字)
例如:查看vim的进程:
查看vim的进程:ps aux | grep vim
进程与可执行程序的区别
进程:存在于内存中
可执行程序:存在于磁盘中
例如:
命令:rm 文件名
此命令执行后进程还存在吗?
答案:进程还是存在的,因为命令 "rm 文件名" 删除的是可执行程序,而不是进程
描述进程—>PCB
操作系统管理对象,它不是直接进行管理的,而是通过媒介,我们所说的PCB就可以说是一个媒介。
操作系统管理进程时,它是通过管理进程的有效信息来管理进程的,而所有进程的有效信息会被存放到一个进程控制块的数据结构中,这个进程控制块可以说是进程属性的集合,而这个进程控制块的名字就是"PCB"
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里,并且包含着进程的信息
每个进程都把他的信息存放在task_struct这个数据结构体中,进程的创建、进程的终止、进程的切换都与task_struct有关
task_struct的组成
1.标示符:描述进程的"唯一标示符",用来区别别的进程
例如:PID(用来标示子进程),PPID(用来标示父进程)
2.状态:任务(状态)状态,退出代码,退出信号
进程的状态:睡眠、运行、挂起等状态
3.优先级:相对于其他进程的优先级
例如:如果有好几个进程都在执行,那就会涉及到那个进程先执行那个进程后执行,这就会和进程的优先级有关
4.程序计数器:程序中即将被执行的下一条指令的地址
注:一个进程一个程序计数器
5.内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
6.上下文数据:进程执行时处理器的寄存器中的数据
7.I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
8.记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
9.其他信息
注意:所有运行在系统中的进程都以"task_struct双向链表"的形式存放在Linux内核中
标示符
PID
通过系统调用获得进程标示符
代码:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
printf("pid:%d\n",getpid());
printf("ppid:%d\n",getppid());
return 0;
}
运行结果:
子进程与父进程
状态
R--->运行状态
并不意味着进程一定在运行中,它表明进程有两种可能:第一种是进程在运行中,第二种是进程在队列中
S--->睡眠状态
意味着进程在等待事件完成,这里的睡眠有时候也叫做可中断睡眠
D--->磁盘休眠状态
有时候也叫不可中断睡眠,在这个状态的进程通常都会等待I/O的结束
T--->停止状态
可以通过发送SIGSTOP信号给进程来停止(T)进程,这个被停止的进
程可以通过发送SIGSTOP信号让进程继续进行
X--->死亡状态
这个状态只是一个返回状态,不会再任务列表里看到此状态。