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

2011年(1)

2010年(2)

2009年(14)

2008年(38)

我的朋友

分类: LINUX

2009-03-06 22:09:07

之前看到这个的时候有一些迷惑的地方,现在弄清楚了其定义,但是对位图中的算法还没有细看,来日再细看其算法
************************************************************************
关于运行队列runqueue中的prio_array_t数据结构中的bitmap[BITMAP_SIZE]的一些理解:

它的定义在这个prio_array结构体中,如下:
typedef struct prio_array prio_array_t;

struct runqueue {
    spinlock_t lock;
    ...
    //活动优先级队列指针、超时优先级队列指针,以及实际优先级队列数组
    prio_array_t *active, *expired, arrays[2];
    ...    
}

struct prio_array {
    unsigned int nr_active;            //本进程组中进程的个数
    unsigned long bitmap[BITMAP_SIZE];    //进程队列queue[MAX_PRIO]的索引位图
    struct list_head queue[MAX_PRIO];    //各个优先级所对应的进程队列。
}

刚看到的BITMAY_SIZE的时候比较困惑,为什么要用unsigned long 类型的数据而不用unsigned char或者

unsigned int类型的数据呢,还有一个疑问就是BITMAP_SIZE大小是多少呢,如果是MAX_PRIO,那岂不是

非常浪费空间吗。带着这三个问题,查找了一下。BITMAP_SIZE这个宏定义如下:
#define BITMAP_SIZE ((((MAX_PRIO+1+7)/8)+sizeof(long)-1)/sizeof(long))
下面是这个宏大计算过程
***********
该宏首先计算MAX_PRIO,这个宏定义的值为140.为140个优先级所需的bit数
接着再次基础上其又加上1,加上7(此处应该是为了避免下面计算字节数的时候尾数被截断而采取的填充8

个bits,保证所计算得到的字节数大于等于实际所需的字节数),其结果为148。
接着148/8等于18,得到所需的字节的数目。
接着,计算(18+sizeof(long)-1)/sizeof(long)得到所需的long型数据的个数。
最终用这个这个个数值来代替
unsigned long bitmap[BITMAP_SIZE]中的的BITMAP_SIZE,这个数组所申请的内存作为存放优先级位图数

据的位置。
***********

阅读(1367) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~