从事软件研发工作有近两年的时间了,从自己的感觉来说,系统软件,特别是内核软件开发的难点在于并发程序设计,或者从更深层次的角度来讲应该是并行程序设计(多核程序设计)。并行程序设计的难点在于临界资源的保护。通常各并行的线程或者是进程之间都会存在共享的临界资源,如果这些临界资源处理不当,那么小则程序运行出错;大则系统崩溃。所以,我个人认为只要将临界资源处理好,那么并行程序设计就不是问题了。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
下面结合自己这一段时间的程序设计“经验”,对并行程序设计过程中所应该注意的问题和一些方法做初步小结。
1、 避免临界资源,减少临界资源的数量
并行程序设计中,临界资源越多,程序设计将会越复杂,所以在程序设计之初,需要考虑临界资源的数量,尽可能的减少临界资源。另一方面,一个资源在不同的时间点会呈现出不同的特点。在某些情况下其可能为临界资源;在某些情况其表现为非临界资源。例如,操作需要创建一个设备,该设备需要添加到共享资源区中,为了避免临界资源的产生,可以先将创建设备的所有信息都初始化完毕之后,最后将设备添加到共享资源区,这样在一定程度上避免了临界资源,可以简化创建设备的过程,提高系统性能。所以,从这一点上我们可以得出一个结论,在处理临界资源时,很多时候可以将资源从总的资源池中取出来,让被访问的临界资源成为一个非临界资源,在短时间内为一个上下文独享,这样可以简化设计,提高效率。但是,并不是所有的应有都允许这样的操作,然而,总的原则应该是不变的,那就是尽可能的减少临界资源的数量,减少并发程序的依赖关系,这是从“根”上简化并发程序的设计与实现。
2、 函数的设计需要考虑应用上下文环境
并行程序中的函数设计并不仅仅是函数功能的封装,算法的封装,还需要考虑函数的应用上下文,也就是设计实现的函数将在什么环境下被调用。这一点非常重要,如果处理不好,那么很容易出现死锁、系统崩溃等现象。
函数设计需要考虑应用上下文,这一点一个非常重要的原因在于并行程序,特别是内核程序中的上下文特点存在很大的区别。例如,Linux内核上下文分为普通的用户进程上下文、软中断上下文、中断上下文。在用户进程上下文中,函数的限制条件不是很强烈,能够睡眠的函数都可以运行,但是在中断上下文限制条件很强烈,睡眠函数是不能运行的,所以,函数设计需要考虑应用上下文环境。
除了上述原因之外,另一个非常重要的原因在于加锁的问题,而这个问题可能更容易在设计实现过程中被忽视。函数的运行上下文一定要考虑加锁情况,例如一个函数在持有spinlock资源锁的条件下调用一个可能引起睡眠的函数,那么系统肯定崩溃;另外,一个函数在持有锁A的时候再次调用可能访问锁A的函数,那么系统肯定死锁。总的来说,上述这些问题的根源都在于函数调用时没有考虑运行上下文的加锁情况,导致错误加锁或者乱序加锁。
因此,在并行程序设计过程中,设计一个函数需要考虑一下,这个函数是为哪个上下文写的?调用这个函数存在哪些限制?这是在普通函数设计之上提出的更高要求。
3、 临界资源的保护需要考虑读写性、竞争上下文
临界资源的保护需要考虑对临界资源访问的读写性,如果访问临界资源的多个上下文存在读操作,那么访问临界资源的锁可以被优化。通常可以采用读锁对临界资源进行读访问。另外,在临界资源访问时一定要考虑竞争上下文,如果竞争上下文为中断上下文,那么需要考虑加锁时间与可睡眠性,通常在Linux系统中采用Spinlock对其进行保护;如果竞争上下文为普通的进程上下文,那么保护的方法将简单的多。
临界资源保护时,锁的设计非常重要,通常在设计实现过程中会遇到大锁、小锁的抉择。大锁的设计实现简单,竞争点可以分析的非常清晰,但是程序效率将会大打折扣;小锁的设计实现复杂,竞争点的分析、考虑将会变得复杂,程序实现效率将会大大提高。我个人认为,在设计临界资源保护时,首先需要分析清楚竞争上下文,根据竞争上下文对资源访问的竞争点分析结果,设计合理的锁资源。尽可能在不太影响性能的前提下(锁不能成为系统的性能瓶颈),设计大锁资源。在后继的性能优化过程中,如果有必要再将锁资源进行必要细化。
并行程序设计中,临界资源的访问是程序设计的一大难点,一个好的程序设计人员,一定需要将程序的功能模块切分好,程序的运行上下文及上下文之间的关系设计好,临界资源及资源访问的锁设计好。只有这样设计的程序才能具备一个完美的框架,只有拥有完美框架的程序才有可能成为一个非常出色的程序。
总的而言,在涉及临界资源访问时,设计开发人员需要问一下自己:访问时这个资源是否为临界资源?这个资源将在何种上下文中运行?资源的竞争点有哪些?对资源封装的函数是否可以在该上下文中应用?不管怎么样,并行程序设计时,一定要清楚,共享的资源并不是在一个上下文中引用,需要对它进行合理保护。
这是我对临界资源保护的一点小结,不是很全面,都是一些个人理解,写下文字记录一下,希望大家批评。
文章评论(0条评论)
登录后参与讨论