nanosleep
文章目录
- 背景
- 代码模拟
- 编译执行后输出结果
- 分析
- 结论
背景
某天客户反馈程序cpu占用99%,要求分析出问题,经排查发现是由于nanosleep函数使用不当导致
代码模拟
#include <time.h>
#include <stdio.h>
int count;
void do_printbuf()
{
count++;
printf("do print buf called %d\n",count);
}
int main()
{
struct timespec s_time,ostime;
s_time.tv_sec = 0;
s_time.tv_nsec = 1000 * 1000 * 1000;//故障行
//s_time.tv_nsec = 10 *1000*1000;
while(1)
{
do_printbuf();
printf("tv_nsec %ld,sizeof %d\n",s_time.tv_nsec,sizeof s_time.tv_sec);
nanosleep(&s_time,&ostime);//故障行
}
return 0;
}
编译执行后输出结果
do print buf called 47938
tv_nsec 1000000000,sizeof 8
do print buf called 47939
tv_nsec 1000000000,sizeof 8
do print buf called 47940
tv_nsec 1000000000,sizeof 8
do print buf called 47941
tv_nsec 1000000000,sizeof 8
do print buf called 47942
分析
编译执行后,可以看出s_time.tv.nsec正常打印并没有发生溢出的问题,但是现象表明当tv_nsec中第一个乘数为10时程序执行缓慢,100时变的更慢一点点,1000时程序疯狂打印.
查看man 手册
The structure timespec is used to specify Intervals of time with
nanosecond precision. It is defined as follows:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
The value of the nanoseconds field must be in the range 0 to 999999999.
结论
- timespec中tv_nsec的存在范围限制,程序没有进行范围处理导致
- 当tv_nsec值超过999999999时,程序行为是未定义的,在不同系统,不同环境中表现不同,大多数系统表现为立即返回,不阻塞程序.
相关阅读
CPU性能排行天梯图2019 CPU天梯图2019年6月最新版
CPU一直是电脑硬件爱好者们关注的重点,一款CPU的性能如何直接决定了那个产品的定位和服务人群,天梯图2019年6月最新版集合了19年6月
linux 中的 nohup 命令(设置后台进程): nohup: ignoring
一、Linux 下使用 nohup Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。 比如我们要
CPU Idle状态可以分为很多种Idle状态,在CPU准备进入idle的时候在很多状态中进行选择以达到省电的目的。 CPU Idle相关的软件架构
一:操作系统原理1, 操作系统的主要功能: 一:将计算机复杂的硬件封装成一个个简单的接口,提供给应用程序或者客户使用
在用Idea开发项目的时候会发现Tomcat的端口突然被占用了,或者在使用其他的程序时也会出现端口冲动的问题,如下图所示: 这时候我们就