转贴:鼠眼看Linux调度器 (2)
转自 http://hi.baidu.com/grantzhou/blog/item/56a91cf3b685cdc90a46e09d.html
四、sched_setscheduler()系统调用。
这个系统调用的调用层次和代码都比nice复杂些,所涉及的也有不少我们这里不感兴趣的东西,因此就不再以展示代码的方法介绍它们了。这里仅在功能层次上,从与nice()对比的角度上对它做一个简要介绍:
1、因为sched_setscheduler()系统调用不仅可以修改当前任务的调度策略和优先级,还可以修改指定任务的这个信息。所以,它的合法性检查更严格些,最重要的是增加了用户身份验证,当然这个检查依旧是在task_struct结构上做的。
2、和nice()一样,sched_setscheduler()也不特别区分进程和线程,将两者作等同处理,该任务也会有重新加入运行队列的行为。
3、sched_setscheduler()只修改动态优先级,对于默认调度策略,它被设置为与静态优先级相等。
五、静态优先级里的猫腻。
说了这么多静态优先级如何如何,它到底是个什么玩意儿?现在就让我们剥掉其上所有可能的"耗子药",弄清楚它到底是怎样影响进程的。"静态优先级",之所以冠之以"静态"前缀,是因为内核自己从不主动修改它,只有通过系统调用才能修改它。那么,它在调度里到底扮演什么角色呢?容俺仔细道来:
1、计算任务时间片。
让代码说话,先看task_timeslice()实现:
/*
* task_timeslice() scales user-nice values [ -20 ... 0 ... 19 ]
* to time slice values: [800ms ... 100ms ... 5ms]
*
* The higher a thread's priority, the bigger timeslices
* it gets during one round of execution. But even the lowest
* priority thread gets MIN_TIMESLICE worth of execution time.
*/
#define SCALE_PRIO(x, prio) \
max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE)
static inline unsigned int task_timeslice(task_t *p)
{
if (p->static_prio < NICE_TO_PRIO(0))
return SCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);
else
return SCALE_PRIO(DEF_TIMESLICE, p->static_prio);
}
从名字上也看得出来,这个函数就是用来计算任务时间片的。一般说来,只有在时间片消耗光的时候才重新计算任务的时间片,而这个计算过程只与静态优先级有关。这个函数的逻辑很简单,如果任务p的nice值<0(也就是说静态优先
相关文档:
一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......
#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>
int g_count;
void Exit()
{
printf("I will exit, press any key to continue...(g_count = %d)\n", g_count);
exit(0);
}
int main(int argc, char* argv[])
{
struct sigaction almact;
pid_t ......
linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。
阅读之前建议先看一下附图。
本文中假设inittab中设置的init tree为:
/etc/rc.d/rc0.d
/etc/rc.d/rc1.d
/etc/rc.d/rc2.d
/etc/rc.d/rc3.d
/etc/rc.d/rc4.d
/etc/rc.d/rc5.d
/etc/rc.d/rc6.d
/etc/rc.d/init.d
1. 关于linux ......
不同的国家和地区因文化的差异,在日期、时间以及货币符号等表示方式上都不完全相同,最为明显的就是语言。有时在编写软件给用户使用时,开发者、维
护者以及最终用户可能分别来自不同的区域,而要求他们均使用同一种语言显然是不明知的,因此当一个程序或者软件编写给全世界人使用时,通常分为两个部分:
国际化 (intern ......
Console 修改/etc/inputrc文件
set bell-style off
VIM 如果是在 console 模式下使用 vi/vim,一旦按错键会发出 bi 的一声,这样做可以提醒我们,但是很多时候会影响其他人工作、学习或者休息,如何关闭呢?
可以在 vi/vim 中使用
:set noeb
命令(其中 noeb 是 noerrorbells 的缩写) ......