基于SSM的大学生实践技能管理系统设计

2020-12-28 12:19唐崇华
鞍山师范学院学报 2020年6期
关键词:结点调用内存

唐崇华

(鞍山师范学院 管理学院,辽宁 鞍山 114007)

当前,高校专业教育的重点是提高大学生的实践能力、阶梯式培养大学生的专业实践技能、引导学生的技术发展和专研方向、提高大学生的专业自信和竞争能力.教育者需要及时了解学生实践技能的掌握程度,以调整教育教学方案,学生需要适时对自己的实践技能进行评估,以衡量自身的专业水平问题.

1 系统功能分析

系统设计的目的是提供一个能够进行专业技能学习、技能水平评估与认证和信息追踪与发布的平台.教师用户利用这个平台可以设定所属专业的技术技能学习路线,并对学生的专业技能进行跟踪和评价.学生用户利用这个平台可以学习专业技能,及时了解自身专业水平及与专业要求之间的差距,对自己的专业技能进行评估.通过对广大师生的广泛调研,总结出系统应具备的核心功能.

1.1 技能链管理

本功能提供给教师用户使用,主要业务是建立相应的技能链.技能链除应具备名称、所属专业、建立者和建立时间等属性之外,最重要的是每个技能链应包括掌握该技能必须具备的专业知识,系统中用技能结点表示.这些技能结点按照逻辑关系进行排列,学习者需逐一进行学习.技能链管理功能包括技能链的添加、编辑、更新、删除,其中编辑功能包括添加和编辑技能结点,在技能结点的编辑中需上传学习资料,如相关视频、PPT文稿等.教师用户可针对具体的技能结点布置作业和测试题目,学生完成作业和测试即可视为掌握这项技能.

1.2 技能学习

本项功能供学生用户使用.学生可登录系统,按照专业要求查询需要掌握的技能链,也可以按照个人兴趣选择某项技能链.学生将选择的技能链添加到自己的技能列表内,对于某个技能链,按照其中技能结点提供的学习资料进行学习,完成教师布置的任务并提交测试结果以获取教师的审核,也可以同自身的技能水平进行对比,若能够达到该技能结点的要求,需提交对应的佐证材料,如相应课程的考试分数、课程设计成果、职业资格证书等进行报备,在获得建立该技能链的教师认可之后,即可认为通过该结点的学习.对于技能链上各结点均通过的学生,系统认为其已经掌握该项技能.学生用户可以通过统计功能及时了解自己的学习进度.

1.3 技能推荐

本项功能对学生用户开放.专业教师在建立技能链的同时需要设置该技能链所属专业,学生用户在登录注册时需要注册所在专业.系统根据专业要求、相似学习者已选择的技能链、学习者注册时填报的兴趣爱好、学习者浏览的相关技术文献信息等数据,对学生用户进行相关技能链的推荐.

1.4 职业推荐

本项功能与企业和学生用户相关.系统提供企业的注册接口,企业用户完成注册后,可以登录岗位招聘信息,提交招聘岗位所需技能要求.系统将根据学生用户所完成的技能链情况,进行相关职业岗位的推荐.

以上是本系统的核心功能,其余功能还包括基本的信息管理、技能链榜单、实时公告等.按用户角色进行功能分析,并绘制用例图1.

图1 系统用例图

2 系统实现

2.1 基本功能的实现

系统采用SSM框架设计.SSM框架将视图层、业务逻辑层、持久层、模型层进行清晰的划分,使得扩展维护更加方便[1].系统体系结构如图2所示.

图2 系统体系结构

下面以技能链管理功能为例进行系统实现的说明:

技能链管理功能是系统的核心功能之一,该模块也是系统开发的主要模块.技能链的管理分为技能链基本信息管理和技能结点管理两个主要部分.对应的控制器实现代码如下所示:

@Controller

public class SkillManagerController{

@RequestMapping(value=”teacher/AddSkillChain”,method=RequestMethod.POST)

Public void AddSkillChain(@RequestParam(“SkillChainName”)String skillchainname,@RequestParam(“SkillDesp”)String description,……){}

@RequestMapping(value=”teacher/AddSkillNode”,method=RequestMethod.POST)

Public void AddSkillNode(@RequestParam(“SkillNodeName”)String skillnodename,@RequestParam(“SkillNodeDesp”)String description,……){}

}

