Linux调度使用的数据结构和重要函数
时间:2006-03-06 来源:ChinaE_OS
1:runqueue
Runqueu是调度器中非常重要的一个数据结构,每个CPU都有自己的runqueue。
对队列都有初始化、添加、删除等功能。
1:运行队列:Linux系统为处于就绪态的进程的队列,只有在这个队列中的进程才有机会获得CPU。
2:等待队列:,Linux系统也为处于睡眠态的进程组建了一个队列。
requeue |
||
Type |
Name |
Description |
spinlock_t |
lock |
保护进程列表的自旋锁 |
unsigned long |
nr_running |
runqueue 列表中可运行进程数。 |
unsigned long |
cpu_load |
基于runqueue平均进程数的CPU 加载因子 |
unsigned long |
nr_switches |
CPU运行的进程切换次数 |
unsigned long |
nr_uninterruptible |
曾经在runqueue但是现在处于 TASK_UNINTERRUPTIBLE 状态的进程数 |
unsigned long |
expired_timestamp |
老进程已经插入expired列表中的时间 |
unsigned long long |
timestamp_last_tick |
最后一次时钟中断的Timestamp值 |
task_t * |
curr |
当前运行进程描述符的指针 |
task_t * |
idle |
进程描述符指针,指向当前CPU的swappe进程 |
struct mm_struct * |
prev_mm |
在进程却换工程中,保存正被替换的进程的地址空间 |
prio_array_t * |
active |
指向激活进程列表(arrays 中的一个) |
prio_array_t * |
expired |
指向expired进程列表(arrays 中的一个) |
prio_array_t [2] |
arrays |
激活和expired进程的2维数组,每个prio_array_t代表一组可运行进程,140个双向列表,静态bitmap以及这组进程的counter. |
int |
best_expired_prio |
在expired进程中最低的静态优先级 |
atomic_t |
nr_iowait |
曾经在runqueue但是现在正在等待I/O操作完成的进程数 |
struct sched_domain * |
sd |
指向当前CPU的基本调度域 |
int |
active_balance |
标志一些进程将被从一个requeue转移到其他requeue队列 |
int |
push_cpu |
没有使用 |
task_t * |
migration_thread |
内核转移线程的进程描述符 |
struct list_head |
migration_queue |
将被从requeue中转移的进程列表 |
九:调度使用的重要函数
调度需要一系列函数配合完成调度这一功能,其中最重要的如下:
调度重要函数 |
|
scheduler_tick |
更新当前进程的time_slice。该函数有两种调用途径: |
try_to_wake_up |
唤醒sleep进程。当进程不在可运行队列时,将其放在可运行队列。 |
recalc_task_prio |
更新进程的动态优先级 |
schedule |
选择一个进程运行 |
load_balance |
保持多系统下runqueue平衡。检查当前CPU,保证一个域中runqueue平衡。 |