在Linux内核中,进程的睡眠(sleep)和唤醒(wakeup)是进程调度的重要机制,用于管理进程对资源的等待和同步。
// 可中断睡眠
void interruptible_sleep_on(wait_queue_head_t *q);
// 不可中断睡眠
void sleep_on(wait_queue_head_t *q);
DEFINE_WAIT(wait); // 定义等待队列项
prepare_to_wait(&wq_head, &wait, TASK_INTERRUPTIBLE); // 准备睡眠
if (!condition)
schedule(); // 让出CPU
finish_wait(&wq_head, &wait); // 完成等待
wait_event(wq_head, condition); // 不可中断等待条件
wait_event_interruptible(wq_head, condition); // 可中断等待条件
wait_event_timeout(wq_head, condition, timeout); // 带超时的等待
void wake_up(wait_queue_head_t *q); // 唤醒所有等待的进程
void wake_up_interruptible(wait_queue_head_t *q); // 只唤醒可中断睡眠的进程
void wake_up_process(struct task_struct *tsk);
// 生产者-消费者模型中的睡眠/唤醒示例
static DECLARE_WAIT_QUEUE_HEAD(wq);
static int condition = 0;
// 消费者线程
static int consumer_thread(void *data)
{
while (1) {
wait_event_interruptible(wq, condition != 0);
// 处理数据
condition = 0;
}
return 0;
}
// 生产者线程
static int producer_thread(void *data)
{
while (1) {
// 生产数据
condition = 1;
wake_up_interruptible(&wq); // 唤醒消费者
}
return 0;
}
使用ps aux
查看进程状态:
S
:可中断睡眠D
:不可中断睡眠使用/proc/<pid>/wchan
查看进程在等待什么内核函数
使用strace
跟踪系统调用,查看进程阻塞的位置
理解Linux进程的睡眠和唤醒机制对于开发内核模块、驱动程序和高效的用户空间程序都至关重要。