当前位置:  技术问答>linux和unix

调用pause()的进程/线程会让出处理器么?

    来源: 互联网  发布时间:2016-05-26

    本文导语:  内核驱动采用阻塞式读时,没有数据时会被阻塞,让出处理; 而采用异步通知的方法时,用户态进程会在ready后调用puase()/sleep(),等待内核程序发出异步通知。 这里想比较一下,哪种方法更好?更节省资源,pause()源代码不大...

内核驱动采用阻塞式读时,没有数据时会被阻塞,让出处理;

而采用异步通知的方法时,用户态进程会在ready后调用puase()/sleep(),等待内核程序发出异步通知。

这里想比较一下,哪种方法更好?更节省资源,pause()源代码不大看得懂,貌似没有让出处理器的操作,如此的话,难道是阻塞式读写比异步通知更好?但是这个结论和感觉相悖。

int
__libc_pause (void)
{
  sigset_t set;

  __sigemptyset (&set);
  __sigprocmask (SIG_BLOCK, NULL, &set);

  /* pause is a cancellation point, but so is sigsuspend.
     So no need for anything special here.  */

  return __sigsuspend (&set);
}

|
__sigsuspend 会阻塞等待并释放CPU。下面是信号处理 sigsuspend 的一些说明:


       int sigsuspend(const sigset_t *sigmask);
       The  sigsuspend()  function  shall replace the current signal mask of the calling thread with the set of
       signals pointed to by sigmask and then suspend the thread until delivery of a  signal  whose  action  is
       either to execute a signal-catching function or to terminate the process. This shall not cause any other
       signals that may have been pending on the process to become pending on the thread.
       If the action is to terminate the process then sigsuspend() shall never return. If the action is to exe-
       cute  a  signal-catching  function,  then  sigsuspend()  shall return after the signal-catching function
       returns, with the signal mask restored to the set that existed prior to the sigsuspend() call.
       It is not possible to block signals that cannot be ignored. This is enforced by the system without caus-
       ing an error to be indicated.
       也就是说,sigsuspend后,进程就挂在那里,等待着开放的信号的唤醒。系统在接受到信号后,马上就把现在的信号集还原为原来的,然后调用处理函数。

|
让他sleep吧,这样不占资源。
阻塞貌似是要占资源的。
所以就有mutex_cond。

    
 
 

您可能感兴趣的文章:

  • java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了
  • 请问调用notify后被选中线程的wait是立刻返回,还是等到调用notify的线程退出synchronized块后再返回?
  • 如何在工作线程中调用图形界面线程的成员函数(串口通信)?
  • 请教:线程中调用一个阻塞的方法后,进程及其它线程会阻塞么?
  • 子线程里如何调用主线程中的方法?
  • 小问题:在线程中调用sleep()使其睡眠的时候,此线程是否释放所占的资源?
  • 各位,线程的run方法不允许抛出异常,那我的调用程序如何得知线程里发生了异常?
  • 问一个很奇怪的线程调用的问题
  • 多线程调用ffmpeg
  • 存在线程的程序中调用exec将出现什么问题?
  • 如果遇到多层函数调用,使用一次上锁解锁可以保证数据的线程独立性么
  • 多线程调用localtime有时得到的数据不正确如何解决
  • 多线程调用ioctl 应在哪进行互斥操作?
  • 子线程中调用 execl的问题
  • 求教 Linux多个线程 可不可以同时调用一个函数
  • java线程怎么调用java的application.class?
  • 由于问题变化了,所以重新个贴子,是关于线程间函数调用及串口接收数据的问题?
  • 线程调用场景
  • 新手关于线程调用的求救!应该不难
  • 多线程调用函数
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在Python中使用SWIG调用C和C++程序
  • Linux添加系统调用时如何调用C语言库函数
  • sessionbean调用entitybean的时候还需要像Client一样远程调用对象吗??
  • system()调用 与 ioctl()调用
  • linux中为什么系统调用比普通函数调用更费时间?
  • 如何在LINUX下用一个普通文件调用一个自己编写的调用系统的文件
  • 可不可以用java调用其他语言的编译结果?(好象asp调用com那样)
  • 为什么我的BEAN 在WIN2000中调用没有问题,但在LINUX中调用有问题
  • 为什么守护进程调用调用getlogin会失败呢?
  • 用RMI进行远程对象调用的时候,可不可以实现多个调用远程对象的并发操作
  • 关于jsp调用javabean的问题!调用是成功了,但是有小问题!
  • ioctl中能不能调用generic_file_read呀?我一调用就不动了
  • LINUX下系统调用是不能中断的,要怎么改造成可以中断系统调用?
  • 请问用javaScript或vbScript可否调用页面上Applet的public函数?如何调用?
  • 请问在jsp中调用外部的类,与jsp调用javabean有何区别??
  • 调用数学函数,需要调用哪个函数库?
  • 调用system(“命令”)和函数调用之间有什么不同?效率?
  • 请问如何在Java中调用一个VB所写的DLL?如何调用这个Dll的方法?如何取得和设置这个Dll的属性值?谢谢!
  • 脚本1调用脚本2,脚本2必须输入回车,如何在调用过程中自动输入回车
  • 请问linux中的系统调用号是如何跟系统调用表对应起来的
  • 我的APPLET在Jbuilder5中,可以调用EJB对象,但是移植到网页上却不能调用EJB对象!是何缘故,值得研究!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3