Chinaunix首页 | 论坛 | 博客
  • 博客访问: 364642
  • 博文数量: 109
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 1920
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-19 11:17
个人简介

只要活着,就要有目标。

文章分类
文章存档

2013年(109)

我的朋友

分类: LINUX

2013-04-17 17:50:42


    今天 网小编带大家一起来学习关于Linux内核中等待队列的几种用法,因为Linux内核里的等待队列机制在做驱动开发时用的非常多,多用来实现阻塞式访问,所以下面简单总结了等待队列的四种用法,

   

    1. 睡眠等待某个条件发生(条件为假时睡眠):

    睡眠方式:wait_event, wait_event_interruptible

    唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要把条件变为真)

    2. 手工休眠方式一:

    1)建立并初始化一个等待队列项

    DEFINE_WAIT(my_wait <==> wait_queue_t my_wait; init_wait&my_wait);

    2)将等待队列项添加到等待队列头中,并设置进程的状态

    prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state

    3)调用schedule(),告诉内核调度别的进程运行

    4)schedule返回,完成后续清理工作

    finish_wait()

    3. 手工休眠方式二:

    1)建立并初始化一个等待队列项:

    DEFINE_WAIT(my_wait <==> wait_queue_t my_wait; init_wait&my_wait);

    2)将等待队列项添加到等待队列头中:

    add_wait_queue

    3)设置进程状态

    __set_current_status(TASK_INTERRUPTIBLE);

    4)schedule()

    5)将等待队列项从等待队列中移除

    remove_wait_queue()

    其实,这种休眠方式相当于把手工休眠方式一中的第二步prepare_to_wait拆成两步做了,即prepare_to_wait <====>add_wait_queue + __set_current_status,其他都是一样的。

    4. 老版本的睡眠函数sleep_on(wait_queue_head_t *queue):

    将当前进程无条件休眠在给定的等待队列上,极不赞成使用这个函数,因为它对竞态没有任何保护机制。

 

 原文链接:

 

 

阅读(1129) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~