精华内容
下载资源
问答
  • linux系统休眠

    2021-05-11 07:45:10
    “iPad占有68%的市场份额,但是却占有平板市场91%的Web流量... 喜欢关机的同学要么为了省电要么认为长时间不关机系统变慢,只关显示器的同学显得不厚道,真是不知道驱动工程师的苦和累啊。在linux下,我喜欢用命令让...

    “iPad占有68%的市场份额,但是却占有平板市场91%的Web流量。“我不知道其他平板都在做什么!”” – Tim Cook

    “在休眠(画外音)”

    研发同事下班后关机有一个有趣的现象:做应用的同事要么关机,要么只关显示器;做驱动的同事喜欢让电脑进入休眠。 喜欢关机的同学要么为了省电要么认为长时间不关机系统变慢,只关显示器的同学显得不厚道,真是不知道驱动工程师的苦和累啊。

    在linux下,我喜欢用命令让系统进入休眠:

    $ echo mem | sudo tee /sys/power/state

    当然,不用每次都要敲这么一长串,可以把它加入到一个脚本中。 再将该脚本命令加入到/etc/sudoers文件,就可以避免每次都需要输入用户密码了。

    有同事搞不清楚为什么下面的命令执行不成功:

    $ sudo echo mem > /sys/power/state

    上面这个shell命令的流程是:fork一个子进程,等待 → shell关闭标准输出,打开重定向文件state作为标准输出 → execve "sudo echo mem" → 退出。 在第2步的时候shell没有写权限,所以已经失败了。

    ~EOF~ 2013.02.22

    阅读(3891) | 评论(0) | 转发(1) |

    展开全文
  • Linux 系统休眠

    2020-01-06 08:58:45
    Linux 系统休眠 常用的休眠方式有freeze,standby, mem, disk freeze: 冻结I/O设备,将它们置于低功耗状态,使处理器进入空闲状态,唤醒最快,耗电比其它standby, mem, disk方式高 standby:除了冻结I/O设备外,还会暂停...

    Linux 系统休眠
    常用的休眠方式有freeze,standby, mem, disk

    freeze: 冻结I/O设备,将它们置于低功耗状态,使处理器进入空闲状态,唤醒最快,耗电比其它standby, mem, disk方式高
    standby:除了冻结I/O设备外,还会暂停系统,唤醒较快,耗电比其它 mem, disk方式高
    mem: 将运行状态数据存到内存,并关闭外设,进入等待模式,唤醒较慢,耗电比disk方式高
    disk: 将运行状态数据存到硬盘,然后关机,唤醒最慢
    cat /sys/power/state
    freeze statndby mem

    system("echo freeze > /sys/power/state");
    
    system("echo standby > /sys/power/state");
    
    system("echo mem > /sys/power/state");
    

    参考:https://www.cnblogs.com/lifexy/p/9629699.html

    展开全文
  • Linux系统休眠的理解

    千次阅读 2017-04-21 23:11:27
    其实这个问题在学习驱动的时候早就应该解决了,但是由于5年前学驱动的时候属于Linux初学者,能力有限,所以对这个问题就知其然,没有能力知其所以然。现在回头看这个问题的时候,感觉应该可以有一个较为清晰的认识了...

         今天看了一个关于中断例程为什么不能休眠的文章,引发了我的思考。其实这个问题在学习驱动的时候早就应该解决了,但是由于5年前学驱动的时候属于Linux初学者,能力有限,所以对这个问题就知其然,没有能力知其所以然。现在回头看这个问题的时候,感觉应该可以有一个较为清晰的认识了。

    首先必须意识到:休眠是一种进程的特殊状态(即task->state= TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)]


    • 一、休眠的目的

        简单的说,休眠是为在一个当前进程等待暂时无法获得的资源或者一个event的到来时(原因),避免当前进程浪费CPU时间(目的),将自己放入进程等待队列中,同时让出CPU给别的进程(工作)。休眠就是为了更好地利用CPU

         一旦资源可用或event到来,将由内核代码(可能是其他进程通过系统调用)唤醒某个等待队列上的部分或全部进程。从这点来说,休眠也是一种进程间的同步机制。

     

    • 二、休眠的对象

         休眠是针对进程,也就是拥有task_struct的独立个体。

         当进程执行某个系统调用的时候,暂时无法获得的某种资源或必须等待某event的到来,在这个系统调用的底层实现代码就可以通过让系统调度的手段让出CPU,让当前进程处于休眠状态。


    • 进程什么时候会被休眠?

        进程进入休眠状态,必然是他自己的代码中调用了某个系统调用,而这个系统调用中存在休眠代码。这个休眠代码在某种条件下会被激活,从而让改变进程状态,说到底就是以各种方式包含了:

    1、条件判断语句

    2、进程状态改变语句

    3、schedule();


    • 三、休眠操作做了什么

        进程被置为休眠,意味着它被标识为处于一个特殊的状态(TASK_UNINTERRUPTIBLE或 TASK_INTERRUPTIBLE),并且从调度器的运行队列中移走这个进程将不在任何 CPU 调度,即不会被运行。 直到发生某些事情改变了那个状态(to TASK_WAKING)。这时处理器重新开始执行此进程,此时进程会再次检查是否需要继续休眠(资源是否真的可用?),如果不需要就做清理工作,并将自己的状态调整为TASK_RUNNING。过程如下图所示:


    • 四、谁来唤醒休眠进程

         进程在休眠后,就不再被调度器执行,就不可能由自己唤醒自己,也就是说进程不可能“睡觉睡到自然醒”。唤醒工作必然是由其他进程或者内核本身来完成的。唤醒需要改变进程的task_struct中的状态等,代码必然在内核中,所以唤醒必然是在系统调用的实现代码中(如你驱动中的read、write方法)以及各种形式的中断代码(包括软、硬中断)中。

         如果在系统调用代码中唤醒,则说明是由其他的某个进程来调用了这个系统调用唤醒了休眠的进程。

          如果是中断中唤醒,那么唤醒的任务可以说是内核完成了。

     

    · 如何找到需要唤醒的进程:等待队列

        上面其实已经提到了:休眠代码的一个工作就是将当前进程信息放入一个等待队列中。它其实是一个包含等待某个特定事件的所有进程相关信息的链表。一个等待队列由一个wait_queue_head_t 结构体来管理,其定义在中。

    wait_queue_head_t 类型的数据结构如下:

    struct __wait_queue_head {
        spinlock_t lock;
        struct list_head task_list;
    };
    typedef struct __wait_queue_head wait_queue_head_t;

        它包含一个自旋锁和一个链表。这是一个等待队列链表头,链表中的元素被声明做wait_queue_t。自旋锁用于包含链表操作的原子性。 

    wait_queue_t 包含关于睡眠进程的信息和唤醒函数
    typedef struct __wait_queue wait_queue_t;
    typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int flags, void *key);
    int default_wake_function(wait_queue_t *wait, unsigned mode, int flags, void *key); 
    
    struct __wait_queue {
    unsigned int flags;
    #define WQ_FLAG_EXCLUSIVE 0x01 		/* 表示等待进程想要被独占地唤醒 */ 
    void *private; 				/* 指向等待进程的task_struct结构图 */ 
    wait_queue_func_t func; 		/* 用于唤醒等待进程的处理例程,在其中实现了进程状态的改变和将自己从等待队列中删除的工作 */
    struct list_head task_list; 		/* 双向链表结构体,用于将wait_queue_t链接到wait_queue_head_t */ 
    };
    他们在内存中的结构大致如下图所示:

    等待队列头wait_queue_head_t一般是定义在模块或内核代码中的全局变量,而其中链接的元素 wait_queue_t的定义被包含在了休眠宏中。

    休眠和唤醒的过程如下图所示:


    五、休眠和唤醒的代码简要分析

    下面我们简单分析一下休眠与唤醒的内核原语。

    1、休眠:wait_event 

    /**
    * wait_event - 休眠,直到 condition 为真
    * @wq: 所休眠的等待队列
    * @condition: 所等待事件的一个C表达式
    *
    * 进程被置为等待状态 (TASK_UNINTERRUPTIBLE) 直到
    * @condition 评估为真. @condition 在每次等待队列@wq 被唤醒时
    * 都被检查。
    *
    * wake_up() 必须在改变任何可能影响等待条件结果
    * 的变量之后被调用。
    */
    #define wait_event(wq, condition) \
    do { \
    if (condition) \
    break; \
    先测试条件,看看是否真的需要休眠
    __wait_event(wq, condition); \
    } while (0)
     
    #define __wait_event(wq, condition) \
    do { \
    DEFINE_WAIT(__wait); \
    
    定义一个插入到等待队列中的等待队列结构体,注意.private = current,(即当前进程)
    #define DEFINE_WAIT_FUNC(name, function) \
    wait_queue_t name = { \
    .private = current, \
    .func = function, \
    .task_list = LIST_HEAD_INIT((name).task_list), \
    }
    #define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, autoremove_wake_function)
    \
    for (;;) { \
    prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \
    
    将上面定义的结构体__wait放入wq等待队列中,并设置当前进程状态为TASK_UNINTERRUPTIBLE
    if (condition) \
    break; \
    测试条件状态,看看是否真的需要休眠调度
    schedule(); \
    开始调度,程序停于此处,直到有其他进程唤醒本进程,就从此处继续......
    } \
    finish_wait(&wq, &__wait); \
    
    由于测试条件状态为假,跳出以上循环后执行休眠后的扫尾工作:
    设置当前进程状态为TASK_RUNNING
    将上面定义的__wait从等待队列链表中删除。
    } while (0)
    2 、唤醒:wake_up
    #define wake_up(x) __wake_up(x, TASK_NORMAL, 1, NULL)
    
    
    /**
    * __wake_up - 唤醒阻塞在等待队列上的线程.
    * @q: 等待队列
    * @mode: which threads
    * @nr_exclusive: how many wake-one or wake-many threads to wake up
    * @key: is directly passed to the wakeup function
    *
    * It may be assumed that this function implies a write memory barrier before
    * changing the task state if and only if any tasks are woken up.
    */
    void __wake_up(wait_queue_head_t *q, unsigned int mode,
    int nr_exclusive, void *key)
    {
    unsigned long flags;
    spin_lock_irqsave(&q->lock, flags);
    __wake_up_common(q, mode, nr_exclusive, 0, key);
    spin_unlock_irqrestore(&q->lock, flags);
    }
    EXPORT_SYMBOL(__wake_up);
    kernel/sched.c
    /*
    * 核心唤醒函数.非独占唤醒(nr_exclusive == 0) 只是
    * 唤醒所有进程. If it's an exclusive wakeup (nr_exclusive == small +ve
    * number) then we wake all the non-exclusive tasks and one exclusive task.
    *
    * There are circumstances in which we can try to wake a task which has already
    * started to run but is not in state TASK_RUNNING. try_to_wake_up() returns
    * zero in this (rare) case, and we handle it by continuing to scan the queue.
    */
    static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
    int nr_exclusive, int wake_flags, void *key)
    {
    wait_queue_t *curr, *next;
    list_for_each_entry_safe(curr, next, &q->task_list, task_list) {
    
    遍历指定等待队列中的wait_queue_t.
    unsigned flags = curr->flags;
    if (curr->func(curr, mode, wake_flags, key) &&
    (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
    break;
    
    调用唤醒函数,也就是创建wait_queue_t时的 autoremove_wake_function
    }
    }
    int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key)
    {
    int ret = default_wake_function(wait, mode, sync, key);
    
    if (ret)
    list_del_init(&wait->task_list);
    
    从等待队列中删除这个进程
    return ret;
    }
    EXPORT_SYMBOL(autoremove_wake_function);
     
    int default_wake_function(wait_queue_t *curr, unsigned mode, int wake_flags,
    void *key)
    {
    return try_to_wake_up(curr->private, mode, wake_flags);
    
    主要是要改变进程状态为 TASK_WAKING,让调度器可以重新执行此进程。
    }
    EXPORT_SYMBOL(default_wake_function);
        上面分析的休眠函数是最简单的休眠唤醒函数,其他类似的函数,如后缀为_timeout、_interruptible、_interruptible_timeout的函数其实都是在唤醒后的条件判断上有些不同,多判断一些唤醒条件而已。这里就不再赘述了。


    六、使用休眠的注意事项

    (1) 永远不要在原子上下文中进入休眠,即当驱动在持有一个自旋锁、seqlock或者 RCU 锁时不能睡眠;关闭中断也不能睡眠,终端例程中也不可休眠。

          持有一个信号量时休眠是合法的,如果代码在持有一个信号量时睡眠,任何其他的等待这个信号量的线程也会休眠。发生在持有信号量时的休眠必须短暂,而且决不能阻塞那个将最终唤醒你的进程。

    (2)当进程被唤醒,它并不知道休眠了多长时间以及休眠时发生什么;也不知道是否另有进程也在休眠等待同一事件,且那个进程可能在它之前醒来并获取了所等待的资源。所以不能对唤醒后的系统状态做任何的假设,并必须重新检查等待条件来确保正确的响应。


    (3)除非确信其他进程会在其他地方唤醒休眠的进程,否则也不能睡眠。使进程可被找到意味着:需要维护一个等待队列的数据结构。它是一个进程链表,其中包含了等待某个特定事件的所有进程的相关信息。

     

    七、不可在中断例程中休眠的原因

         如果在某个系统调用中把当前进程休眠,是有明确目标的,这个目标就是过来call这个系统调用的进程(注意这个进程正在running)。

         但是中断和进程是异步的,在中断上下文中,当前进程大部分时候和中断代码可能一点关系都没有。要是在这里调用了休眠代码,把当前进程给休眠了,那就极有可能把无关的进程休眠了。再者,如果中断不断到来,会殃及许多无辜的进程。

        在中断中休眠某个特定进程是可以实现的,通过内核的task_struct链表可以找到的,不论是根据PID还是name。但是只要这个进程不是当前进程,休眠它也可能没有必要。可能这个进程本来就在休眠;或者正在执行队列中但是还没执行到,如果执行到他了可能又无须休眠了。

        还有一个原因是中断也是所谓的原子上下文,有的中断例程中会禁止所有中断,有的中断例程还会使用自旋锁等机制,在其中使用休眠也是非常危险的。 下面会介绍。

     

    八、不可在持有自旋锁、seqlockRCU 锁或关闭中断时休眠的原因 

        其实自旋锁、seqlock、RCU 锁或关闭中断期间的代码都称为原子上下文,比较有代表性的就是自旋锁spinlock。

        对于UP系统,如果A进程在拥有spinlock时休眠,这个进程在拥有自旋锁后主动放弃了处理器。其他的进程就开始使用处理器,只要有一个进程B去获取同一个自旋锁,B必然无法获取,并做所谓的自旋等待。由于自旋锁禁止所有中断和抢占,B的自旋等待是不会被打断的,并且B也永远获得不了锁。因为B在CPU中运行,没有其他进程可以运行并唤醒A并释放锁。系统就此锁死,只能复位了。

        对于SMP系统,如果A进程在拥有spinlock时休眠,这个进程在拥有自旋锁后主动放弃了处理器。如果所有处理器都为了获取这个锁而自旋等待,由于自旋锁禁止所有中断和抢占,,就不会有进程可能去唤醒A了,系统也就锁死了。

        并不是所一旦系统获得自旋锁休眠就会死,而是有这个可能。但是注意了计算机的运行速度之快,只要有亿分之一的可能,也是很容易发生。

        所有的原子上下文都有这样的共性:不可在其中休眠,否则系统极有可能锁死。

         如果你对此还有怀疑,眼见为实。我编写了一个故意锁死系统的及其简单的驱动:
       只要对其设备节点做两次读写操作,系统必死。我在X86 的SMP系统,ARMv5、ARMv6、ARMv7中都做了如下的实验 (单核(UP)系统必须配置CONFIG_DEBUG_SPINLOCK,否则自旋锁是没有实际效果(起码不会有“自旋”), 系统可以多次获取自旋锁,没有实验效果。之后博文中有详细描述)。现象都和上面叙述的死法相同,看了源码就知道(关键在read\write方法)。以下是实验记录:
    # insmod spin_lock_sleep.ko
    spin_lock sleep module loaded!
    # cat /proc/devices
    Character devices:
    1 mem
    4 /dev/vc/0
    4 tty
    4 ttyS
    5 /dev/tty
    5 /dev/console
    5 /dev/ptmx
    7 vcs
    10 misc
    13 input
    14 sound
    21 sg
    29 fb
    81 video4linux
    89 i2c
    90 mtd
    116 alsa
    128 ptm
    136 pts
    252 spin_lock_sleep
    253 ttyO
    254 rtc
    Block devices:
    1 ramdisk
    259 blkext
    7 loop
    8 sd
    11 sr
    31 mtdblock
    65 sd
    66 sd
    67 sd
    68 sd
    69 sd
    70 sd
    71 sd
    128 sd
    129 sd
    130 sd
    131 sd
    132 sd
    133 sd
    134 sd
    135 sd
    179 mmc
    # mknod spin_lock_sleep c 252 0
    # cat spin_lock_sleep
    spin_lock_sleep_read:prepare to get spin_lock! PID:1227
    spin_lock_sleep_read:have got the spin_lock! PID:1227
    spin_lock_sleep_read:prepare to sleep! PID:1227
    spin_lock_sleep_write:prepare to get spin_lock! PID:1229
    BUG: spinlock cpu recursion on CPU#0, sh/1229
    lock: dd511c3c, .magic: dead4ead, .owner: cat/1227, .owner_cpu: 0
    Backtrace:
    [] (dump_backtrace+0x0/0x118) from [] (dump_stack+0x20/0x24)
    r7:00000002 r6:dd511c3c r5:dd511c3c r4:dd7ef000
    [] (dump_stack+0x0/0x24) from [] (spin_bug+0x94/0xa8)
    [] (spin_bug+0x0/0xa8) from [] (do_raw_spin_lock+0x6c/0x160)
    r5:bf04c408 r4:dd75e000
    [] (do_raw_spin_lock+0x0/0x160) from [] (_raw_spin_lock+0x18/0x1c)
    [] (_raw_spin_lock+0x0/0x1c) from [] (spin_lock_sleep_write+0xb4/0x190 [spin_lock_sleep])
    [] (spin_lock_sleep_write+0x0/0x190 [spin_lock_sleep]) from [] (vfs_write+0xb8/0xe0)
    r6:dd75ff70 r5:400d7000 r4:dd43bf00
    [] (vfs_write+0x0/0xe0) from [] (sys_write+0x4c/0x78)
    r7:00000002 r6:dd43bf00 r5:00000000 r4:00000000
    [] (sys_write+0x0/0x78) from [] (ret_fast_syscall+0x0/0x48)
    r8:c005a5a8 r7:00000004 r6:403295e8 r5:400d7000 r4:00000002
    1. 此时在另一个终端(ssh、telnet等)中执行命令:
    2. echo 'l' > spin_lock_sleep
    BUG: spinlock lockup on CPU#0, sh/1229, dd511c3c
    Backtrace:
    [] (dump_backtrace+0x0/0x118) from [] (dump_stack+0x20/0x24)
    r7:dd75e000 r6:dd511c3c r5:00000000 r4:00000000
    [] (dump_stack+0x0/0x24) from [] (do_raw_spin_lock+0x120/0x160)
    [] (do_raw_spin_lock+0x0/0x160) from [] (_raw_spin_lock+0x18/0x1c)
    [] (_raw_spin_lock+0x0/0x1c) from [] (spin_lock_sleep_write+0xb4/0x190 [spin_lock_sleep])
    [] (spin_lock_sleep_write+0x0/0x190 [spin_lock_sleep]) from [] (vfs_write+0xb8/0xe0)
    r6:dd75ff70 r5:400d7000 r4:dd43bf00
    [] (vfs_write+0x0/0xe0) from [] (sys_write+0x4c/0x78)
    r7:00000002 r6:dd43bf00 r5:00000000 r4:00000000
    [] (sys_write+0x0/0x78) from [] (ret_fast_syscall+0x0/0x48)
    r8:c005a5a8 r7:00000004 r6:403295e8 r5:400d7000 r4:00000002
    而你在这样原子环境中休眠调度,内核一旦检测到(主要是检测到关闭了抢占),你可能会看到如下信息,警告你:
    # cat spin_lock_sleep
    spin_lock_sleep_read:prepare to get spin_lock! PID:540
    spin_lock_sleep_read:have got the spin_lock! PID:540
    spin_lock_sleep_read:prepare to sleep! PID:540
    BUG: scheduling while atomic: cat/540/0x00000002
    Modules linked in: spin_lock_sleep
    [] (unwind_backtrace+0x0/0xe4) from [] (schedule+0x74/0x36c)
    [] (schedule+0x74/0x36c) from [] (spin_lock_sleep_read+0xe8/0x1bc [spin_lock_sleep])
    [] (spin_lock_sleep_read+0xe8/0x1bc [spin_lock_sleep]) from [] (vfs_read+0xac/0x154)
    [] (vfs_read+0xac/0x154) from [] (sys_read+0x3c/0x68)
    [] (sys_read+0x3c/0x68) from [] (ret_fast_syscall+0x0/0x2c)

    展开全文
  • linux系统休眠与唤醒简介

    千次阅读 2019-07-04 00:03:28
    系统挂起(Suspend)是电源管理(APM&...另外有一篇介绍android和linux内核对电源管理的支持的比较,代码级别的:Linux Kernel and Android 休眠与唤醒(中文版) 一个网址是http://blog.csd...

    系统挂起(Suspend)是电源管理(APM&ACPI)的一个特性,给用户带来了很大的方便。Linux在2.6系列核心中对电源管理有了较好的支持,下面就谈谈Linux对系统挂起的支持情况。

     

    另外有一篇介绍android和linux内核对电源管理的支持的比较,代码级别的:Linux Kernel and Android 休眠与唤醒(中文版)

    一个网址是http://blog.csdn.net/hellolwl/article/details/6271207

          Linux对系统挂起的支持

     

           Linux同时提供了对APM和ACPI的支持,当时两者是不兼容的,同一时刻只能有一种机制工作。由于ACPI的优越性,所以现在Linux将ACPI设为缺省的电源管理方案。对于一些比较旧的主板,如果其BIOS中ACPI的实现在2000年以前,那么Linux自动启用APM(可以通过核心命令行参数acpi=force来强制启用ACPI)。如果你下主板BIOS中对ACPI的支持有些问题导致Linux工作不正常,那么还可以使用核心命令行参数acpi=off来强制禁用ACPI,这样Linux会自动启用APM电源管理。

    Linux现在主要支持三种ACPI的节电方式:

    S1:Stopgrant,即待机(standby)模式。显示屏自动断电,只是主机通电。这时敲任意键即可恢复原来状态。
    S2 S3:STR(Suspend To Ram),即挂起到内存。系统把当前信息储存在内存中,只有内存等几个关键部件通电,这时计算机处在高度节电状态。此时系统不能从键盘唤醒。手工唤醒的方法只能是按前面板上的电源按钮。唤醒后,计算机从内存中读取信息很快恢复到原来状态。
    S4:STD(Suspend To Disk),即挂起到硬盘,也即休眠。计算机自动关机,关机前将当前数据存储在硬盘上,用户下次按开关键开机时计算机将无须启动操作系统,直接从硬盘读取数据,恢复原来状态。

    在Linux下查看核心支持ACPI情况的方法如下:

    2.4核心下:
    # cat /proc/acpi/sleep
    S0 S1 S3 S4 S5
    2.6核心下:
    # cat /sys/power/state
    standby mem disk

    上面的输出可知,我们系统中核心同时支持三种节电模式。

    在/sys/power目录下还有一个文件:disk,文件的内容可以如下:

    shutdown: 将系统状态保存到磁盘,让BIOS关闭计算机;
    platform: 将系统状态保存到磁盘,让BIOS关闭计算机,并且点亮挂起指示灯;
    firmware:
    让BIOS自己将系统状态保存,并且关闭计算机,需要BIOS自己有挂起磁盘。大部分工作都由BIOS完成,对操作系统是透明的;
    
    
    进入这三种节电模式的方法如下: 
    
    #echo  standby > /sys/power/state ---->挂起(S1)
    #echo  mem > /sys/power/state ---->挂起到内存(S3)
    #echo shutdown > /sys/power/disk; echo disk >
    /sys/power/state ---->挂起到磁盘(S4)
    #echo platform > /sys/power/disk; echo disk >
    /sys/power/state
    
    
     

    Linux下的磁盘挂起(STD)是通过swsusp机制实现的:将系统当前状态保存的内存后,再把内存内容写入交换分区(swap)。这里要求交换分区容量最好大于内存容量。系统挂起到磁盘后,下次启动的时候需要向核心传递命令行参数resume=/dev/hdaX(/dev/hdaX是系统中的交换分区),这样系统就能够很快恢复到关机时的状态。

    还有一个非正式的核心补丁可以实现STD:Software Suspend 2。该项目是一个快速发展的项目,设计上教swsusp有一些优势,但是还没有集成到核心正式发布中,实现方式与swsusp基本相同。

    虽然Linux提供了系统挂起的机制,但是执行上面的挂起操作不一定能够成功。一方面,这些操作除了需要BIOS支持以外,还需要外围硬件设备能够兼容,即设备支持节电状态,支持从节电状态或断电状态恢复;另一方面,这些设备驱动必须能够接收电源管理指令。目前,系统挂起的主要障碍就是那些还不太完善的驱动程序,如USB、显卡、声卡驱动等。

    当然,现在Linux核心对系统挂起的支持还有待改进,主要表现在:

    1. 不支持SMP系统。
    2. 不支持大内存(>4G)。
    3. 核心中许多模块需要增加电源管理的支持。
    4. 缺少上层配置程序。

    不过可以放心,所有的问题内核黑客们都能够解决!

    展开全文
  • 1、安装tuxonice-source和hibernate-script前者是打了休眠和待机功能的补丁的内核源码包,后者是提供了用户执行休眠和待机的脚本。2、编译内核下面是我的配置 * Power Management support │ │ │ │ [ ] Legacy ...
  • Linux 休眠命令

    2021-05-10 06:42:45
    这种休眠状态恢复速度特别快,但由于内存中的数据并没有被保存下来,因此这个状态的系统并没有进入真正意义上的休眠状态,还在持续耗电。hibernate(suspend to disk)这种休眠会将内存中的系统状态写入交换空间内,...
  • 2、修改 /etc/grub.conf 配置文件,在内核启动参数中增加 agp=off,也就是类似...Linux),在 GNOME 中试试“挂起”或者“休眠”,当系统被唤醒后,一切如初了,显示也恢复正常了,呵呵。笔记本上运行真的很完美了。
  • linux笔记本设置休眠

    2021-05-17 11:56:54
    挂起睡眠和休眠的区别三种存储当前运行状态数据(前后台进程服务,不包含buff cache等)的方式挂起suspend 存储到内存 设备通电 低功耗睡眠hybrid-sleep 存储到内存和磁盘 设备通电 低功耗休眠hibernate 存储到磁盘 ...
  • linux 系统下的休眠函数主要有两个,sleep,nanosleep;usleep 已经被遗弃;sleep,nanosleep休眠都是基于实时时钟(比如挂钟,墙钟,手表,国家授时时间)的sleep,两种sleep方式都受信号中断影响,调用进程捕捉到一个...
  • 阻塞IO: 当数据不可读或不可写,进程休眠,直到得到数据可读或可写时才返回。阻塞效率高,实时性比较好。 非阻塞IO:不管数据是否可读可写,都马上返回。 应用程序是否能实现阻塞或非阻塞是取决于驱动程序。实际...
  • 运行一个命令,让你的电脑进入睡眠状态
  • Linux关闭休眠和屏保模式

    千次阅读 2021-05-11 17:15:32
    本人因为特殊需求,想让某台Linux主机始终显示某个程序,显示器不能关机或者休眠或进入屏保模式。环境:Ubuntu11.10最小化模式安装并安装有轻量级桌面openbox(非gnome)。因为X的屏幕保护,电源管理机制跟gnome不一样...
  • Linux电源管理-休眠与唤醒

    千次阅读 2020-12-30 15:13:18
    常用的休眠方式有freeze,standby, mem, diskfreeze: 冻结I/O设备,将它们置于低功耗状态,使处理器进入空闲状态,唤醒最快,耗电比其它standby, mem, disk方式高standby:除了冻结I/O设备外,还会暂停系统,唤...
  • linux 设置系统休眠时间

    千次阅读 2021-01-13 09:32:10
    显示当前系统正在执行的进程的相关信息,包括进程 ID、内存占用率、CPU 占用率等常用参数:-c 显示完整的进程命令 -s 保密模式 -p 指定进程显示 -n 循环显示次数 1 2 3 4 实例:top - 14:06:23 up 70 days, 16:44, 2...
  • linux 系统睡眠.休眠命令

    万次阅读 2015-11-28 14:35:13
    命令 操作 systemctl reboot 重启机器 systemctl poweroff 关机 systemctl suspend 挂起-睡眠-保存在內存 ...休眠-断电-保存在硬盘 ...混合休眠模式(同
  • 我只想要进程的某个线程休眠一段时间的,可是用sleep()是将整个进程都休眠的,这个可能就达不到,我们想要的效果了。目前我知道有三种方式:1、usleep这个是轻量级的,听说能可一实现线程休眠,我个人并不喜欢这种...
  • linux休眠/待机命令

    万次阅读 2017-08-07 13:41:50
    linux休眠/待机命令 爱玩酷原创(https://www.iplayers.cn) 文章来自 if you # cat /sys/power/state mem disk you can echo “mem” > /sys/power/state 这相当于待机 echo “disk” > /sys/...
  • linux 休眠与唤醒

    千次阅读 2019-07-04 00:02:31
    Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务;(2)调用注册的设备的suspend的回调函数;(3)按照注册顺序休眠核心设备和使CPU进入休眠态。 冻结进程是内核把进程列表中所有的进程的...
  • 计算中的「休眠」(或挂起到磁盘)指的是...休眠的不同实现(在Linux中)以下三者都称之为“休眠到硬盘”(suspend-to-disk)。swsusp - Software Suspend在Linux内核中,休眠由swsusp实现,它内置于2.6系列中。TuxOnIce -...
  • LINUX系统休眠与唤醒

    2013-03-07 14:28:51
    Linux在2.6系列核心中对电源管理有了较好的支持,下面就谈谈Linux系统挂起的支持情况。 Linux系统挂起的支持  Linux同时提供了对APM和ACPI的支持,当时两者是不兼容的,同一时刻只能有一种机制工作。由于ACPI...
  • Linux 4种休眠模式

    千次阅读 2019-07-17 20:26:09
    1.Linux 4中休眠模式 # echo standby >/sys/power/state //CPU和RAM在运行 # echo mem > /sys/power/state //挂起到内存(待机),关闭硬 盘、外设等设备 # echo disk > /sys/power/state //挂起到硬盘(休眠),...
  • Linux系统休眠

    千次阅读 2019-06-04 15:23:43
    Ubuntu系统不睡眠设置方法:要完成这个设置Ubuntu有两种方法: 第一种是打开 System Settings –> Power,中文版是打开系统设置 -> 电源),然后进行设置。但不排除一些用户设置后不会生效; 第二种方法是,...
  • linux 休眠唤醒流程

    千次阅读 2016-09-24 17:09:51
    Linux Suspend主要有以下三步:  1) 冻结用户态进程和内核态任务   2) 调用注册的设备的suspend的回调函数,顺序是按照注册顺序   3) 休眠核心设备和使CPU进入休眠态。  冻结进程(suspend_freeze_processes)是...
  • Linux在2.6系列核心中对电源管理有了较好的支持,下面就谈谈Linux系统挂起的支持情况。 Linux系统挂起的支持  Linux同时提供了对APM和ACPI的支持,当时两者是不兼容的,同一时刻只能有一种机制工作。由于ACPI...
  • linux待机与休眠的命令和区别

    千次阅读 2017-11-26 12:15:03
    区别:待机是挂起到内存,休眠是挂起到硬盘。 #待机的命令: sudo pm-hibernate #休眠的命令: sudo pm-suspend ¥重启的命令: sudo reboot 注:pm(power manager)。
  • 2012-02-16 16:29 375人阅读 评论(1)收藏举报 ...标准linux休眠过程: powermanagement notifiers are executed with PM_SUSPEND_PREPARE tasksare frozen targetsystem sleep state is announced to
  • 一、Linux系统休眠 在嵌入式设备中由于省电功耗等原因我们需要让系统在不忙的时候进入休眠模式,Linux pm core提供给我们wakelock及autoslepp内核休眠机制。 autosleep 和 wakelock是并行存在,只有 wakelock 唤醒锁...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,570
精华内容 19,428
关键字:

linux系统休眠

linux 订阅
友情链接: GemCCID_W10_64-bits.zip