Linux2.6内核进程调度系列1.总体思想
来源:互联网 发布:上瘾 网络剧 日本评论 编辑:程序博客网 时间:2024/05/22 13:40
origin: http://www.cnblogs.com/joey-hua/p/5770730.html
参考的是ULK第三版,Linux2.6.11.12内核版本。
调度程序依靠几个函数来完成调度工作,其中最重要的第一个函数是scheduler_tick函数,主要步骤如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
* 维持当前最新的time_slice计数器
* 每次时钟节拍到来时,scheduler_tick函数将被调用,以执行与调度相关的操作。
*/
void
scheduler_tick(
void
)
{
int
cpu = smp_processor_id();
runqueue_t *rq = this_rq();
//宏this_rq()产生本地CPU运行队列的地址
task_t *p = current;
/**
* 把转换为纳秒的TSC的当前值存入本地运行队列的timestamp_last_tick中。
* 这个时间戳由sched_clock获得。
*/
rq->timestamp_last_tick = sched_clock();
/**
* 检查当前进程是否是idle进程。swapper进程,就是0号进程
*/
if
(p == rq->idle) {
/**
* 检查运行队列中除了IDLE进程外,是否还有其他可运行进程。
* 如果有,就设置当前进程的TIF_NEED_SCHEDULED字段,以强迫进行调度。
*/
if
(wake_priority_sleeper(rq))
/**
* 没有必要更新IDLE进程的时间片计数器.
*/
goto
out;
rebalance_tick(cpu, rq, SCHED_IDLE);
/**
* 没有必要更新IDLE进程的时间片计数器,所以此处直接返回。
*/
return
;
}
/**
* 检查current->array是否指向本地运行队列的活动链表。
* 如果不是,说明进程已经过期但还没有被替换,
* 设置TIF_NEED_SCHEDULED标志,以强制进行重新调度。并跳转
*/
if
(p->array != rq->active) {
set_tsk_need_resched(p);
goto
out;
}
/**
* 获得运行队列的自旋锁。
*/
spin_lock(&rq->lock);
//递减时间片
...
out_unlock:
/**
* 释放自旋锁。
*/
spin_unlock(&rq->lock);
out:
/**
* 调用rebalance_tick函数,该函数应该保证不同CPU的运行队列
* 包含数量基本相同的可运行进程。
*/
rebalance_tick(cpu, rq, NOT_IDLE);
}
这就是此函数所做的主要工作,总体思想。
阅读全文
0 0
- Linux2.6内核进程调度系列1.总体思想
- 转载 linux2.6内核进程调度
- Linux2.6 内核进程调度分析
- Linux2.6 内核进程调度分析 .
- Linux2.6 内核进程调度分析
- Linux2.6内核进程调度系列2.更新实时进程的时间片
- Linux2.6内核进程调度系列3.更新普通进程的时间片
- Linux2.6进程调度
- Linux2.6内核进程调度核心代码分析
- linux2.6.29内核 进程调度分析
- linux2.4到linux2.6内核调度(6)
- Linux2.6内核调度器介绍
- linux2.4到linux2.6内核调度(1)
- linux2.4到linux2.6内核调度(2)
- linux2.4到linux2.6内核调度(3)
- linux2.4到linux2.6内核调度(4)
- linux2.4到linux2.6内核调度(5)
- linux2.4到linux2.6内核调度(7)
- VB文件操作-exe文件更新
- Hadoop(HDFS)
- centos7重启php-fpm命令
- BZOJ2400:[Spoj 839]Optimal Marks(最小割)
- Zeal一个好用的开源离线开发文档浏览器
- Linux2.6内核进程调度系列1.总体思想
- 在vSphere Client上安装虚拟机工具VMware Tools
- python入门之二:tuple
- 1057. 数零壹(20)
- MyBatis向sql语句传多个参数方法
- Jsoup官方教程(三)【数据抽取】
- Eclipse自动补全与快捷键设置
- java中的反射机制
- django+uwsgi+nginx 部署项目