- 论坛徽章:
- 0
|
调度使用的数据结构
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。该函数有两种调用途径:
1:timer,调用频率为HZ,并且在关中断的情况下调用。
2:fork代码,当改变父进程的timeslice时。
try_to_wake_up
唤醒sleep进程。当进程不在可运行队列时,将其放在可运行队列。
recalc_task_prio
更新进程的动态优先级
schedule
选择一个进程运行
load_balance
保持多系统下runqueue平衡。检查当前CPU,保证一个域中runqueue平衡。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/15169/showart_81708.html |
|