//进程状态描述
TASK_RUNNING 0 可运行状态,要么准备执行,要么正在执行
TASK_INTERRUPTIBLE 1 可中断的等待状态,进程在睡眠状态,直到某个条件为真
才被调度执行,函数interruptible_sleep_on()使进程进入
该状态
TASK_UNINTERRUPTIBLE 2 和 TASK_INTERRUPTIBLE 类似,但是进入此状态将不能被唤醒
uninterruptible_sleep_on() 使进程进入该状态
__TASK_STOPPED 4 此状态的进程的执行被暂停
__TASK_TRACED 8 此状态的进程的执行已由debugger程序暂停
EXIT_DEAD 16 僵死撤销状态,最终状态
EXIT_ZOMBIE 32 僵死状态,进程执行被终止,但是父进程没有发布wait4或
waitpid,则此进程的描述符数据还存在,仍然可被父进程
使用
EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD) 复合
TASK_DEAD 64 死亡状态,函数do_exit()使进程进入此状态
TASK_WAKEKILL 128 唤醒杀死状态,和 TASK_UNINTERRUPTIBLE 类似,但是可以
接收致命信号唤醒线程
TASK_WAKING 256 唤醒状态
TASK_PARKED 512 休眠状态
TASK_STATE_MAX 1024 预留,暂时无用
TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) 可杀死状态
TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) 暂停状态
TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) 跟踪状态
TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) 普通状态
TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED) 全状态
TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \ 报告态
TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \
__TASK_TRACED | EXIT_ZOMBIE | EXIT_DEAD)
//用于唤醒等待队列中处于特定状态的进程,唤醒后获得CPU资源,从而被调度执行
/*wait_queue_head_t 等待队列头指针
mode 处于如下状态的进程才能够被唤醒:TASK_ALL/TASK_NORMAL
TASK_NORMAL:可中断或不可中断的等待状态的进程
TASK_ALL: TASK_NORMAL及暂停状态和跟踪状态的进程
nr_exclusive 唤醒等待队列中进程的个数:<0 时唤醒所有满足mode状态的进程
>0 时扫描完等待队列,唤醒等待队列中进程的个数
key 代表唤醒进程时执行的函数,一般传递NULL
*/
void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr_exclusive , void *key)
{
unsigned long flags;
spin_lock_irqsave(&q->lock, flags);
__wake_up_common(q, mode, nr_exclusive, 0, key);
spin_unlock_irqrestore(&q->lock, flags);
}
typedef struct __wait_queue_head wait_queue_head_t;
struct __wait_queue_head {
spinlock_t lock; //资源访问锁
struct list_head task_list; //队列链表前后指针
};
struct list_head {
struct list_head *next, *prev;
};
//同步唤醒等待队列中处于特定状态的进程
void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
{
__wake_up_sync_key(q, mode, nr_exclusive, NULL);
}
//同上
void __wake_up_sync_key(wait_queue_head_t *q, unsigned int mode,
int nr_exclusive , void *key)
{
unsigned long flags;
int wake_flags = 1; /* XXX WF_SYNC */
if (unlikely(!q))
return;
if (unlikely(nr_exclusive != 1))
wake_flags = 0;
spin_lock_irqsave(&q->lock, flags);
__wake_up_common(q, mode, nr_exclusive, wake_flags, key);
spin_unlock_irqrestore(&q->lock, flags);
}
//更改当前进程的状态,将当前进程置于 TASK_RUNNING 态
typedef struct __wait_queue wait_queue_t;
struct __wait_queue {
unsigned int flags; //优先级高低标志
void *private; //指向某一个进程的进程描述符
wait_queue_func_t func; //进程唤醒函数指针
struct list_head task_list; //等待队列链表,指前指后
};
void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
unsigned int mode , void *key)
{
unsigned long flags;
__set_current_state(TASK_RUNNING);
spin_lock_irqsave(&q->lock, flags);
if (!list_empty(&wait->task_list))
list_del_init(&wait->task_list);
else if (waitqueue_active(q))
__wake_up_locked_key(q, mode, key);
spin_unlock_irqrestore(&q->lock, flags);
}
TASK_RUNNING 0 可运行状态,要么准备执行,要么正在执行
TASK_INTERRUPTIBLE 1 可中断的等待状态,进程在睡眠状态,直到某个条件为真
才被调度执行,函数interruptible_sleep_on()使进程进入
该状态
TASK_UNINTERRUPTIBLE 2 和 TASK_INTERRUPTIBLE 类似,但是进入此状态将不能被唤醒
uninterruptible_sleep_on() 使进程进入该状态
__TASK_STOPPED 4 此状态的进程的执行被暂停
__TASK_TRACED 8 此状态的进程的执行已由debugger程序暂停
EXIT_DEAD 16 僵死撤销状态,最终状态
EXIT_ZOMBIE 32 僵死状态,进程执行被终止,但是父进程没有发布wait4或
waitpid,则此进程的描述符数据还存在,仍然可被父进程
使用
EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD) 复合
TASK_DEAD 64 死亡状态,函数do_exit()使进程进入此状态
TASK_WAKEKILL 128 唤醒杀死状态,和 TASK_UNINTERRUPTIBLE 类似,但是可以
接收致命信号唤醒线程
TASK_WAKING 256 唤醒状态
TASK_PARKED 512 休眠状态
TASK_STATE_MAX 1024 预留,暂时无用
TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) 可杀死状态
TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) 暂停状态
TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) 跟踪状态
TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) 普通状态
TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED) 全状态
TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \ 报告态
TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \
__TASK_TRACED | EXIT_ZOMBIE | EXIT_DEAD)
//用于唤醒等待队列中处于特定状态的进程,唤醒后获得CPU资源,从而被调度执行
/*wait_queue_head_t 等待队列头指针
mode 处于如下状态的进程才能够被唤醒:TASK_ALL/TASK_NORMAL
TASK_NORMAL:可中断或不可中断的等待状态的进程
TASK_ALL: TASK_NORMAL及暂停状态和跟踪状态的进程
nr_exclusive 唤醒等待队列中进程的个数:<0 时唤醒所有满足mode状态的进程
>0 时扫描完等待队列,唤醒等待队列中进程的个数
key 代表唤醒进程时执行的函数,一般传递NULL
*/
void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr_exclusive , void *key)
{
unsigned long flags;
spin_lock_irqsave(&q->lock, flags);
__wake_up_common(q, mode, nr_exclusive, 0, key);
spin_unlock_irqrestore(&q->lock, flags);
}
typedef struct __wait_queue_head wait_queue_head_t;
struct __wait_queue_head {
spinlock_t lock; //资源访问锁
struct list_head task_list; //队列链表前后指针
};
struct list_head {
struct list_head *next, *prev;
};
//同步唤醒等待队列中处于特定状态的进程
void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
{
__wake_up_sync_key(q, mode, nr_exclusive, NULL);
}
//同上
void __wake_up_sync_key(wait_queue_head_t *q, unsigned int mode,
int nr_exclusive , void *key)
{
unsigned long flags;
int wake_flags = 1; /* XXX WF_SYNC */
if (unlikely(!q))
return;
if (unlikely(nr_exclusive != 1))
wake_flags = 0;
spin_lock_irqsave(&q->lock, flags);
__wake_up_common(q, mode, nr_exclusive, wake_flags, key);
spin_unlock_irqrestore(&q->lock, flags);
}
//更改当前进程的状态,将当前进程置于 TASK_RUNNING 态
typedef struct __wait_queue wait_queue_t;
struct __wait_queue {
unsigned int flags; //优先级高低标志
void *private; //指向某一个进程的进程描述符
wait_queue_func_t func; //进程唤醒函数指针
struct list_head task_list; //等待队列链表,指前指后
};
void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
unsigned int mode , void *key)
{
unsigned long flags;
__set_current_state(TASK_RUNNING);
spin_lock_irqsave(&q->lock, flags);
if (!list_empty(&wait->task_list))
list_del_init(&wait->task_list);
else if (waitqueue_active(q))
__wake_up_locked_key(q, mode, key);
spin_unlock_irqrestore(&q->lock, flags);
}