在控制层主要使用了@Controller、@RequestMapping、@RequsetParam和@PathVariable注解.在配置文件内使用元素启动包扫描功能,由Spring实现控制反转(IOC)自动生成实例对象[2].

技能链管理模块中的主要业务逻辑为技能链与行业技能的自动匹配功能.技能链在构建时会标注关键词,系统会自动将技能链的关键词与行业技能的关键词进行匹配,匹配度满足需求即可自动将该技能链与对应的行业技能进行配对.该项功能由SkillMatching类实现.该类作为中间层组件由Spring自动装配.Spring提供了三种装配机制,即XML配置、Java配置、隐式的发现机制和自动装配[3],不同的装配方法可以搭配使用,本系统采用的是自动配置机制.系统定义SkillMatchService服务接口并提供match方法,SkillMatching类实现了该接口,并使用@Component注解标注,如下所示:

@Component

public class SkillMatching implements SkillMatchService{

private int skillChainId;//需要配对的技能链ID

public float match(){

… …//处理流程参见图3

图3 技能链与行业技术匹配处理流程

}

}

@Component注解表明SkillMatching类为组件类,可以在配置文件中添加对于SkillMatching类所在的包扫描,Spring会自动创建该类对象,并在容器内等待调用.在调用处声明接口对象,并用@Autowired注解标识,这样Spring会自动将生成的SkillMatching对象的引用赋予该接口对象.

系统以业务逻辑组件作为DAO组件的门面,业务逻辑组件底层依赖于DAO组件.系统技能链管理功能涉及的数据层有SkillNodeDAO提供对技能结点数据表的操作;SkillChainDAO提供对技能链表的基本操作;UsersSkillChainsDao用于提供对用户选择技能链表的基本操作.在持久化层中涉及教师实体(Teacher)、用户实体(User)、技能链实体(SkillChain)、技能结点实体(SkillNode).SkillNode(技能结点)与SkillChain(技能链)之间的一对多联系采用如下代码段所示的配置方法,代码内只展示一对多联系的配置,其他部分省略:

… …

… …

ofType=”org.skill.domain.SkillNode” select=”org.skill.maooer.SkillNodeMapper.selectSkillNodeByscID” fetchType=”lazy”>

… …

… …

Progress in study on rheological test and rheological model of rock for nearly 20 years in China XIONG Liang-xiao WANG Zi-hua(104)

Sector(行业)实体与技能链(SkillChain)实体是多对多的关系,在MyBatis中多对多的关系采用了一个中间表维护.中间表的行业ID作为外键参照行业表的ID,技能链ID作为外键参照技能链表的ID.

2.2 技能学习推荐

系统根据相似学习者已完成的技能链、学习者注册时填报的兴趣爱好、学习者浏览的相关技术文献信息等数据,进行学习技能链的推荐.

由于需要采集学生的学习轨迹,在其浏览相关技能资料的时候,需要对学生浏览的历史进行记录.对每个学习项目,以学习者点击次数、学习的时长和完成进度的情况进行评价,其中点击次数,学习时长和完成进度按照3∶3∶4的比例进行分配.

用户数据采用向量方式存储在数据库中,向量中的每一个维度代表着该用户对某个技能链的评价数据,推荐采用协同过滤算法,计算用户之间的相似度,以相似度最高的N个用户形成邻域.将用户相似度作为权值,加权平均邻域内用户对某个技能链的评价,以其作为当前用户对该技能链评价的预测,并按照评价值的高低推荐.

用户之间的相似度采用余弦相似度计算,参见公式(1),邻域内用户的个数K作为超参数,可灵活设定.加权平均计算预测评价见公式(2).

(1)

(2)

其中,wij表示用户i与用户j之间的相似度,G为技能链集合,r表示用户对技能链的评价,N表示用户的邻域.

由于涉及大量的计算操作,且C++具有很好的并行性,效率较高,本功能采用C++实现.算法过程如下:

(1)建立用户与技能链模型.将用户与技能链数据组成二维矩阵M,其中,行表示不同的用户,列表示不同的技能链,M[i][j]表示用户i对于技能链j的评价.

(2)构造用户相似矩阵.为避免用户数量过多,而用户评价的交集稀疏所带来的高时间复杂度计算,采用倒查表的方式组织用户评价数据.倒查表以技能链为索引,以评价该技能链的用户作为表项,若用户i与用户j均对技能链m做评价,则系数矩阵中S[i][j]加1.

