论文部分内容阅读
编程题在线评判技术是协调庞大编程学习者群体和稀缺的教学资源矛盾的手段之一,它弱化了学生数量对教师工作量的影响,使大规模编程在线教育成为可能。当前流行的编程题在线评判系统多为ACM-ICPC(Association for Computing Machinery-International Collegiate Programming Contest)赛制专用的评判系统。该类系统最先用于算法的学习和训练。此类系统基于黑盒模型对学生代码进行测试,根据通过的测试数据组数打分。如今许多高校都在编程课中引入ACM的在线评判系统。但是ACM的专用评判系统用于教学中也存在一些缺陷。首先,随着编程语言和软件开发技术的发展,单纯黑盒测试的模式已不能很好地契合新兴编程语言的教学要求。例如,黑盒测试可以分辨出错误的程序结果,却不能判断该代码是否符合面向对象的程序设计思想。其次,ACM的赛制惩罚不通过的提交,违背了现代编程教学中鼓励学生多练习的教育理念,同时也规避了大规模考试中高并发提交代码的问题。最后,评判系统使用场景的实名制回避了编程题评判系统应涉及的安全挑战,且一些系统使用的安全方案后续维护和迁移成本较大。本文探讨了编程题在线评判系统的发展状况,分析了大规模考试及计算机编程考试的需求,结合目前广泛采用的ACM赛制专用评判系统的不足,针对系统规模、实时性、安全性、评判粒度和多知识点评判等5个现代编程教学评判需求,提出了一种基于分布式、虚拟化和插件技术的多知识点编程题评判方案,设计并实现了支持在线扩容的编程题在线评判系统。该系统基于ActiveMQ消息中间件的队列模式,实现了生产者-消费者模型,并利用该模型解决了大规模考试的热伸缩和灾备需求。该模型支持根据系统负载在线调整评判器节点个数,容许若干个评判器节点意外离线。通过消息队列、缓存及分布式技术,本文实现了较高的系统吞吐量和同时使用在线人数。本文的主要关注以下方面:(1)在安全上,本文对安全沙箱技术进行了研究,结合全虚拟化和半虚拟化技术对已知的在线编程题评判系统的安全缺陷进行了加固。利用操作系统用户和文件系统权限机制、setUID和ulimt沙箱、LXC(Linux Container)以及虚拟化实现的多级安全体系,在确保评判环境的安全性和纯净性的同时,兼顾运行效率和维护成本。(2)在性能上,本文对磁盘IO(Input/Output)效率和编译器起停时间进行了优化,提升了评判器的吞吐量。(3)在多样化评判要求方面,本文实现了插件机制,并利用灰盒测试模型,满足了多知识点评判及细化评判粒度的在线课堂需求。测试结果表明,评判器及其支撑系统具有很好的伸缩性和容错性,评判器可随时联机和离线而不影响系统的正确性。通过简单地增加评判器节点个数即可完成对评判系统的在线扩容,从而实现大规模的在线程序评判。