僵尸进程
进程=内核数据结构PCB+进程的代码和数据,都要占据内存空间,那么进程退出的核心工作之一:即将PCB和自己的代码和数据释放掉
我们创建进程的目标一定是为了完成某种任务,父进程/OS要知道该进程把任务完成的怎么样,所以进程在退出的时候,要有一些退出信息(存在PCB中)表明自己把任务完成的怎么样(如main函数,都要有return),当一个进程在退出的时候退出信息会由OS写入到当前退出进程的PCB中,这样,OS/父进程读取退出进程的PCB中的退出信息,就可得知子进程退出的原因。可以允许进程的代码和数据空间被释放,但是不能允许进程的PCB立即被释放
那么此刻便有这样一种情况:进程退出了,但是还没有被父进程/OS读取退出信息,故而os必须要维护这个退出进程的PCB结构,此时,这个进程的状态就是Z:僵尸状态
如果一个进程Z状态了,但是父进程就是不回收它,PCB就会一直存在,所以,如果我们不及时回收,会导致内存泄漏,只有父进程/OS读取之后,PCB状态才会由Z状态(僵尸状态)改成X状态(死亡状态),才会被释放
孤儿进程
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”
孤儿进程被1号init进程(即操作系统)领养,有init进程回收
进程优先级
基本概念
1 cpu资源分配的先后顺序,就是指进程的优先权(priority)
2 优先权高的进程有优先执行权利,配置进程优先权对多任务环境的linux很有用,可以改善系统性能
3 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
多个进程在cpu的运行队列中排队等待被调度,排队的本质就是在确认优先级
优先级是什么?优先级是得到某种资源的先后顺序
为什么要有优先级?因为资源不足
其实优先级就是PCB中的一个int字段,数值越小,优先级越大
Linux中进程的优先级数值范围:60~99(共40个等级)
Linux中默认进程的优先级都是80
Linux支持动态优先级调整:linux中进程PCB里存在一个nice值(进程优先级的修正数据)
即新的优先级=默认优先级+nice值
nice调整最小是:-20 超过部分统一当成-20
nice调整最大是:19,超过部分统一当成19
那么为什么要把优先级限定在一定的范围内?为了较为公平
因为OS调度时,需要较为均衡地让每一个进程都要得到调度,如果不限制范围,容易导致优先级较低的进程长时间得不到CPU资源,导致进程饥饿
查看系统进程
在linux中,输入ps-la指令,会出现以下内容:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值
查看进程优先级的命令
用top命令更改已存在进程的nice
1 top
2 进入top后按“r”–>输入进程PID–>输入nice值
每一个进程不是占有cpu就一直运行,每隔一段时间(时间片),自动被从cpu上剥离下来,此外linux内核支持进程之间进行cpu资源抢占,即基于时间片的轮转式抢占内核
其他概念:
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
cpu中存在许多寄存器,如eax,ebx,ecx……
为什么我们函数内定义的栈临时变量会返回给外部?
因为eax寄存器保存了它的值,eax充当了代码的临时空间
为什么我们的进程/程序,它怎么知道我们当前运行到哪里?
因为cpu内的eip(程序计数器)它存储了下一条指令的地址
我们的进程在运行的时候,是会使用这些寄存器的,我们的进程会产生各种数据,在寄存器中临时保存,如果我们有多个进程,各个进程在CPU寄存器中形成的临时数据(即进程的硬件上下文)都应该是不一样的
cpu寄存器只有1套,若是有10个进程,那么进程的上下文数据就有10套,所以寄存器!=寄存器的内容
将cpu内的寄存器数据保存到进程pcb中(简单理解),本质就是cpu寄存器中的内容,保存到内存中