可能是由于某个进程长期得不到响应,比如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系统了。
sleep()函数大概只能精确到50ms左右,你用sleep(10)是肯定不行的,如果你要精确的定时的话可以使用QueryPerformanceFrequency()函数,用法为:LARGE_INTEGER litmp
LONGLONG QPart1,QPart2
double dfMinus, dfFreq, dfTim
QueryPerformanceFrequency(&litmp)
dfFreq = (double)litmp.QuadPart// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp)
QPart1 = litmp.QuadPart// 获得初始值
do
{
QueryPerformanceCounter(&litmp)
QPart2 = litmp.QuadPart//获得中止值
dfMinus = (double)(QPart2-QPart1)
dfTim = dfMinus / dfFreq// 获得对应的时间值,单位为秒
}while(dfTim<0.001)
其定时误差不超过1微秒,精度与CPU等机器配置有关。
×××××××××××××××××××××××××
sleep()函数的中等待时间是以毫秒计算的,所以等待1秒就是sleep(1000),如果要让等待时间小于一秒,那么就让传入的参数小于1000就行了.
比如,等待0.1秒:
sleep(100)
sleep函数:#include <unistd.h>unsigned int sleep(unsigned int seconds)此函数使调用进程被挂起,直到满足以下条件之一:1)已经过了seconds所指定的墙上时钟时间2)调用进程捕捉到一个信号并从信号处理程序返回注:由于其他系统活动,实际返回时间比所要求的会迟一些,像alarm一样。sleep的返回值:1)在上述第一种情形中,返回值是02)当由于捕捉到某个信号sleep提前返回时,返回值是未睡够的时间(所要求的时间减去实际休眠时间)看看下面的例子,猜猜sleep()的返回值是多少1 #include <stdio.h>2 #include <time.h>3 #include <signal.h>4 5 #define DIAPAUSE 30//sleep time 30s6 #define TIMEOUT 57 8 void sigalrm(int signo)9 10 int main()11 {12 struct sigaction sa13 14 sa.sa_handler = sigalrm15 sa.sa_flags = 016 sigemptyset(&sa.sa_mask)17 if(sigaction(SIGALRM, &sa, NULL) <0)18 {19 printf("sigaction error!\n")20 return21 }22 23 while(1)24 {25 printf("alarm(TIMEOUT)...\n")26 alarm(TIMEOUT)27 printf("...\n")28 printf("sleep(DIAPAUSE) == %d\n", sleep(DIAPAUSE))29 }30 31 return 032 }33 34 void sigalrm(int signo)35 {36 printf("timeout...\n")37 return38 }sleep函数的返回值是25。如果将TIMEOUT的值改为大于DIAPAUSE的值,如50的话,sleep函数在睡够了DIAPAUSE后就会返回,返回值为0。如果我们即需要alarm又需要sleep一个预订的事件怎么办?如上面的例子,我想在...后再sleep 30s然后再进入循环。这在socket通讯过程中,在设置超时的时候可能会用到。注意到alarm函数。#include <unistd.h>unsigned int alarm(unsigned int senconds)使用alarm函数可以设置一个计时器,在将来某个指定的时间该计时器会超时。当计时器超时时,产生SIGALARM信号。如果不捕捉或不忽略此信号,则其默认动作是终止调用该alarm函数的进程。每个进程只能有一个闹钟时钟,如果在调用alarm时,已经为该进程设置过闹钟时钟,而且它还没有超时,则将该闹钟时钟的余留值作为本次alarm函数调用的返回值。以前登记的闹钟时钟将被新值代替。如果有以前为进程登记的尚未超过的闹钟时钟,而且本次调用的seconds为0,则取消以前的闹钟时钟,其余留值仍作为alarm的返回值。(以上这几段话摘自《unix环境高级编程》)。所以在while循环的printf("...\n")后面添加一句alarm(0)就可以满足我的要求,即在...后再sleep 30s然后再进入循环。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)