发明名称 一种基于Openflow的事件并行控制器及其事件并行处理方法
摘要 本发明公开了一种基于Openflow的事件并行控制器及其事件并行处理方法,该方法将Openflow消息的收发与Openflow事件的处理相分离,利用额外的计算线程对Openflow事件处理进行加速。应用开启后的控制器将建立与交换机的链接,并将链接平均地分给多个I/O线程,每个链接上消息的收发由唯一的I/O线程处理。应用在接收Openflow消息后,触发对应的Openflow事件,并根据事件的类型产生对流对象和状态对象的处理任务,交由不同的线程进行处理。在流事件处理过程中,能够动态产生子任务,并由多个线程并行执行。对共享状态,使用唯一的状态线程进行处理。本发明方法相对于现有的Openflow事件的并行处理方法具有更好的性能可扩展性、以及更简单的数据访问方式。
申请公布号 CN103677760B 申请公布日期 2015.12.02
申请号 CN201310647876.0 申请日期 2013.12.04
申请人 北京航空航天大学 发明人 刘轶;宋平;刘驰
分类号 G06F9/38(2006.01)I;G06F9/44(2006.01)I 主分类号 G06F9/38(2006.01)I
代理机构 北京永创新实专利事务所 11121 代理人 李有浩
主权项 一种基于Openflow的事件并行控制器,其特征在于:该控制器包括有流处理模块(1)、状态处理模块(2)和Openflow消息分配控制模块(3);Openflow消息分配控制模块(3)第一方面采用异步非阻塞IO模型从链接的接收缓冲区中接收Openflow交换机(4)发送的Openflow消息;所述Openflow消息中包括有Packet‑in消息、Flow‑Removed消息、Port‑status消息和Error消息;Packet‑in消息是指流到达消息;Flow‑Removed消息是指流移除消息;Port‑status消息是指端口状态消息;Error消息是指错误消息;Openflow消息分配控制模块(3)第二方面将流处理任务<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>FA</mi><mrow><mi>P</mi><mi>a</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>t</mi><mo>-</mo><mi>i</mi><mi>n</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>-</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>FA</mi><mrow><mi>F</mi><mi>l</mi><mi>o</mi><mi>w</mi><mo>-</mo><mi>Re</mi><mi>m</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000011.GIF" wi="914" he="140" /></maths>发送到流处理模块(1)的主线程本地任务队列Q<sub>z</sub>中;<img file="FDA0000816410870000012.GIF" wi="300" he="92" />表示Packet‑in事件对应的流处理任务;<img file="FDA0000816410870000013.GIF" wi="309" he="100" />表示Flow‑Removed事件对应的流处理任务;所述流处理任务<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>FA</mi><mrow><mi>P</mi><mi>a</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>t</mi><mo>-</mo><mi>i</mi><mi>n</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>FA</mi><mrow><mi>F</mi><mi>l</mi><mi>o</mi><mi>w</mi><mo>-</mo><mi>Re</mi><mi>m</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000014.GIF" wi="917" he="134" /></maths>的获取是:(A)首先依据Packet‑in消息触发Packet‑in事件;然后根据Packet‑in事件生成Base_flow结构的流对象FLOW<sub>Base_flow</sub>={F<sub>1</sub>,F<sub>2</sub>,…,F<sub>f</sub>};最后根据Base_flow结构中start方法生成所述Packet‑in事件对应的流处理任务<img file="FDA0000816410870000015.GIF" wi="338" he="100" />(B)首先依据Flow‑Removed消息触发Flow‑Removed事件;然后根据Flow‑Removed事件生成如表1中Base_flow结构的流对象FLOW<sub>Base_flow</sub>={F<sub>1</sub>,F<sub>2</sub>,…,F<sub>f</sub>};最后根据Base_flow结构中start方法生成所述Flow‑Removed事件对应的流处理任务<img file="FDA0000816410870000016.GIF" wi="341" he="100" />Base_flow结构的流对象FLOW<sub>Base_flow</sub>={F<sub>1</sub>,F<sub>2</sub>,…,F<sub>f</sub>}中F<sub>1</sub>表示第一种类型的流对象,F<sub>2</sub>表示第二种类型的流对象,F<sub>f</sub>表示最后一种类型的流对象,f为流对象的标识号;表1  Base_flow类<img file="FDA0000816410870000017.GIF" wi="1760" he="475" /><img file="FDA0000816410870000021.GIF" wi="1760" he="1062" />Openflow消息分配控制模块(3)第三方面将状态处理任务<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>2</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>SA</mi><mrow><mi>P</mi><mi>o</mi><mi>r</mi><mi>t</mi><mo>-</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>u</mi><mi>s</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>SA</mi><mrow><mi>E</mi><mi>r</mi><mi>r</mi><mi>o</mi><mi>r</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000022.GIF" wi="905" he="134" /></maths>发送到状态处理模块(2)的访问任务队列<maths num="0004" id="cmaths0004"><math><![CDATA[<mrow><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>=</mo><mo>{</mo><msub><mi>P</mi><mn>1</mn></msub><mo>,</mo><msub><mi>P</mi><mn>2</mn></msub><mo>,</mo><mo>...</mo><mo>,</mo><msub><mi>P</mi><mi>s</mi></msub><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000023.GIF" wi="677" he="108" /></maths>中;<img file="FDA0000816410870000024.GIF" wi="299" he="102" />表示Port‑status状态处理任务;<img file="FDA0000816410870000025.GIF" wi="298" he="100" />表示Error状态处理任务;所述状态处理任务<maths num="0005" id="cmaths0005"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>2</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>SA</mi><mrow><mi>P</mi><mi>o</mi><mi>r</mi><mi>t</mi><mo>-</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>u</mi><mover><mi>s</mi><mo>&OverBar;</mo></mover></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>SA</mi><mrow><mi>E</mi><mi>r</mi><mi>r</mi><mi>o</mi><mi>r</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000026.GIF" wi="908" he="136" /></maths>的获取是:(A)首先依据Port‑status消息触发Port‑status事件;然后根据Port‑status事件生成Base_state结构的状态对象STATE<sub>Base_state</sub>={S<sub>1</sub>,S<sub>2</sub>,…,S<sub>s</sub>}的处理任务,即Port‑status状态处理任务记为<img file="FDA0000816410870000027.GIF" wi="327" he="96" />(B)首先依据Error消息触发Error事件;然后根据Error事件生成针对如表2中Base_state结构的状态对象STATE<sub>Base_state</sub>={S<sub>1</sub>,S<sub>2</sub>,…,S<sub>s</sub>}的处理任务,即Error状态处理任务记为<img file="FDA0000816410870000028.GIF" wi="330" he="101" />Base_state结构的状态对象STATE<sub>Base_state</sub>={S<sub>1</sub>,S<sub>2</sub>,…,S<sub>s</sub>}中S<sub>1</sub>表示第一种类型的状态对象,S<sub>2</sub>表示第二种类型的状态对象,S<sub>s</sub>表示最后一种类型的状态对象,s表示状态对象的标识号;表2  Base_state类<img file="FDA0000816410870000029.GIF" wi="1752" he="468" /><img file="FDA0000816410870000031.GIF" wi="1752" he="394" />Openflow消息分配控制模块(3)第四方面接收流处理模块(1)输出的controller‑to‑switch消息;Openflow消息分配控制模块(3)第五方面采用异步非阻塞IO模型从消息-线程TH<sub>3</sub>={C<sub>1</sub>,C<sub>2</sub>,…,C<sub>c</sub>}中所属的链接<img file="FDA0000816410870000032.GIF" wi="194" he="92" />的发送缓冲区中向Openflow交换机(4)输出controller‑to‑switch消息;消息-线程TH<sub>3</sub>={C<sub>1</sub>,C<sub>2</sub>,…,C<sub>c</sub>}中C<sub>1</sub>表示Openflow消息分配控制模块(3)中的第一个线程,C<sub>2</sub>表示Openflow消息分配控制模块(3)中的第二个线程,C<sub>c</sub>表示Openflow消息分配控制模块(3)中的最后一个线程,c表示Openflow消息分配控制模块(3)中的线程标识号;流处理模块(1)第一方面用于接收Openflow消息分配控制模块(3)输出的流处理任务<maths num="0006" id="cmaths0006"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>FA</mi><mrow><mi>P</mi><mi>a</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>t</mi><mo>-</mo><mi>i</mi><mi>n</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>FA</mi><mrow><mi>F</mi><mi>l</mi><mi>o</mi><mi>w</mi><mo>-</mo><mi>Re</mi><mi>m</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>}</mo><mo>;</mo></mrow>]]></math><img file="FDA0000816410870000033.GIF" wi="946" he="132" /></maths>流处理模块(1)第二方面将<maths num="0007" id="cmaths0007"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>FA</mi><mrow><mi>P</mi><mi>a</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>t</mi><mo>-</mo><mi>i</mi><mi>n</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>FA</mi><mrow><mi>F</mi><mi>l</mi><mi>o</mi><mi>w</mi><mo>-</mo><mi>Re</mi><mi>m</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000034.GIF" wi="914" he="131" /></maths>保存到主线程本地任务队列Q<sub>z</sub>中;流处理模块(1)第三方面将<maths num="0008" id="cmaths0008"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>FA</mi><mrow><mi>P</mi><mi>a</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>t</mi><mo>-</mo><mi>i</mi><mi>n</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>FA</mi><mrow><mi>F</mi><mi>l</mi><mi>o</mi><mi>w</mi><mo>-</mo><mi>Re</mi><mi>m</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000035.GIF" wi="914" he="138" /></maths>通过轮询的方式发送到计算线程本地任务队列<img file="FDA0000816410870000036.GIF" wi="533" he="106" />中;计算线程TH<sub>1</sub>={A<sub>1</sub>,A<sub>2</sub>,…,A<sub>a</sub>}所对应的本地任务队列集合记为<img file="FDA0000816410870000037.GIF" wi="568" he="116" />流-线程TH<sub>1</sub>={A<sub>1</sub>,A<sub>2</sub>,…,A<sub>z</sub>,…,A<sub>a</sub>}中A<sub>1</sub>表示流处理模块(1)中的第一个线程,A<sub>2</sub>表示流处理模块(1)中的第二个线程,A<sub>z</sub>表示流处理模块(1)中的第z个线程,A<sub>a</sub>表示流处理模块(1)中的最后一个线程,a表示流处理模块(1)中的线程标识号;第一个线程A<sub>1</sub>对应的本地任务队列记为Q<sub>1</sub>,第二个线程A<sub>2</sub>对应的本地任务队列记为Q<sub>2</sub>,第z个线程A<sub>z</sub>对应的本地任务队列记为Q<sub>z</sub>,最后一个线程A<sub>a</sub>对应的本地任务队列记为Q<sub>a</sub>;流处理模块(1)第四方面执行<maths num="0009" id="cmaths0009"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>FA</mi><mrow><mi>P</mi><mi>a</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>t</mi><mo>-</mo><mi>i</mi><mi>n</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>FA</mi><mrow><mi>F</mi><mi>l</mi><mi>o</mi><mi>w</mi><mo>-</mo><mi>Re</mi><mi>m</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000038.GIF" wi="910" he="136" /></maths>中的具体任务;并动态生成对流对象FLOW<sub>Base_flow</sub>={F<sub>1</sub>,F<sub>2</sub>,…,F<sub>f</sub>}的处理任务,记为流对象子任务<img file="FDA0000816410870000039.GIF" wi="434" he="104" />将所述<img file="FDA00008164108700000310.GIF" wi="387" he="109" />添加到<maths num="0010" id="cmaths0010"><math><![CDATA[<mrow><msup><mi>Q</mi><mrow><msub><mi>TH</mi><mn>1</mn></msub></mrow></msup><mo>=</mo><mo>{</mo><msub><mi>Q</mi><mn>1</mn></msub><mo>,</mo><msub><mi>Q</mi><mn>2</mn></msub><mo>,</mo><mo>...</mo><mo>,</mo><msub><mi>Q</mi><mi>a</mi></msub><mo>}</mo></mrow>]]></math><img file="FDA00008164108700000311.GIF" wi="536" he="112" /></maths>中;流处理模块(1)第五方面执行<maths num="0011" id="cmaths0011"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>FA</mi><mrow><mi>P</mi><mi>a</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>t</mi><mo>-</mo><mi>i</mi><mi>n</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>FA</mi><mrow><mi>F</mi><mi>l</mi><mi>o</mi><mi>w</mi><mo>-</mo><mi>Re</mi><mi>m</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow><mrow><msub><mi>FLOW</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>f</mi><mi>l</mi><mi>o</mi><mi>w</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000041.GIF" wi="916" he="140" /></maths>中的具体任务;并动态生成对状态对象STATE<sub>Base_state</sub>={S<sub>1</sub>,S<sub>2</sub>,…,S<sub>s</sub>}的处理任务,记为状态对象子任务<img file="FDA0000816410870000042.GIF" wi="397" he="110" />根据所述的<img file="FDA0000816410870000043.GIF" wi="368" he="112" />的global属性的值,进行判断;如果global为true,则表示该状态为全局共享状态,则将所述的<img file="FDA0000816410870000044.GIF" wi="368" he="110" />给予状态处理模块(2),并等待状态处理模块(2)的任务完成消息STA<sub>2‑1</sub>;反之,如果global不为true,则表示该状态为局部共享状态,则流处理模块(1)中的产生所述<img file="FDA0000816410870000045.GIF" wi="368" he="108" />的线程直接执行;Base_state结构的状态对象STATE<sub>Base_state</sub>={S<sub>1</sub>,S<sub>2</sub>,…,S<sub>s</sub>}中S<sub>1</sub>表示第一种类型的状态对象,S<sub>2</sub>表示第二种类型的状态对象,S<sub>s</sub>表示最后一种类型的状态对象,s表示状态对象的标识号;流处理模块(1)第六方面通过任务窃取的方式进行计算线程的任务负载均衡;流处理模块(1)第七方面输出controller‑to‑switch消息给Openflow消息分配模块(3);计算线程将需要输出的controller‑to‑switch消息同步地写入到消息-线程TH<sub>3</sub>={C<sub>1</sub>,C<sub>2</sub>,…,C<sub>c</sub>}中所属的链接<img file="FDA0000816410870000046.GIF" wi="187" he="89" />的发送缓冲区中;TH<sub>3</sub>={C<sub>1</sub>,C<sub>2</sub>,…,C<sub>c</sub>}中C<sub>1</sub>表示Openflow消息分配控制模块(3)中的第一个线程,C<sub>2</sub>表示Openflow消息分配控制模块(3)中的第二个线程,C<sub>c</sub>表示Openflow消息分配控制模块(3)中的最后一个线程,c表示Openflow消息分配控制模块(3)中的线程标识号;状态处理模块(2)第一方面接收Openflow消息模块(3)发出的状态处理任务<maths num="0012" id="cmaths0012"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>2</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>SA</mi><mrow><mi>P</mi><mi>o</mi><mi>r</mi><mi>t</mi><mo>-</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>u</mi><mi>s</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>SA</mi><mrow><mi>E</mi><mi>r</mi><mi>r</mi><mi>o</mi><mi>r</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>}</mo><mo>,</mo></mrow>]]></math><img file="FDA0000816410870000047.GIF" wi="1119" he="130" /></maths>并将<maths num="0013" id="cmaths0013"><math><![CDATA[<mrow><msub><mi>TASK</mi><mrow><mn>3</mn><mo>-</mo><mn>2</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>SA</mi><mrow><mi>P</mi><mi>o</mi><mi>r</mi><mi>t</mi><mo>-</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>u</mi><mi>s</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>,</mo><msubsup><mi>SA</mi><mrow><mi>E</mi><mi>r</mi><mi>r</mi><mi>o</mi><mi>r</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>}</mo></mrow>]]></math><img file="FDA0000816410870000048.GIF" wi="910" he="134" /></maths>保存到状态对象STATE<sub>Base_state</sub>={S<sub>1</sub>,S<sub>2</sub>,…,S<sub>s</sub>}的访问任务队列<img file="FDA0000816410870000049.GIF" wi="678" he="109" />中;访问任务队列<img file="FDA00008164108700000410.GIF" wi="676" he="110" />中第一种类型的状态对象S<sub>1</sub>对应的访问任务队列记为P<sub>1</sub>,第二种类型的状态对象S<sub>2</sub>对应的访问任务队列记为P<sub>2</sub>,最后一种类型的状态对象S<sub>s</sub>对应的访问任务队列记为P<sub>s</sub>;状态处理模块(2)第二方面接收流处理模块(1)发出的状态处理任务<img file="FDA00008164108700000411.GIF" wi="453" he="111" />并将<img file="FDA00008164108700000412.GIF" wi="368" he="114" />保存到状态对象STATE<sub>Base_state</sub>={S<sub>1</sub>,S<sub>2</sub>,…,S<sub>s</sub>}的访问任务队列<img file="FDA00008164108700000413.GIF" wi="678" he="109" />中;状态处理模块(2)第三方面状态-线程TH<sub>2</sub>={B<sub>1</sub>,B<sub>2</sub>,…,B<sub>b</sub>}中的B<sub>1</sub>从<img file="FDA0000816410870000051.GIF" wi="677" he="109" />中提取出属于B<sub>1</sub>的访问任务队列<maths num="0014" id="cmaths0014"><math><![CDATA[<mrow><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><msub><mi>B</mi><mn>1</mn></msub></msubsup><mo>=</mo><mo>{</mo><msub><mi>P</mi><mn>1</mn></msub><mo>,</mo><msub><mi>P</mi><mn>2</mn></msub><mo>,</mo><mo>...</mo><mo>,</mo><msub><mi>P</mi><mi>s</mi></msub><mo>}</mo><mo>,</mo></mrow>]]></math><img file="FDA0000816410870000052.GIF" wi="556" he="102" /></maths>且<maths num="0015" id="cmaths0015"><math><![CDATA[<mrow><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><msub><mi>B</mi><mn>1</mn></msub></msubsup><mo>&Element;</mo><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>;</mo></mrow>]]></math><img file="FDA0000816410870000053.GIF" wi="463" he="94" /></maths>然后B<sub>1</sub>通过轮询的方式执行<img file="FDA0000816410870000054.GIF" wi="519" he="113" />中的任务;当执行完成<img file="FDA0000816410870000055.GIF" wi="367" he="109" />后,向流处理模块(1)发送的任务完成消息<img file="FDA0000816410870000056.GIF" wi="188" he="90" />状态-线程TH<sub>2</sub>={B<sub>1</sub>,B<sub>2</sub>,…,B<sub>b</sub>}中B<sub>1</sub>表示状态处理模块(2)中的第一个线程,B<sub>2</sub>表示状态处理模块(2)中的第二个线程,B<sub>b</sub>表示状态处理模块(2)中的最后一个线程,b表示状态处理模块(2)中的线程标识号;状态-线程TH<sub>2</sub>={B<sub>1</sub>,B<sub>2</sub>,…,B<sub>b</sub>}中的B<sub>2</sub>从<img file="FDA0000816410870000057.GIF" wi="676" he="106" />中提取出属于B<sub>2</sub>的访问任务队列<maths num="0016" id="cmaths0016"><math><![CDATA[<mrow><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><msub><mi>B</mi><mn>2</mn></msub></msubsup><mo>=</mo><mo>{</mo><msub><mi>P</mi><mn>1</mn></msub><mo>,</mo><msub><mi>P</mi><mn>2</mn></msub><mo>,</mo><mo>...</mo><mo>,</mo><msub><mi>P</mi><mi>s</mi></msub><mo>}</mo><mo>,</mo></mrow>]]></math><img file="FDA0000816410870000058.GIF" wi="546" he="109" /></maths>且<maths num="0017" id="cmaths0017"><math><![CDATA[<mrow><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><msub><mi>B</mi><mn>2</mn></msub></msubsup><mo>&Element;</mo><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>;</mo></mrow>]]></math><img file="FDA0000816410870000059.GIF" wi="458" he="95" /></maths>然后B<sub>2</sub>通过轮询的方式执行<img file="FDA00008164108700000510.GIF" wi="514" he="111" />中的任务;当执行完成<img file="FDA00008164108700000511.GIF" wi="369" he="109" />后,向流处理模块(1)发送的任务完成消息<img file="FDA00008164108700000512.GIF" wi="190" he="87" />状态-线程TH<sub>2</sub>={B<sub>1</sub>,B<sub>2</sub>,…,B<sub>b</sub>}中的B<sub>b</sub>从<img file="FDA00008164108700000513.GIF" wi="674" he="110" />中提取出属于B<sub>b</sub>的访问任务队列<maths num="0018" id="cmaths0018"><math><![CDATA[<mrow><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><msub><mi>B</mi><mi>b</mi></msub></msubsup><mo>=</mo><mo>{</mo><msub><mi>P</mi><mn>1</mn></msub><mo>,</mo><msub><mi>P</mi><mn>2</mn></msub><mo>,</mo><mo>...</mo><mo>,</mo><msub><mi>P</mi><mi>s</mi></msub><mo>}</mo><mo>,</mo></mrow>]]></math><img file="FDA00008164108700000514.GIF" wi="544" he="106" /></maths>且<maths num="0019" id="cmaths0019"><math><![CDATA[<mrow><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><msub><mi>B</mi><mi>b</mi></msub></msubsup><mo>&Element;</mo><msubsup><mi>P</mi><mrow><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow><mrow><msub><mi>STATE</mi><mrow><mi>B</mi><mi>a</mi><mi>s</mi><mi>e</mi><mo>_</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow></msubsup><mo>;</mo></mrow>]]></math><img file="FDA00008164108700000515.GIF" wi="457" he="100" /></maths>然后B<sub>b</sub>通过轮询的方式执行<img file="FDA00008164108700000516.GIF" wi="518" he="112" />中的任务;当执行完成<img file="FDA00008164108700000517.GIF" wi="371" he="109" />后,向流处理模块(1)发送的任务完成消息<img file="FDA00008164108700000518.GIF" wi="188" he="91" />对于状态处理模块(2)第四方面向流处理模块(1)发送的任务完成消息集合记为<maths num="0020" id="cmaths0020"><math><![CDATA[<mrow><msub><mi>STA</mi><mrow><mn>2</mn><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mo>{</mo><msubsup><mi>STA</mi><mrow><mn>2</mn><mo>-</mo><mn>1</mn></mrow><msub><mi>B</mi><mn>1</mn></msub></msubsup><mo>,</mo><msubsup><mi>STA</mi><mrow><mn>2</mn><mo>-</mo><mn>1</mn></mrow><msub><mi>B</mi><mn>2</mn></msub></msubsup><mo>,</mo><mo>...</mo><mo>,</mo><msubsup><mi>STA</mi><mrow><mn>2</mn><mo>-</mo><mn>1</mn></mrow><msub><mi>B</mi><mi>b</mi></msub></msubsup><mo>}</mo><mo>.</mo></mrow>]]></math><img file="FDA00008164108700000519.GIF" wi="856" he="107" /></maths>
地址 100191 北京市海淀区学院路37号