2014-10-27 2 views
1

Я установил minix3 на виртуальную машину и надеялся, что смогу манипулировать текущим алгоритмом выбора очереди, чтобы я мог изменить его из порядка приоритетов в приоритетный порядок, который включает случайный ассортимент заданий с более низким приоритетом , Мне удалось найти, что раздел кода, который мне нужно изменить, был в proc.c, а конкретный раздел - pick_proc.c.Изменение очереди приоритетов Minix3

/*===========================================================================* 
*    pick_proc      * 
*===========================================================================*/ 
PRIVATE struct proc * pick_proc(void) 
{ 
    /* Decide who to run now. A new process is selected and returned. 
    * When a billable process is selected, record it in 'bill_ptr', so that the 
    * clock task can tell who to bill for system time. 
    */ 
    register struct proc *rp; /* process to run */ 
    int q;      /* iterate over queues */ 

    /* Check each of the scheduling queues for ready processes. The number of 
    * queues is defined in proc.h, and priorities are set in the task table. 
    * The lowest queue contains IDLE, which is always ready. 
    */ 
    for (q=0; q < NR_SCHED_QUEUES; q++) {  
     if(!(rp = rdy_head[q])) { 
      TRACE(VF_PICKPROC, printf("queue %d empty\n", q);); 
      continue; 
     } 

     u64_t timecount; 
     u32_t randdom; 
     read_tsc_64(&timecount); 
     rand = timecount.lo; 

     #if DEBUG_RACE 
     rp = random_process(rdy_head[q]); 
     #endif 

     TRACE(VF_PICKPROC, printf("found %s/%d on queue %d\n", 
       rp->p_name, rp->p_endpoint, q);); 
     assert(proc_is_runnable(rp)); 
     if (priv(rp)->s_flags & BILLABLE)   
      bill_ptr = rp;  /* bill for system time */ 
     return rp; 
    } 
    return NULL; 
} 

Я уже поставил некоторый код, чтобы начать процесс рандомизации, но я не знаю, куда идти отсюда. Я знаю, что мне нужно добавить что-то в этот файл, но я не уверен, какие переменные делают то, что и какие указатели мне нужно изменить. Я надеялся, что кто-то может показать мне, как это сделать, или указать, какую часть мне нужно изменить, чтобы помочь мне двигаться вперед. Прямо сейчас я довольно застрял.

ответ

0

Чувствуется как деликатный вопрос; изменение алгоритма может оставить невыполненные задачи с высоким приоритетом. Q1: что такое «задача с более низким приоритетом»? Это NR_SCHED_QUEUES/2? Q2: сколько задач с более высоким приоритетом должно быть в ожидании, прежде чем вы захотите предпочесть задачу с более низким приоритетом? С помощью этого ответа вы можете изменить q = 0 в цикле for, например. q = low_tasks и выберите процесс оттуда.

for (p=0, q=0; q < NR_SCHED_QUEUES/2; q++) 
    p += rdy_tail[q] - rdy_head[q]; // number of processes in this queue 
if (p<some_value) q= NR_SCHED_QUEUES/2; else q= 0; 

for (; q < NR_SCHED_QUEUES; q++) {  
    if(!(rp = rdy_head[q])) { 
     TRACE(VF_PICKPROC, printf("queue %d empty\n", q);); 
     continue; 
    } 

    TRACE(VF_PICKPROC, printf("found %s/%d on queue %d\n", 
      rp->p_name, rp->p_endpoint, q);); 
    assert(proc_is_runnable(rp)); 
    if (priv(rp)->s_flags & BILLABLE)   
     bill_ptr = rp;  /* bill for system time */ 
    return rp; 
} 
return NULL; 

Примечание: это демонстрация только и не гарантируется для правильной работы!

Примечание: вы должны также проверить выполнение задач с более низким приоритетом.

+0

Спасибо за советы Paul. Я немного смущен тем, как вы смогли ввести случайность в очередь планирования, добавив цикл for. Чтобы ответить на ваши предыдущие вопросы: 1. Задачами с более низким приоритетом могут быть любые задачи с более низким приоритетом. Это не должно быть чем-то конкретным. 2. Это число также не должно быть исправлено. Это также может быть случайным. Поэтому иногда он может разрешить несколько задач с более высоким приоритетом, и в других случаях он может позволить многим. Вы упомянули изменение q = 0 на q = low_task, мог бы я включить свой код, который отобрал случайность в этом? – John123

+0

Я не добавлял случайности. Это просто пример принятия решения о том, разрешать ли задания с более низким приоритетом. Вы можете сделать весь процесс случайным, от самой высокой до самой низкой задачи. Это означает, что появится вероятность того, что машина будет висела (например, только планирование задач с низким приоритетом). Поэтому я считаю, что планировщик не может быть случайным или только случайным под стражей. –

+0

Спасибо, Пол! Это очень помогает мне. Я ценю ваш вклад, и я внесу соответствующие изменения. – John123

Смежные вопросы