PintOS:schedule()ASSERT时内核死机(is_thread(next))

xkftehaa  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(126)

thread. c中的Schedule()获取当前运行的线程和就绪列表中的下一个线程,并执行ASSERT,确认下一个线程是一个线程(is_thread(t)检查t!是否为NULL,以及t-〉magic == THREAD_MAGIC)。

Kernel PANIC at ../../threads/thread.c:563 in schedule(): assertion 'is_thread(next)' failed.

我目前正在实现timer_sleep,这样它就不会忙碌等待了。下面是我的timer_sleep函数:

void
timer_sleep (int64_t ticks) 
{
  if (ticks > 0)
  {
    ASSERT (intr_get_level () == INTR_ON);
    enum intr_level old_level;
    old_level = intr_disable ();

    struct thread *current_thread;
    current_thread = thread_current();

    int64_t wake_tick = timer_ticks() + ticks;
    current_thread->wake_tick = wake_tick;

    list_insert_ordered (&sleep_list, &current_thread->timer_elem, cmp_wake_ticks, NULL);
    thread_block();

    intr_set_level(old_level);
  }
}

我的定时器中断:

static void
timer_interrupt (struct intr_frame *args UNUSED)
{
  enum intr_level old_level;
  old_level = intr_disable ();

  ticks++;
  thread_tick ();

  struct list_elem* sl_elem;
  struct thread* sl_thread;
  while(!list_empty(&sleep_list))
  {
    sl_elem = list_front(&sleep_list);
    sl_thread = list_entry(sl_elem, struct thread, timer_elem);

    if (sl_thread->wake_tick > ticks)
    {
      break;
    }

    thread_unblock(sl_thread);
    list_remove(sl_elem);
  }

  intr_set_level (old_level);
}

只有在thread_unblock中才能向ready_list中添加任何内容,它也执行ASSERT is_thread,所以我不确定不是线程的内容会被添加到ready_list的什么位置。除了向thread. h添加timer_elem和线程cmp_wake_ticks函数之外,我没有对基础代码做任何其他更改。

92dk7w1h

92dk7w1h1#

list_insert_ordered()中,使用struct elem“定时器_元素”
但请参见next_thread_run()函数(由is_thread()调用)
像这样实施
列表条目(列表弹出前端(&就绪列表),结构体线程,元素);
这意味着,ready_list中的阻塞线程使用“timer_elem”,但弹出函数使用“elem”

所以你把你的stuct elem统一成“elem”

相关问题