第一章 操作系统绪论

也可看视频看几个重点大题:https://www.bilibili.com/video/BV18X4y1u7aU

单道、多道非抢占式和多道抢占式

有三个程序ABC,它们使用同一个设备进行I/O操作,按ABC的优先次序执行。请分别画出单道程序环境、多道非抢占式和多道抢占式程序环境下,它们运行的时间关系图,并比较它们的总运行时间。

并发程序运行结果

2.

第二章 进程的描述与控制

进程的三种基本状态

(1) 就绪(Ready)状态

(2) 执行(Running)状态

(3) 阻塞(Block)状态。

进程的五种基本状态和转换

具有创建、终止和挂起状态的进程状态图

例:下列选项中,会导致进程从执行态变为就绪态的事件是( D )

A. 执行P操作 B. 申请内存失败 C. 启动I/O设备 D. 被高优先级进程抢占

解析:启动I/O操作会让进程从执行状态转为阻塞状态;当一个进程被高优先级的进程抢占时,该进程直接由执行态转为就绪态。

例:下列选项中,可能导致当前进程P阻塞的事件是( A,B )

A. 进程P申请临界资源 B. 进程P从磁盘读数据 C. 系统将CPU分配给高优先权的进程 D. 上述答案都对

解析:答案A,B,A和B都是申请资源的,容易发生阻塞,C只会让进程进入就绪队列,等高优先级的进程退出CPU时P仍可获得CPU

进程同步

例1:有三个进程PA、PB和PC协作解决文件打印问题。PA将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;:PB将缓冲区1的内容复制到缓冲区2中,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小与记录大小一样。请用信号量来保证文件的正确打印。

例2:桌上有个能盛得下五个水果的空盘子。爸爸不停地向盘中放苹果或桔子,儿子不停地从盘中取出桔子吃,女儿不停地从盘中取出苹果吃。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿这三个循环进程之间的同步。

例3:请用信号量机制解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。

解:同一方向的行人可以同时过桥,这相当于读者可以同时读。因此,可将两个方向的行人看作两类不同的读者,同类读者(行人)可以同时读(过桥),但不同类读者(行人)之间必须互斥地读(过桥)。信号量定义如下:

int countA=0, countB=0; //countA、countB分别表示A、B两个方向过桥的行人数量

Semaphore bridge=1; //用来实现不同方向行人过桥的互斥共享

Semaphore mutexA=1, mutexB=1; //分别用来实现对countA、countB的互斥共享

A方向的所有行人对应相同的算法,他们的动作可描述为:

PA(){

Wait(mutexA);

If(countA==0) wait(bridge);

countA++;

signal(mutexA);

过桥;

Wait(mutexA);

countA–;

if(countA==0) signal(bridge);

signal(mutexA);}

B方向行人的算法与上述算法类似,只需将其中的mutexA、countA换成mutexB和countB即可。

例4:设有两个生产者进程A、B和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售者销售;销售者每次循环从仓库中取出一个产品进行销售。不允许同时入库,也不允许边入库边出库;而且要求生产A产品和B产品的件数满足以下关系:-n<=A的件数-B的件数<=m,其中n、m是正整数,但对仓库中A产品和B产品的件数无上述要求。请用信号量机制写出A、B、C三个进程的工作流程。

解:题中存在着以下的同步和互斥关系:

(1)生产者A、B和消费者C之间,不能同时将产品入库和出库,仓库是一个临界资源。

(2)两个生产者之间必须进行同步,当生产A、B产品的件数之差>=m时,生产者A必须等待;当生产A、B产品的件数之差<=-n时,生产者B必须等待。可想象成有两种令牌,分别跟允许A和B生产的产品数量相关,A和B必须取得对应的令牌后才能生产产品,故这两类令牌也就是两种临界资源。

(3)生产者和销售者之间也必须取得同步,只有当生产者生产出产品并入库后,销售者才能进行销售。

根据上述分析,信号量定义如下:

