linux操作系统是典型的机制和策略相分离的系统,机制和策略一直是设计领域一直关注的重要问题,它们的结合程度直接关系到系统的稳定性和可扩展性。今天做了一个linux上膝上电脑的电源管理的脚本,颇有感触,故写此文。
对于膝上电脑,最大的特点就是靠电池供电,而电脑最耗电的就是机械装置,比如磁盘,因此如何使得磁盘效率最高就是操作系统的任务了,磁盘调度算法当然是最重要的,可是本文不讨论它们。操作系统如果想提供省电模式,可以直接在内核实现一系列的策略,然后用户选择膝上电脑模式或者系统自动监测到电池的时候切换 到相应的磁盘模式,这个实现看似职能,实际上很不好,极大的限制了用户。linux的策略和机制是分离的,因此,体现到这个事情上也是如此。
     linux内核有着非常强大的磁盘缓存机制,就是磁盘数据先不往磁盘直接读写而是直接操作缓存,待到一定条件满足的时候才读写磁盘,大致有几个参数:1.dirty_writeback_centisecs,这个参数表示内核刷新缓存的时间间 隔;2.dirty_expire_centisecs,这个参数表示一个inode在dirty状态停留的最长时间;3.laptop_mode,这个 参数表示是否为膝上电脑模式。系统根据以上参数动态调整磁盘刷新的行为,如果为膝上电脑模式,那么我们需要让磁盘尽量少的走走停停,就是说将脏缓存页面积累到一定程度,然后一次性写入磁盘而不是像pc机那样小间隔的唤醒pdflush,这样的话可以让磁盘的效率更高,因此我们理所当然的要在 laptop_mode参数为1的时候调整上面提到的另外两个参数,很早以前我想当然的以为内核在监测到laptop_mode为1时会动态调整那两个参 数,可是我没有找到代码,当我知道linux的机制和策略相分离的时候,我才明白,linux内核是不管那种事的,如果管的话,它怎么管,它知道调整到具体哪个值吗?如果按照所有的可能来个switch-case的话,内核的大小就要增加好几倍了,windows一直都以大而著称,就是因为它的内核实现好 多的策略,而这些策略是可以在用户空间微调的,比如,针对上述问题我可以写一个脚本:
...
if [ ! -w /proc/sys/vm/laptop_mode ]; then
    exit 1
fi
case "$1" in
    laptop)        
        echo "1"    > /proc/sys/vm/laptop_mode
        echo 参数1    > /proc/sys/vm/dirty_writeback_centisecs
        echo 参数2    > /proc/sys/vm/dirty_expire_centisecs
        echo 参数3    > /proc/sys/vm/dirty_ratio
        echo 参数4    > /proc/sys/vm/dirty_background_ratio
        ...
    non-laptop)
        echo "0"    > /proc/sys/vm/laptop_mode
        echo 参数1-1    > /proc/sys/vm/dirty_writeback_centisecs
        echo 参数2-2    > /proc/sys/vm/dirty_expire_centisecs
        echo 参数3-3    > /proc/sys/vm/dirty_ratio
        echo 参数4-4    > /proc/sys/vm/dirty_background_ratio
        ...
这 里的“参数X”是可以微调的,看到了吧,多么灵活!linux就像一个布满微调按钮的机器,或者是一个按键十分丰富的控制台,初接触的人往往望而生畏,因 为它太复杂了,几乎什么都可以微调,可以做成任何你需要的系统,而不像别的操作系统,比如windows,什么都为你做好,你只要选择就可以了,是的,选 择模式固然很方便,但是却十分不灵活,很多功能你要想实现要费尽周折,这就是为何windows非常大,功能却很有限,linux小,功能却很丰富的原 因。

Logo

更多推荐