linux进程cpu时间片,linux内核调度算法--CPU时间片如何分配

对于自己来说关键点:

1、网页:http://blog.csdn.net/rein07/article/details/6534801

Linux调度时机主要有:

1、进程状态转换的时刻:进程终止、进程睡眠;

2、当前进程的时间片用完时(current->counter=0);

3、设备驱动程序主动调用schedule;

4、进程从中断、异常及系统调用返回到用户态时;

时机1,进程要调用sleep()或exit()等函数进行状态转换,这些函数会主动调用调度程序进行进程调度;

时机2,由于进程的时间片是由时钟中断来更新的,因此,这种情况和时机4是一样的。

时机3,当设备驱动程序执行长而重复的任务时,直接调用调度程序。在每次反复循环中,驱动程序都检查need_resched的值,如果必要,则调用调度程序schedule()主动放弃CPU。

机4,如前所述,不管是从中断、异常还是系统调用返回,最终都调用ret_from_sys_call(),由这个函数进行调度标志的检测,如果必要,则

调用调度程序。那么,为什么从系统调用返回时要调用调度程序呢?这当然是从效率考虑。从系统调用返回意味着要离开内核态而返回到用户态,而状态的转换要花

费一定的时间,因此,在返回到用户态前,系统把在内核态该处理的事全部做完

2、网页http://russelltao.iteye.com/blog/1405359

nice值是-20表示最高,对应着static_prio是多少呢?NICE_TO_PRIO(0)就是120,NICE_TO_PRIO(-20)就是100。

该进程刚被其父进程fork出来时,是平分其父进程的剩余时间片的。这个时间片执行完后,就会根据它的初始优先级来重新分配时间片,优先级为+19时最

低,只分配最小时间片5ms,优先级为0时是100ms,优先级是-20时是最大时间片800ms。我们看看内核是如何计算时间片长度的,大家先看下task_timeslice时间片计算函数:

Cpp代码

#define SCALE_PRIO(x, prio) \

max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE)

staticunsignedinttask_timeslice(task_t *p)

{

if(p->static_prio

returnSCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);

else

returnSCALE_PRIO(DEF_TIMESLICE, p->static_prio);

}

这里有一堆宏,我们把宏依次列出看看它们的值:

Cpp代码

# define HZ     1000

#define DEF_TIMESLICE       (100 * HZ / 1000)

以,DEF_TIMESLICE是100。假设nice值是-20,那么static_prio就是100,那么SCALE_PRIO(100*4,

100)就等于800,意味着最高优先级-20情形下,可以分到时间片是800ms,如果nice值是+19,则只能分到最小时间片5ms,nice值是

默认的0则能分到100ms。

文章转自 http://russelltao.iteye.com/blog/1405359

内核在微观上,把CPU的运行时间分成许多分,然后安排给各个进程轮流运行,造成宏观上所有的进程仿佛同时在执行。双核CPU,实际上最多只能有两个进程在同时运行,大家在top、vmstat命令里看到的正在运行的进程,并不是真的在占有着CPU哈。

所以,一些设计良好的高性能进程,比如nginx,都是实际上有几颗CPU,就配

几个工作进程,道理就在这。比如你的服务器有8颗CPU,那么nginx worker应当只有8个,当你多于8个时,内核可能会放超过多个nginx

worker进程到1个runqueue里,会发生什么呢?就是在这颗CPU上,会比较均匀的把时间分配给这几个nginx

worker,每个worker进程运行完一个时间片后,内核需要做进程切换,把正在运行的进程上下文保存下来。假设内核分配的时间片是100ms,做进

程切换的时间是5ms,那么进程性能下降还是很明显的,跟你配置的worker有关,越多下降得越厉害。

当然,这是跟nginx的设计有关的。nginx是事件驱动的全异步进程,本身设计上就几乎不存在阻塞和中断,nginx的设计者就希望每一个nginx worker可以独占CPU的几乎全部时间片,这点就是nginx worker数量配置的依据所在。

当然,实际的运行进程里,大部分并不是nginx这种希望独占CPU全部时间片的进程,许多进程,比如vi,它在很多时间是在等待用户输入,这时vi在等待IO中断,是不占用时间片的,内核面对多样化的进程,就需要技巧性的分配CPU时间片了。

内核分配时间片是有策略和倾向性的。换句话说,内核是偏心的,它喜欢的是IO消耗