为了互斥地入库和出库,为仓库设置互斥信息量,mutex=1;为了使生产的产品件数满足:-n<=A的件数-B的件数<=m,需设置两个信号量,其中SAB表示当前允许A生产的产品数量,其初值为,SAB=m;SBA表示当前允许B生产的产品数量,其初值为, SBA =n; 设置一个初值为0的资源信号量S,对应于仓库中的产品数量,S=0。 Semaphore SAB=m, SBA=n, S=0,mutex=1;

Signal(SAB)是为了让B产品的件数达到m+n。这样才会满足==-n<=A的件数-B的件数<=m==

例5:某寺庙有小和尚,老和尚若干,有一水缸,由小和尚提水入缸供老和尚饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为3个,每次入缸取水仅为1桶水,且不可同时进行。试给出有关从缸取水、入水的算法描述。

第三章 处理机调度与死锁

FCFS(先来先服务)进程调度


SJF(短作业优先)进程调度

SRT–抢占式版的SJF

高响应比优先(HRRN)

周转时间=作业完成时刻—作业到达时刻;

带权周转时间=周转时间/服务时间;

平均周转时间=作业周转时间之和/作业个数;

平均带权周转时间=带权周转时间之和/作业个数;

先从8点开始,然后寻求运行时间最短10分钟、20分钟、50分钟

第二个进程8点50进入-第一个进程却要10点才结束,需要等待70分钟,要求服务时间则为运行时间50分钟

作业、进程调度

例:有一个内存中只能装入两道作业的批处理系统,作业调度采用短作业优先的调度算法,进程调度采用以优先数为基础的抢占式调度算法。有如下表所示的作业序列,表中所列的优先数是指进程调度的优先数,且优先数越小优先级越高。求:

(1)列出所有作业进入内存的时刻以及结束的时刻。

(2)计算作业的平均周转时间。

作业名 到达时间 估计运行时间 优先数
A 10:00 40分 5
B 10:20 30分 3
C 10:30 50分 4
D 10:50 20分 6

例:假设一个系统中有5个进程,它们的到达时间和服务时间如下表所示,忽略I/O以及其他开销时间,若分别按FCFS、非抢占及抢占的短作业优先(SIF)、高响应比优先(HRRN)、时间片轮转(RR,时间片=1)、多级反馈队列调度算法(FB, 第i级队列的时间片=2i-1)以及立即抢占的多级反馈队列调度算法(FB, 第i级队列的时间片=2i-1)进行CPU调度,请给出各进程的完成时间、周转时间、带权周转时间、平均周转时间和平均带权周转时间。

进程 到达时间 服务时间
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2

最低松弛度优先LLF

例:若有3个周期性任务,任务A要求每20ms执行一次,执行时间为10ms;任务B要求每50ms执行一次,执行时间为10ms;任务C要求每50ms执行一次,执行时间为15ms。应如何按最低松弛度优先算法对它们进行CPU调度?

松弛度=完成时间-当前时间-执行时间

银行家算法

