第3章分布式系统的同步
在单CPU系统中,临界区、互斥和其他同步问题经常使用信号量、管程等方法来解决。这些方法在分布式系统中并不十分适用,因为它们必须依赖于共享存储器的存在。比如,有两个进程通过使用信号量而相互作用,它们必须都能访问信号量。如果它们在同一台机器上运行,那么它们能够共享内核中的信号量,并通过执行系统调用访问它。但是,如果它们运行在不同机器上,那么这种方法就不适用了,而需要其他技术,甚至看似简单的问题,比如判断事件A在事件B之前还是之后发生的问题也需要认真考虑。
时钟同步
分布式系统的同步比集中式系统的同步要复杂一些,因为前者必须使用分布式算法。如果像集中式系统一样,在某地收集有关系统的所有有关信息,然后让某个进程分析并做出决定,那么这是不切实际的。一般说来,分布式算法有如下性质:
(1) 相关信息分散在多台机器中。
(2) 进程决策仅仅依赖于本地信息。
(3) 系统中单点故障应该避免。
(4) 没有公用时钟或其他精确的全局时间资源存在。
前三点都说明在一处收集所有信息并对它进行处理是不可接受的。比如,资源分配(以一种无死锁的的方式分配)向单一的管理进程发送所有I/O请求,由该管理进程来检查这些请求,根据表中的信息允许或拒绝请求是不实际的。在大系统中,这种解决方法会给某个进程带来太重的负担。
时钟同步
进一步而言,一个单点故障就会造成系统不可靠。最理想的情况是,一个分布式系统应该比单机系统更可靠,一台机器崩溃不影响其他机器的继续运行。我们最不希望的是,一台机器(例如资源分配器)的故障使大量其他机器(它的用户)停滞不前。不通过集中而获得同步所使用的方法应该与传统操作系统所用的方法不同。
上述的最后一点是十分关键的。在集中式系统中,时间的概念很清楚,当进程想知道时间时,它使用由内核提供的系统调用。如果进程A询问时间,之后进程B也询问时间,进程B得到的时间值就应该大于或等于进程A所得到的时间值,但一定不会小于进程A得到的时间值。在分布式系统中,获得时间上的一致并不容易。
时钟同步
考虑在缺少全局时间时的UNIX下的make程序这样一个简单的例子。一般来说,UNIX系统中一个大程序通常可被分割成多个源文件,如果某个源文件发生变化,那么只需将该文件重新编译即可,而不需重新编所有的文件。如果一个程序由100个文件组成,那么这样修改一个文件而不需重新编译其余的文件,将大大提高编程人员的工作效率。
make程序所使用的这种方法很简单。当编程者修改完所有的源文件后,编程者启动make程序,看一下源文件和目标文件最后一次修改的时间,,,。因此,。相反,,,就不必再重新编译了。make检查所有的源文件并找出哪一个需要重新编译,然后调用编译器重新编译它。
时钟同步
现在设想一下在没有统一时间的分布式系统中会发生什么情况。,,但是由于它所在机器上的时钟略慢,,。make将不再调用编译器,最终可执行的二进制程序将包括由老的源文件和新的源文件所产生的混合目标文件,这样可能将不能再正常执行。编程者将为此去检查源代码以寻找错误所在,从而搞得精疲力尽。
根据本地时钟的时间
进行编译的计算机
进行编译的计算机
根据本地时钟的时间
时间
当每台机器有它自己的时钟时,一个发生于另一事件之后的事件可能会被标记一个比另一个事件更早的时间
逻辑时钟
几乎所有的计算机都有一个计时电路,尽管广泛使用“时钟”这个词来表示这些设备,但在通常情况下它们并不是通常意义的时钟,称它们为计时器可能更好一些。计算机上的计时器通常是由一个精确的石英晶体制成的,当在其张力限度内时,石英晶体以一定的频率振荡,这种频率取决于晶体本身如何切割及其受到的张力大小。与每个晶体相关的是两个寄存器、一个计数器和一个保持寄存器。每次振荡时使计数器减1,当计数器减为0时,产生一次中断,计数器重新从保持寄存器中装入起始值。通过这种方法可以编程使得一个计时器每秒能产生60次中断或以其他希望的频率产生中断成为可能,每次中断称为一个时钟滴答(clock tick)。
当系统刚启动时,总是要求操作者输入日期和时间,然后将它们转换成某一已知起始时间后的时钟值,并将它存储在存储器中。在每个时钟滴答,中断服务程序将此值加
分布式操作系统ch3 来自淘豆网m.daumloan.com转载请标明出处.