Category Archives: 计算机与 Internet
Java 线程锁定优化策略
Brian Goetz 最近在其 dw Java theory and practice 专栏 里发表了几篇有趣的文章,介绍了 Sun HotSpot JVM 在以后几个版本中,对锁定等性能优化的思路。 Synchronization optimizations in Mustang 其中核心的思路是将锁分为 contended 和 uncontended 两类来分别优化。根据 80/20 经验原则和一些实测数据,大多数的线程锁实际上都只是预防性的。例如被广泛使用的 Vector 类中,绝大多数方法都被缺省加上 synchronized 修饰符以避免多线程问题,虽然这能够最大限度降低潜在的问题,但相应付出的代价也是巨大的。因为大量的实际使用都是局部或者不会涉及线程同步情况的,例如下面这种情况: 以下内容为程序代码: public String getStoogeNames() { Vector v = new Vector(); v.add("Moe"); v.add("Larry"); v.add("Curly"); return v.toString(); } 要缓解此问题,一方面可以从使用者角度通过库的选择来避免无效锁定,另一方面则可以由 JVM 根据行为进行锁定优化。对前者来说,随着 JDK 的发展可以说灵活性大大增强。例如选择性使用 ArrayList 和 Collections.synchronizedList 可以获得类似的能力,但并不用付出不必要的代价;同时也可以使用已成为 JDK 1.5 标准库的 concurrent 库,根据多线程的使用情况进行锁定优化。这方面 C/C++ 库的设计理念非常优秀,那就是决不为用不到的东西付出代价。对后者来说,则可以发挥 JVM 与传统静态编译相比最大的优势,根据运行时行为进行优化。 Lock elision 的思路,就是通过 escape 分析找出根本不存在多线程引用可能性的锁。对这种情况 Java 语言规范中明确允许进行优化,直接去掉不必要的锁定语义。而最大的问题则在于如何进行 escape 分析,并找到锁的可优化范围。因为相对于基于栈的 C/C++ 来说,Java 内存模型目前是完全基于堆的,每个对象都在全局堆中可以由任何外部线程访问。有兴趣深入研究的话,可以看看下面这两篇文章 http://www.research.ibm.com/people/g/gupta/toplas03.pdf http://www.research.ibm.com/people/j/jdchoi/escape-pointsto.html Adaptive locking 的思路,则是将 contended 的锁定按锁定时间进一步细分。因为对大多数锁定来说,锁定的时间都是非常短的,例如很多 get/set 方法,以及简单的内存操作。对这些方法来说,如果要完成一个完整的锁定流程,需要涉及到对象锁状态更新、等待线程对象构建、甚至与操作系统一级的线程调度打交道。相对于实际要工作所耗费的时间来说,锁定这个操作自身消耗的资源可能反而是大头。对这些情况而言,与其建立一个完整的锁上下文,不如直接用 spin 锁机制进行等待: 以下内容为程序代码: while (lockStillInUse) ; 如果一定时间或尝试次数后还是无法获得锁,则 JVM 可以将此锁的类型转换为长时间的锁,然后构造完整的锁上下文进行管理。而这种优化方法,最能够体现动态 JIT 相对于传统静态编译器的优势,因为这些执行行为的信息是无法静态获取的。 Lock coarsening 的思路,则是通过将临近的几个相同锁定进行合并,以减少不必要的重复锁定操作。这种优化的原理是基于重复方法往往同时出现的模式,例如下面这种常见情况 以下内容为程序代码: public void addStooges(Vector v) { v.add("Moe"); v.add("Larry"); v.add("Curly"); } … 繼續閱讀
企业级信息搜索服务
前几天部门开会讨论知识管理,其中提到一个很重要的问题,就是如何对企业内部各种积累下来的信息,提供统一、方便且安全的检索支持。虽然大部分现有机制,例如 SPS、论坛、邮件、IM 等等,基本上都提供了一定程度的检索支持。但从企业知识管理这个层面,并没有一个很好的现存解决方案。 而要解决这个问题,基本上是一个非常复杂的系统工程,需要涉及很多方面: 平台无关,支持 Windows, Linux, FreeBSD 等操作系统上的信息检索 存储无关,支持文件、各种常见数据库或其他存储方式 格式无关,支持 HTML, DOC, PDF 等各种文档、邮件、IM 格式等等 权限控制,支持基于角色的内容访问限定 分布部署,支持对部署在不同机器上的信息进行统一检索 使用便捷,支持通过 Web 检索或集成在 Outlook 等客户端中 可维护性,支持对存储数据进行监控和二次处理 虽然看起来非常复杂,但技术上还是可以通过对现有工具的重用,达到最大限度降低二次开发工作量的。 首先,可以通过模拟 GDS/SPS 的相关检索插件运行环境,重用这些针对特定格式的分析器。这样一来直接就可以提供大部分常用文档格式的支持,且以后的扩展和升级余地较大。 其次,可以通过分布式代理,将检索插件的分析结构,汇总到中央服务器统一进行存储。通过 lucene 等现成检索支持工具,完成基于关键字的存储和检索支持,并可以获得现成的使用界面和管理支持。 此外,可以在存储分析后内容时,通过预定义树型结构来区分内容。以便于在实际使用时,根据可定义的权限系统来保护机密内容。 最后,可以针对不同的客户端和业务应用,开发相应的检索界面和检索代理,以完成实际的工作。 … 繼續閱讀
声明性事务的粒度
最近大概看了一下几个平台的事务处理机制,感觉 .NET 在这方面目前大大落后于 Java 阵营,追赶和改进的余地还非常大。 首先因为 .NET 实际上是通过 COM+ 来完成声明性事务的支持,而一直到 Win2003 的 COM+ 1.5 版,COM+ 都只支持在对象一级定义事务隔离性。也就是说,在定义 COM+ 组件的事务性时,我必须使用最高一级的事务隔离性需求来限定组件。例如在一个 Service 对象中,调用两个不同 DAO 对象实现域对象的读写,虽然读操作只需要 ReadUncommitted 隔离级别,但因为写操作需要 Serializable 级别,我就得将整个对象设置为 Serializable 级别。而实际上 99% 的操作可能都只是调用需要 ReadUncommitted 隔离级别的读功能,因此会产生大量不必要的数据锁定。 在现有架构下优化效率的方法,大概就只能手工将不同隔离级别的功能,拆分为多个类来实现并分头定义隔离性。而这样一来就违背了声名性事务的初衷,也大大增加了开发者的负担。 而 Java 在这方面就相对好些,通过容器(J2EE/Spring)管理的声明性事务,可以细到方法一级定义事务的隔离性和超时时间等细节。而且在隔离性的细分上,也提供了更多的选择。 .NET … 繼續閱讀
关注企业级服务自身的可管理性
《Enterprise Services with the .NET Framework》一书实际上漏掉了一个非常重要的议题,那就是对企业级服务自身的可管理性支持。JSE 5 中一个非常重要的改进,就是直接集成了对 JMX 标准的支持,这一特性的运用能大大增强服务的可用性。JBoss 的设计人员就曾评价说,JBoss 4 之所以能够成功,很大程度上依赖于基于 JMX 的微内核结构的设计,而 JMX 在 JBoss 实现上也起到了事实上的服务容器与管理机制的作用。虽然普通的企业级应用,没有必要灵活到全部通过 JMX 类似的机制管理,但基于 JMX 机制提供服务自身的监控和管理支持确实非常必要的选择。而 Java 阵营的绝大多数引擎和服务,都陆续提供了 JMX 支持和集成;MS 自身的几乎所有服务器端产品,也都内嵌了 WMI 和性能监视器的支持。 Windows 平台下与 JMX 对应的是 WMI 架构,它在底层通过类似 SNMP MIB … 繼續閱讀
又一届 xcon
直到坐在xcon的会场,才恍然察觉到又过了一年。只不过去年的这个时候还在辛苦的赶演讲稿件,而今年却可以心安理得坐在会场里面打瞌睡,呵呵。 揭幕的议题是小许的 Hacks Windows CE,把 WinCE 的内核与组织结构剖析了一把后,提出了一些传统 shellcode 手法在 WinCE 上的实现方法。虽然在技术上的解决并没有很完美,但毕竟已是业内较为领先的探索,这种勇于探索新领域的精神还是非常不错的。感觉小许真是挺不容易的,从无到有在缺少参考资料、缺少实验条件的情况下,折腾到这个程度。还成功打入国外“黑”社会,去拉斯维加斯宣讲了一把,呵呵,总算没苦练几年英语。 第二场因为原定主讲一老外要调时差,改由江海客讲他们的网络防毒。不过感觉 seak 现在不知是进化还是退化,已经完全变成一售前。通篇大谈各种宏观数据和技术方向,却一点实在的信息都不舍得给。偶只好看看杂志打打瞌睡了 :S 不过说起病毒技术领域,一段时间以来都是平淡的很,有的只是一些厂商的商业抄做,和一些莫名其妙的半调子病毒。有时也觉得他们挺可怜的,满腹的高深知识,却每每要跟那些 script kidding 写的,技术巨烂却行之有效的蠕虫和木马做搏斗。 中午的午休是意外的收获,从乌烟瘴气的都市丛林出来,能脱了鞋走在保养良好的大片草坪上,看着小桥边盛开的荷花,躺在柳树下的草堆里,在熟悉又陌生的草香中,吃饱饭幸福的睡午觉,哈哈,真是惬意之极啊。 下午先是一马来西亚的华裔讲《可编程信号同步》,一堆一堆的波形图、电路图,一个又一个似曾相识的数学符号,听得我云里雾里,似乎回到了大学硬件课程全挂的时候。最后问了几个人,才弄明白这个是用来对未知的电器接口进行攻击的,不知现实中的可行性到底有多强。反正他老兄的英文和中文,我是都没怎么听懂。 接下来的 tk 则是做了一个全面的无线知识科普讲座,听完我唯一的感觉是实在tmd太麻烦了,我是不会再去碰这块的东西了,等 tk 弄出 total solution 我等直接 copy 算了。感觉 tk 可以到淘宝上,开个各种 bt 无线装备的专卖店,顺便承接来料加工等服务。 最不爽的是回来的时候,从那个该死的北京会议中心,在烈日下步行了一两公里,才找到可以打车的地方。 总的来说 xcon … 繼續閱讀
享受 .NET 时代的 COM+ 开发
等明天看完 Queue Component 和 Loosely Coupled Events 两章,这本《Enterprise Services with the .NET Framework: Developing Distributed Business Solutions with .NET Enterprise Services》就基本上快结束了。虽然是工具书类型的,但也算让我重新系统的了解了一把 .NET 时代的 COM+ 开发。 虽然本质上还是换汤不换药,但 CLR 对COM+功能的封装能力,绝对能让经历过用 ATL 编写 COM+ 组件的人,流下一大滩口水,呵呵。COM+组件的集成调试和 DCOM 的发布配置,是为数不多曾让我能感受到抓狂感觉的技术,以至于当年有一段时间给别人出的方案,都是能关的安全设置就关,所有应用服务器和web服务都用相同密码的admin帐号,呵呵,这大概就是绝望下的垂死挣扎吧。 而与 Delphi 支持思路一脉相承的 CLR 在这方面,则将 … 繼續閱讀
感受 COM+ 事务性
陆陆续续花了一个多月时间,总算把《 事务性COM+编程——创建可伸缩应用系统 》看完一遍。虽说其间仍是七八本书并行在看,中间还得刨去休假的一周多时间,但以我啃中文书的速度来说可以算比较慢了。归根结底原因可以总结为两条:书写的实在是太好;翻译的人可以直接拖出去砍了。:S 虽说书是2001年才出版2003年才翻译过来的,但即使到现在仍是我看过的关于COM+的十余本著作中唯一能将问题说清楚的,其重要性不亚于 COM 领域的 <Inside COM> 一书。而从其名字中的 Transactional 一词就可以看出,作者决不是那种拿着 MSDN 边琢磨边攒稿件的人,因为此书的书名一语道破了 COM+ 的真谛,那就是 Transactional。 如果说 COM 演变七八年来还在底层的二进制互通性上穷折腾的话,从 MTS 发展而来的 COM+ 则一开始就站在企业级开发的高度上,名字虽只差一个 "+",但所面向的领域和目标相差千里。就算 .NET 如日中天,但在企业级应用领域还是得建构在 COM+ 的基础之上, 只不过提供了一个更为友好和强大的集成开发环境罢了。 此书正是站在这样一个高度,针对企业级开发中的事务性编程所需要面对和解决的问题,结合 COM+ 的思想和实现娓娓道来。从 Context 到 Apartment,从 Causatiy 到 Activity,从 … 繼續閱讀