2005年05月31日

本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文可不经作者同意,任意被转载、引用、复制,但任何对本文的引用都必须注明本文作者,出处以及本行声明信息。谢谢。

  作为WIN平台下同时管理数千个连接的最为高效的网络模型,完成端口已经被越来越多的人认识和熟悉。通常情况下,一种经典的完成端口使用模式是:
  (1)创建完成端口,并在指定端口开始监听;
  (2)创建接受连接线程,用accept或acceptEx接受客户端连接;
  (3)创建工作者线程,处理客户端的数据收发。
  
  众所周知,CreateIoCompletionPort函数,有两个作用,一是“创建”一个完成端口,二是将一个socket与已经创建的完成端口句柄相“绑定”,绑定之后,基于该socket的收、发、断开等事件都可以被完成端口感知。一般情况下,较为正常的思维状态下,CreateIoCompletionPort的绑定是选在accept函数执行以后或acceptEx函数完成之时与套接字相绑定。但是,这并不说明CreateIoCompletionPort函数就不能进行其它形式的绑定。

  事实上,CreateIoCompletionPort关心的只是一个套接字,它并不关心这个套接字到底是通过accept而来的,还是用来connect的。也就是说,它并不关心当前的这个socket是用于接受客户端连接的,还是用来连接其它服务器的。那就是说,CreateIoCompletionPort函数,也可以用来绑定一个连接到其它服务器的客户端socket。

  这个问题的提出,是我在设计网关服务器时。

  网关服务器,承担的主要工作就是两个:向内,负责客户端数据包的分发;向外,负责把内部服务器所有的返回数据包统一通过网关发送出去。网关服务器上,我创建了两个IOCP,一个用来向外接受玩家与网关的数据交换,另一个用来与内部的服务器进行数据转发。由于本人较懒,所以想在内部的那个服务器上,也采用IOCP模型来作。

  在网关上负责向内部服务器提供数据转发的这个IOCP,必须要能正确识别哪一个内部服务器使用的是哪一个套接字。这样,内部服务器与网关服务器之间的套接字确认就有两种方式。一种方式,是由内部服务器连接到网关服务器上,随后向网关服务器发送一个注册包,告诉网关服务器当前的这个socket是哪个内部服务器;另一种方式,是由网关服务器先创建若干个指定的socket,然后用这些socket去连接指定类型的内部服务器。前面,我已经说过,IOCP可以绑定的套接字,不仅是可以被accept来的套接字,也可以是connect其它服务器的套接字。所以,我选用了后一种方式。这样在网关服务器对内的IOCP的逻辑处理上,就少了一项判定和一个包的逻辑解析。当网关流量非常巨大时,每节省一项判定或一种分支,效率和资源都会得到更有效的利用,高性能从哪里来?就是从这样的一点一滴的改进中来。到目前为止,我能测试到的网关服务器流量上限是每秒10M到12M,据说,局域网的某些HUB给每台机子的带宽只分了10M左右的出口带宽,所以,我无法确定如果把局域网的交换机换成电信级的,数据交换量会不会有一个更大的提高,不久,公司会进一个这样的电信级交换机,到时可以作进一步的测试。

  过段时间,我会在我的BLOG(http://blog.csdn.net/sodme)上公布我的IOCP底层通信模型的架构设计以及一个通用的高性能服务器模型架构,希望能与各位同仁共同研究高性能服务器研发问题。

2005年03月20日

  “系统分析员”水平考试在2004年作了较大改革,其中一条就是“高级工程师资格证书”,这也是我为什么在2000年通过后于2004年再次参加考试的原因之一(有幸再次通过),虽然我早已改行,不再搞开发编程了。 ―― 参加考试除了证明自己的能力,同时也想再收集一张国家颁发的高工资格证书。 这是一篇几年前的小结,有很明显的“办公用品”色彩,供参考。虽然本人现在已经改行,计算机成为业余爱好,但应朋友要求,将一些经验和大家分享。

  一、考试介绍

  2000年我参加了系统分析员考试,它是目前中国计算机软件专业考试的最高级别。根据“中国计算机软件专业技术资格和水平考试暂行规定”第四条的说明:“水平考试跟踪国际水平,其级别分为:程序员、高级程序员、系统分析员。程序员、高级程序员水平考试合格者同时具有相应级别专业技术资格。系统分析员考试合格可以做为评聘高级工程师的条件之一”。考试是对具有高级技术职称人员的实际工作能力和业务知识水 平的考核。通过本级考试的合格人员具有从事计算机应用系统的分析和设计的工作能力和业务水平,能指导高级程序员工作。

  考试考核范围包括 :计算机应用系统的分析与设计能力、 软件知识、硬件知识、计算机应用的综 合知识。试题形式有选择、叙述、论文三种,相应的在时间上安排为三场考试,分别为:上午一:基础知识,考试时间为150分钟;下午一:分析设计,考试时间为90分钟;下午二:专题论文,考试时间为120分钟。每场考试满分为75分,每场得分均要通过分数线。
系统分析员难度较大,通过率很低。每年江苏通过人数都只有十人以内,迄今不足百人。据了解, 上午一场难度中等,下午两场淘汰率高,没有实践经验和分析能力通过下午考试几乎不可能,实际上大部分通过考试的系统分析员也是软件项目的主要负责人。

  二、考试经历

  我于2000年7月报名参加考试,报名时市科委的工作人员介绍了系统分析员考试的难度,告知考区开考十多年来还没有考生通过,希望我们这次能有所突破。由于第一次参加考试,我没有太大的把握,想通过这次难得机会检验一下自己的真实水平。

  在考前三个月时间内,由于工作任务紧,我没有系统的复习。好在学校所学基础知识掌握较好,还没有遗忘,也不需要特别学些什么。当时欠缺的主要是分析能力和项目经验,实际上考察重点也在于此。我想能力的提高不是一蹴而就的事,只有在本职工作中慢慢积累。
2000年10月我参加了考试,考了一天,很紧张很累,经历至今难忘。

  上午的考试,考场有十来人参加,从神情看大家都显得信心不足。试题涉及面较广,计算机各学科、几门数学、专业英语都考到了,还考到了一些新技术,真正体现了“水平考试跟踪国际水平”的精神。上午试题,由于所学基础知识掌握较好,我们公司在日常工作中也比较关注新技术。所以虽然不是每题都会,大部分都比较有把握,时间也比较充裕。考虑到下午还有更艰苦的两场,我早早交卷,回家休息调整。

  中午稍微休息,下午我准时来到考场。上午一起奋战的同志算上我只剩下了三个人,大部分都知难而退了。除了我们公司的两个人外,还有一个小伙子是邮政的,见过一面,看来邮电系统还真是人才济济啊。

  下午第一场是分析设计,题目类似于现在流行的“案例分析题”,但不同之处是答案有字数限制,一个问题只能在有限的空格里解答,所以只有答对要点才行。试卷给出了多个不同应用背景的案例,选做几题。除了工业控制领域的我不太了解外,其他在工作学习中都有所涉猎。感觉是这场是综合能力的测试,考的大部分都是新技术的方案选择、方案分析和技术评价,都是学校没学到过的,需要有足够的知识面、工作经验和设计分析能力。

  交卷短暂休息后开始第二场考试,这场是论文。要求400字摘要、2000-3000字正文,在两小时完成,打草稿是来不及的,要求构思和书写速度要快,只能是一挥而就。试卷给出了四个题目,我选了个比较熟悉的“网络计算”的题目。由于考前也没有时间试着写过一篇完整的论文,只写过去年一个考题的提纲,所以怕时间不够,写的很急,有的观点也没有仔细推敲。现在具体写什么已经忘了,只记得花了几分钟列了个提纲,列了网络方案设计、计算方案设计、软件系统开发、配套设备选型、进度成本控制、项目实施演进等几个方面。我是结合当时公司实施的公司城域网和移动综合业务系统项目来写的,写的都是实际的工作经历和经验教训,具体涉及了设计、经过、问题和解决、评价改进等方面的经验,也写了改进的设想,写的象项目总结。由于写的都是熟悉的工作经历,思路没有停顿,写完后还有十几分钟,之后稍微做了点润色,最后写了400字摘要。

  由于第一次这样写论文,感觉论文写的很草率,考试后对论文通过没有太大把握。现在看起,当时的许多观点都很不成熟,没写出什么深度,象在写项目总结,条理也不太清晰。但可能由于论文总体真实可信,我们公司项目的技术也比较领先,阅卷老师给了我较高的分数。从另一种角度看,这也是对我们公司计算机项目开发、文档质量等各方面的承认。

  2000年底,市科委告诉我考试成绩,我感到很意外。三场的考分分别是61、48、51,分数线是:45、45、45。上午第一场的成绩在意料之中,但后面两场比我估计的要高。由于我的考分在全省名列前茅,省里还给我颁发了一份荣誉证书。首次通过,而且成绩好得出乎意料,我感觉我实在是个幸运儿。成为本考区开考十多年来首个通过的考生,我感觉也给我们公司增添了一份荣誉。

  三、回顾总结

  我从电信进入移动时候,刚刚过了一年的实习期,没有太多的工作经验。参加系统分析员考试时候,在移动公司也才工作了短短两年时间。在这两年里,公司给了我成长的土壤和空间,领导们将我培养成为技术骨干,这在其他企业是很难想象的。假设没有这样的经历,仅仅停留在书本上,我也许就止步于上午的考试,分析设计无从下手,论文更是无话可说。

  通过考试后转眼又是两年过去了,当初的喜悦和激动已经逐渐淡去,留下的是自信和思考:

  一、技术人员在工作中设计方案、优化系统、解决故障,虽然工作很辛苦,压力很大,但日积月累,这些书本上学不到的经历,对分析设计很有帮助。

  二、技术人员工作主要是设计、操作、维护,站在系统分析的高度来处理问题的机会不会太多,在知识的深、广度分析和解决问题的能力等方面都有待进一步提高。而这些方面又正是体现技术人员实力的地方。所以从这个意义上来说,如果要进一步提高自己,我们在日常工作中要有效地利用各种途径、方法和机会,勤于思考,大胆创新,不断实践,努力增强自身的实力。

  三、技术人员在工程项目方面有着得天独厚的条件。如果没有参加过完整的工程项目,就难以搞清楚开发过程的每个阶段的每一个环节的要点,更难以提出独到的观点和方法并加以评价。系统开发和设计的丰富内容,是生动地体现在一个个相似而又千差万别的具体的应用环境上的,其中蕴涵着开发者的思想、智慧和无数次的失败、挫折。在实践中虚心求知,善于总结,从工程中学习,是提高能力的重要步骤。
四、信息技术飞速发展的今天,企业的每个人都面临着巨大的挑战,需要不断补充新知识。知识更新的途径除了培训和进修外,自学是非常重要的一种方式。经验告诉我,书上的东西往往要经过亲身实践才能真正掌握,而在实践中有时会产生新的问题,促使重新学习。

  五、要注意文档的编写能力,这不仅对于应试是必要的,对于一个合格的系统分析员是必不可少的,对于实际工作更是大有裨益。技术人员的一个通病是做的多、写的少。公司经常要求我们多思考、多动笔,提高自己撰写文章的能力,我想我也得益于这样的培养训练颇多。 通过考试转眼又是两年,当初的喜悦和激动已经逐渐淡去,留下的是自信和思考:信息技术飞速发展的今天,我们企业的每个人都面临着巨大的挑战,需要不断补充新知识。应对考试,只有学习;迎接人生考验,只有更广义的学习、实践!