针对每个CPU运行队列的线程、等待队列线程信息输出
各位好,我需要在SysRq中增加自己的调试命令,当键入命令后输出每个CPU中运行队列的所有线程信息以及等待队列的线程信息。查找运行队列现在主要有两种思路:一种是直接遍历task_struct链表,另外一种是利用struc ra结构体。等待队列还没有思路。由于内核刚入门不久,具体的细节和概念还不是特别清楚,请各位大牛多多指点。 是struct rq结构体,不是ra结构体,不好意思。 遍历运行队列中的任务,应该有现有的接口,忘了,建议看看代码~
等待队列可能也有,建议搜搜代码~ 打印每个cpu的运行队列信息已经实现了。现在的问题就是等待队列了,看了一个礼拜的源代码,还是没有找到内核调度层的等待队列地址,内核好像只记录等待的数量,而对具体等待的任务不做保存。请教下如何打印CPU的等待队列中的进程?回复 3# humjb_1983
回复 4# 仙帝将王
等待队列怎么没有链表,不然怎么把任务取出来去**!void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
{
unsigned long flags;
wait->flags &= ~WQ_FLAG_EXCLUSIVE;
spin_lock_irqsave(&q->lock, flags);
__add_wait_queue(q, wait);
spin_unlock_irqrestore(&q->lock, flags);
}
EXPORT_SYMBOL(add_wait_queue);static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new)
{
list_add(&new->task_list, &head->task_list);
} **的代码在这:
static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
int nr_exclusive, int sync, void *key)
{
wait_queue_t *curr, *next;
list_for_each_entry_safe(curr, next, &q->task_list, task_list) {
unsigned flags = curr->flags;
if (curr->func(curr, mode, sync, key) &&
(flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
break;
}
} 回复 6# Tinnal
谢谢Tinnal,这个确实是等待队列的代码,但是具体的队列是由应用层自己定义的。我想请教的是,内核调度层会像运行队列一样的等待队列吗?也就是说每个CPU中是不是有一个唯一的等待队列? 回复 7# 仙帝将王
没有作谓的每CPU等待队列吧,应该只有每CPU运行队列。除非在一些特性的子系统里或你自己定义。自己去搜索一下代码不就出来了。
页:
[1]