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库中的“线程”事实上就是进程,因此该函数的作用域就是这个“线程”。

阅读剩余
THE END