Linux和Windows双系统时间不一致的问题

Linux和Windows做双系统的时候,发现两个系统中的时间不一致。表现为在一个系统中将时间校准以后,重启到另外一个系统中发现时间不对,相差8个小时。

昨天晚上突然想到会不会是两个系统启动时读取BIOS时间(RTC, Real Time Clock)的处理不一样,查了一下资料,还真是这样。问题就在BIOS中存储的时间只是一个值,而不能存储与这个时间值相关的其它信息(比如这个时间值是UTC还是localtime,时区信息等)。Linux和Windows对这个时间值的解释是不一样的,前者通常是当作UTC时间,而Windows则当作本地时间。这样,在Linux中使用NTP校准时间以后,写入BIOS的时间值是UTC时间,重启到Windows,读取这个时间值,当作本地时间来解析,由于北京时间是UTC+8,因此就差了8个小时。

只要把两个系统对BIOS时间的解析方式配置为一致的就可以了。通常Linux下都是使用UTC,systemd默认也是使用UTC,因此我把Windows配置成使用UTC。

修改Windows注册表,增加如下DWORD数值项(这个注册表项默认是没有的,自己新建一个),并且把它的值设置为1:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal

Arch的Wiki上说Windows改用UTC以后,应该关闭Windows的“联网更新时间”。Google其它资料也有说使用UTC的时候Windows联网更新系统时间以后没有写入BIOS。但是我在Windows 8.1上试了一下,联网更新时间以后BIOS时间也被更新成了正确的UTC时间值,因此我还是开着“联网更新时间”。

将两个系统都配置为使用UTC以后,进入BIOS看到的时间与北京时间相差8小时,这是正常的,因为此时BIOS里面是UTC时间。

References
1. Time – ArchWiki, https://wiki.archlinux.org/index.php/time
2. Why does Windows keep your BIOS clock on local time?
3. Windows 7 Internet Time Update and RealTimeIsUniversal (UTC) registry hack

Read More

并发与并行(Concurrency vs Parallelism)

并发与并行是两个密切关联但是又不完全一样的概念,从字面上来讲都是指同时进行。一种比较常见的区分方式是说并发是指逻辑上的同时发生,而并行是指真正意义上的同时发生。并发的一个例子是在单核的CPU上运行多线程程序,从逻辑上来看这些线程是同时执行的,但是从微观上看同一时刻只有一个线程在执行,通过分时使用CPU达到逻辑上的同时运行。而在多核CPU的系统中,多个线程可能被调度在不同的核上运行,这通常被认为是并行的。

从上述观点来看,并行似乎是并发的一个子集,然而并发与并行虽然在表达的意义上有所重合,但是两者之间并没有包含关系,它们是不一样的两种东西,有不同的外延。例如有一种观点认为:并发是程序的属性,而并行是运行时属性(Concurrency is a property of the program and parallel execution is a property of the machine. )。这种观点在某种程度上可以从第一种观点推导出来。多线程程序本身被认为是设计成并发的,然而只有在多核处理器上运行时才有可能被称作是并行的。

有趣的是,并不是所有“多线程在多核上运行”都被认为是并行的。这一点可以体现为并发程序设计(concurrent programming)和并行程序设计(parallel programming)的不同。

并发程序设计通过使用多个执行流(execution flow)协同合作来提供一种服务或者能力。多个执行流的发生顺序是非确定性的(nondeterministic),因而并发程序设计需要重点关注由这种非确定性引起的对共享资源的竞争。

并行程序设计更多关注于使用多个执行流同时处理以便更快地完成一件事情。并行程序设计通常把一个大任务拆分可若干个子任务同时运行,这些子任务的业务逻辑往往是一样的,只是处理不同的数据,彼此没有依赖关系,这被称为数据并行,比如MapReduce计算模型。另一种并行程序设计方式是生成一个新任务去计算一个稍后即将使用的数据,新任务与当前任务同时运行,当前任务需要该数据的时候与新任务通信获取数据。并行程序设计在理论上通常被认为是确定性的(deterministic)。在实际的实现中,并行程序设计里面往往会出现并发程序设计的影子。

并发与并行有着非常微妙的联系和区别,在一些场景中两者会被当作完全一样而被交替使用,而对于两者的理解大概是见仁见智了。

References
1. http://www.linux-mag.com/id/7411/
2. http://concur.rspace.googlecode.com/hg/talk/concur.html#slide-5
3. http://www.quora.com/What-is-the-exact-difference-between-parallel-and-concurrent-programming

Read More