自学内容网 自学内容网

【Linux】--进程(优先级)

大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦
本文由:残念ing原创CSDN首发,如需要转载请通知
个人主页:残念ing-CSDN博客,欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:[残念ing 的【Linux】系列专栏——CSDN博客]

请添加图片描述

今天的学习内容
1 对上一次学习的补充
2 孤儿进程
3 进程的优先级
4 切换过程和理解
5 关于每个进程的上下文数据
6 Linux真实的调度算法
7 Linux中的双链表结构

对上一次学习的补充

进程退出

  1. 代码不会执行了—首先可以立即释放的就是进程对应的程序信息数据
  2. 进程退出,要有退出信息(进程的退出码)保存在自己的task_struct内部
  3. 管理结构task_struct 必须被OS维护起来,方便用户未来进行获取进程退出的信息

Z-僵尸状态

维护自己的task_struct,方便未来进程读取退出状态,但是如果没有人管(默认没人管),就会一直僵尸,task_struct会一直消耗内存(这样会导致内存泄漏),后面一般需要父进程读取子进程信息,子进程才会自动退出
在这里插入图片描述

孤儿进程:

当父进程退出,子进程还在的这种进程就是孤儿进程,这样的子进程会被领养,会被系统自动领养
在这里插入图片描述

进程优先级

进程的优先级是什么?

进程的优先级是:获得CPU资源的先后顺序,比如:排队的本质就是在确认优先级。

为什么要有优先级?

因为一般目标资源(CPU资源)是比较少的
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整
体性能

修改优先级(不建议修订 )

  1. 指令 top->r->根据建议来输入
  2. 代码

切换过程和理解

  1. 你的进程在运行的时候,会有很多的临时数据,都在CPU的寄存器中保存。
    在这里插入图片描述

  2. CPU内有很多个寄存器,它们构成了一整套寄存器,寄存器!=寄存器里面的数据

4 进程切换的核心

进程切换的核心就是进程上下文数据的保存和恢复。
保护就是单时间片或者其他进程进入之前,先将相关寄存器的内容保存起来(这个保存的地方是不在CPU中的)。
恢复就是当要继续这个进程时,将历史保存的寄存器的数据,恢复到寄存器中
每次的切换都保证了CUP在运行下一个进程时都是全新的。

进程在CUP中的切换过程

  1. 根据pc取指令
  2. 更新pc
  3. 分析执行指令
    pc=当前地址+读进来的指令的长度
    在这里插入图片描述

5 关于每个进程的上下文数据

CPU寄存器内部是存储上下文数据的,这套寄存器是被多个进程共享使用的。
在这里插入图片描述

6 Linux真实的调度算法

在这里插入图片描述
每个进程会被根据自己的优先级,被分配到一个类似于哈希桶中,相同优先级的进程会被链到一起,然后依次等待调用。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
饥饿问题:
优先级很高,表示一定要一直优先吗?
优先级很低,表示一定不会被调度吗?

调度器是要非常均衡的进行进程调度的,不是优先级越高,就会一直优先,也不是优先级越低,就不会被调度到。

active队列永远都是一个存量进程竞争的情况即:
active队列中进程只会越来越少,不会增多

解决饥饿问题的方法

  1. CPU调度只会从active队列中选择进程来进行调度
  2. 调度有三种情况
    a. 运行退出,(active进行删除)
    b. 不退出,但是时间片到了(根据优先级加入到expire队列)
    c. 有新的进程产生(根据优先级加入到expire队列)
  3. 单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

原文地址:https://blog.csdn.net/m0_73523775/article/details/143741819

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!