网络程序设计中的并发复杂性

2011-08-15 00:52
科技传播 2011年18期
关键词:线程协作调度

计 然

福建师范大学协和学院信息技术系,福建福州 350108

网络程序设计中的并发复杂性

计 然

福建师范大学协和学院信息技术系,福建福州 350108

基于网络的应用程序与基于单人PC的应用程序有着很大的不同,网络环境对于网络程序的影响巨大。在网络程序开发过程中遇到的各种困难里,由于并发带来的问题是一个到现在都没有彻底解决的问题,并发问题的存在使网络程序开发遇到了一个难题。本文将介绍一些并发处理模型,并分析其复杂性。

网络程序;并发;复杂性

1 网络程序的并发性问题描述

并发为宏观上的并行,微观上的串行,与在单核处理器的单人计算机上运行多线程类似,其本质上与微观下同为并行的“并行”并不相同。虽然并发与并行有许多相似之处,但是其处理方法并不相同。并发性问题的处理,不仅对单机有意义,对于网络应用程序同样具有重大的意义。最初的并发性问题来源于操作系统,网络程序设计中遇到的并发性问题与操作系统的并发性其有相似之处,其理念是通用的。在并发性问题的处理上,有不同的管理方法与理念,尽管人们在这个问题上研究了数十年,但是现今也没有研究出一种方法能够做到让大多数人满意,现有的主流并发模型依然是以往的基于事件的驱动模型以及多线程模型,这两种模型各自有各自的特点,在不同的环境下能够发挥的性能也不同,并不存在一个模型一定优于另一个模型的情况。模型的使用需要根据环境而定,而后又出现了一种混合模型。

2 基于事件的驱动并发模型

当前的计算机基本上使用的都是冯.诺依曼计算机模型,除了此模型之外还存在着依靠其他信息进行驱动的计算机模型,而事件驱动的并发模型就有些类似数据流驱动的计算机模型。使用事件驱动在网络程序中的应用非常广泛,按照操作调配时机不同,可以分为反应式与前摄式。反应式为在当需要数据满足条件是再进行操作,而前摄式是先操作后等待事件的完成。在使用事件驱动的并发模型中,事件状态的维护以及函数间关系维护以及函数运行时机的处理都是由事件分派器进行处理完成的,函数与函数之间的通信很多时候是通过事件来完成的,而事件的维护是由事件分派器进行的。所以在函数完成其特定操作后必须交出CPU控制权,并由事件分派器进行下一步的处理,并依据次事件继续程序的运行调度,形成了控制流反转。如上所诉,基于事件驱动的任务之间的关系需要经过底层的事件分派器的处理,那么就需要对函数进行拆分,又引发了函数分裂问题。如果处理不当,大量的函数分裂不但会影响程序的调试难度(调试器是不会理解一个事件所代表的含义的),还有可能造成内存泄露等问题。事件驱动的函数的被调用需要其调用者也是基于事件驱动的函数,而基于事件驱动函数就需要进行函数分裂,大量的被迫函数分裂无疑会使函数内部细节暴露在外,无益于函数的封装,降低了模块的复用性。

3 多线程的并发模型

在多线程并发模型中,线程的调度可以划分为两种,一种是抢占式,另一种是协作式。有系统内核对线程进行调度管理的属于抢占式,线程的运行与否不由应用层控制,而协作式主要是用应用层协作方式运行任务线程。因为着两种调度方法的不同,其表现出来的特征以及衍生的问题也具有明显的差异。

在抢占式调度中,CPU的控制权在调度器的管理之下,调度器不会了解当前线程执行的详细情况,调度器对线程的调度是强制性的,也就是说调度器可能在一个不应该暂停线程的时候将CPU的控制权强行转移给了另外的一个线程。这样做的后果是极有可能当前线程需要的数据上一个线程没有处理妥当,造成数据竞争,严重的会带来死锁问题,致使程序崩溃。而协作式多线程调度在CPU的控制权方面明显优于抢占式调度,协作式调度中,CPU的控制权只有当当前线程放弃时才转移到其他线程,这种调度方法可以更好的利用处理器的并行能力,协作式调度表现出的问题是实时性不如抢占式,在对实时性要求高的任务中,抢占式对协作式有一定的优势。多线程并发模型相对于事件驱动模型的问题是灵活性低,移植性太差等。

4 混合性并发模型

以上介绍的两种并发模型在网络程序设计中是主流的并发管理方法,鉴于两种方法各有特点,于是开始有研究人员尝试结合这两种方法建立了混合并发模型。其主要的实现思想是进行驱动形式转换,可以根据编译时转换与运行时转换大致的分类。编译时转换的混合并发模型具有一个相同的问题需要解决,就是其通用性较差。不能很好的与其他体系的程序进行相互协作式。而基于运行时转换的混合模型没有这个问题,已经有技术可以同时支持事件驱动与多线程这两种不同的并发模型,但是其实现方法复杂且没有异常处理机制。总的来说,目前没有一种完美的方法来进行两种模型之间的融合。在混合模型的使用方面,由于混合模型诞生的较晚,实际应用效果与研究较少,其性能还有待于进一步检验。

5 结论

随着云的兴起,以及技术的逐步成熟,软件开始越来越明显的表示出网络化的趋势。并发问题便成了软件网络化中不可回避的一个问题,经过几十年的努力,并发问题仍然没有得到有效的解决,没有一种有效的办法可以对并发问题进行简化。当前能做的是提升现有解决办法的并发处理能力,无论哪种并发模型都有很大的提升空间。其次是将程序应用功能分类进行处理,尽量的缩小并发处理规模。相信随着技术的进步,并发问题必将得到很好的解决。

[1]唐洁.VC++多线程开发技术[J].电脑编程技巧与维护,2007.

[2]王鹏,常征.算法隐含并行性的物理模型[J]电子科技大学学报,2009(4).

[3]李文军,周晓聪,李师贤.并发模型的分类与层次[J].计算机科学,2000(3).

[4]周光明,高继民.基于对象的并发模型[J].计算机技术与发展,2008.

[5]陈艳.并发实时系统的模型及其形式化[D].广西师范大学,2008.

[6]史琦,杨海成,李原.基于事件驱动的协同设计系统研究[J].工程图学学报,2003.

TP39

A

1674-6708(2011)51-0165-01

猜你喜欢
线程协作调度
《调度集中系统(CTC)/列车调度指挥系统(TDCS)维护手册》正式出版
一种基于负载均衡的Kubernetes调度改进算法
团结协作成功易
虚拟机实时迁移调度算法
协作
浅谈linux多线程协作
协作
可与您并肩协作的UR3
SVC的RTP封装及其在NS2包调度中的应用研究
基于上下文定界的Fork/Join并行性的并发程序可达性分析*