我试图了解Linux内核的调度程序如何工作
如此链接所示
http://books.google.co.in/books?id=NXVkcCjPblcC&lpg=PP1&pg=PA47#v=onepage&q&f=false 和以下链接 http://www.informit.com/articles/article.aspx?p=101760&seqNum=2
struct runque是调度程序运行的基本数据结构
它是
struct runqueue {
spinlock_t lock; /* spin lock which protects this
runqueue */
unsigned long nr_running; /* number of runnable tasks */
unsigned long nr_switches; /* number of contextswitches */
unsigned long expired_timestamp; /* time of last array swap */
unsigned long nr_uninterruptible; /* number of tasks in
uinterruptible sleep */
struct task_struct *curr; /* this processor's currently
running task */
struct task_struct *idle; /* this processor's idle task */
struct mm_struct *prev_mm; /* mm_struct of last running task
*/
struct prio_array *active; /* pointer to the active priority
array */
struct prio_array *expired; /* pointer to the expired
priority array */
struct prio_array arrays[2]; /* the actual priority arrays */
int prev_cpu_load[NR_CPUS];/* load on each processor */
struct task_struct *migration_thread; /* the migration thread on this
processor */
struct list_head migration_queue; /* the migration queue for this
processor */
atomic_t nr_iowait; /* number of tasks waiting on I/O
*/
}
上面有两个成员
struct prio_array *active; /* pointer to the active priority
array */
struct prio_array *expired; /* pointer to the expired priority array */
和struct prio_array定义为
struct prio_array {
int nr_active; /* number of tasks */
unsigned long bitmap[BITMAP_SIZE]; /* priority bitmap */
struct list_head queue[MAX_PRIO]; /* priority queues */
};
我不清楚以下句子
问题1)
Each priority array contains one queue of runnable processors per priority level.
在struct prio_array
的上述定义中,其中是可运行处理器的ID
然后它说
然后它说 “有140个优先级和32位字,这是五个。”The priority arrays also contain a priority bitmap used to
有效发现系统中优先级最高的可运行任务。
它是如何得出结论,这是五个什么是它背后的数学计算?
以上是本书第4章的摘录,这些摘录在第2个链接中都包含相同的文本。为了清楚起见,这里只是张贴了。
* UPDATE1 * 基于评论,我只想澄清我的要求 作者说
BITMAP_SIZE是unsigned long类型数组的大小 变量必须为每个有效优先级提供一位 水平。有140个优先级和32位字,这是五个。
问题2)
我不清楚的是给出了每个优先级的一位,并且有140个优先级,那么阵列大小如何变为5我没有得到BITMAP_SIZE计算的逻辑而不是140/32 = 5
它与以下段落
有关 When a task of a given priority becomes runnable (that is,
its state becomes TASK_RUNNING), the corresponding bit in the
bitmap is set to one. For example, if a task with priority seven is
runnable, then bit seven is set
在数组
的链接上 unsigned long bitmap[BITMAP_SIZE]; /* priority bitmap */
设置基本上我不清楚这个数组是如何设置的,如果我能够正确解释,也可以看问题1。
更新2及以下答案说明
下面的答案我只是添加一个小解释,它可能在将来帮助某个人 如果他们基本上来这里
调度程序维护一个runque,并且每个runnable进程的runnable进程列表只有一个runqueue,我给它的链接的文章考虑了多处理器系统有很多运行问题,回到我们的情况,一个处理器和一个runque各种优先级的流程
有140个优先级,每个优先级在TASK_RUNNING状态下有不同的进程说例如可以有多个进程优先级8等等(我以8为例) struct runque指向优先级数组,告诉
btimap[BITMAP] /* this is the priority level
struct list_head /* points to the start of list of processes of that run level
因此runque指向优先级数组,从优先级数组中可以轻松获得进程 需要在O(1)时间内执行。
答案 0 :(得分:3)
您是否在询问如何在阵列中找到合适的位?
这样的事情:
int bitmap_idx = priority/BITS_PER_WORD;
int bitmap_bit = priority%BITS_PER_WORD;
isSet = ( bitmap[bitmap_idx]&(1<<bitmap_bit) ); //test
bitmap[bitmap_idx] |= 1<<bitmap_bit; //set