1.实践基础要求
以计算机操作系统原理为指导,利用面向对象程序设计技术仿真 OS 内核的作业管理、连续内存管理、页式虚存管理、进程同步与互斥、Spooling 系统的 API 功能,可视化显示操作系统的工作过程。
1.1 裸机硬件仿真设计的基础要求
(1)基础硬件部件
CPU、内存、时钟中断、输入输出设备中断、地址变换机构(MMU)、外存缓冲区;
◆ 扩展硬件部件:缺页中断;
(2) CPU 与寄存器的仿真设计
◆ CPU 可抽象为一个类,名称:CPU2023。
◆ 关键寄存器可抽象为类的属性,至少包括:程序计数器(PC)、指令寄存器(IR)、 状态寄存器(PSW)等,寄存器内容的表示方式自行设计,需要在实践报告中说明。
需要实现 CPU 现场保护、现场恢复操作,封装为 CPU 类的方法,供进程切换、CPU 模式切换方法调用。
方法函数的名称须统一,入口出口参数自行定义:
◆ CPU-PRO():CPU 现场保护函数;
◆ CPU-REC():CPU 现场恢复函数;
(3)系统时钟中断仿真
计算机系统使用统一时钟计时;
◆ 设计一个时钟线程类,名称:Clock_thread
◆ 该类中设计一个共享属性变量,名称:COUNTTIME,整型,单位:秒(s) 每 1 秒激活该线程计时,COUNTTIME+1 操作。
(4)作业请求的中断仿真
假设计算机每 10 秒(s)查询一次外部是否有新作业的执行请求,在“并发作业请求文件” 中判读是否有新进程请求运行。
◆ 设计一个作业请求查询线程类,名称:JobIn_thread;
◆ 作业请求判读函数,名称:CheckJob():
功能:每 10 秒激活该线程,利用 COUNTTIME 变量判断“并发作业请求文件”是否有新进程请求;如果有,进入后备队列;如果没有,空操作;
(5)进程调度的中断仿真
假设计算机 CPU 在 1 秒(s)发生一次时钟硬件中断;可以执行 1 条指令。
假设进程调度的基础算法均为时间轮转法,在此基础上可以叠加静态或者动态特点,或 者叠加静态或者动态优先权法;或者叠加多级反馈调度算法;
◆ 初始静态时间片大小:Times=3 秒
◆ 设计一个进程调度算法线程类,名称:ProcessScheduling_thread
线程激活时长:1 秒,也就是 1 秒发生一次调度中断信号,每次 Times-1;
◆ 调度时间函数,名称:CheckSchedulingTime():
功能:以初始静态时间片大小为基础单元,根据选题设计具体对时间片大小 Times
1
重新赋值,当 Times=0 时发生进程调度;
◆ 进程调度函数,名称:ProcessScheduling(): 功能:根据所选题目的调度算法实现调度;
(6)输入/输出中断事件仿真
仿真 I/O 中断。分别设计两个线程
◆ InputBlock_thread 类:阻塞队列的唤醒线程。外设输入变量造成进程进入阻塞态,如键盘给变量赋值;
◆ OutputBlock_thread 类:阻塞队列的唤醒线程。外设输出变量造成进程进入阻塞态, 如显示器显示;
(7)缺页中断事件仿真
设计一个线程发出缺页中断,并实现页淘汰算法,页装入操作,完成以后唤醒缺页阻塞 队列中的进程重新进入就绪队列;
◆ 线程类名:PageInterruption-thread 类,一直处于侦听状态,收到缺页请求时被激活;
◆ 页装入操作函数,名称:PageIn()
◆ 页淘汰函数,名称:PageOut( )
(8)用户区内存
假设不考虑 OS 内核所占内存空间
◆ 用户区共 16KB,每个物理块大小 1024B,共 16 个物理块;
◆ 采用页式存储管理。将每个物理块假设为 1 页帧,共 16 页
◆ 逻辑地址(物理地址)共 14 位二进制表示,其中 4 位表示页号,10 位表示页内地址;
◆ 测试数据用十进制表示逻辑地址;
◆ 采用固定分配与局部替换策略,每个用户进程分配内存大小为 4 页(块);用户进程最高并发度为 4;
◆ 地址变换过程(MMU)需要在界面上显示并详细记录过程保存到 ProcessResults-???
-算法名称代号.txt 文件中。???表示数字,为每次运行完成所有进程的总分钟数。例如: 测试输入数据是 input1 中的数据文件,用 LZ(时间片轮转)算法完成机器调度所有作业, 总运行分钟数是 166 秒,保存进程运行输入输出以及调度过程中状态变化、统计数据等所有信息,保存到 ProcessResults-166-LZ.txt 文件,保存到 output1 子文件夹。
(9)内存缓冲区
◆ 内存缓冲区共 4KB,单缓冲,每个物理块大小 1024B,共 4 个物理块;
◆ 所有进程共享,进程通信过程中可能会出现死锁;
(10)硬盘交换区仿真
◆ 选题 1 使用,选题 2 不使用;
◆ 磁盘交换区共 16KB,每个物理块大小 1024B,共 16 个物理块;
◆ 磁盘交换区,每个进程的交换区用文件夹仿真,用“DiskExchangeArea_进程 ID”命
名;
◆ 每个用户进程创建以后分配 4 页(块)磁盘交换区,保存该进程运行时临时变量或函
数返回值的数据;
◆ 每个物理块对应一个文件,物理地址为文件名称;
◆ 每个文件是文本文件,保存物理块内容;
1.2 并发作业请求文件(jobs-input.txt)的设计
◆ 每个作业相当于用户提交给操作系统运行的可执行程序。本实验考虑作业调度、内存 分配回收,进程管理等功能;
◆ 创建 input 子文件夹,保存 jobs-input.txt 以及用户程序指令文件。本次实验有两组测试输入数据,分别放在 input1、input2 子文件中。
input1 子文件:选题 1 的同学使用;
◆ jobs-input.txt 文件格式固定,统一提供,初始 5 个作业。一行代表一个作业请求,学生测试程序时可以增加新作业条目;
◆ jobs-input.txt 文件内容: 作业序号(JobsID)
作业优先级(Priority) 作业请求时间(InTimes)
作业包含的程序指令数目(InstrucNum)
◆ 仿真程序开始运行时,开始按秒计时(不要用系统时间,用自己的计时器计时)。将jobs-input.txt 文件一次性读入一个临时数组。JobInput_thread 类每 10 秒(s)查询临时数组, 根据当前计时器时间,通过判断与作业请求时间(InTimes)(单位为秒)中请求时间的匹配程度,判断该时刻是否有作业请求。如果有,加入作业后备队列,并根据作业编号找到该作业程序指令文件(与 jobs-input.txt 文件在同一目录),并将其内容保存到相应数据结构中。
◆ 在界面上需要设计一个作业实时请求接收按钮,随时接收该时刻产生的新作业并加入 到作业后备队列;
◆ jobs-input.txt 文件举例:
3
1.3 用户程序指令文件的设计
◆ 用户程序指令文件是每个作业要执行的被编译以后的程序指令集合。每个作业的指令类型由本文档给出。
(1)作业程序的结构
作业程序包括 6 类,有语句和函数类型,统一保存在 input1 和 input2 子文件夹中。每个用户程序指令文件名用“作业序号(JobsID)”来命名。具体包括:
指令段编号(Instruc_ID)
用户程序指令的类型(Instruc_State)
用户程序指令访问的逻辑地址(L_Address)
(2)用户程序指令的类型(Instruc_State)
★本试验假设 CPU 执行用户态每段指令,在执行一段机器指令时不可以中断。
★指令段编号(Instruc_ID):作业创建进程以后,进程所执行用户程序段指令序号, 从 1 开始计数。
★根据 Instruc_State 类型,每条指令运行或者唤醒时间(InRunTimes)有确定值,不需要输入;
★用户程序指令的类型(Instruc_State)包括:
0 表示用户态计算操作语句。执行该指令需要运行时间 InRunTimes=1s。
1 表示用户态计算操作函数。执行该指令进程转向执行函数指令,需要 InRunTimes=2s。
2 表示键盘输入变量语句。发生系统调用,CPU 进行模式切换,运行进程进入阻塞态; 值守的键盘操作输入模块接收到输入变量或输出变量内容,InRunTimes=2s 后完成输入,产生硬件终端信息号,阻塞队列 1 的队头节点出队,进入就绪队列;InputBlock_thread 类在 2s 以后自动唤醒该进程;
3 屏幕输出显示语句。发生系统调用,CPU 进行模式切换,运行进程进入阻塞态;值守的屏幕显示模块输出变量内容,InRunTimes=2s 后完成显示,产生硬件终端信息号,阻塞队列 2 的队头节点出队,进入就绪队列;OutputBlock_thread 类在 2s 以后自动唤醒该进程;
4 打印操作语句。假设 InRunTimes=1s 以后拷贝打印数据到内存缓冲区,Spooling 系统完成打印任务。发出打印请求的用户作业,在打印数据拷贝到内存缓冲区以后,阻塞队列队
3 头节点出队,进入就绪队列;
5 磁盘文件读操作函数。发生进程调度, 进程进入阻塞态; 同时关中断, 假设
InRunTimes=2s 以后读完文件内容到内存缓冲区,操作系统的读文件模块负责将缓冲区数据拷贝到用户进程 PCB 区域,产生唤醒信号,阻塞队列队 4 的头节点出队,进程进入就绪队列;
6 磁盘文件写操作函数。进程进入阻塞态;同时关中断,假设 InRunTimes=2s 以后写文件数据到内存缓冲区,操作系统的写文件模块负责将缓冲区数据写入磁盘物理块,产生进程 唤醒信号,阻塞队列队 5 的头节点出队,进程进入就绪队列;
(3)用户程序指令访问的逻辑地址(L_Address)
由 input1 子文件、input2 子文件分别给出。用十进制表示。需要设计 MMU 类实现逻辑地址转换为物理地址。
L_Address 表示每个用户进程所访问的逻辑地址,需要计算页号和页内偏移。
MMU 类中需要包含名为 PageTableCreate( )函数,函数入口参数自行定义,实现页表生
成。
★如果按界面上实时作业请求按钮:可以随机在已产生的指令文件中选择一个重新执
行。
举例:
选题 1:input1 文件夹中 1 号作业的程序段指令保存在 1.txt 文件中。2 号、3 号用户作业指令段保存在 2.txt、3.txt 文件中.文件第一行为代号。
1.txt 文件内容如下:
1.4 作业运行及调度详细记录的文件保存
◆ 作业和进程调度模块用单独的线程或计时器实现。需要重点注意的是:不是每次发生时钟中断都要进行进程调度。
◆ 时间片计算:进程调度最小时间片 3s。
◆ 进程调度算法:必须完成的调度算法为静态优先数调度算法(代号 JTYX)。扩展算法在选题要求中给出。
◆ 优先数越小,优先级越高。
◆ 程序要求界面可视化显示作业请求与进程调度过程。同时将调度过程以文件形式保 存。界面显示和文件保存的信息要清晰、完整、可读;
◆ 作业调度、进程调度运行完成以后,运行记录保存到 ProcessResults-???-算法名称代号.txt 文件。???表示数字,为每次运行完成所有进程的总分钟数。例如:测试输入数据是 input1 中的数据文件,用 JTYX(静态优先数调度)算法完成机器调度所有作业,总运行分钟数是 166 秒,保存进程运行输入输出以及调度过程中状态变化、统计数据等所有信息, 保存到 ProcessResults-166-JTYX.txt 文件,该保存到 output1 子文件夹。
保存内容至少包括:进程 ID、作业到达时间、作业运行时间、作业结束时间、作业中每条指令 ID、指令内容、指令状态转换的时间、CPU 寄存器变化情况、进程 PCB 信息等状态变化信息以及进程调度的周转时间等评价类数据。本次实验与 input1、input2 子文件测试数据对应的输出文件夹分别保存 output1、output2。该文件设计需要强调可读性与可分析性。
◆ ProcessResults-???-算法名称代号.txt 文件内容的格式如下:
(1)输出包括 4 段信息,分别为:进程调度事件:内存缓冲区处理事件;井操作事件; 状态统计信息。其中,进程调度事件、状态统计信息是必须的,其他两类事件的记录需要根
5
据选题及申请成绩等级来完成。
(2)进程调度事件信息段的输出信息,每行有时间信息,按照时间顺序,记录发生进程调度事件、进程就绪队列、进程阻塞队列等的状态。
(3)每段输出信息的关键信息加半角中括号[]。批改时会对所有带有中括号的内容进行提取,不加中括号都视为无效信息。
每一行信息的具体格式如下:时间:[关键操作或状态名称:作业或进程信息,] 输出信息格式如下:
作业/进程调度事件:
0:[新增作业:作业编号,请求时间,指令数量]
1:[创建进程:进程 ID,PCB 内存块始地址,内存分配方式]
2:[进入就绪队列:进程 ID:待执行的指令数]
3:[运行进程:进程 ID:指令段编号,指令类型编号,逻辑地址, ]
4:[运行进程:进程 ID:指令段编号,指令类型编号,逻辑地址, ]
5:[运行进程:进程 ID:指令段编号,指令类型编号,逻辑地址, ]
6:[阻塞进程:阻塞队列编号,进程 ID]
7:[缺页中断:进程 ID:PageOut 页号,PageIn 页号]
8:[重新进入就绪队列:进程 ID,待执行的指令数]
9:[阻塞进程:阻塞队列编号,进程 ID]
10:[CPU 空闲]
11:[终止进程 ID]
缓冲区处理事件:
3:[P 操作/V 操作/拷贝入缓冲区/拷贝出缓冲区,4 个动作选择之一]
4:[入缓冲区:进程 ID:指令段编号,磁盘文件读操作:逻辑地址,物理地址,缓冲区地址,交换区物理块地址]
5:[入缓冲区:进程 ID:指令段编号,磁盘文件读操作:逻辑地址,物理地址,缓冲区地址,交换区物理块地址]
6:[P 操作/V 操作/拷贝入缓冲区/拷贝出缓冲区]说明:4 个动作选择之一显示并记录
7:[P 操作/V 操作/拷贝入缓冲区/拷贝出缓冲区]说明:4 个动作选择之一显示并记录
8:[入缓冲区:进程 ID:指令段编号,磁盘文件读操作:逻辑地址,物理地址,缓冲区地址,交换区物理块地址]
9:[P 操作/V 操作/拷贝入缓冲区/拷贝出缓冲区]说明:4 个动作选择之一显示并记录
10:[缓冲区无进程]
结束时间:[进程 ID:作业请求时间+进入时间+总运行时间]
结束时间:[进程 ID:作业请求时间+进入时间+总运行时间] BB1:[阻塞队列 1,键盘输入:进入时间,进程 ID/进入时间,进程 ID/进入时间,进程 ID]
BB2:[阻塞队列 2,屏幕显示:进入时间,进程 ID/进入时间,进程 ID/进入时间,进程 ID] BB3:[阻塞队列 3,打印任务:进入时间,进程 ID/进入时间,进程 ID/进入时间,进程 ID] BB4:[阻塞队列 4,磁盘读文件:进入时间,进程 ID /进入时间,进程 ID/进入时间,进程 ID] BB5:[阻塞队列 5,磁盘写文件:进入时间,进程 ID/进入时间,进程 ID/进入时间,进程 ID]
PPPP:[PageInterruption:进入时间,进程 ID/进入时间,进程 ID/进入时间,进程 ID]
说明:
在“作业/进程调度事件”中,f 符号均为半角西文态符号:
时间:每秒记录一条信息,两条记录的时间可以相同,表示并发操作;
关键操作或状态:包括新增作业、创建进程、第一次进入就绪队列、重新进入就绪队列 阻塞队列、缺页中断、重新进入就绪队列、运行进程、CPU 空闲、终止进程等,输出时请写汉字信息;
记录事件的多少及时间根据选题确定;
作业或进程信息:包括进程 ID,指令编号,指令类型编号等,具体信息见下面的例子, 信息用逗号隔开;
在“状态统计信息”中:当每个进程指令全部执行完成以后计算保存。每一行统计一个 进程信息;
结束时间:指进程运行结束后的时间;
案例:只考虑进程调度事件、状态统计信息截图
7
1.6 进程控制块 PCB 设计
下面是进程相关 PCB 内容,本次课设需要补充与逻辑地址、物理地址、外存物理块相关信息。参照 Linux task_struct 的数据结构内容设计;
进程编号(ProID);值分别为 1,2,3,4,5,6,。。进程优先数(Priority);
进程创建时间(InTimes); 进程结束时间(EndTimes); 进程状态(PSW);
进程运行时间列表(RunTimes); 进程周转时间统计(TurnTimes);
进程包含的指令数目(InstrucNum); 程序计数器信息(PC);
指令寄存器信息(IR);
在就绪队列信息列表(包括:位置编号(RqNum)、进入就绪队列时间(RqTimes)); 阻塞队列信息列表 1(包括:位置编号(BqNum1)、进程进入键盘输入阻塞队列时间
( BqTimes1));
阻塞队列信息列表 2(包括:位置编号(BqNum2)、进程进入显示器输出阻塞队列时间
( BqTimes2));
说明:
★系统请求运行的并发进程个数最小值为 5,可以自行设计最大值。
★进程编号(ProID):整数
★进程优先数(Priority):随机生成[1-5]整数优先数,优先数越小,优先级越大;
★进程创建时间(InTimes):由仿真时钟开始计时,整数,假设每条指令执行时间 1s;
★进程结束时间(EndTimes):显示仿真时钟的时间,整数;
★进程运行时间列表(RunTime):统计记录进程开始运行时间、时长,时间由仿真时钟提供;
★进程包含的指令数目(InstrucNum):可自行扩展;
★PSW:保存该进程当前状态:运行、就绪、阻塞;
★指令寄存器信息(IR):正在执行的指令编号;
★程序计数器信息(PC);下一条将执行的指令编号;
1.7 系统 PCB 表的设计
需要设计系统空白 PCB 表,假设系统最大 4个进程并发,可用数组、链表、队列实现。
1.8 仿真实现进程控制原语
按照教材步骤仿真实现原语函数,可以作为 PCB 类的方法,包括: 进程创建:考虑内存分配与回收。
进程撤销:执行完成的进程调用撤销函数;
进程阻塞;I/O 操作产生,可以不考虑对内存缓冲区的 PV 操作
1.9 其他
◆ 课程设计采用的语言为 JAVA ,需要开发环境下运行以及脱离开发环境独立测试运行
2 课程设计选题
2.1 选题 1:仿真实现作业管理与虚页存储管理(难度系数=4)
◆ 及格要求:完成实验基础要求。利用 5 个线程实现进程并发以及输入输出。多任务作业并发环境下,实现页表生成、MMU 地址变换、进程原语、作业调度算法、静态优先级进程调度算法,页面分配与回收算法。
◆ 良好要求:完成及格要求的前题下,实现缺页中断、外存交换区管理、页表再生成与 页面替换 LRU 算法;将内存分配过程、进程调度过程等通过可视化方式呈现。
9
4)保存课设程序被编译为RunProcess.exe 可执行文件;保存一份“材料阅读使用顺序说明文档”
(3) input1子文件夹:保存作业进程请求文件,使用 input1 子
文件夹测试输入数据;每个子文件夹包括jobs-input.txt、用户程序指令文件(如 1. txt 或 2.txt 等),
(4) output1子文件夹:分别对应 input1子文件夹输入作业的ProcessResults-???-算法名称代号.txt 文件。
(5) code 子文件夹:工程文件、源程序等,要求公共变量、函数、函数输入输出变量有详细的注释,
6 课程设计实践报告内容与要求
注意:逻辑结构合理,层次分明,论述清楚,不要放程序代码,核心算法与关键环节处理 用伪码描述。对每个测试结果需要分析说明。
正文:宋体 5 号字,图表需要有编号和名称
封皮(统一格式可下载) 目录
摘要(单独一页,500 字以上,包括目的、完成功能、总结核心设计实现技术、测试结果总结等,需要具体化)
关键词(不超过 5 个,与摘要在一页)
1 实践内容与目标
包括:1.1 实践内容、1.2 实践目标(分条目论述完成了任务、实现函数、模块功能)
2 系统功能与 API 函数说明
包括:描述所设计的系统功能说明,所对应的 API 函数名称; API 函数需要说明函数输入、输出变量说明及调用方法
3 硬件仿真设计
分小标题论述,包括:计算机各硬件部件的仿真设计,要有具体的大小和仿真方法等
4 数据结构与基础操作的抽象与实现
分小标题论述,包括:作业控制块及程序指令集设计、与硬件映射的数据结构设计、OS 原语与核心操作,采用示意图与伪码相结合的方式,不能直接拷贝代码等,注意写清楚自己 有特色的关键处理;
5 程序整体结构及模块功能的实现
分小标题论述,包括;整个软件系统的结构说明,采用示意图、流程图与伪码相结合的 方式说明,不能直接拷贝代码。注意写清楚自己有特色的关键处理;
6 技术问题及解决方案(重点)
分小标题论述,要有具体技术问题描述,发生场景描述,最好配合现场图片;给出具体 解决方案和结果测试截图证据等
7
附件 1:程序文件及结构说明附件 2:类图和顺序图说明
附件 3:带注释的部分核心代码(只需要5 页)
13