如何干掉多线程

 

如何干掉多线程
干掉多线程的目的是为了干掉锁,干掉争用,减少开发的难度及提高系统的稳定性,可理解性,易维护性。


以阶段来划分系统的话,有多种划分方法。比如业务意义上的阶段,或模块意义上的阶段。但是这样的划分总是有点画蛇添足的感觉:计算机并不懂业务,它也不懂模块。它什么都不懂。它懂的只有指令。两种指令:内存指令与IO指令。本来这两者都只是处理器的事情,跟我并没有关系。但是IO指令会将线程挂起,线程跟我有关系。因为它承载我的“任务”。


这样划分的话,我至少得到两种阶段:IO阶段与非IO阶段。具体设计可能采用2个阶段,也可能采用10个阶段。但所有的阶段要么属于I/O阶段要么不属于。


采用阶段模式的好处是,系统没有并发。系统存在的只有一些阶段与中间结果。即使在面向对象的系统中,经过适当的设计仍然可以完全避免掉阶段之间的数据共享(因为面向对象的系统是有状态的系统,所以很容易产生数据共享----相反的是,这却正是面向过程系统最大的好处。因为它无状态所以使得服务器端的开发异常容易----同时也证明了面向对象开发的高成本特征:高开发成本,低进化成本。而面向过程则是:低开发成本,高进化成本)的情况。


多道程序设计即多线(进)程本来就是为了I/O适配而产生的。目的是使得系统在等待I/O设备就绪以前有别的事情可以做,以致于不浪费系统在等待I/O期间的CPU周期。但是分阶段一样可以做到它。两者的区别不过是一个是从纵向对用户任务进行的切分,一个则是从横向进行的切分。而两者在提高CPU利用率的方法这一点上其实是一致的:都是“分而治之”。分开的部分可以独立运行,CPU利用率自然就提高了。


实现技术上,有几种模式可以考虑应用于这种分阶段设计:Future, Callback, Actor。见:


http://www.cnblogs.com/uptownBoy/articles/1772483.html(什么是Future)


I/O被拿出来单独处理的好处有:


1,在以数据库为中心的系统中,如果使用事务的话,几乎不需要同步。即使需要同步,同步也只存在于本来阻塞就很严重的I/O线程,不影响其它线程。同步被局限在I/O层还有一个好处是,系统更稳定。因为这样的系统总比那些通常到处都是同步的面向对象系统好得多(什么是线程安全?谁来负责那么多的同步?在一个面向对象的系统中。。。);


2,集中在一起的I/O操作更容易管理或优化;


3,因I/O阻塞而产生的线程开销最小化。实际上,I/O将只阻塞在自己上面。也就是I/O将相互阻塞。也就是说,系统的堆栈空间浪费被最小化;


4,如果线程数量被设定为与处理器相同的数量的话,在这种模式下,线程之间的切换会很少发生。大幅减少了因线程切换产生的处理器资源直接损失以及间接损失如缓存失效,内存屏障,寄存器重新载入,指令重排序等。
 

发布了17 篇原创文章 · 获赞 1 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章