学习笔记
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
Linux2.6下进程描述符
volatile long state
进程所处的状态。在include/linux/sched.h中包含的状态:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_STOPPED 4
#define TASK_ZOMBIE 8
#define TASK_DEAD 16
struct thread_info *thread_info
当前进程运行的一些环境信息。其中有两个结构成员非常重要,与调度密切相关:
__s32 preempt_count;
unsigned long flags;
preempt_count是用来表示内核能否被抢占的使能成员。
如果它大于0,表示内核不能被抢占;
如果等于0,则表示内核处于安全状态(即没有加锁),可以抢占。
flags里面有一个TIF_NEED_RESCHED位
如果此标志位为1,则表示应该尽快启动调度器。
在2.4 中,每个进程的task_struct 都位于该进程核心栈的顶端(低址部分),内核可以通过栈
寄存器ESP 轻松访问到当前进程的task_struct。
在2.6 中,仍然需要频繁访问这个名为current 的数据结构,但现在,进程核心栈顶保存的是其
中的thread_info 属性,而不是完整的task_struct 了。
仅将最关键的、访问最频繁的运行环境保存在核心栈里(仍然是两个页大小),而将
task_struct 大部分内容通过thread_info::task 指针保存在栈外,以方便扩充。
int prio
prio是进程的动态优先级,相当于Kernel2.4中用goodness()函数计算出来的结构;
在kernel2.6中不再是由调度器统一计算,而是独立的进行计算的。
0~MAX_PRIO-1,数值越大优先级会越小;
实时优先级:0~MAX_RT_PRIO-1:数值越大,优先级越小
非实时:MAX_RT_PRIO~MAX_PRIO-1
动态优先级独立计算
对于非实时进程:取决于static_prio和sleep_avg;
对于实时进程:rt_priority,由sys_sched_setschedule()设置
int static_prio
sstatic_prio则是进程的静态优先级,与nice意义相同。nice的取值仍然是-20~19,数值越小,
进程优先级越高。
kernel/sched.c中定义了两个宏:
#defineNICE_TO_PRIO(nice)(MAX_RT_PRIO+(nice)+20)
#definePRIO_TO_NICE(prio)((prio)-MAX_RT_PRIO-20)
可见prioity和nice的关系是:priority=MAX_RT_PRIO+nice+20
prio_array_t*array
记录当前CPU激活的就绪队列
以优先级为序组成数组
prio_array_t的结构如下:
structprio_array{
intnr_active;/*本进程组中进程个数*/
structlist_headqueue[MAX_PRIO];/*每个优先级的进程列*/
unsignedlongbitmap[BITMAP_SIZE];/*上述进程队列的索引位图*/
};
unsigned long sleep_avg
进程的平均等待时间
当进程处于等待或者睡眠状态时,该值变大;当进程运行时,该值变小。
值越大,计算出来的进程优先级越高
sleep_avg是Kernel2.6中衡量进程的一个关键指标,它既可以用来衡量进程的交互程度,也可以用来衡
量进程的紧急程度。
long interactive_credit
表示进程交互程度,取值范围在-CREDIT_LIMIT ~CREDIT_LIMIT+1之间。
进程创建的时候值为1,以后根据不同的情况进行不同的增1、减1;
如果一个进程的interactive_credit超过CREDIT_LIMIT之后,这个进程就会被认为是交互式进程,同时
interactive_credit的值也就不再改变了(恒为CREDIT_LIMIT+1)。
unsigned long policy
进程的调度策略和2.4一样,有以下几种:
SCHED_FIFO先进先出式调度,除非有更高优先级进程申请运行,否则该进程将保持运行至退出才
让出CPU;
SCHED_RR轮转式调度,该进程被调度下来后将被置于运行队列的末尾,以保证其他实时进程有机
会运行)
SCHED_OTHER常规的分时调度策略
#define SCHED_OTHER 0
#define SCHED_FIFO 1
#define SCHED_RR 2
unsigned int time_slice,first_time_slice
time_slice是进程剩余的时间片
进程的默认时间片与进程的静态优先级相关
进程创建时,与父进程平分时间片
运行过程中递减,一旦归零,则重置时间片,并请求调度
递减和重置在时钟中断中进行(scheduler_tick())
进程退出时,如果自身并未被重新分配时间片,则将自己剩余的时间片返还给父进程
first_time_slice
用来记录时间片是否是第一次分配(进程创建时),以确定进程退出时是否将时间片交
还给父进程。
timestamp
进程发生调度事件的时间戳(单位是nanosecond),包括以下几类:
被唤醒的时间(在activate_task() 中设置);
被切换下来的时间(schedule());
被切换上去的时间(schedule());
负载平衡相关的赋值
从这个值与当前时间的差值,可以分别获得"在就绪队列中等待运行的时长"、"运行时长"等与优
先级计算相关的信息
unsigned long rt_priority
实时进程的优先级
由sys_sched_setschedule()设置
阅读(1117) | 评论(0) | 转发(0) |