秒懂:进程切换——O(1)调度算法

情景理解:

上面这张图展示的就是Linux内核中的调度队列示意图,那么具体是如何进行队列调度的呢?

首先,图中有两个queue[140],这个就是所谓的队列结构,(蓝色和红色扩出来的)其中有一个就是所谓的运行队列,也就是直接向CPU上进行调度的结构。

1.cpu调度进程的原则:优先级原则

那么140就意味着这当中有140个格子,每个格子对应的是一个优先级,对于0-99号格子是普通优先级,目前不考虑它的作用,而对于100-139号格子,对应的是优先级为60-99,每当有一个优先级为这个区间内的进程来临的时候,就将它放到对应格子的队列中,这样CPU就可以在调度的时候,根据优先级的大小来进行调度了。

上面的话有些复杂,简单来说,就是每个进程都有自己的号(有关优先级的),这些号码存储再这些格子中,cpu是通过这些格子里面的号来调度进程的!!

2.为什么这里有两个queue?

假设下面的场景,有一个优先级为99的进程,它的优先级是最低的,从理论上来说应该是被最后进行调度的进程,但是在前面进程运行的过程中,一直有优先级为80的进程不断的插入队列,不停的插入,那么就意味着这个优先级为99的进程始终不能被放到CPU上运行,CPU的资源无法供应到这个进程,就会造成进程饥饿现象

简单解释一下就是,一直有优先于你的进程一直进入,类似于一直插你的队,这时候你就会一直等待,这就叫做饥饿问题

那么如何解决这个问题?? ->> 让它们排队就可以了(排在你后面)

 

对于这种情况,调度队列的设计就采用了两个队列来进行解决这个问题。

对于一个进程想要进入待调度的队列中,会把它放在另外一个队列中,CPU会优先调度CPU目前维护的队列,当这个队列中的程序全部都运行结束后,再调度另外一个队列中的进程。

简单解释一下:就是排在你的后面

3.CPU如何知道自己现在要调度哪一个队列? 

这就用到了另外两个参数,分别是*active和*expired这两个参数表示的就是目前CPU正在调度的队列(运行队列)和CPU以后会调度的队列(等待队列)。当运行队列中的进程全部调度结束后,就和等待队列进行地址交换,再接着进行运行,新插入的进程始终都是插入到等待队列队列中的。

4.关于CPU如何知道队列中的调度状态的问题

通常来说是通过遍历就可以知道调度情况,但是Linux内核是采用的位图的思想,在蓝红框所框选的内容中,还有一个是bitmap,里面存储了五个数据,这五个数据本质上都是int类型的数据,而一个int是32个bit位,而五个就是160个bit位,正好可以存储下对应的140个队列中的状态值,如果某个位置有等待运行的进程,就将这个进程对应的优先级找到在位图中的位置,再将它标记位1即可,这样就完成了标记。
                        
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值