在计算机网络中,由于有多个主机,因此,可以运行更多的用户进程。然而这些进程可能为一共享资源而竞争。为了解决这种竞争就必须首先对发出占用此资源请求的进程进行排队。根据排队依次共享该资源。这就需要应用并行控制的办法。1
其次,为了在网络上实现并行控制,就必须使网络上参与实现某一功能的所有进程皆能获得与该功能相关的一致的系统状态。并且不必访问一个全网唯一的集中系统数据库。所有描述全网系统状态的信息均被保存在一个分布式系统数据库中,并且由所有参加实现系统功能的进程通过相互通讯来使全网系统的状态保持一致。
系统数据库可以是完全被分割的。也就是说,分布在各个主机上的数据库都只是系统数据库的一部分。并且相互之间都不相同。
系统数据库也可以多拷贝的形式分布在多个主机上。
此外,还可以以部分多拷贝方式分布在多个主机上。也就是说,每一主机上的数据库都是系统数据库的一部分,但这些部分之间有相重复的部分。
分布数据库的一致性要实现并行控制,就必须保持系统数据库多拷贝部分的一致性。因为只有这样才能使网络上各个进程通过系统数据庠所观察到的状态是一致的,也才谈得上实现各相关进程之间的同步运行。
所渭分布数据库的一致性,实际上包含有两方面的含义义。一是多拷贝之间的相互一致性,二是每一个数据库拷贝内部的一致性。
所谓相互一致性就是说,这些多拷贝相互之间是相同的,但是,应当指出的是:在网络上,由于通讯的延迟,因而要求每一时刻都能使这些多拷贝保持一致是很困难的。比较合理的要求是。在适当的访问数据库操作完成后,多个数据库多拷贝之间应当保持一致。
分布数据库的内部一致性本身又有两个方面的含义。
1. 保持语义完整性的一致性。由于数据库所反映的是客观世界的某些事物。因此;数据席内部的数据之间常常存在着反映这些事物的关系(例如,在航空预约系统的数据麾库中,每一航班的已订机票数,未预定的机票数,及该航班的总座位数之间的关系是:该航班的总坐位数=已订票数+未定的机票数),这就是所谓数据的语义完整性。
因此,在数据库上所进行的操作应当不要破坏这种语义的完整性。否则便不反映客观实际情况。但是,要判断那一种操作是否能保持语义的完整性,显然与具体的应用有关。
2. 在事务处理的调度中保持内部一致性。一个原子事务显然可以保证数据库内部的一致佳。这是因为原子事务就意味要么完全不执行这个事务,要么执行完这个事务,因此它不会破坏数据库内部的一致性。但是,如果有多个事务在多个主机上都要对此数据库进行库操作,采用完全串行调度固然可以保证数据库内部的一致性。但这会大大降低分布系统的效率。为了提高效率可以让多个并行事务相互穿插进行以便在效果上相当子多个原子事务串行执行。
因此也就可以既保证多个事务并行运行,又保证了数据库内部的一致性。可是,怎样实行这种可串行化的多事务调度呢?应当谨慎行事,因为,如果调度不当,把读在前和写在后的操作顺序改成为写在前和读后的顺序,那就会造成数据库内部的不一致。
并行控制在并行控制中,单片机用数条输出口线直接去控制步进电动机各相绕组的驱动线路。2很显然,电机功率接口中不包含环形分配器,环形分配器的功能必须由单片机来完成。而单片机实现脉冲分配器的功能又有两种方法,一种是纯软件方法,即全部用软件来实现相序配,直接输出各相导通或截止的信号。另一种方法是软件与硬件结合的方法,下面分别以电视机为例予以介绍。
纯软件方法在这种方法中,单片机输出口直接与功率接口耦合,环形分配器的功能全部由软件来完成。如图是其示意图。8031的P1.0~P1.4 五条输出线输出相应的电机状态:AB—ABC—BC—BCD—DC—CDE—DE—DEA—EA—EAB—AB,这称为五相十拍运行状态。这种纯软件方法,需要在内存ROM区域开辟一个存储空间来存放这10种输出状态。
系统软件按照电机正、反转的要求,按正、反顺序依次将状态表的内容取出来并送至8031的输出口。
例如,在程序存储器OFFOH开始用lO个字节存储五相反应式步进电动机的五相十拍工作状态表,并设低电平导通,高电平截止,则存储状态表的地址内容如表。3
采用上述程序实现反转,可省去状态表中地址为0FFAH一1003H的部分,而且可以采用同一个计数器指针R0,在正转任意步后接着反转时,用不着为了避免乱步而调整指针的位置。
用纯软件方法代替脉冲分配器是比较灵活的。例如要求用8031的P1口输出A、B、C、D四相脉冲,以控制四相混合式步进电机,则可采用更简单的方法如下:
假定门口线为低电平时绕组通电,并用Pl口的P1.1、P1.3、P1.5、P1.7分别驱动A、B、C、D四相功率接口,则四相八拍的工作状态可安排。
软、硬件结合的方法软、硬件结合的方法可进一步减少单片机的工作时间占用,更有利于实现多台步进电动机的联动控制。如图是两台步进电动机联动控制系统的示意图。在这种方法中,8031以P1.0~P1.3四条数据线接到多个EPROM的低四位地址线上,可选通每个EPROM的16个地址,也即16种状态。EPROM的低位数据输出线作为步进电动机A、B、C,D各相的控制线。EPROM作为一种解码器,解码器的输人输出关系可以设计得更加有利于微机控制。例如如下对应关系:
这种方法只需对计数器进行加1操作,然后送Pl口;环形分配器的功能不用主机负担,不再需要串行控制中的延时,软件开消减少。
Pl口的高位线,按线选法,选择不同的EPROM,也即选择不同的步进电动机。P1口高四位,最多可线选四台步进电动机联动控制。分别选通1#和2#EPROM及相应的步进电动机。
步迸电动机开环变速控制控制步进电动机的转速,实际上就是控制转换电机通电状态的时间长短。有两种基本方法,一种是软件延时,另一种是定时器定时。
1.软件延时方法
这种方法在每次转换电机通电状态(简称换向)后,调用一个延时子程序,待延时结束后,再次执行转换状态子程序。如此反复使电机按某一确定转速运转。执行下面程序将控制电机正向连续旋转。
2.定时器延时的方法
不同的单片机有不同数量的片载定时器/计数器。利用其中某个定时器,加载和溢出产生中断信号,终止主程序的执行,转向执行定时器中断服务程序,来产生硬件延时的效果。若将电机换相子程序放在定时器中断服务程序:之中,则定时器每中断一次,电机就换相一次,从而实现对电机的速度控制。
并行控制结构控制流与数据流(1)控制流
控制流对我们来说是非常熟悉的模型,4特别是以往的(yonNeumann型)逐次控制流是控制流的代表.在逐次控制流中,从当前指令转入下面要执行的指令,是由程序计数器暗中进行控制的,换句话说,一条控制流由程序计数器进行暗中指示.当然,控制流也可由GOTO这样的指令公开指示。
另一方面源用并行控制运算符可以实现并待控制流,也就是可以实现几个控制流同时激活.并行控制流有FORK。运算符(控制分支指令)和JOIN运算符,(分支控制间取同步的指令)等等
(2)数据流
如前所述,在控制流中也能实现并行执行,但为了实现并行执行,操作员必须公开记述并行控制运算符.另一方面,从LSI转向VLSI的器件技术的迅速发展,有可能实现驱动多台处理器.以此为背景,近年来展开了对数据流的研究.在数据流申,如果运算所需要的数据完全齐备,就可以执行运算(称为发火).然后,运算结果被送到下一运算.也就是在数据流中,由所传送的数据启动运算,因此有时把数据流启动运算称为数据驱动.数据流的最大特点是不象控制流那样,由并行控制运算符公开指示并行执行,而是根据依赖关系,能够很自然地并行执行可以并行执行的处理.
数据流语言和数据流程图运算所需要的数据完全备齐时,就发火、执行运算,然后运算结果被送到下面的运算.这样的数据流概念只有开发出数据流语言和数据流机器之后,才能成为现实。
用数据流语言记述的程序被编译后,转换成数据流程图,能直接执行数据流程图的机器就是数据流机器.本节介绍数据流语言和数据流程图,关于数据流机器将在后面介绍。
(1)数据流语言
数据流语言的最大特点是单一代入规则.简单地说,就是向某一变量代入的数值最多只允许代入一个.下面用例子来加以说明。
在以前的程序设计语言中,允许象程序例1那样代入,且经常使用.该代入的意义就是向为X保留的存储单元写或从该单元读,也就是执行X:一5时,数值5被写入存储单元.执行x+1时,从X的存储单元读出数值5,并将其加1,其结果6再写入为x保留的存储单元.
但是,在数据流中没有存储单元的概念,所以不允许象程序例1那样向变量代入两次以上
也就是,在数据流语言中,变量并不是象以前的程序设计语言的变量那样,表示存储器的单元名,而是表示结果的结果名.这样,对数据流来说,没有存储单元的概念,因此存在的问题是难于保留经历的过程.
(2)数据流程图
用数据流语言记述的程序被转换成数据流程图.
例如,表达式的数据流程图如图所示.
用○符号圈起来的部分叫做节,连接节与节的有向线段叫做弧.从图看出,节相当于运算,弧表示数据流.流入节的弧数是运算的操作数的个数.在这个例子中,全部运算均为两个操作数,例如在e节中,当B的值与C的值都到达时就发火,并执行减法运算,其结果出现在输出弧上.此外,同一级的节可以并行执行.
这里应注意的是,在表达式中,没有指明哪一部分同哪一部分可以执行并行执行.然而,可以知道,在该表达式被编译后产生的数据流程图中,运算所需要的数据备齐并在处理器有冗余(这种场合为两台微处理器)时,则可并行执行○节和e节。
也就是说,即使程序员没有意识和明确指示可并行执行的部分,如果程序被转换成数据流程图,那么从数据依赖关系就可以知道可并行执行的部分.换句话说,根据数据流就能自然地抽出程序中的并行性.
数据流的结构从以免计算为理论基础的函数型程序设计语言和数据流结构的研究开发过程,可以立刻发现两者有亲和性。例如,在函数型程序设计语言中有函数计算的独立性,而在数据流结构中有通过备齐数据流中的输入数据来启动的运算独立性,或在前者中有函数处理,而在后者中有运算间由于发出和接收数据所引起的运算间的依赖关系等等。
此外,对数据流结构来说,即使程序员没有意识包含在算法中的并行性,也能以自然形式将它取出,所以可以推荐数据流结构作为面向Prolog的结构的一个有力补充。下面将介绍数据流结构的一般组成。
数据流结构的组成要素由处理部分和结构体存储器两种要素组成如图。
这两种要素每一种的个数以及用什么样的网络把它们的组成要素连接起来,要由体系结构专家来确定。
处理部分由队列存储器和运算部分组成一队列存储器控制数据排队,如果发火所需要的数据备齐(也有到达一个数据就先发火的情况),就把这些数据和指令送给运算部件。
运算部件对数据执行指令,再将结果送给队列存储器.指令对结构体数据操作时,将指令与数据(实际上是结构体存储器的指针)送入结构体存储器。
对纯数据流来说,数据本身在弧上流动,就会使结构体数据加长,所以直接让它在弧上流动效率低.因此,引进了结构体存储器来作为结构体数据的公共存储器.结构体存储器执行对结构体数据的存储、管理、操怍。因此,弧上的数据分为两种情况,一种情况t基数值本身,另一种情况是指示结构体存储器的指针。