Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309936
  • 博文数量: 55
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 615
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-07 13:47
文章分类
文章存档

2011年(1)

2010年(2)

2009年(14)

2008年(38)

我的朋友

分类: LINUX

2009-03-13 15:15:13

学习笔记
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
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) |
给主人留下些什么吧!~~