wiki:NP2012Fall

2012年秋-网络程序设计

http://teamtrac.ustcsz.edu.cn/raw-attachment/wiki/NP2012Fall/logo-big.PNG

对这门课的赞誉和评价

  • 这门课的理论课时不是很多,更多的是练习。过程中遇到的问题可以说是多种多样,老师鼓励我们自己思考、尽量想办法自己解决;同时老师也在coding,和我们保持着同样的进度,并且公开自己的代码。当遇到问题时主动去查资料,想办法解决;有什么技术实在不理解了才去问老师,然后老师一句话就把自己点醒了... 摘自吴丰的总结
  • ...最终 3500 行的代码量让我的 C 语言功底和经验有了质的飞跃,虽然每周五都是最累的时候...尤其是 I/O 复用技术和多线程的使用既让我对这些并行技术有了了解,也让我掌握了一些 C 语言写并行程序的技巧。而一致性哈希的实现,更多的是考验我们对于良好架构的设计和理解能力以及对于各种细节的掌控,确实让我明白了在大并发量、大规模数据的背景下,设计并实现良好的架构是非常不易但很有成就感的事情。抛开这些课程的主要内容不说,单单是使用 C 语言来实现这一切都足够有挑战了,很多时候与内存管理打交道更像是绣花,需要足够的细心和耐心,尤其是自己从底层实现那些常用的数据结构,可以说绝对是对自己的一次考验和提升。另外,我们的项目始终使用 GITHUB 进行版本管理,让我对 GIT 的优点有了充分的认识,对版本控制系统有了好感,以后的代码应该都会使用 GIT 进行版本控制。...这门课是我从本科到现在所修的少有的值得学的课之一,比起那些“纸上谈兵”的课程,实践是这门课的灵魂,实践对于我们计算机科学/工程来说实在是太重要了,希望孟宁老师能够继续保持这门课的实践性。王磊的总结
  • 还记得第一次课是老师在黑板上一行一行的教我们写socket,感动啊。老师问我们是不是觉得太简单,当时是有这种感觉。可到后来我们就认识到,这门课程远没有这门简单。总之,在老师的一步一步讲解和引导下,我们渐渐地开始上手。像编程规范,代码封装,注释等等,都是这门课给我们的宝贵财富。我们在学习过程中也学习了两个人的分工协作,代码的编写能力也得到了提升,也接触到了分布式等前沿技术,虽然只是蜻蜓点水,可也在思想上给了我们很大的启发。吴平
  • 通过一个学期网络程序设计的学习,对个人而言,学到的东西还是挺多的。EPOLL 的使用,正则表达式的运用给我留下了深刻的印象。而老师漂亮的代码封装和代码风格也给自己编程水平上了浓墨重彩的一笔。对于个人来说,正则表达式解决了自己之前最不愿意解决的字符串处理问题,对于今后字符串处理问题有了飞跃性的提升。在此,十分的感谢老师在课堂上讲述了正则表达式的使用。IO 复用技术对于个人来说是一个领域的突破,之前一直觉得多线程技术是最佳的利用处理器性能的技术之一,经过本门课的学习后,之前一直有耳闻但是没有探究过的 IO 复用技术已经有了深刻的了解。相信以后编码过程中,也会用得到更多。周朴方
  • 这门课起点高,强度大,节奏快,对于我这个初学者来说是个很大的挑战,只能逼着自己不停的学习,这样才能跟上课程的步伐。非常详尽的课程全过程设计知识点的总结
  • ...为了完成这个程序,我阅读《unix 环境高级编程》一书中的很多章节,对整个操作系统方面的知识由以前的抽象的概念映射到了程序中更具体的方面,通过阅读里面的程序,大大提高了阅读代码的能力,和一些编程技巧,尤其是线程一章中的一个hash 工作队列+mutex 的使用,精妙的设计和完整的可能性考虑让我很有启发.王嘉懿

