• 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):

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

  • 相关阅读:
    结算凭证中委托付款部分sql
    各公司年资金归集汇总sql
    通过开户银行账号查询客商名称 sql
    TRIGGER_15.8.3BACKUP
    备份触发器:ADDC3
    sql查询单个银行账号重复
    待研究:insert客商账户触发器增加条件提示为空
    sql:劳务统计各分公司管理费用明细合计(等同汇总报表)
    【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
    【ASP.NET程序员福利】打造一款人见人爱的ORM(一)
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/7107358.html
Copyright © 2020-2023  润新知