linux学习笔记03
1.孤儿进程
我们知道这个进程之间是存在着这个父子关系的,当我们的子进程退出的时候,我们知道这个子进程的信息需要被我们的这个父进程获取,没有获取的话这个子进程就是僵尸进程,这个是我们之前学习的这个问题;
但是针对于这个父子关系的进程,如果我们的这个父进程掉线了,这个时候我们的这个子进程就变成孤儿进程,这个进程会被1号进程领养;
2.进程的优先级
2.1通俗理解
食堂吃饭,排队的本质就是确认自己的优先级,因此优先级的本质就是衡量我们等到某一种资源的先后顺序;
对于进程而言,这个进程的优先级就是决定我们的进程获取CPU资源的先后顺序;
2.2为什么需要优先级
因为我们的目标资源稀缺,例如我们的食堂吃饭需要排队,如果这个窗口的数量足够多,我们也就不需要排队;
进程里面很多的进程竞争一个或者几个CPU,因此需要进程的优先级的概念;
就是因为这个CPU资源稀缺,因此我们需要优先级确定这个资源获取的先后顺序;
2.3怎么设计优先级
优先级是一个数字,这个数值的值越小,这个进程的优先级就会越高,这个其实是很容易理解的;
大部分的操作系统是基于时间片的分时操作系统,优先级可能会变化,但是这个变化的幅度不能很大;
2.4PRI和NI
PRI就是我们的进程的默认的优先级;
NI就是我们的进程的优先级的修正数据;
进程的真正的优先级:默认的优先级+我们的修正数据;
我们的这个最开始默认的优先级是80(本来就是),修正数据是0,但是这个修正数据是可以被我们修改的,假设我们修改成为10,这个时候就是90的优先级了,如果我们把这个NI修改成为-10,这个时候的真正的优先级不是80,而是70,因为这个优先级的基准值是相对于这个默认的优先级80而言的;
2.5优先级的极值
优先级的范围是60-99,因此这个NI数值的范围就是-20和19之间;
3.进程切换
3.1死循环是如何执行的
死循环不会直接把我们的这个系统卡死,就说明这个死循环不会一直占用我们的这个CPU,而是使用的时间片的技术,每一个进程在我们的这个CPU上面执行的按照时间片的分配去执行的;
这个就证明了,我们的这个进程不会一直占用这个CPU,而是时间片轮转的;
3.2聊聊CPU和寄存器
1.寄存器就是CPU里面的保存数据的临时的空间
2.寄存器!=寄存器里面的这个数据,寄存器就是我们的这个保存数据的空间本身,这个寄存器里面的对应的数据是可以发生变化的
3.3关于进程的切换故事
进程切换的本质,其实就是保存和回复我们的当前进程的硬件上下文的数据,也就是我们的CPU里面的寄存器;
进程的硬件上下文数据,其实是保存到了这个进程对应的PCB,也就是这个task_struct里面去;
在这个进程的task_struct里面的某一个字段里面,就保存着我们的进程的硬件上下文数据的相关的具体的内容;
4.O(1)进程的调度算法
这个部分的内容老师讲了很久,但是我觉得自己没有完全的理解,只是知道这个里面的一些调度的设计的方法把;
其实就是这个active和expired两个指针分别指向不同的这个区域,每一个区域都有一个140大小的队列,两个指针分别指向的其实活跃的队列和过期的队列;
我们的这个进程本来是在这个active指向的这个队列里面的,如果这个进程被我们的调度器调度之后,就会上CPU进行执行,执行之后就全部放到这个expired指向的这个过期的队列里面去;
只有当我们的这个活跃的进程全部执行完毕之后,我们才可以去照顾到这个过期的进程,也就是我们的这个活跃的进程全部执行完毕,全部都放到了这个过期的队列对应的位置上面之后,我们的这个活跃进程才算是全部调度完成了;
这个时候,我们的这个active指针和这个expired指针进行swap操作,也就是修改这个指针的指向,这个时候继续开始新的调度的过程啦;
每一个140大小的队列都是有这个进程的优先级的,1-100主要是实时的优先级,101-140就是我们熟悉的这个进程的优先级的编号;
- 点赞
- 收藏
- 关注作者
评论(0)