快速业务通道

TASK_KILLABLE:Linux 中的新进程状态

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-10
程用于获取互斥锁.但是,如果锁不可用并且任务正在等待获得锁,与此同时又接收到一个致命信号,则该任务将从等待互斥锁以处理信号的等待者列表中删除.
●int down_killable(struct semaphore *sem);
●定义在 kernel/semaphore.c 中,它用于获取信号量 sem.如果信号量不可用,它将被置为睡眠状态;如果向它传递了一个致命信号,则会将它从等待者列表中删除,并且需要响应此信号.获取信号量的另外两种方法是使用例程 down() 或 down_interruptible().down() 函数现在已不建议使用.您应该使用 down_killable() 或 down_interruptible() 函数.

关于 完成 的一些信息

完成机制的适用情况是:您希望将某个任务置为睡眠状态,但随后需要在某些事件完成时唤醒它.它提供了一种简单的、无竞态条件的同步机制.例程 wait_for_completion(struct completion *comp) 将使调用任务处于不可中断睡眠状态,除非完成已经发生.它要求通过 complete(struct completion *comp)complete_all(struct completion *comp) 函数来唤醒进程.

除了 wait_for_completion_killable() 之外,其他正在等待的例程包括:

  • wait_for_completion_timeout()
  • wait_for_completion_interruptible()
  • wait_for_completion_interruptible_timeout()

有关完成结构的定义,请参阅 include/linux/completion.h.

NFS 客户机代码中的变化

NFS 客户机代码也使用了这种新进程状态.清单 3 显示了 Linux 内核 2.6.18 和 2.6.26 在 nfs_wait_event 宏方面的差异.


清单 3. nfs_wait_event 因 TASK_KILLABLE 而发生的变化

Linux Kernel 2.6.18                          Linux Kernel 2.6.26

==========================================   =============================================

#define nfs_wait_event(clnt, wq, condition)  #define nfs_wait_event(clnt, wq, condition)

 ({                                           ({

  int __retval = 0;                            int __retval = 

                                                   wait_event_killable(wq, condition);

    if (clnt->cl_intr) {                        __retval;

     sigset_t oldmask;                        })

     rpc_clnt_sigmask(clnt, &oldmask);

     __retval = 

     wait_event_interruptible(wq, condition);

       rpc_clnt_sigunmask(clnt, &oldmask);

    } else

        wait_event(wq, condition);

        __retval;

 })

清单 4 显示了 nfs_direct_wait() 函数在 Linux Kernels 2.6.18 与 2.6.26 中的定义


清单 4. nfs_direct_wait() 因 TASK_KILLABLE 而发生的变化

Linux Kernel 2.6.18                                   

=================================           

static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq) 

{                                                           

  ssize_t result = -EIOCBQUEUED;                              



  /* Async requests don''t wait here */                         

 if (dreq->iocb)                                              

      goto out;                                                    



 result = wait_for_completion_interruptible(&dreq->completion);



 if (!result)                                                 

   result = dreq->error;                                        

 if (!result)                                                 

   result = dreq->count;                                        



out:                                                            

  kref_put(&dreq->kref, nfs_direct_req_release);

  return (ssize_t) result;

}                                                               







Linux Kernel 2.6.26

=====================

static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)

{

  ssize_t result = -EIOCBQUEUED;

  /* Async requests don''t wait here */

  if (dreq->iocb)

    goto out;



  result = wait_for_completion_killable(&dreq->completion);

  if (!result)

    result = dreq->error;

  if (!result)

    result = dreq->count;

out:

   return (ssize_t) result;

 }

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号