大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦
本文由:残念ing原创CSDN首发,如需要转载请通知
个人主页:残念ing-CSDN博客,欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:[残念ing 的【Linux】系列专栏——CSDN博客]
目录
- 对上一次学习的补充
- 进程退出
- Z-僵尸状态
- 孤儿进程:
- ***进程优先级***
- 进程的优先级是什么?
- 为什么要有优先级?
- 修改优先级(不建议修订 )
- 切换过程和理解
- 4 进程切换的核心
- 5 关于每个进程的上下文数据
- 6 Linux真实的调度算法
- Linux中的双链表结构
今天的学习内容
1 对上一次学习的补充
2 孤儿进程
3 进程的优先级
4 切换过程和理解
5 关于每个进程的上下文数据
6 Linux真实的调度算法
7 Linux中的双链表结构
对上一次学习的补充
进程退出
- 代码不会执行了—首先可以立即释放的就是进程对应的程序信息数据
- 进程退出,要有退出信息(进程的退出码)保存在自己的task_struct内部
- 管理结构task_struct 必须被OS维护起来,方便用户未来进行获取进程退出的信息
Z-僵尸状态
维护自己的task_struct,方便未来进程读取退出状态,但是如果没有人管(默认没人管),就会一直僵尸,task_struct会一直消耗内存(这样会导致内存泄漏),后面一般需要父进程读取子进程信息,子进程才会自动退出
孤儿进程:
当父进程退出,子进程还在的这种进程就是孤儿进程,这样的子进程会被领养,会被系统自动领养
进程优先级
进程的优先级是什么?
进程的优先级是:获得CPU资源的先后顺序,比如:排队的本质就是在确认优先级。
为什么要有优先级?
因为一般目标资源(CPU资源)是比较少的
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整
体性能
修改优先级(不建议修订 )
- 指令 top->r->根据建议来输入
- 代码
切换过程和理解
-
你的进程在运行的时候,会有很多的临时数据,都在CPU的寄存器中保存。
-
CPU内有很多个寄存器,它们构成了一整套寄存器,寄存器!=寄存器里面的数据
4 进程切换的核心
进程切换的核心就是进程上下文数据的保存和恢复。
保护就是单时间片或者其他进程进入之前,先将相关寄存器的内容保存起来(这个保存的地方是不在CPU中的)。
恢复就是当要继续这个进程时,将历史保存的寄存器的数据,恢复到寄存器中
每次的切换都保证了CUP在运行下一个进程时都是全新的。
进程在CUP中的切换过程
- 根据pc取指令
- 更新pc
- 分析执行指令
pc=当前地址+读进来的指令的长度
5 关于每个进程的上下文数据
CPU寄存器内部是存储上下文数据的,这套寄存器是被多个进程共享使用的。
6 Linux真实的调度算法
每个进程会被根据自己的优先级,被分配到一个类似于哈希桶中,相同优先级的进程会被链到一起,然后依次等待调用。
饥饿问题:
优先级很高,表示一定要一直优先吗?
优先级很低,表示一定不会被调度吗?
调度器是要非常均衡的进行进程调度的,不是优先级越高,就会一直优先,也不是优先级越低,就不会被调度到。
active队列永远都是一个存量进程竞争的情况即:
active队列中进程只会越来越少,不会增多
解决饥饿问题的方法
- CPU调度只会从active队列中选择进程来进行调度
- 调度有三种情况
a. 运行退出,(active进行删除)
b. 不退出,但是时间片到了(根据优先级加入到expire队列)
c. 有新的进程产生(根据优先级加入到expire队列) - 单active队列为空时,进行swap(&active,&expired)
a. 之前:按照优先级调度
b. 之后:给了其他优先级的进程的调度机会
补充知识:
1 所有的进程都要链表连接
2 进程可以在调度队列中,阻塞队列中
Linux中的双链表结构
在Linux中的双链表结构只有连接字段,没有属性字段
这样设计的意义?
一个进程,既可以在全局链表中,又可以在任何一个其他数据结构中,只要加节点字段即可
原理是什么呢?
struct A
{int a;char b;double c;float d;
}
原理:(struct A*)(&c-偏移量)
#define who(type, x)((type *)(&x-&(type*)0->x))
task struct, link
who(struct task struct, link)->pri-> pid