系统需要满足为同时访问的多用户进行推荐的业务场景,在设计上采用线程池的方式实现同时计算.

采用系统提供的线程池,需要使用QueueUserWorkItem函数,该函数将工作项排队入线程池中的一个线程.

下述代码演示工作线程的定义方式:

DWORD WINAPI RecommendThreadFunc(LPVOID pParam).

由于传入的结构体参数可以自行定义,所以只传入其指针,需要在函数内对结构体的各数据项进行解析.

由于每次计算均会涉及大量用户数据,频繁读取数据库会导致系统效率低下.鉴于用户评价数据更新速度平缓,解决这个问题可采用一次读取数据库、建立内存表存储用户评价数据、定期更新内存表的方式.内存表可以采用内存映射文件的方法建立.

建立内存映射需按顺序调用CreateFileMapping、MapViewOfFile以及UnmapViewOfFile等API函数.CreateFileMapping用于建立内存数据表,MapViewOfFile用于将内存表映射到系统应用所在的内存空间,UnmapViewOfFile用于系统退出时取消映射.下面代码为上述API的定义:

HANDLE CreateFileMapping(HANDLE hFile,PSECURITY_ATTRIBUTES psa,DWORD fdwProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,PCTRSTR pasName);

PVOID MapViewOfFile(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFilePffSetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap);

HANDLE OpenFileMapping(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName);

BOOL UnmapViewOfFile(PVOID pvBaseAddress);

调用CreateFileMapping时将第一个参数设置为INVALID_HANDLE_VALUE,系统将创建一个与物理文件无关的映射区域,可以使用自定义的结构体规范内存数据结构.fdwProtect 需要设置为PAGE_READWRITE以供多进程读写,dwMaximumSizeLow 需设置为内存结构体的大小.因此,设计内存结构体时要充分考虑用户评价数据空间的扩展.

CreateFileMapping返回的句柄作为参数调用MapViewOfFile,并将返回的地址强制转换为内存结构体类型的指针,这样就可以通过这个指针对内存结构进行读写操作.由于内存映射建立在进程空间中,线程池中的工作线程可以共享访问.

使用CreateFileMapping进行内存映射,由于使用自定义的内存结构,因此,需要处理好数据对齐问题.CPU处理准确对齐的数据时,它的运行效率最高[4].内存结构中的数据具有不同的类型,特别是字符数组的长度参差不齐,为达内存对齐目的,需要进行占位处理,使数据项的长度均为4的倍数.

2.3 Java与C++互操作

系统中对于推荐算法的调用采用JNA实现.JNA提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码[5].由于本系统是基于J2EE平台编写的,而如技能学习推荐等核心算法采用C++编写,因此,涉及平台间的调用问题.

在项目中添加如下代码,可以将相关依赖下载到项目中:

利用C++实现的推荐算法需要编译为DLL形式供Java调用.通过在JNA中定义接口来描述DLL文件,在该接口中需要描述动态链接库内的所有函数,接口继承至com.sun.jna.win32.StdCallLibrary,同时动态链接库内的函数需要用stdcall方式输出.

Java与C++代码之间的参数传递也是调用过程中需要解决的问题.常用的传递参数为结构体,为达到传参的目的,需要在Java中使用Structure模拟结构体参数,在定义结构体参数时需要注意Java和C++之间的简单数据类型的对应关系.当互调用的结构体内部存在数组对象的时候,在Java内定义时需实例化该数组对象并赋予初值,否则将会出现内存大小不一致的错误,导致调用失败.除此之外,为防止GC回收内存,需要调用Structure 类的write()方法将结构体的所有字段固定住.

3 总结

本系统实现的难点为推荐算法、Java与C++的相互调用.经过多次实践分别采用了系统线程池、JNA技术解决,经过测试效果良好.当前,正处于互联网+ 与大数据时代,线上学习作为校内学习的有效补充而得到广泛普及,后续的研究工作将进一步对系统进行完善与功能扩展,结合大数据分析挖掘技术为学生实践技能的培养提供决策参考.

猜你喜欢
结点调用内存
LEACH 算法应用于矿井无线通信的路由算法研究
基于八数码问题的搜索算法的研究
核电项目物项调用管理的应用研究
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
系统虚拟化环境下客户机系统调用信息捕获与分析①
内存搭配DDR4、DDR3L还是DDR3?
利用RFC技术实现SAP系统接口通信
上网本为什么只有1GB?
C++语言中函数参数传递方式剖析