型进程,因为这类进程如果不能及时响应,用户就会很不爽,所以它总会下意识的多分配CPU运行时间给这类进程。而CPU消耗进程内核就不太关心了。这有道

理吗?太有了,CPU消耗型慢一点用户感知不出来,电信号和生物信号运转速度差距巨大。虽然内核尽量多的分配时间片给IO消耗型进程,但IO消耗进程常常

在睡觉,给它的时间片根本用不掉。很合理吧?

那么内核具体是怎么实现这种偏心呢?通过动态调整进程的优先级,以及分配不同长短的CPU时间处来实现。先说内核如何决定时间片的长度。

对每一个进程,有一个整型static_prio表示用户设置的静态优先级,内核里它与nice值是对应的。看看进程描述结构里的static_prio成员。

Cpp代码

structtask_struct {

intprio, static_prio;

......}

nice值是什么?其实就是优先级针对用户进程的另一种表示法,nice的取值范围是-20到+19,-20优先级最高,+19最低。上篇曾经说过,内核优先级共有140,而用户能够设置的NICE优先级如何与这140个优先级对应起来呢?看代码:

Cpp代码

#define MAX_USER_RT_PRIO    100

#define MAX_RT_PRIO     MAX_USER_RT_PRIO

#define MAX_PRIO        (MAX_RT_PRIO + 40)

可以看到,MAX_PRIO就是140,也就是内核定义的最大优先级了。

Cpp代码

#define USER_PRIO(p)        ((p)-MAX_RT_PRIO)

#define MAX_USER_PRIO       (USER_PRIO(MAX_PRIO))

而MAX_USER_PRIO就是40,意指,普通进程指定的优先级别最多40,就像前面我们讲的那样-20到+19。

Cpp代码

#define NICE_TO_PRIO(nice)  (MAX_RT_PRIO + (nice) + 20)

nice值是-20表示最高,对应着static_prio是多少呢?NICE_TO_PRIO(0)就是120,NICE_TO_PRIO(-20)就是100。

当该进程刚被其父进程fork出来时,是平分其父进程的剩余时间片的。这个时间片

执行完后,就会根据它的初始优先级来重新分配时间片,优先级为+19时最低,只分配最小时间片5ms,优先级为0时是100ms,优先级是-20时是最大

时间片800ms。我们看看内核是如何计算时间片长度的,大家先看下task_timeslice时间片计算函数:

Cpp代码

#define SCALE_PRIO(x, prio) \

max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE)

staticunsignedinttask_timeslice(task_t *p)

{

if(p->static_prio

returnSCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);

else

returnSCALE_PRIO(DEF_TIMESLICE, p->static_prio);

}

这里有一堆宏,我们把宏依次列出看看它们的值:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux进程调度算法是操作系统中的重要组成部分,它负责决定哪个进程在何时获得CPU的使用权。Linux内核提供了多种进程调度算法,其中最常用的是CFS(Completely Fair Scheduler)算法。 CFS算法的目标是实现公平的进程调度,即每个进程都能够公平地获得CPU的使用时间。为了实现这个目标,CFS算法引入了一个称为"虚拟运行时间"的概念,它表示一个进程在理想情况下应该获得的CPU时间。CFS算法通过动态地调整进程的优先级来实现公平调度。 为了进一步优化Linux进程调度算法,可以考虑以下几个方面: 1. 调整时间片大小:时间片是指每个进程分配到的CPU时间段。通过调整时间片大小,可以平衡进程之间的响应速度和系统的吞吐量。较小的时间片可以提高系统的响应速度,但会增加上下文切换的开销;较大的时间片可以减少上下文切换的开销,但可能导致进程响应变慢。 2. 考虑进程优先级:Linux内核中,每个进程都有一个静态优先级和一个动态优先级。静态优先级由进程的nice值决定,而动态优先级则根据进程的虚拟运行时间计算得出。可以根据实际需求调整进程的优先级,以满足不同进程CPU的需求。 3. 考虑进程调度策略:Linux内核支持多种调度策略,如先来先服务(FIFO)、最短作业优先(SJF)、轮转调度(Round Robin)等。选择合适的调度策略可以根据不同的应用场景提高系统的性能。 4. 考虑多核处理器的负载均衡:在多核处理器上,可以通过负载均衡算法进程均匀地分配到各个核心上,以充分利用系统资源并提高系统的整体性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值