1.孤儿进程
父子进程关系中,如果父进程先退出,子进程要被1号进程领养,这个被领养的进程为孤儿进程(1号进程为操作系统),不领养如果变成僵尸进程就会有弊端,只有父进程和操作系统可以回收子进程,孤儿进程是在后台进行的,查看进程状态可以看到没有+号。
2.进程优先级
概念
cpu资源分配的先后顺序,就是指进程的优先级(priority)
优先权高的进程有优先执行的权利,配置进程优先权对多任务环境的Linux很有用,可以改善系统的性能
可以把进程运行到指定的CPU上,这样一来把不重要的进程安排到每个CPU,可以大大改善系统的整体性能
查看系统进程
在Linux系统中,用ps -l的命令可以看到如下的输出
UID:代表执行者的身份
PID:代表这个进程的代号
PPID:父进程代号
PRI:代表这个进程可被执行的优先级,其值越小越早被执行(默认80)
NI:代表这个进程的nice值(默认0)
PRI和NI
PRI表示进程的优先级,就是程序被CPU执行的先后顺序,此值越小则进程的优先级别越高
NI表示进程可被执行的优先级修正数值
PRI(new)=PRI(old)+nice
nice值为负优先级的值变小,反之变高
所以调整进程优先级,在Linux下就像调整进程nice的值
nice取值范围是[-20 19] ,一个四十个级别(变化的幅度,不能太大公平性)
小知识:
访问文件时系统通过发送指令(user的指令),指令也是进程也有UID,通过UID来看user是属于拥有者,所属组还是other
3.PRI vs NI
需要注意一点的是,进程的nice值不是进程的优先级,但是nice会影响进程优先级变化
可以理解nice值是进程优先级的修正数据
查看进程优先级的命令
用top命令更改已存在进程的nice:
top
进入top后按“r” ->输入进程PID->输入nice值
renice -n(这里的-是负号) number -p PID
优先级设立不合理,会导致优先级低的进程,长时间得不到CPU的资源,进而导致:进程饥饿
4.概念-竞争,独立,并行,并发
竞争性:系统进程数目很多,而CPU资源只有少量,甚至一个,所以进程之间是具有竞争属性的,为了高效完成任务,跟合理竞争相关资源,便具有了优先级
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行:多个进程在多个CPU下分别,同时运行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程都得以推进
5.进程切换
CPU上下文切换:其实际含义是任务切换,或者CPU寄存器切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,也就是CPU寄存器的全部内容。这些内容被保存在任务自己的堆栈中,入栈工作完成后就把下一个将要运行的任务的当前状态从该任务的栈中重新装入CPU寄存器,并开始下一个任务的运行,这一过程就是context switch
故事:
小明在大学报名参兵,但是参兵后就不能上学了,要去保留学业信息,不保留好厉害直接上大二的课是不行的,所以要保留走的那一刻的状态,然后存到学校的档案里面,然后导员会给一个学号给小明,回来后告诉学号就可以得到对应的上次走的状态了
学校-CPU
导员-调度器
学籍-进程运行的临时数据,CPU内寄存器里面的内容(当进程上下文的数据)
保留学籍-保存运行的临时数据,CPU内寄存器里面的内容保存起来
恢复学籍-恢复进程上下文数据,把保存的数据恢复到CPU寄存器里面
当兵-进程结束
进程切换最核心:保存和恢复当前进程的硬件上下文的数据,即CPU内寄存器的内容
进程的上下文数据保存到task_struct里面。TSS:任务状态段
对于死循环的程序不会一直占用CPU,有时间片,运行指定时间就会切换到下一个。
寄存器就是CPU内部的临时空间(用于储存数据)
寄存器=寄存器里面的数据
上下文切换:在多任务操作系统中,当任务切换时,当前任务的寄存器状态会被保存到内存中,以便任务再次执行时恢复。
6.Linux内核进程O(1)调度队列
蓝色和红色只有名字不同,其余相等,queue[140]跟哈希表结构相似。
一个CPU拥有一个runqueue
如果有多个CPU就要考虑进程个数的负载均衡问题,cpu_load表示有多个个进程在队列里,通过判断找到进程最少的那个把进程放进去
优先级
普通优先级:100~139
实时优先级:0~99
实时优先级理解:
指在操作系统中分配给进程或任务的一种属性,它决定了进程执行的优先顺序。具有更高实时优先级的进程通常会比具有较低实时优先级的进程更早得到处理。实时优先级通常用于需要在严格时间限制内完成的任务
特点:
1.时间限制:实时任务通常有一个明确的时间限制,必须在这个时间限制内完成
2.抢占式调度:实时任务可以抢占正在运行的非实时任务,确保它们能够满足时间限制
分时优先级理解:
是一种调度算法,它允许多个进程或任务在CPU上执行,每一个进程或任务被分配一个时间片,当一个进程的时间片用完时,调度器会切换到另一个进程,确保所有进程都能公平获得CPU时间。
7.活动队列
时间片还没有结束的所有进程都按照优先级放在该队列
nr_active:总共有多少个运行状态的进程
queue[140]:一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以数组下标就是优先级
从该结构中,过程运行
1.从0下标开始遍历队列queue[140]
2.找到第一个非空队列,该队列必定为优先级最高的队列
3.拿到选中队列的第一个进程,开始运行,调度完成
bitmap[5]:一共140个优先级,一共140个进程队列。为了提高查找非空队列的效率,就可以用5*32位比特位表示队列是否为空,这样可以大大提高查找效率。
8.过期队列
过期队列和活动队列结构一模一样
过期队列上放置的进程都是时间片耗尽的进程
当活动队列上的进程被处理完后,对过期队列的进程进行时间片重新计算(swap活动队列和过期队列)
active指针和expired指针
active指针永远指向活动队列
expired指针永远指向过期队列
当活动队列上的进程结束完时,会交换active指针和expired指针的内容