嵌入式开发教程之Linux核机制之等待队列.pptxVIP

嵌入式开发教程之Linux核机制之等待队列.pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式开发教程之Linux核机制之等待队列

嵌入式开发教程之Linux内核机制之等待队列;  Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在中,等待队列在源代码树中,这是一个通过连接的典型双循环链表,如下图所示。 ;  在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个list_head类型的域作为连接件。由于我们只需要对队列进行添加和删除操作,并不会修改其中的对象(等待队列项),因此,我们只需要提供一把保护整个基础设施和所有对象的锁,这把锁保存在等待队列头中,为wq_lock_t类型。在实现中,可以支持读写锁(rwlock)或自旋锁(spinlock)两种类型,通过一个宏定义来切换。如果使用读写锁,将wq_lock_t定义为rwlock_t类型;如果是自旋锁,将wq_lock_t定义为spinlock_t类型。无论哪种情况,分别相应设置wq_read_lock、wq_read_unlock、 wq_read_lock_irqsave、wq_read_unlock_irqrestore、wq_write_lock_irq、 wq_write_unlock、wq_write_lock_irqsave和wq_write_unlock_irqrestore等宏。;  /include/linux/wait.h   struct __wait_queue_head {   spinlock_t lock;   struct list_head task_list;   };   typedef struct __wait_queue_head wait_queue_head_t;;  在内核里面,等待队列是有很多用处的,尤其是在中断处理、进程同步、定时等场合。可以使用等待队列在实现阻塞进程的唤醒。它以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现内核中的异步事件通知机制,同步对系统资源的访问等。;  1、spinlock_t lock;   在对task_list与操作的过程中,使用该锁实现对等待队列的互斥访问。   2、srtuct list_head_t task_list;   双向循环链表,存放等待的进程。;1、定义并初始化等待队列头   (1)   wait_queue_head_t my_queue;   init_waitqueue_head(my_queue);   直接定义并初始化。init_waitqueue_head()函数会将自旋锁初始化为未锁,等待队列初始化为空的双向循环链表。   (2)   DECLARE_WAIT_QUEUE_HEAD(my_queue);   定义并初始化,相当于(1)。;  DECLARE_WAITQUEUE(name,tsk);   注意此处是定义一个wait_queue_t类型的变量name,并将其private与设置为tsk。wait_queue_t类型定义如下:   struct __wait_queue {   unsigned int flags;   #define WQ_FLAG_EXCLUSIVE 0x01;  void *private;   wait_queue_func_t func;   struct list_head task_list;   };   其中flags域指明该等待的进程是互斥进程还是非互斥进程。其中0是非互斥进程,WQ_FLAG_EXCLUSIVE(0x01)是互斥进程。等待队列(wait_queue_t)和等待对列头(wait_queue_head_t)的区别是等待队列是等待队列头的成员。也就是说等待队列头的task_list域链接的成员就是等待队列类型的(wait_queue_t)。;  (1)add_wait_queue()函数:   void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)   {   unsigned long flags;   wait-flags = ~WQ_FLAG_EXCLUSIVE;   spin_lock_irqsave(q-lock, flags);   __add_wait_queue(q, wait);   spin_unlock_irqrestore(q-lock, flags);   };  设置等待的进程为非互斥进程,并将其添加进等待队列头(q)的队头中。   void fastcall add_wait_queue_exclusive(wait_queue_head_

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档