例. 假定系统中有五个进程{P0, P1, P2, P3, P4}和三类资源{A, B, C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况如图3-15所示。

(1)  T0时刻的安全性:利用安全性算法对T0时刻的资源分配情况进行分析(如图3-16所示)可知,在T0时刻存在着一个安全序列{P1, P3, P4, P2, P0},故系统是安全的。

​ 图3-16 T0时刻的安全序列

​ (2)  P1请求资源:P1发出请求向量Request1(1, 0, 2),系统按银行家算法进行检查:① Request1(1, 0, 2)≤Need1(1, 2, 2);② Request1(1, 0, 2)≤Available1(3, 3, 2);③ 系统先假定可为P1分配资源,并修改Available,Allocation1和Need1向量,由此形成的资源变化情况如图3-15中的圆括号所示;④ 再利用安全性算法检查此时系统是否安全,如图3-17所示。

图3-17 P1申请资源时的安全性检查

(3)  P4请求资源:P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:① Request4(3,3,0)≤Need4(4,3,1);② Request4(3,3,0)>Available(2,3,0),让P4等待。(4)  P0请求资源:P0发出请求向量Request0(0,2,0),系统按银行家算法进行检查:① Request0(0,2,0)≤Need0(7,4,3);② Request0(0,2,0)≤Available(2,3,0);③ 系统暂时先假定可为P0分配资源,并修改有关数据,如图3-18所示。

​ 图3-18 为P0分配资源后的有关资源数据

(5) 进行安全性检查:可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。

第四章 存储器管理

伙伴地址

例1:假设系统中某一内存块的地址为011011110000,块的大小为4和16的伙伴地址分别为多少?

解:块为2k=4时,011011110000=1776可以被8整除,所以伙伴地址位于下半区,运用公式x+4 再转为2进制 是011011110100;

块为16时,011011110000不能被32整除,所以伙伴地址位于上半区,减16得011011100000。

例2:某系统主存空间为1024KB,采用伙伴(Buddy system)系统分配其内存,对于下列请求序列:作业1请求240KB、 作业2请求120KB、作业3请求60KB、作业2释放120KB、作业4请求130KB、作业3释放60KB。请画出进行上述分配和回收后,内存实际使用的情况。

将主内存空间进行持续对半划分,将最接近240k的较大空闲块划分为两个大小相等的块,则得到图(a)

同理能得到图(b)、图©

图(d)进行了两次操作,一个是作业4请求130KB和作业2释放120KB

图(e)进行了相邻的空闲块可以和为一对伙伴,能合成一个更大的空闲块也就是128KB+60KB+64KB+内部碎片=0

分页存储管理方式

例3:某系统采用页式存储管理策略,拥有逻辑空间32页,每页2KB,拥有物理空间1MB。请回答以下问题:(1)画出逻辑地址的格式。 (2)若不考虑访问权限等,进程的页表有多少项?每项至少有多少位?

解: (1) 该系统拥有逻辑空间32页,故逻辑地址中页号必须用5位来描述;而每页为2KB,因此,

页内地址必须用 2KB=211 ,所以是11位来描述,

页号是32个页面—》25=32,所以页号是5位来描述,

拥有的物理空间(内存)为1MB=210KB=220B,所以有20位,不足的往位数的前面补零。

​ (2) 每个进程最多有32个页面。因此,进程的页表项最多为32项;若不考虑访问权限等,则页表项中只需给出页所对应的物理块块号,1MB的物理空间可分为29个内存块(1MB/2kB==用物理空间除以页的大小所得内存块的数量),故每个页表项至少有9位。

例4:在某一分页系统中,假设内存大小为2GB,页面大小为4KB,页表项长度为4B,试求: (1)整个内存可以被划分成多少个页面?(2)页表的长度为多少?

解: (1) 2GB/4KB=512K个页面 因为单位变成了个,所以有1K=1024个,所以有512k个

​ (2) 4B*512K=2M

例5:对一个将页表放在内存中的分页系统。试求:(1)如果访问内存需要0.2ns,有效访问时间为多少?(2)如果加一快表,且假定在快表中找到页表项的机率高达90%,则有效访问时间又是多少?(假定查快表需花费的时间为0)

解:(1) 有效访问时间为:2X0.2ns=0.4ns
(2) 有效访问时间为:0.9X0.2+(1-0.9)X2X0.2=0.22ns

例6:已知某系统页面长4KB,每个页表项4B,采用多层分页策略映射64位的用户地址空间。若限定最高层页表只占1页,问它可采用几层分页策略?

解:该系统的用户地址空间为264B,而页的大小为4KB,故一作业最多可有264/212(即252)个页,其页表的大小则为252*4(即254)B。因此,又可将页表分成242个页表项,并为它建立两级页表,两级页表的大小为244B。
依次类推,可知道它的3、4、5、6级页表的大小(长度)分别为234B、224B、214B、24B,故可采取6层分页策略。

例7:已知某分页系统,主存容量为64K字节,页面大小为1K,对一个4页大的作业,其0、1、2、3页分别被分配到主存的2、4、6、7块中,试求:(1)将十进制的逻辑地址1023、2500、4500转换成物理地址。(2)以十进制的逻辑地址1023为例画出地址变换过程图。

解:在分页系统中进行地址转换时,地址变换机构将自动把逻辑地址转化为页号和页内地址,如果页号不小于页表长度,则产生越界中断;否则便以页号为索引去检索页表,从中得到对应的块号,并把块号和页内地址分别送入物理地址寄存器的块号和块内地址字段中,形成物理地址。

分段存储管理方式

例8:对于如下所示的段表,请将逻辑地址(0, 137),(1, 4000),(2, 3600),(5, 230)转换成物理地址。

段号 内存始址 段长
0 50K 10K
1 60K 3K
2 70K 5K
3 120K 8K
4 150K 4K

段页式存储管理方式

第五章 虚拟存储器

请求分段系统

例1:某虚拟存储器的用户空间共有32个页面,每页1KB,主存16KB。假定某时刻系统为用户的第0、1、2、3页分配的物理块号为5、10、4、7,而该用户作业的长度为6页,试将十六进制的虚拟地址0A5C、103C、1A5C转换成物理地址。

第一步进制转换:
16进制转二进制:
0A5C=0000 10 10 0101 1100
103C=0001 00 00 0011 1100
1A5C=0001 10 10 0101 1100

第二步确定页号和页内地址:
页内地址为:1kb=210B,所以取后十位:10 0101 1100、00 0011 1100、10 0101 1100

页号为:32=25,所以取前五位:00010、00100、00110

第四步页号变块号页内地址不变

00010=2页==》块号为4=0100

00100=4页==》没有对应的物理块号,越界中断。

00110=6页=》没有对应的物理块号,越界中断。

第五步确定物理地址的位数

16KB=214B,所以总位数为14位

前4位0100 后十位1001011100 ==》01 0010 0101 1100

先进先出(FIFO)页面置换算法

最近最久未使用(LRU)页面置换算法

例2:在一采取局部置换策略的请求分页系统中,分配给某个作业的内存块数为4,其中存放的四个页面的情况如下表所示:

物理块 页号 装入时间 最后一次访问时间 访问位 修改位
0 2 60 157 0 1
1 1 160 161 1 0
2 0 26 158 0 0
3 3 20 163 1 1

表中的所有数字均为十进制数,所有时间都是从进程开始运行时,从0开始计数的时钟数。请问,如果系统采用下列置换算法,将选择哪一页进行换出?(1)FIFO算法;(2)LRU算法;(3)改进的Clock算法。

分析:FIFO算法即先进先出算法,它选择最先装入内存的页面进行换出;LRU算法即最近最久未用置换算法,它选择最近最长时间没被使用的页面进行换出;改进的Clock算法是一种常用的LRU近似算法,它优先选择访问位和修改位均为0的页面进行换出。

答:(1)FIFO算法选择的换出页是物理块3中的第3页。

(2)LRU算法选择的换出页是物理块0中的第2页。

(3)改进的Clock算法选择的换出页是物理块2中的第0页。

例3:这里有点算错了

地址变换机构

例7 假如一个程序的段表如下表所示,其中存在位为1表示段在内存,存取控制字段中W表示可写,R表示可读,E表示可执行。对下面的指令,在执行时会产生什么样的结果?

(1)STORE R1,[0,70] R1寄存器 ,0是段号,70是地址

(2)STORE R1,[1,20] STORE 写(存储)

(3)LOAD R1,[3,20] LOAD读(加载)

(4)LOAD R1,[3,100]

(5)JMP [2,100] JMP执行

段号 存在位 内存始址 段长 存取控制 其他信息
0 0 500 100 W
1 1 1000 30 R
2 1 3000 200 E
3 1 8000 80 R
4 0 5000 40 R

答:(1)该指令从段表的第0项可读出第0段的存在位为0,表示相应段未装入内存,因此,地址变换机构将产生缺段中断,以请求OS将其调入内存。

(2)该指令从段表的第1项可以看出,虽然指令中的逻辑地址合法、段也在内存,但该指令对内存的访问方式(写)与存取控制字段(只读)不符,因此,硬件将产生保护性中断信号。

(3)该指令从段表的第3项可以看出,逻辑地址合法,访问方式合法,形成物理地址8020(8000+20)后,指令将把该单元的内容读到寄存器R1中。

(4)该指令从段表的第3项可读出第3段的存在位为1,内存始址为8000,段长为80,存取控制为R,因此,指令的逻辑地址中段内地址超过了段长,地址变换机构将产生越界中断信号。

(5)该指令从段表的第2项可读出第2段的存在位为1,内存始址为3000,段长为200,访问权限为E,因此逻辑地址与访问方式合法,形成物理地址3100(3000+100) ,指令执行后,将跳转到内存单元3100处继续执行。

第六章 输入输出系统

单、双缓冲区

例1:假设 T 是从磁盘输入一块数据的时间,C 是CPU对一块数据进行处理的时间, M 是将一块数据从缓冲区传送到用户去的时间。当一用户进程要按顺序访问的方式处理大量数据时,请问在单缓冲和双缓冲的情况下,系统对一块数据的处理时间分别是多少?

单缓冲:Max(C,T)+M

双缓存:Max(T,C)或者Max(C+M,T)

磁盘容量

例2:一个拥有6个磁头(3个圆盘),7个柱面的磁盘,每条磁道有12个扇区,则磁盘的容量是多少?

​ 磁盘容量=磁头数 X 磁道(柱面)数 X 每道扇区数 X 每扇区字节数

磁盘容量=6x7x12x

校验码

例子:假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,求出二进制序列10110011的CRC校验码。

解:(1)首先把生成多项式转换成二进制数,由G(X) = X4 + X3 + 1可以知道,它一共是5位(总位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个二进制的第4位、第3位、第0位的二进制均为1,其它位均为0)很快就可得到它的二进制比特串为11001。

(2)因为生成多项式的位数为5,可知CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以生成多项式(异或运算),得到的余数,即CRC校验码为0100,如下图所示。

磁盘调度

例4:假设磁盘有200个磁道,磁盘请求队列中是一些随机请求,它们按照到达的次序分别处于190、10、160、80、90、125、30、20、140、25号磁道上,当前磁头在100号磁道上,并正由外向里移动。请给出按FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(扫描算法(电梯算法))及CSCAN(循环扫描算法(以100为界限从小到大))算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。

FCFS SSTF SCAN CSCAN
被访问的下一个磁道号 移动的磁道数 被访问的下一个磁道号 移动的磁道数 被访问的下一个磁道号 移动的磁道数 被访问的下一个磁道号 移动的磁道数
190 90 90 10 125 25 125 25
10 180 80 10 140 15 140 15
160 150 125 45 160 20 160 20
80 80 140 15 190 30 190 30
90 10 160 20 90 100 10 180
125 35 190 30 80 10 20 10
30 95 30 160 30 50 25 5
20 10 25 5 25 5 30 5
140 120 20 5 20 5 80 50
25 115 10 10 10 10 90 10
平均寻道长度88.5 平均寻道长度31 平均寻道长度27 平均寻道长度35

操作系统复习(第四版)--命中期末考试所有大题相关推荐

  1. 操作系统(第四版)期末复习总结(上)

    很多小伙伴私信要word下载,我就整理出来了一份pdf,是和线上的完全一样,建议大家看线上的,因为pdf下载需要收费,但是下载有好处就是可以打印出来复习,各位伙伴自行选择吧.现在这里给出pdf完整下载 ...

  2. 操作系统-复习-考题预测及解析-期末考试(南航)

    文章目录 考题预测及解析 考点 概述部分 进程部分 内存管理部分 磁盘调度 文件系统 IO相关部分 系统调用部分 考题预测及解析 首先声明一点: 从长远角度看,前面博客中讲的研究思路更重要! 从考试角 ...

  3. 软件体系结构期末考试复习题(题中页码 与软件体系结构原理、方法与实践第2版 张友生编著 匹配)

    软件体系结构期末考试复习题(题中页码 与软件体系结构原理.方法与实践第2版 张友生编著 匹配) 一.选择题← 不属于软件体系结构的核心模型的最基本的元素是 A构件   B连接件   C配置   D角色 ...

  4. 计算机操作系统(第四版)

    计算机操作系统(第四版) 引论 目标:方便性,有效性,可扩展性,开放性 作用 用户与计算机硬件系统之间的接口 计算机系统资源的管理者 对计算机资源的抽象 发展动力 不断提高计算机资源利用率 方便用户 ...

  5. 现代操作系统英文第四版课后习题答案——第二章

    @T现代操作系统第四版参考答案 现代操作系统英文第四版第二章参考答案--进程 先更新第二章的答案,习惯中文的童鞋请左转百度翻译 Solution for chapter 2 The transitio ...

  6. 小学四年级计算机上册考试试题,小学四年级信息技术期末考试试题及答案

    <小学四年级信息技术期末考试试题及答案>由会员分享,可在线阅读,更多相关<小学四年级信息技术期末考试试题及答案(3页珍藏版)>请在人人文库网上搜索. 1.四年级信息技术期末笔试 ...

  7. 小学计算机年考试题目,(完整版)小学四年级信息技术期末考试试题及答案

    小学四年级<信息技术>期末考试试卷 小学四年级<信息技术>期末考试试卷 考试时间:40 分钟 (笔试*50% +上机*50%) 一.选择题(每题 5 分 ,共 70 分) 1. ...

  8. c语言期末考试压轴编程题——猜凶手、猜名词、喝汽水、水仙花数

    目录 C语言大一期末必考压轴编程题 几道C语言初阶学习必考题,尤其最后一道打印水仙花数,C语言期末考试必备大题,不要错过!!! 以下个人思路仅供参考,如有更优算法,欢迎评论! 目录 一.猜凶手 题目: ...

  9. 复旦大学2016--2017学年第二学期(16级)高等代数II期末考试第七大题解答

    七.(本题10分)  设 $n$ 阶复方阵 $A$ 的特征多项式为 $f(\lambda)$, 复系数多项式 $g(\lambda)$ 满足 $(f(\lambda),g'(\lambda))=1$. ...

最新文章

  1. Alpine?Distroless?Busybox?到底谁才是容器镜像的瑞士军刀?
  2. 即日起更新机器学习相关博客
  3. jzoj1751-Span(每日C组)【并查集,贪心】
  4. hibernate jpa_JPA / Hibernate实体状态转换的初学者指南
  5. java从1开始计时用线程_java – Python – 线程,计时或函数使用?
  6. 乐学python_铁乐学python_day01-作业
  7. 信息学奥赛C++语言:数字三角形2
  8. Nginx+Tomcat搭建集群环境
  9. stm32正交编码器 原理图_ROS机器人平台STM32底层控制部分
  10. 爬虫-相关库知识整理(更新)
  11. 使用Html5+C#+微信 开发移动端游戏详细教程 :(二)准备工作开发环境
  12. matplotlib中subplot的各参数的作用
  13. 【牛客网SQL篇】SQL必知必会
  14. java sql 字符串_java用字符串拼接SQL语句的特殊字符转义问题
  15. python开发一个PC屏幕监控软件(2000块的道德底线)
  16. 用scratch编程打字游戏
  17. 显示计算机101代码,电脑出现蓝屏故障101停机码,怎么解决问题
  18. 微信dat转码-微信数据库解密-dat批量查看
  19. maven核心,pom.xml详解
  20. 2021年熔化焊接与热切割试题及解析及熔化焊接与热切割模拟试题

热门文章

  1. 【HTTP】如何避免OPTIONS请求?
  2. js 鼠标移动和离开
  3. 【SpringBoot应用篇】SpringBoot+Redis实现接口幂等性校验
  4. 最适合微商的直播平台——微信直播
  5. 卡尔曼滤波算法的五大核心公式含义
  6. 读取和博客可视化分析
  7. Android TabLayout修改指示器宽度方案汇总
  8. java-php-python-ssm计算机网络精品课程网站计算机毕业设计
  9. 大学图书馆空间再造与服务创新研究
  10. 小程序扫码在线点餐系统源码开源分享