进程
进程是什么
进程: 一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
进程 = 代码 + 数据 + pcb
pcb一般都叫task_struct
pcb是什么
pcb是一种用来管理进程信息的数据结构
进程信息被存放在进程信息控制块
的结构中
当程序运行起来时,可执行程序会被加载到内存中;众所周知我们的计算机不可能只有一个应用正在执行,可能是5个,10个程序同时执行,我们的计算机就是通过pcb这种结构来对他们进行链式管理
typedef struct task_struct
{
//众多信息
}pcb;
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。(cpu中有地址寄存器pc/eip,记录下一个指令的地址)
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。 I/IO状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
标识符——pid/ppid
我们先来看看我们的进程长什么样子
第一个是执行起来的程序——mybin;第二个是grep,grep执行起来也是一个程序我们使用的命令行基本上都是一个执行起来的程序
,它用来查找mybin,所以他也包含mybin的关键字,我们使用grep -v grep
来忽略grep
获取标识符——pid/ppid
获取id的函数时getpid,getppid——本别时获取本进程和获取父进程
可以看到pid_t getpid
是一个系统函数
,pid_t
是c语言上的整数类型
,谁调用这个函数,就返回谁的pid
使用这段代码进行连续观测,每一秒打印一次进程信息(现在打印的是表头信息)
获取自己的进程(pid)
通常使用ctrl+c终止进程
以上就获取到了自己的进程
接下来获取父进程(ppid)
我们发现了一个奇怪的点每次自己的进程编号
都是不一样
的,但是每次的父进程
都是一样
的`
通过查看ppid的进程得知:父进程是bash;bash是命令行解释器,所有的进程都是由bash创建的
进程运行的地址
在本路径下生成并执行文件,使用ls /proc/28300(进程id) -l
显示进程信息
需要补充的是:在linux中进程是被当作文件进程记录的
cwd表示进程的工作目录
exe表示文件的执行地址
我们来回忆一下c语言中的文件操作
:fopen("file.txt","w")
;//如果没有就在当前的工作目录下新建一个
重定向到已有的目录下
我们使用chdir改变文件工作目录
我们能看到,虽然exe文件还在
/home/user1/12_3/
路径下,但是我们的cwd已经改变位置了
,新生成的文件也是在新的路径下
重定向到没有的目录下
tem1是个没有的文件夹
补充
chdir有两个返回值,重定向成功返回0,重定向失败返回-1
经过分析,可以改变程序的工作目录,只能重定向到已经存在的目录
,如果重定向到不存在的目录就会产生错误
也可以使用移动可执行程序的目录的方式进行重定向
将文件直接放到上层目录中
这种更加证明了执行的目录默认就是工作目录,也就是说cwd和exe目录是一样的
进程状态——stat
r运行——运行状态
s浅层睡眠——(可中断睡眠)s后台运行(不可以被杀掉),s+前台运行(可以杀掉)
d深度睡眠——(不可中断睡眠)当资源紧张时,系统准备杀死进程,但是进程是一个重要的进程,不能被删除,就需要d状态来躲避
t暂停
z僵尸——需要使用父进程进行回收
当进程退出时,会保留pcb,保留相应的信息,只有父进程读取才能进行释放
x死亡
观察r状态和s状态
从图中看到子进程和父进程都是被创建出来了,并且父进程和子进程的状态都是s+,可是他为什么是s+状态呢,他们都是正在运行的呀,原因就是进程确实是在运行,计算机计算速度非常的快,运行完打印之后,会有2秒的休眠,那么就知道了,程序的大部分时间都处于sleep状态
去掉sleep函数,就只有函数执行,也就顺理成章的成为r状态
孤儿进程
孤儿进程就是没了父进程,孤儿进程一般会被父进程的父进程领养,但是对于子进程下有子进程,形成
父进程——子进程——孙子进程
,如果将子进程杀掉,孙子进程和父进程变化就不同寻常了(不需要管)
父进程死后只剩子进程,子进程被pid为1的进程接管
,并且子进程成为后台进程,不能被ctrl+c杀掉,只能使用kill杀掉
kill -l
查看所有kill参数,kill -9 pid
杀掉匹配pid进程
1就是系统进程
前台进程不能输入命令行
但是后台进程
可以输入命令行
进程优先级
为什么要有优先级
在计算机中,资源是有限的,对于所有的进程,需要进行排队,进行有次序的运行
由pid进行排序,pid=pid(old)+nice
NI——nice
pid:[60 ,99],数字越小,优先级越高
nice:[-20,19]
具有优先级显然是好的,但是对于程序员来说,最好是不要调整优先级,优先级还是让os自己调整吧
操作系统中有
分时操作系统
:每个进程都是可以运行到的——当一个进程的时间片用完了,就发出陷入信号,交还os权限,在转换进程
学习大佬的优秀文章
进程和程序
linux中gdb多进程调试