linux sleep on 我的世界linux启动器
linux中如何实现sleep(0)的功能
前段时间从windows移植了一个程序到linux上,不知为何性能奇差。查了下原因,发现是由于一个函数ZeroSleep特别耗时,这个函数的代码很简单,如下:
void ZeroSleep()
{
Sleep(0);
}
Sleep(0)作用是用来释放cpu的时间片,避免忙等待。于是想当然的在linux上实现为:
void ZeroSleep()
{
msleep(0);
}
但其实msleep API的源代码如下:
void msleep(unsigned int msecs)
{
unsigned long timeout= msecs_to_jiffies(msecs)+ 1;
while(timeout)
timeout= schedule_timeout_uninterruptible(timeout);
}
如此一来,即使参数为0,也至少要睡眠一个jiffies单位的时间,因此导致严重的性能问题。
该问题的解决方法是:
既然ZeroSleep的目的是释放cpu资源,那么就可以通过调用schedule()函数替换msleep。而且实际上msleep本身也是通过调用schedule_timeout_uninterruptible实现的,所以这个做法也是合理的。
linux sleep命令怎么使用
sleep命令
常用工具命令 sleep命令暂停指定的时间。
语法
sleep(参数)
参数
时间:指定要暂停时间的长度。
时间长度,后面可接 s、m、h或 d,其中 s为秒,m为分钟,h为小时,d为日数。实例有时在写一些以循环方式运行的监控脚本,设置时间间隔是必不可少的,下面是一个Shell进度条的脚本演示在脚本中生成延时。
#!/bin/bash
b='' for((i=0;$i<=100;i++)) do printf"Progress:[%-100s]%d%%\r"$b$i sleep 0.1 b=#$b done
求高手,linux系统几乎所有进程处于sleep状态是否正常
你的sleep进程基本上都是java相关的。可能是由于某个进程长期得不到响应,比如nfs造成的IO中断,应用一直在等待响应,等的都睡着了。。所以也看不到报错,呵呵。具体的也看不出到底是哪个进程引起的。建议就是重启相关的java应用。或者重启机器。
进程为什么会被置于uninterruptible sleep状态呢?处于uninterruptible sleep状态的进程通常是在等待IO,比如磁盘IO,网络IO,其他外设IO,如果进程正在等待的IO在较长的时间内都没有响应,那么就很会不幸地被 ps看到了,同时也就意味着很有可能有IO出了问题,可能是外设本身出了故障,也可能是比如挂载的远程文件系统已经不可访问了,我以前遇到的问题就是由 down掉的NFS服务器引起的。
正是因为得不到IO的相应,进程才进入了uninterruptible sleep状态,所以要想使进程从uninterruptible sleep状态恢复,就得使进程等待的IO恢复,比如如果是因为从远程挂载的NFS卷不可访问导致进程进入uninterruptible sleep状态的,那么可以通过恢复该NFS卷的连接来使进程的IO请求得到满足,除此之外,要想干掉处在D状态进程就只能重启整个Linux系统了。