LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 882|回复: 2

关于实时调度算法改进的问题,希望大家不吝指教,

[复制链接]
发表于 2007-4-25 21:58:43 | 显示全部楼层 |阅读模式
主要问一问题有以下几个:
1:#include <linux/slab.h>
  temporary=(struct prio_array *)kmalloc(sizeof(struct prio_array),1);
这样进行结构体分配空间是否有语法上的错误 ,,,????

2,我改进实时高度的主要思想是增加一个队列,只要是实时进程都进这个队列,然后这个队列是个哈希结构,这样调度实时进程时可以在O(1)的时间内选中,而不需要遍历整个队列....
增加队列的数据结构如下:
#define MAX_PRIO 100
struct prio_array{
  int proc_num;                              /*队列中的进程数目*/
  int Max_realhighest;                    /*当前最高的优先级实时进程*/
  struct task_struct *newqueue[MAX_PRIO];/*这里的数组号为实时进程的goodness 的值减去1000*/
};
struct prio_array *using,*used,ARRAY[2];/*ARRAY[0]为当前可以运行队列,ARRAY[1]为等待分配时间片队列*/


我想问的第二个问题是:我分辨实时进程和普通进程是通过policy的值进行的,如果调度策略为shedother则为普通进程,否则为实时进程.....这样可不可以...????

3,,大家觉得我这种方案可不可行,,,,主要是现在进不了系统了都,找不到原因,,,
 楼主| 发表于 2007-4-25 22:03:41 | 显示全部楼层
主要修改了schedule函数,其它的就是当出现del_fromrunqueue;之类时先判断是否为实时进程,如果是则进实时进程的队列.....


asmlinkage void schedule(void)
{
        struct schedule_data * sched_data;
        struct task_struct *prev, *next, *p;
        struct list_head *tmp;
        int this_cpu, c;
        int use_number,hash_number;

        spin_lock_prefetch(&runqueue_lock);

        BUG_ON(!current->active_mm);
need_resched_back:
        prev = current;
        this_cpu = prev->processor;

        if (unlikely(in_interrupt())) {
                printk("Scheduling in interrupt\n");
                BUG();
        }

        release_kernel_lock(prev, this_cpu);

        /*
         * 'sched_data' is protected by the fact that we can run
         * only one process per CPU.
         */
        sched_data = & aligned_data[this_cpu].schedule_data;

        spin_lock_irq(&runqueue_lock);

        /* move an exhausted RR process to be last.. */
        if (unlikely(prev->policy == SCHED_RR))
                if (!prev->counter) {
                        prev->counter = NICE_TO_TICKS(prev->nice);
                /*        move_last_runqueue(prev);*/
                        use_number=0;Dequeue(use_number,prev);
                        use_number=1;Enqueue(use_number,prev);
                  
                }

        switch (prev->state) {
                case TASK_INTERRUPTIBLE:
                        if (signal_pending(prev)) {
                                prev->state = TASK_RUNNING;
                                break;
                        }
                default:/*del_from_runqueue(prev);*/   
   /*这里的疑问最大,原来是del_from_runqueue,现改为以下部份,麻烦大家帮我看一下有没有错误*/
                if(prev->policy==SCHED_OTHER){del_from_runqueue(prev);}
                                   else{if(!prev->counter)
                             { use_number=1;Dequeue(use_number,prev);}
                              else{use_number=0;Dequeue(use_number,prev);}
                                       }
                case TASK_RUNNING:;
        }
....................................
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-25 22:05:24 | 显示全部楼层
第一次修改内核,现在弄得抓狂,找不着错误的原因,又不能像windows环境下一样可以有调试工具,希望大家不吝指教,谢谢了,,,,,,,,,,,,,,,,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表