课程概要

  • 课程类型:工程实践课程
  • 课程目标:基于Tokyo Cabinet实现一个简单的分布式存储系统原型Nezha(code name),其中会涉及到Socket网络编程、pthread、Makefile及相关工程方法。
  • 编程语言:标准C、Makefile
  • 目标环境:Linux (推荐Ubuntu 10.04 VM
  • 编辑器:any (推荐UltraEdit或VIM)

评分标准

  • 功能实现demo占40%
  • code review占60%,包括基本规范(缩进4个空格为单位、注释编排整齐划一、注释和内容要逻辑一致、函数和变量的命名要和内容逻辑一致并风格统一等);逻辑封装分层;对代码实现机制的理解程度。
  • 允许参考讨论但决不允许抄袭(拷贝代码)。

课程内容

W1-课程准备

  • Linux开发环境、编辑器、Linux C编程参考资料等
  • TCP/IP Socket API
  • 完成的标准:编译运行演示client与server实现互相通信的功能,比如打招呼hello、hi。
  • 参考代码server client (gcc source.c -o dest)
  • 提高:封装 - 减少重复代码、局部化外部接口、改善逻辑关系。代码优化方向:简洁、易读、易修改。优化后的代码范例

W2-Nezha Project kickoff:基于Tokyo Cabinet实现key-value数据的存储功能

gcc tctest.c -ltokyocabinet
  • 对Tokyo Cabinet的接口进程封装(局部化输入输出)然后实现key-value数据的存储功能,即能通过函数调用读写数据。
  • 编译多个源文件
gcc -c dbapi.c -o dbapi.o
gcc -c main.c -o main.o
gcc -o nezha main.o dbapi.o -ltokyocabinet
  • 遵守代码编写规范
  • 完成的标准:编译运行演示程序实现key-value数据的存储功能,并进行code review。
  • 范例代码(注意其中main.c和dbapi.h中都没有include TC的头文件)

W3-Milestone 1:实现用命令行方式操作的单机版KV数据库系统

W4-给KV数据库系统增加C/S方式的远程访问功能

  • 实现KV数据库系统的远程访问,具体命令行操作功能不变.即编译生成2个可执行文件,一个是服务器,另一个是客户端,服务器在一台机器上,客户端在另一台机器上,在客户端可以显示命令行并接受open、close、get、set和delete操作命令(像单机版一样)。
  • C/S之间的通信协议设计
  • 软件代码重构,尽可能多地重用已有的代码
  • 考核标准 - 文档为纲、接口为领、测试为要。
    • 实现客户端远程操作数据库的功能,功能同Milestone 1;
    • 支持单元测试和自动化回归测试
    • code review,代码的模块化
    • 简要明了的文档

W5-Milestone 2:支持多客户和大并发量请求

W6-在客户端实现分布式策略

  • 根据key计算出分布式节点的编号,比如有N个节点,任意一个key取key%N即可得到该key存储在哪个节点上,并直接到该节点处做get/set/delete操作。
  • 最终演示方法:1)启动N个服务器节点(应该分布在不同机器上或虚拟机上);2)启动一个或多个客户端;3)每次get/set/delete操作系统会自动选择某个节点实现数据库访问
  • 这样单个节点上的数据库实际上只是完整数据的一部分,换句话说整个数据库分布存储在各节点上,所以叫分布式数据库。

W7-Milestone 3:实现服务器节点的集中(自动)管理和维护

  • 服务器节点信息和分布式策略由客户端存储和管理有显著的弊端,比如当服务器节点发生变化时,所有客户端都需要随着变化,显然W6的做法还远不够灵活。
  • 服务器节点信息和分布式策略由某个服务器节点Master集中存放,客户端从master上取服务器节点信息和分布式策略,是不是在管理和维护上更加方便灵活呢?!当服务器节点信息发生变化时客户端能自动完成更新自适应环境变化那就更好了。
  • Distributed Database
  • 目标:启动N个服务器节点,客户端能自动获得N个服务器节点信息,完成分布式数据库的操作。
  • 进一步的思考:系统工作过程中增加或减少一个服务器节点,系统如何自动处理?

近期上课时间安排

  • 1月6日(周日)上午9点-12点(主要是实验讲解演示和答疑),下午2点-5点(主要是检查Milestone3)
  • 1月12日(周六)上午9点-10点半,提前批次(自愿申报)实验考核;
  • 1月13日(周日)上午9点-12点,正常批次(随机点名)实验考核,务必提前准好;
  • 1月13日(周日)下午2点-5点,正常批次(续)、补考批次实验考核

W8:实验考核

  • 基本考核标准
    • 服务器并发处理采用i/o复用(epoll)和多线程机制(pthread)协同工作,其中可能涉及信号量、互斥锁、队列、链表等;
    • 配置好服务器集群后,客户端可以自动获得服务器节点信息并实现分布式数据库的操作;
    • 必要的图文并茂文档、统一规范的代码风格、清晰准确的演讲表达等
    • 提前准备和演练5分钟演讲,现场计时,超时或提前1分钟结束即降低一个评分等级。
  • 附加考核内容
    • 采用一致性Hash算法
    • 服务器节点启动时能自动获取本地IP(必须是函数调用方式非执行命令的方式),检验端口是否可用并自动选择可用端口
    • 系统工作过程中增加或减少一个服务器节点并不影响整个系统正常工作(可以在一致性Hash算法基础上改进)
    • 冗余备份机制(包括fail over)
    • Gossip协议机制
    • 其他创新性想法

请将实验考核的文档(增加学习总结)和源代码分开提交到教辅系统,截止日期1月16日

  • 注意:如果milestone3提交的源代码已近是最新的了,只需提交文档(增加学习总结)。

欢迎您到教辅系统网络程序设计讨论区发表您的该课程批评和建议

参考资料

  • 往年课程资料参见http://code.google.com/p/chatsys/
  • Tokyo Cabinet http://fallabs.com/tokyocabinet/
  • Linux C编程参考
  • (美)史蒂文斯,(美)芬纳,(美)鲁道夫 著,杨继张 译,UNIX网络编程:第3版,清华大学出版社,2006-1-1
  • (美)史蒂文斯 著,TCP/IP详解 卷1:协议,机械工业出版社,2000 年4月
  • Behrouz A. Forouzan, Sophia Chung Fegan. TCP/IP Protocol Suite (3rd Edition)
  • 杨宗德,邓玉春,曾庆华编著,Linux高级程序设计,人民邮电出版社,2007年11月
Last modified 5 years ago Last modified on 01/22/13 15:00:37

Attachments (14)

Download all attachments as: .zip