1. 基于stack虚拟机
  2. 内存包括4部分:the Scheme objects, the Scheme global variables, the RVM’s stack, and the instruction stream executed by the RVM.
  3. 使用rib来表示object, [ x,x,x ],整数用低位为1的word(host c): an object reference is implemented with a machine word with the lower bit encoding the type: 1 when the object is an integer (the other bits represent the integer value), and 0 when the object is a rib (all the bits are the aligned address of the rib in memory).
  4. 虚拟机只需要两个指针:stack, which refers to the rib at the top-of-stack (TOS), and pc, which refers to the rib containing the RVM instruction being executed. (同时亦作为gc root)
  5. 使用 Cheney-style stop-and-copy GC 算法
  6. 类型:[ field0, field1, type ] 0 pair, 1 procedure, 2 symbol/global variable, 3 string, 4 vector, 5 special

这几天发现我的grafana面板有点不对劲,经常刷新一下之后某些字段出现nodata,但是我确定之前是可以用的,而且也没升级版本。
跟踪了一下json,发现是确实没有数据出来,time和value都是0,但是隔时间久一点刷新数据又都有,只有很快的点击刷新按钮,数据才会没有。
于是我检查了一下表达式,发现这个表达式是irate,但是irate的基础数据是有的,思考半晌后,我想是不是时间不同步,导致没有新的时间窗口的数据?因为exporter是在另外一台机器上。看了一下时间,结果发现确实差了大概10秒钟,ntpdate一下后grafana恢复了正常,但是这两台机器是在同一台esxi上,只是其中一台开启了ntp,另外一台只是在启动的时候ntpdate,并且母鸡也是开了ntp的。
那么时间为什么会差10秒钟呢,esxi的RTC时间是不准确的吗?看了一下文档TIMECOUNTERS(4),HPET(4),发现其实系统有好几个时钟源:

kern.timecounter.tsc_shift: 1
kern.timecounter.smp_tsc_adjust: 0
kern.timecounter.smp_tsc: 1
kern.timecounter.invariant_tsc: 1
kern.timecounter.fast_gettime: 1
kern.timecounter.tick: 1
kern.timecounter.choice: TSC(1000) ACPI-fast(900) i8254(0) HPET(950) dummy(-1000000)
kern.timecounter.hardware: TSC
kern.timecounter.alloweddeviation: 5
kern.timecounter.timehands_count: 2
kern.timecounter.stepwarnings: 0
kern.timecounter.tc.TSC.quality: 1000
kern.timecounter.tc.TSC.frequency: 2112000000
kern.timecounter.tc.TSC.counter: 2163619832
kern.timecounter.tc.TSC.mask: 4294967295
kern.timecounter.tc.ACPI-fast.quality: 900
kern.timecounter.tc.ACPI-fast.frequency: 3579545
kern.timecounter.tc.ACPI-fast.counter: 15875638
kern.timecounter.tc.ACPI-fast.mask: 16777215
kern.timecounter.tc.i8254.quality: 0
kern.timecounter.tc.i8254.frequency: 1193182
kern.timecounter.tc.i8254.counter: 50337
kern.timecounter.tc.i8254.mask: 65535
kern.timecounter.tc.HPET.quality: 950
kern.timecounter.tc.HPET.frequency: 14318180
kern.timecounter.tc.HPET.counter: 3934900351
kern.timecounter.tc.HPET.mask: 4294967295

我记得很久以前freebsd implemention那本书里写因为rtc的精度太低,所以系统的时间都用其他的counter来计算,启动之后就不管rtc时间了,反正这个都是可以调整的,esxi确实也有timer的bug:https://kb.vmware.com/s/article/85150

上个月在图书馆借了一本书《C#函数式程序设计》,此书是吴文国教授翻译的。
当拿到书的时候看到这个熟悉的名字,我一下子就陷入了回忆。

大约在14年前,2010年,我还在超日太阳的时候,曾经买了一本书,叫《UNIX原理与应用》,原作者是印度人Das,也是吴文国博士翻译的(那时候吴文国还是博士),我花了大概三个月,反复阅读这本书,从此入门了Linux/Unix系统。
虽然当时也有阅读其他计算机的书,类似于UNIX环境编程,CSAPP等等,但是这本书翻译质量非常之高,原作者又写的很通俗易懂,后来我把这本书送给了一个朋友。

话说回来这本书,这本书是基于.NET4 写的,主要介绍在C#中如何进行函数式编程,包含介绍泛型,惰性求值,迭代器,高阶函数之类的主题,同时也都给了C#的例子,不过作者一开篇就提到C#并不适合函数式编程,很多特性都没有在语言中实现,比如尾调用优化。但也正因为如此,C#中的实现更清晰明了一些,不会特别晦涩难懂。

有兴趣了解C#函数式编程的可以看看,但是没必要为了学习函数式编程看这本书。