linux 线程 sleep?linux脚本sleep
各位老铁们,大家好,今天由我来为大家分享linux 线程 sleep,以及linux脚本sleep的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
Thread.sleep的副作用
很多Java程序员倾向于使用Thread.sleep方法来实现线程的定时睡眠,从而避免while循环中CPU资源的大量消耗。然而,Thread.sleep的执行并非零成本。如果循环中的睡眠时间过短,开销会非常大。
Thread.sleep的主要成本来源于线程切换。当代码执行到Thread.sleep时,当前线程会进入time_wait状态,即所谓的睡眠状态。此时,该线程不再占用CPU资源,操作系统将执行一次线程切换,将CPU时间分配给其他线程使用,这被称为主动线程切换。这种切换是线程主动让出CPU时间,而不是由CPU资源耗尽而被动切换给其他线程。
在Linux操作系统中,可以通过执行vmstat命令来观察CPU上下文切换的统计情况。cs列展示了每秒的上下文切换次数。值得注意的是,CPU上下文切换并不等同于线程切换,许多操作可能会导致CPU上下文切换。
为了更细致地了解线程的上下文切换情况,可以使用pidstat命令来查看特定进程的详细统计信息。执行命令pidstat-w-p进程ID 1,可以获取进程每秒的主动切换(cswch)和被动切换(nvcswch)次数。在上述例子中,某进程每秒的主动切换次数达到将近500次,表明存在大量睡眠和唤醒操作。
除了造成线程切换,sleep操作还是一个系统调用。在Linux环境下,使用strace命令跟踪可以发现sleep最终执行的系统调用是futex。了解系统调用与普通代码执行相比的重量级特性,每次系统调用需要将线程状态从用户态切换到内核态,并在完成后切换回来,涉及执行现场的保存和恢复,同样涉及到CPU上下文切换。虽然系统调用的切换开销小于线程切换,但累积次数多时,总消耗也不可忽视。
因此,Thread.Sleep看似微不足道的操作,实则消耗系统资源严重。在性能要求较高的系统中,应仔细考虑设置的睡眠时间,过小的睡眠时间会导致大量资源浪费,进而拖慢整个系统程序的性能。
Linux下的sleep函数 要用的话得包涵什么头文件啊
Linux下的sleep函数要用的话得需要#include<unistd.h>
sleep把进程的运行状态改为睡眠,将其从系统可执行队列去掉,这样系统就不会调度到该进程,不会分配CPU时间片,同时根据该进程的睡眠时间,将进程挂入相应的定时器队列中。
同时内核维持一个定时器队列,每一次时钟中断处理,都把当前到期的队列中的进程唤醒,加入到可运行进程队列中。同时对所有挂入定时器队列中的进程时间值减1。
参考代码:
#include<stdio.h>
#include<unistd.h>
intmain()
{
int sec=0,
usec=0;
while(1)
{
printf("sec=%d\n",++sec);
sleep(1);
printf("usec=%d\n",++usec);
usleep(1000000);
}
return0;
}
扩展资料:
在Linux下,sleep中的“s”不大写
sleep()单位为秒,usleep()里面的单位是微秒。在内核中,sleep的实现是由pause函数和alarm函数两个实现的。
特别注意在Codeblocks环境下是无法使用sleep函数的,因为在windows上Codeblocks采用mingw(Gnu在Window环境下的编译器,可以充分使用WindowsApi)作为编译器,而在stdlib.h中sleep的说明如下:_CRTIMP void __cdecl __MINGW_NOTHROW _sleep(unsigned long) __MINGW_ATTRIB_DEPRECATED;可以认为mingw舍弃了sleep函数,建议用Sleep实现sleep。
参考资料来源:百度百科-Sleep函数
嵌入式 linux下sleep函数到底是线程休眠还是进程休眠
Linux实际上没有真正线程的概念,pthread库中的“线程”被许多人称作“轻量级的进程",内核负责调度所有的进程,且在内核眼里被我们看做线程的东西与普通进程是无差别的。
sleep函数休眠的是当前进程,而pthread库中的“线程”事实上就是进程,因此该函数的作用域就是这个“线程”。