Linux下的sleep是睡眠还是忙等?占用CPU资源不?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下的sleep是睡眠还是忙等?占用CPU资源不?相关的知识,希望对你有一定的参考价值。

如题。另外想问怎么能看到具体占用了多少资源,而不是ps里边的看占了百分比的资源。
补充说明一下:提的问题可能造成了误解,我是想问在Linux下编程,用sleep函数,比如sleep(10);睡眠10秒,那这10秒是在忙等还是在睡眠?是否占用CPU资源?

sleep时占用资源很少,主机断网,中止正在运行的程序,只有少量的守护进程还在运行,init仍在运行,还有获取你让其苏醒的守护进程,用top或者free都可看百分比追问

兄弟,我提的问题可能有歧义了,让你误解了,我是想问sleep函数,是忙等还是睡眠?

追答

调用sleep时其他程序照样运行,sleep只针对包含sleep的这个程序,此程序运行到sleep时,相当于暂停了,之后又继续

追问

这个知道啊。我问的是它暂停的具体机制是怎样的?是相当于忙等锁的那种原地打转占用CPU的等待,还是相当于睡眠等待唤醒的那种不占CPU的暂停?

追答

就是相当于睡眠等待唤醒不占CPU的暂停,如图,我在一个终端调用sleep时,在另一终端看cpu,mem占用情况

追问

命令行里调用的sleep和程序里的sleep是一样的么?你这种是命令行里的sleep啊。你有程序里的sleep函数的源码么?还有有办法量化看CPU资源占用么?而不是百分比的形式?
想把这个问题搞清,所以问的多了点,望不吝赐教啊``

追答

sleep 就是一个系统调用,无论程序还是命令行调用效果都一样,源代码看附件,

至于查看cpu占用情况,除了ps就是top,没别的

参考技术A 楼上明显答非所问。sleep()是阻塞,就是你所说的睡眠,放弃当前cpu时间片并阻塞指定时间。

并发基础 Thread 类的sleep()yeild()join()

1、Thread.sleep(long millis )

sleep( )是一个静态方法,让当前正在执行的线程休眠(暂停执行),而且在睡眠的过程是不释放资源的,保持着锁。
在睡眠的过程,可以被中断,注意抛出InterruptedException异常;
作用:
1、暂停当前线程一段时间;
2、让出CPU,特别是不想让高优先级的线程让出CPU给低优先级的线程

try {
        //单位是毫秒,睡眠1秒
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

2、Thread.yeild()

同样也是一个静态方法,暂停当前正在执行的线程,线程由运行中状态进入就绪状态,重新与其他线程一起参与线程的调度。
作用:
线程让步,顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行。但是,这种让步只对同优先级或者更高优先级的线程而言,同时,让步具有不确定性,当前线程也会参与调度,即有可能又被重新调度,那么就没有达到让出CPU的效果了。

3、Thread.join()

JDK中提供三个版本的join方法:

  1. join( ):等待该线程终止。
  2. join(long millis):等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。
  3. join(long millis, int nanos):等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
    作用:
    join方法的作用是父线程等待子线程执行完成后再执行,换句话说就是将异步执行的线程合并为同步的线程。
public static void main(String[] args) {
    
    Thread childThread = new Thread("childThread"){
        @Override
        public void run() {
            int a = 1;
            for(int i=1;i<5;i++){
                a += i;
            }
            System.out.println("线程"+getName()+"结束,Count a = "+a);
        }
    };
    //线程启动
    childThread.start();
    try {
        //main线程要等待childThread线程的结束,才可以往下执行
        childThread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    
    System.out.println("线程"+Thread.currentThread().getName()+"结束");
    
}

运行结果:

线程childThread结束,Count a = 11
线程main结束



以上是关于Linux下的sleep是睡眠还是忙等?占用CPU资源不?的主要内容,如果未能解决你的问题,请参考以下文章

java cpu占用高,该怎么处理

mysqld占用CPU过高是啥原因

玩转 ESP32 + Arduino (十七) deepsleep深睡眠模式

sleep()与阻塞函数 是不是会一直占用cpu ?

linux 查看进程cpu和内存占用率排序

java中线程里的sleep的用法与yield的用法~