麦克斯韦妖和守护进程

发布于
麦克斯韦妖和守护进程

对计算机和服务器有些了解的朋友可能会发现一个有趣的规律:有一些常用的服务和命令会在名字结尾加上一个 d

比如这些:登录服务器的 sshd 、传输文件的 ftpd 、网页服务器的 httpd 、运行数据库的 mysqld 还有系统服务相关的 systemd 。等等。 这显然不是 头文字D ,看起来和海贼王里神秘的 D之一族 似乎也没有直接的关联。

注:头文字D 的英文字母 D 是代表 “Drift“(漂移),也可以是 “Dream”(梦想)。海贼王 D之一族 有 哥尔·D·罗杰、蒙奇·D·路飞、马歇尔·D·蒂奇 等,一般推测代表着 “Dream”(梦想)“Dawn”(黎明)。

要完整地知道 d 是什么,先简单了解一点点科学知识。

热力学第二定律和熵

很久很久以前,科学家们总结发现了热力学第一定律,说热量和其他能量可以相互转换,但总和不变。即能量守恒定律。

既然能量是守恒的,感觉浪费能量也不是很可耻,它不过是换了一种形式存在。于是在后来(1850年),科学家克劳修斯(德语:Rudolf Julius Emanuel Clausius)提出了一个定理,这个定理被总结成热力学第二定律。

不可能把热量从低温物体传递到高温物体而不产生其他影响。

即:“热不能自动地从低温物体传到高温物体。”

举个例子,一杯热水放在室内,水会变得和室温一样冷;一杯冷水放在室内,水会变得和室温一样热。在不受外界影响的情况下,水温和室温会变得趋同,而不是热的越热冷的越冷。 (例子里:热是从高温物体传到低温物体,即热水传向室温,室温传向冷水。而不能反过来。)

不久之后克劳修斯提出了 “熵” (英语:entropy 拼音读作 商 )的概念,希腊语源意为“内向”,亦即“一个系统不受外部干扰时往内部最稳定状态发展的特性”。熵在物理学上不是那么好理解,并且之后人们在统计学和信息论等其他领域也引用了熵的概念。可以简单理解:熵作为混乱程度的度量。

就是通常所说的:熵增——从有序(一边冷一边热,不稳定)变成无序(一样热,稳定)。没有了温度差,就不能产成可用的能量了。(所以还是要节约能源)

*注:热力学有从 0 到 3 共四定律1

  • 热力学第零定律:在不受外界影响的情况下,只要 A 和 B 同时与 C 处于热平衡,即使A和B没有热接触,他们仍然处于热平衡状态。这个定律说明,互相处于热平衡的物体之间必然具有相等的温度。
  • 热力学第一定律:能量守恒定律对非孤立系统的扩展。此时能量可以以 功W 或 热量Q 的形式传入或传出系统。
  • 热力学第二定律:孤立系统熵(失序)不会减少──简言之,热不能自发的从冷处转到热处,而不引起其他变化。任何高温的物体在不受热的情况下,都会逐渐冷却。
  • 热力学第三定律:完整晶体于绝对温度零度时(即摄氏-273.15度),熵增为零。*

熵增一词在某些大厂的企业管理文化中,也变成了互联网黑话。

麦克斯韦妖

热力学第二定律似乎十分有道理,能不能有反驳的例子呢?于是知名的物理学四大神兽之一的麦克斯韦妖登场了。

注:物理学四大神兽分别为:薛定谔的猫、拉普拉斯妖、芝诺的龟、麦克斯韦妖

在 1867 年和 1871 年的信件中,以及 1871 年在他的 《热理论》中 ,詹姆斯·克拉克·麦克斯韦(James Clerk Maxwell)描述了一个可以逆转热力学第二定律的 demon (小妖,小恶魔):小妖只是简单地打开和关闭充满空气的容器的两个部分之间的开口,以便较快的分子在 “B” 侧收集一个,而在另一侧 “A” 收集较慢的分子。(较快的分子温度高,较慢的分子温度低)

假设小妖操作的滑梯很轻,因此在操作过程中所做的功可以忽略不计。

最终效果是我们从一个均匀充满空气的容器开始。

当这个过程完成时,B 面更热,A 面更冷,而没有做任何工作。

于是就产生了永动机!

当然,这是一个思想实验。其他科学家们说,麦克斯韦妖需要有某种方法来测量分子速度,而获取信息的行为需要消耗能量。小妖消耗能量会导致小妖的熵增加,这将大于气体熵的降低。3

注:思想实验是指:使用想像力去进行的实验,所做的都是在现实中无法做到(或现实未做到)的实验。知名的思想实验还有:薛定谔的猫、有轨电车难题、无限猴子定理……

守护进程(Daemon)

在多任务计算机系统里,daemon(/ˈdiːmən/ or /ˈdeɪmən/)是一种后台运行的计算机程序。daemon 的进程名称以字母 d 结尾,以说明该进程实际上是一个守护进程,并与普通计算机程序区分开。

这个术语是由麻省理工学院 MAC项目 的程序员创造的。他们的名字取自麦克斯韦妖(Maxwell’s demon),这是一个来自思想实验的虚构生物,它不断在后台工作,对分子进行排序。

如何写一个守护进程呢?4

代码如下(这段代码并不会有人认真去看,但是可以让排版更丰富)

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>

int main(void) {
        
        /* Our process ID and Session ID */
        pid_t pid, sid;
        
        /* Fork off the parent process */
        pid = fork();
        if (pid < 0) {
                exit(EXIT_FAILURE);
        }
        /* If we got a good PID, then
           we can exit the parent process. */
        if (pid > 0) {
                exit(EXIT_SUCCESS);
        }

        /* Change the file mode mask */
        umask(0);
                
        /* Open any logs here */        
                
        /* Create a new SID for the child process */
        sid = setsid();
        if (sid < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }
        

        
        /* Change the current working directory */
        if ((chdir("/")) < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }
        
        /* Close out the standard file descriptors */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
        
        /* Daemon-specific initialization goes here */
        
        /* The Big Loop */
        while (1) {
           /* Do some task here ... */
           
           sleep(30); /* wait 30 seconds */
        }
   exit(EXIT_SUCCESS);
}

根据 1963 年参与MAC 项目的费尔南多·J·科尔巴托(Fernando J. Corbató)的说法,他的团队是第一个使用术语 daemon 的人,其灵感来自麦克斯韦妖,这是物理学和热力学中有助于对分子进行分类的虚构代理人,他说:使用 daemon 这个词来描述不知疲倦地工作以执行系统杂务的后台进程”。5

许多人把 “daemon” 这个词等同于 “demon”,暗示 UNIX 和地狱之间有某种邪恶的联系。这是一个非常严重的误解。“daemon” 实际上是 “demon” 的一种更古老的形式;“daemon” 对善或恶没有特别的偏见,而是帮助定义一个人的性格或个性。古希腊人的 “personal daemon” (个人守护神)的概念类似于现代的 “守护天使” 的概念。

对神话象征意义的进一步描述是,“daemon” 是一种不可见的东西,但它总是存在并发挥其意志。在柏拉图的《Theages》中,苏格拉底描述了他自己的个人守护神,就像现代的道德良知概念。

“众神的眷顾给了我一份奇妙的礼物,它从我的童年开始就没有离开过我。它是一种声音,当它发出声音时,会阻止我做我要做的事,而不会催促我继续前进”。