Linux内核:通过wait_event和wake_up内在机制分析等待队列

等待队列在linux内核中,等待队列是一个非常重要的概念,也是一个非常重要的机制。我们会在很多函数当中用到等待队列的知识,例如completion机制、wait_event机制等等。在解释这些机制之前,我们首先要弄清楚什么是等待队列。

在linux内核里面,我们将进程分为以下几种状态:

可运行状态(TASK_RUNNING)
处于这种状态的进程,要么正在运行,要么正准备被CPU调度运行。正在运行的进程就是当前进程(由current所指向的进程),而准备运行的进程只要得到CPU就可以立即投入运行,CPU是这些进程唯一等待的系统资源。系统中有一个运行队列(run_queue),用来容纳所有处于可运行状态的进程,调度程序执行时,从中选择一个进程投入运行。在后面我们讨论进程调度的时候,可以看到运行队列的作用。当前运行进程一直处于该队列中,也就是说,current总是指向运行队列中的某个元素,只是具体指向谁由调度程序(schedule)决定。

等待状态(TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE)
处于该状态的进程正在等待某个事件(event)或某个资源,它肯定位于系统中的某个等待队列(wait_queue)中。Linux中处于等待状态的进程分为两种:可中断的等待状态(TASK_INTERRUPTIBLE)和不可中断的等待状态(TASK_UNINTERRUPTIBLE))。处于可中断等待态的进程可以被信号唤醒,如果收到信号,该进程就从等待状态进入可运行状态,并且加入到运行队列中,等待被调度;而处于不可中断等待态的进程是因为硬件环境不能满足而等待,例如等待特定的系统资源,它任何情况下都不能被打断,只能用特定的方式来唤醒它,例如唤醒函数wake_up()等。

暂停状态
此时的进程暂时停止运行来接受某种特殊处理。通常当进程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信号后就处于这种状态。例如,正接受调试的进程就处于这种状态。

僵死状态
进程虽然已经终止,但由于某种原因,父进程还没有执行wait()系统调用,终止进程的信息也还没有回收。顾名思义,处于该状态的进程就是死进程,这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占用的资源。

实际使用
了解了Linux内核的几个状态之后,现在我们开始着重讲解其中的一个状态,等待状态,由上面的等待状态的描述,我们可以知道处于等待状态的进程正在等待某一个事件或者某一个资源,它肯定位于系统中的某一个等待队列中。这里我们就以wait_event和wake_up机制来讲解。
在这一机制当中,wait_event用于将当前进程加入某一等待队列中,同时将该进程的状态修改为等待状态。而wake_up则用于将某一个等待队列上面所有的等待进程唤醒,也就是将其从等待队列上面删掉,同时将其的进程状态置为可运行状态。
等待队列由等待队列头等待队列项构成,所以当我们定义了一个等待队列头,也就是定义了一个等待队列了,等待队列的结构如下图所示:
等待队列

等待队列头(wait_queue_head)在内核文件中的定义(include\Linux\Wait.h)


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值