加载中…
个人资料
小叶子leaves
小叶子leaves
  • 博客等级:
  • 博客积分:0
  • 博客访问:10,076
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

进程调度之sys_nice()系统调用

(2016-03-12 10:39:01)
标签:

it

分类: 进程

进程调度之sys_nice()系统调用

 

linux调度过程中,采用了红黑树的数据结构,通过虚拟可运行时间与等待时间的时间差作为红黑树的一个key,树中最左边的则为下一次运行的进程,在linux系统中进程调度主要分为:公平调度和实时调度,而进程的运行时间又与进程的优先级,等待时间以及运行时间有关。

Linux中,进程的优先级是动态的。调度程序跟踪进程正在做什么,并周期性地调整它们的优先级。在这种方式下,在较长的时间间隔内没有使用CPU的进程,通过动态地增加它们的优先级来提升它们。相应地,对于已经在CPU上运行了较长时间的进程,通过减少它们的优先级来处罚它们

内核的优先级:


进程调度之sys_nice()系统调用

  asmlinkage long sys_nice(int increment);            syscall.h(include\linux)

函数定义前加宏asmlinkage ,表示这些函数通过堆栈而不是通过寄存器传递参数

进程调度之sys_nice()系统调用


sys_nice作用:改变当前进程的优先级

increment:边界值的检查:小于0increment最终会提高优先级,大于0的反之会降低运行优先级。

进程调度之sys_nice()系统调用
sched.h(kernel\sched)

MAX_RT_PRIO:   100

TASK_NICE(current)----------àPRIO_TO_NICE( (current)->static_prio )

----------------àcurren->static_prio - 120

TAS_NICE(current):将任务的静态运行优先级(即current->static_prio)转换成nice

进程调度之sys_nice()系统调用

rt.h(include\linux\sched)

最大优先级:140

默认的优先级:120

进程调度之sys_nice()系统调用

core.c(kernel\sched)

nice : [-20, +19]

nice_rlim : [1,40]

/表明是否可以提高优先级(硬件资源限制等等)

进程调度之sys_nice()系统调用

进程调度之sys_nice()系统调用

core.c(kernel\sched)

nice()系统调用只能修改当前任务的nice值,但由于该函数也可以被其它系统调用所使用,比如:setpriority(),所以还需要指定任务。

  set_user_nice(struct  task_struct *p, long nice)

进程调度之sys_nice()系统调用

进程调度之sys_nice()系统调用

如果p->policySCHED_FIFO或者SCHED_RR,  rt_policy(p->policy)  : return 1

否则   return 0

进程调度之sys_nice()系统调用

进程每降低一个nice值,则多获得10% CPU时间,每升高一个nice值,则放弃10%CPU时间。为了执行该策略,内核将优先级转换为权重值。进程的重要性不仅是由优先级指定的,而且还需要考虑保存在task_struct->se.load的负荷权重。set_load_weight负责根据进程类型及其静态优先级计算负荷权重。

  优先级---权重转换表

每个nice值都会在下表中都有一个对应项。各数组之间的乘数因子大致为1.25.

假设:1> 进程A,B  niceA =0, niceB = 0 ,则根据权重表可知nice = 0 所对应的是1024,则,每个进程的份额为1024 / (1024 + 1024) = 0.5 ,CPUA = 50 %CPUB = 50%

2> 进程niceB= -1,则所对应的权重weightB:820niceA = 0,weightA = 1024,

CPUA = 1024/1024+820=0.55 CPUB = 820 / (1024 +820) = 0.45

进程调度之sys_nice()系统调用

set_load_weight(struct task_struct *p)

进程调度之sys_nice()系统调用

SCHED_IDLE :只有系统空闲时,才会被执行的进程

task_rq_unlock(rq,p,&flags)

在对可执行队列进行操作以前,应该先锁住它。在其拥有者读取或改写队列成员的时候,可执行队列包含的锁用来防止队列被其他代码改动。锁住运行队列的最常见情况发生在你想锁住的运行队列上恰巧有一个特定的任务在运行,此时需要用到task_rq_lock()task_rq_unlock()函数。

  sys_nice()执行过程:

从上到下是调用过程,从左到右是顺序过程。

进程调度之sys_nice()系统调用

                              Sys_nice()执行过程

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有