运行队列链表把处于TASK_RUNNING状态的所有进程组织到一起
等待队列表示一组睡眠的进程,当某一条件变为真时,由内核唤醒他们,等待队列由双向链表实现
睡眠进程分为两种,互斥进程(等待队列元素的flags字段为1)由内核有选择地唤醒,非互斥进程(flags值为0)总是由内核在事件发生时唤醒
等待访问临界资源的进程就是互斥进程;等待相关事件的进程是非互斥的
每个等待队列链表中的一个元素其实就是指向睡眠进程描述符的指针
内核开发者可以通过init_waitqueue_func_entry()函数来自定义唤醒函数,该函数负责初始化等待队列的元素
为了把一个互斥进程插入等待队列,内核必须使用prepare_to_wait_exclusives()函数,或者直接调用add_wait_queue_exclusive();所有其他的相关函数把进程当做非互斥进程来插入
list_for_each宏扫描双向链表q->task_list中的所有项,即等待队列中的所有进程
所有的非互斥进程总是在双向链表的开始位置,而所有的互斥进程在双向链表的尾部;一个等待队列中同时包含互斥与非互斥进程的情况是十分罕见的
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u012839187/article/details/47124331