我的个人站点:http://zhwen.org ,这里的文章基本上是来自我的个人站点。当然这里有我所有的技术文章。七度黑光--当感到一切都毫无头绪的时候,最好静下心来从基础开始.

Linux内核中的P,V操作之V

上一篇 / 下一篇  2008-11-17 21:50:38 / 个人分类:linux学习笔记

查看( 80 ) / 评论( 0 )
V操作:也在文件:kernel/semaphore.c中。

void up(struct semaphore *sem)
{
        unsigned long flags;

        spin_lock_irqsave(&sem->lock, flags);
        if (likely(list_empty(&sem->wait_list)))    //在这里用list_empty判断sem的等待队列是否为空。
                sem->count++;        //如果为空则只是信号量的计数加1
        else
                __up(sem);        //否则在这里去唤醒信号量的等待队列上的进程。
        spin_unlock_irqrestore(&sem->lock, flags);
}
下面来看看__up(sem)这个函数:
static noinline void __sched __up(struct semaphore *sem)
{//下面一句是在上面确定有等待进程了之后,来取第一个等待进程(当然这里取的一个信号量结构体)。应为第一个进程是等待最久的。
        struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
                                                struct semaphore_waiter, list);
        list_del(&waiter->list);    //然后在这个等待队列上将其删除
        waiter->up = 1;            //标识允许唤醒
        wake_up_process(waiter->task); //这里正真去唤醒进程。
}
wake_up_process(waiter->task);再调用函数try_to_wake_up(p, TASK_ALL, 0);进行了进程的唤醒。


TAG: Linux LINUX linux 内核

我来说两句

(可选)

日历

« 2010-03-17  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 28582
  • 日志数: 86
  • 图片数: 1
  • 文件数: 1
  • 书签数: 3
  • 建立时间: 2008-03-08
  • 更新时间: 2010-01-04

RSS订阅

Open Toolbar