`

《30天自制操作系统》样章 多任务(1)——挑战任务切换(harib12a)

阅读更多

多任务(1) --挑战任务切换( harib12a)

  “话说,多任务到底是啥呢?”我们今天的内容,就从这个问题开始吧。

  多任务,在英语中叫做 “multitask”,顾名思义就是“多个任务”的意思。简单地说,在Windows等操作系统中,多个应用程序同时运行的状态(也就是同时打开好几个窗口的状态)就叫做多任务。

  对于生活在现代社会的各位来说,这种多任务简直是理所当然的事情。比如你会一边用音乐播放软件听音乐一边写邮件,邮件写到一半忽然有点东西要查,便打开 Web浏览器上网搜索。这对于大家来说这些都是家常便饭了吧。可如果没有多任务的话会怎么样呢?想写邮件的时候就必须关掉正在播放的音乐,要查东西的时候就必须先保存写到一半的邮件,然后才能打开 Web浏览器……光想象一下就会觉得太不方便了。

  然而在从前,没有多任务反倒是普遍的情形(那个时候大家不用电脑听音乐,也没有互联网)。在那个年代,电脑一次只能运行一个程序,如果要同时运行多个程序的话,就得买好几台电脑才行。

  就在那个时候,诞生了昀初的多任务操作系统,大家都觉得太了不起了。从现在开始,我们也要准备给“纸娃娃系统”添加执行多任务的能力了。连这样一个小不点儿操作系统都能够实现多任务,真是让人不由地感叹它生逢其时呀。

  稍稍思考一下我们就会发现,多任务这个东西还真是奇妙,它究竟是怎样做到让多个程序同时运行的呢?如果我们的电脑里面装了好多个 CPU的话,同时运行多个程序倒也顺理成章,但实际上就算我们只有一个 CPU,照样可以实现多任务。

  其实说穿了,这些程序根本没有在同时运行,只不过看上去好像是在同时运行一样:程序 A运行一会儿,接下来程序 B运行一会儿,再接下来轮到程序 C,然后再回到程序 A……如此反复,有点像日本忍者的“分身术”呢(笑)。

  为了让这种分身术看上去更完美,需要让操作系统尽可能快地切换任务。如果 10秒才切换一次,那就连人眼都能察觉出来了,同时运行多个程序的戏码也就穿帮了。再有,如果我们给程序 C发出一个按键指令,正巧这个瞬间系统切换到了程序 A的话,我们就不得不等上 20秒,才能重新轮到程序 C对按键指令作出反应。这实在是让人抓狂啊(哭)。




  在一般的操作系统中,这个切换的动作每 0.01~0.03秒就会进行一次。当然,切换的速度越快,让人觉得程序是在同时运行的效果也就越好。不过, CPU进行程序切换(我们称为“任务切换”)这个动作本身就需要消耗一定的时间,这个时间大约为 0.0001秒左右,不同的 CPU及操作系统所需的时间也有所不同。如果 CPU每0.0002秒切换一次任务的话,该 CPU处理能力的 50%都要被任务切换本身所消耗掉。这意味着,如果同时运行 2个程序,每个程序的速度就只有单独运行时的1/4,这样你会觉得开心吗?如果变成这种结果,那还不如干脆别搞多任务呢。

  相比之下,即便是每 0.001秒切换一次任务,单单在任务切换上面也要消耗 CPU处理能力的 10%。大概有人会想, 10%也没什么大不了的吧?可如果你看看速度快 10%的CPU卖多少钱,说不定就会恍然大悟,“对啊,只要优化一下任务切换间隔,就相当于一分钱也不花,便换上了比现在更快的 CPU嘛……”(笑),你也就明白了浪费 10%也是很不值得的。正是因为这个原因,任务切换的间隔昀短也得 0.01秒左右,这样一来只有 1%的处理能力消耗在任务切换上,基本上就可以忽略不计了。

  关于多任务是什么的问题,已经大致讲得差不多了,接下来我们来看看如何让 CPU来处理多任务。

  当你向CPU发出任务切换的指令时, CPU会先把寄存器中的值全部写入内存中,这样做是为了当以后切换回这个程序的时候,可以从中断的地方继续运行。接下来,为了运行下一个程序, CPU会把所有寄存器中的值从内存中读取出来(当然,这个读取的地址和刚刚写入的地址一定是不同的,不然就相当于什么都没变嘛),这样就完成了一次切换。我们前面所说的任务切换所需要的时间,正是对内存进行写入和读取操作所消耗的时间。

  接下来我们来看看寄存器中的内容是怎样写入内存里去的。下面这个结构叫做“任务状态段”(task status segment),简称TSS。TSS有16位和32位两个版本,这里我们使用 32位版。顾名思义, TSS也是内存段的一种,需要在 GDT中进行定义后使用。



  参考上面的结构定义,TSS共包含26个int成员,总计 104字节(摘自 CPU的技术资料),我特意把它们分成 4行来写。从开头的 backlink起,到 cr3为止的几个成员,保存的不是寄存器的数据,而是与任务设置相关的信息,在执行任务切换的时候这些成员不会被写入( backlink除外,某些情况下是会被写入的)。后面的部分中我们会用到这里的设定,不过现在你完全可以先忽略它。

  第2行的成员是 32位寄存器,第 3行是16位寄存器,应该没必要解释了吧……不对, eip好像到现在还没讲过呢。 EIP的全称是“extended instruction pointer”,也就是“扩展指令指针寄存器”的意思。这里的“扩展”代表它是一个 32位寄存器,也就是说其对应的 16位版本叫做 IP,类比一下的话,跟 EAX与AX之间的关系是一样的。

  EIP是CPU用来记录下一条需要执行的指令位于内存中哪个地址的寄存器,因此它才被称为
“指令指针”。如果没有这个寄存器,记性不好的 CPU就会忘记自己正在运行哪里的程序,于是程序就没办法正常运行了。每执行一条指令, EIP寄存器中的值就会自动累加,从而保证一直指向下一条指令所在的内存地址。

  说点题外话, JMP指令实际上是一个向 EIP寄存器赋值的指令。 JMP 0x1234这种写法, CPU会解释为 MOV EIP,0x1234,并向 EIP赋值。也就是说,这条指令其实是篡改了 CPU记忆中下一条该执行的指令的地址,蒙了 CPU一把。这样一来, CPU在读取下一条指令时,就会去读取 0x1234这个地址中的指令。你看,这不就相当于是做了一个跳转吗?

  对了,如果你在汇编语言里用 MOV EIP,0x1234这种写法是会出错的,还是不要尝试的好。在汇编语言中,应该使用 JMP 0x1234来代替MOV EIP,0x1234。


  如果在TSS中将EIP寄存器的值记录下来,那么当下次再返回这个任务的时候, CPU就可以明白应该从哪里读取程序来运行了。

  按照常识,段寄存器应该是 16位的才对,可是在 TSS数据结构中却定义成了 int(也就是 DWORD)类型。我们可以大胆想象一下,说不定英特尔公司的人将来会把段寄存器变成 32位的,这样想想也挺有意思的呢(笑)。

  第4行的ldtr和iomap也和第1行的成员一样,是有关任务设置的部分,因此在任务切换时不会被CPU写入。也许你会想,那就和第 1行一样,暂时先忽略好了——但那可是绝对不行的!如果胡乱赋值的话,任务就无法正常切换了,在这里我们先将ldtr置为0,将iomap置为0x40000000就好了。

  关于TSS的话题暂且先告一段落,我们回来继续讲任务切换的方法。要进行任务切换,其实还得用JMP指令。 JMP指令分为两种,只改写 EIP的称为near模式,同时改写 EIP和CS的称为far模式,在此之前我们使用的 JMP指令基本上都是 near模式的。不记得 CS是什么了? CS就是代码段(code segment)寄存器啦。

  说起来我们其实用过一次 far模式的JMP指令,就在 asmhead.nas的“bootpack启动”的昀后一句(见8.5节)。 MP DWORD 2*8:0x0000001b 这条指令在向 EIP存入0x1b的同时,将CS置为2*8(=16)。像这样在 JMP目标地址中带冒号( :)的,就是far模式的 JMP指令。

  如果一条 JMP指令所指定的目标地址段不是可执行的代码,而是 TSS的话, CPU就不会执行通常的改写 EIP和CS的操作,而是将这条指令理解为任务切换。也就是说, CPU会切换到目标 TSS所指定的任务,说白了,就是 JMP到一个任务那里去了。

  CPU每次执行带有段地址的指令时,都会去确认一下 GDT中的设置,以便判断接下来要执行的 JMP指令到底是普通的 far-JMP,还是任务切换。也就是说,从汇编程序翻译出来的机器语言来看,普通的 far-JMP和任务切换的 far-JMP,指令本身是没有任何区别的。

  好了,枯燥的讲解就到这里,让我们实际做一次任务切换吧。我们准备两个任务:任务 A和任务B,尝试从 A切换到B。

  

  现在两个TSS都创建好了,该进行实际的切换了。

  我们向TR寄存器存入3 * 8这个值,这是因为我们刚才把当前运行的任务定义为 GDT的3号。 TR寄存器以前没有提到过,它的作用是让 CPU记住当前正在运行哪一个任务。当进行任务切换的时候,TR寄存器的值也会自动变化,它的名字也就是“ task register”(任务寄存器)的缩写。我们每次给 TR寄存器赋值的时候,必须把 GDT的编号乘以 8,因为英特尔公司就是这样规定的。如果你有意见的话,可以打电话找英特尔的大叔投诉哦(笑)。

  给TR寄存器赋值需要使用 LTR指令,不过用 C语言做不到。唉,各位是不是都已经见怪不怪了啊?啥?你早就料到了?(笑)所以说,正如你所料,我们只能把它写进 naskfunc.nas里面。






  对了,LTR指令的作用只是改变 TR寄存器的值,因此执行了 LTR指令并不会发生任务切换。要进行任务切换,我们必须执行 far模式的跳转指令,可惜 far跳转这事 C语言还是无能为力,这种语言还真是不方便啊。没办法,这个函数我们也得在 naskfunc.nas里创建。



  也许有人会问,在 JMP指令后面写个 RET有意义吗?也对,通常情况下确实没意义,因为已经跳转到别的地方了嘛,后面再写什么指令也不会被执行了。不过,用作任务切换的 JMP指令却不太一样,在切换任务之后,再返回这个任务的时候,程序会从这条 JMP指令之后恢复运行,也就是执行JMP后面的RET,从汇编语言函数返回,继续运行 C语言主程序。

  另外,如果 far-JMP指令是用作任务切换的话,地址段(冒号前面的 4*8的部分)要指向 TSS这一点比较重要,而偏移量(冒号后面的 0的部分)并没有什么实际作用,会被忽略掉,一般来说像这样写 0就可以了。

  现在我们需要在 HariMain的某个地方来调用 taskswitch(),可到底该写在哪里呢?唔,有了,就放在显示“ 10[sec]”的语句后面好了。也就是说,程序启动 10秒以后进行任务切换。



大功告成了?不对,我们还没准备好 tss_b呢。在任务切换的时候需要读取 tss_b的内容,因此我们得在TSS中定义好寄存器的初始值才行。




  乍看之下,貌似会有很多看不懂的地方吧,我们从后半段对寄存器赋值的地方开始看。这里我们给cs置为GDT的2号,其他寄存器都置为 GDT的1号,asmhead.nas的时候也是一样的。也就是说,我们这次使用了和bootpack.c相同的地址段。当然,如果你用别的地址段也没问题,不过这次我们只是想随便做个任务切换的实验而已,这种麻烦的事情还是以后再说吧。

  继续看剩下的部分,关于 eflags的赋值,如果把 STI后的EFLAGS的值通过 io_load_eflags赋给变量的话,该变量的值就显示为 0x00000202,因此在这里就直接使用了这个值,仅此而已。如果还有看不懂的地方,大概就是 eip和esp的部分了吧。

。。。。。。

 在eip中,我们需要定义在切换到这个任务的时候,要从哪里开始运行。在这里我们先把 task_b_main这个函数的内存地址赋值给它。



  这个函数只执行了一个 HLT,没有任何实际作用,后面我们会对它进行各种改造,现在就先这样吧。

  task_b_esp是专门为任务 B所定义的栈。有人可能会说,直接用任务 A的栈不就好了吗?那可不行,如果真这么做的话,栈就会混成一团,程序也无法正常运行。



  总之先写成这个样子了。我们为任务B的栈分配了64KB的内存,并计算出栈底的内存地址。
请各位回忆一下向栈PUSH数据(入栈)的动作,ESP中存入的应该栈末尾的地址,而不是栈开
头的地址。

  好了,我们已经讲解得够多了,现在总算是万事俱备啦,马上“make run”一下吧。这个程
序如果运行正常的话应该是什么样子呢?嗯,启动之后的10秒内,还是跟以前一样的,10秒一到便执行任务切换,task_b_main开始运行。因为task_b_main只有一句HLT,所以接下来程序就全部停止了,鼠标和键盘也应该都没有反应了。

  唔……这样看起来好像很无聊啊,算了,总之我们先来“make run”吧。10秒钟的等待还真
是漫长……哇!停了停了!

  看来我们的首次任务切换获得了圆满成功。

分享到:
评论

相关推荐

    30天自制操作系统综合大设计harib12g.zip

    30天自制操作系统最后的实验验收,将近两千行的代码,两点在于开机动画的帧数多,密码,双击,时钟绘制的好看,直线的绘制,可以用拖动的方式绘制矩形,还可以通过输入的方式改变绘制的大小,以及窗口颜色来改变颜色

    harib11i.rar

    本程序是修改原书30天自制操作系统第14天中的最后一个代码,增加了一些自己的图层,实现了五子棋人机对战、时钟计时、开机动画等功能。

    harib02e.zip

    纸娃娃操作系统源代码,可打开!cons_nt.bat后输入make run运行,可改编(这个就是改编的,原作者是川合秀实,原作是纸娃娃系统,增加了一些功能)。

    满意度调查行·知dr.pptx

    满意度调查行·知dr.pptx

    基于B2C的网上拍卖系统_秒杀与竞价.zip

    基于B2C的网上拍卖系统主要用于帮助人们应用互联网方便快捷买到自己所中意的商品,并参与到秒杀与竞拍当中。 主要功能包括: 1.前台模块 (1)普通用户登录/注册。 (2)分类查看商品(普通商品与促销商品) (3)查看商品详细信息 (4)查看秒杀商品 (5)查看竞拍商品 (6)将商品加入购物车 (7)购买,结算功能 (8)留言 2.后台模块 (1)修改密码 (2)商品管理: -- 编辑/删除 -- 设置/取消促销 (3)秒杀商品:设置/取消秒杀 (4)竞拍商品:设置/取消竞拍 (5)订单管理:查看订单 (5)留言管理:查看/删除留言 项目访问路径: 前台:http://localhost:8080/sale 后台:http://localhost:8080/sale/user/adminlogin

    分布式系统中Java后端开发技术及其应用实践.pdf

    分布式系统的核心思想是复杂计算任务的拆分与并行计算,可有效减少计算时间、节约算力成本。以分布式系统中Java后端开发技术的应用为主题,分析分布式系统开发的需求,探讨Java技术栈、分布式监控与日志管理、云服务模型在分布式系统Java后端开发中的应用路径,旨在为分布式系统的设计与实现提供全面的理论分析和实践指导,以支持构建高效、稳定、可扩展的企业级Java应用。 随着云计算、大数据和人工智能技术的飞速发展, 分布式系统已成为支撑现代企业信息系统的基础架构。 Java 后端开发技术在构建分布式系统中扮演着至关重要的 角色,其应用价值和研究重点主要集中在微服务架构、容 器化技术、自动化部署、服务网格、无服务器计算、应用 程序编程接口(Application Programming Interface, API)管理、数据一致性解决方案、分布式缓存、负载均衡、 复杂事件处理和分布式事务管理等方面[1]。Java平台以 其成熟的生态系统、跨平台的移植性、丰富的开源框架 和库以及稳定的性能,为分布式系统的开发提供了坚实 的基础[2]。深入探讨Java后端开发技术在分布式系统中 的应用实践,旨在为企

    【微信小程序毕业设计】书店系统开发项目(源码+演示视频+说明).rar

    【微信小程序毕业设计】书店系统开发项目(源码+演示视频+说明).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频-编号:246】 https://pan.quark.cn/s/cb634e7c02b5 【实现功能】 用户信息管理,图书信息管理,图书类型管理,图书留言管理,论坛信息管理等

    使用Spring in Guice和Guice in Spring的工具(高分项目).zip

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、高效的企业级应用。 1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以简化开发过程、提高代码的可维护性和可测试性。 2. Spring MVC框架:Spring MVC是基于Spring框架的Web框架,用于开发Web应用程序。它采用MVC(Model-View-Controller,模型-视图-控制器)的架构模式,将应用程序分为模型层、视图层和控制器层,提供了处理请求、渲染视图和管理流程的功能。 3. MyBatis框架:MyBatis是一个持久层框架,用于与数据库进行交互。它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程

    小程序-61-微信小程序的学生选课系统--LW-源码.zip

    提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    【前端素材】大数据-010电商物流.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    微信小程序源码 拼音查询小程序 (源码下载 +内附使用说明)

    **微信小程序源码 —— 拼音查询小程序:轻松掌握汉字发音** 对于语言学习者和教育工作者来说,一个实用的拼音查询工具是不可或缺的。我们特别推出了一款微信小程序源码 —— 拼音查询小程序,它能够帮助用户快速查找汉字的拼音和声调,是学习和教学的好帮手。 **核心功能**: - **汉字转拼音**:输入汉字,即可获取准确的拼音和声调。 - **智能搜索**:支持模糊匹配,快速定位用户查询的汉字。 - **多音字识别**:为多音字提供所有正确的拼音选项,方便用户选择。 **源码特点**: - **易于集成**:源码下载后,可以轻松集成到您的微信小程序项目中。 - **高度可定制**:源码开放,允许开发者根据需求进行定制和功能扩展。 - **详细文档**:内附的使用说明文档,帮助您快速理解如何使用和修改源码。 **应用场景**: - **语言学习**:适合汉语学习者练习和纠正汉字发音。 - **教学辅助**:教师可以用于课堂教学,帮助学生掌握正确的拼音。 - **自主学习**:个人用户可以自主查找生僻字或多音字的准确拼音。

    毕业设计-使用 Github Actions 跟踪 Github 趋势项目.zip

    这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有很大的帮助。到时候你会回来感谢我的。 本资源是经过本地编译测试、可打开、可运行的项目、文件或源码,可以用于毕业设计、课程设计的应用、参考和学习需求,请放心下载。 祝愿你在这个毕业设计项目中取得巨大进步,顺利毕业! 但还需强调一下,这些项目源码仅供学习和研究之用。在使用这些资源时,请务必遵守学术诚信原则和相关法律法规,不得将其用于任何商业目的或侵犯他人权益的行为。对于任何因使用本资源而导致的问题,包括但不限于数据丢失、系统崩溃或安全漏洞,风险自担哦!

    【前端素材】大数据-突发预警平台实时监控.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    小程序-46-驾校报名小程序--LW-源码.zip

    提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    基于STM32的Holocubic透明桌面站

    基于STM32的Holocubic透明桌面站 基于STM32的Holocubic透明桌面站

    015ssm-jsp-mysql文物管理系统.zip(可运行源码+数据库文件+文档)

    L文主要是对文物管理系统进行了介绍,包括研究的现状,还有涉及的开发背景,然后还对系统的设计目标进行了论述,还有系统的需求,以及整个的设计方案,对系统的设计以及实现,也都论述的比较细致,最后对文物管理系统进行了一些具体测试。 本文以JSP为开发技术,实现了一个文物管理系统。文物管理系统的主要使用者分为管理员;个人中心、用户管理、文物分类管理、文物信息管理、文物外借管理、文物维修管理、留言板管理、论坛交流、系统管理,用户前台;首页、文物信息、论坛交流、文物资讯、留言反馈、我的、跳转到后台等功能。通过这些功能模块的设计,基本上实现了整个文物管理系统的过程。 具体在系统设计上,采用了B/S的结构,同时,也使用JSP技术在动态页面上进行了设计,后台上采用Mysql数据库,是一个非常优秀的文物管理系统。 关键词 :文物管理系统;JSP技术;Mysql数据库;B/S结构

    【微信小程序毕业设计】课程答疑系统开发项目(源码+演示视频+说明).rar

    【微信小程序毕业设计】课程答疑系统开发项目(源码+演示视频+说明).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频-编号:161】 https://pan.quark.cn/s/cb634e7c02b5 【实现功能】 本课程答疑微信小程序设计与实现有管理员,教师,学生。管理员功能有个人中心,学生管理,教师管理,课程类型管理,课程视频管理,作业信息管理,作业提交管理,提问信息管理,提问回答管理,系统管理等。教师可以发布课程,发布作业,学生可以提交作业,查看课程等。

    node-v12.22.12-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于python的-4-宾馆管理系统--LW-源码.zip

    提供的源码资源涵盖了python应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    算法中的动态规划讲义.pptx

    数学模型算法

Global site tag (gtag.js) - Google Analytics