没有合适的资源?快使用搜索试试~ 我知道了~
陈扬-自测报告1
需积分: 0 3 下载量 122 浏览量
2022-08-08
21:04:02
上传
评论
收藏 1.36MB DOCX 举报
温馨提示
试读
52页
陈扬-自测报告1
资源详情
资源评论
资源推荐
《计算机操作系统》课程设计测试报告 信息科技学院计算机科学与技术系 第 1 页
《计算机操作系统课程设计》
测试报告(自测)
题目
名称
可视化仿真实现 Linux2.6 进程管理与内存管理
院系
信息学院
班级
网工 161
测试时间
2019/03/13
指导
老师
姜海燕教授
助教
姓名
钱峥远
电话
QQ
18013886150
姓名
学号
陈扬
19316117
手机
QQ
17761703297
824678119
申请成绩
A+
是否
组长
是
组长
手机
组长
申请成绩
完
成
任
务
与
功
能
说
明
1. 作业调度
1.1 作业调度模块数据成员
private int job_id=0;//作业号
private int
job_page_location_start=(kernel.MEMORY_SIZE+kernel.HARDDISK_VIRTUAL
_MEMORY_SIZE+kernel.HARDDISK_SYSTEMFILE_SIZE)/kernel.SINGLE_PA
GE_SIZE;//作业存储区的地址开始
private int
job_page_location_end=(kernel.MEMORY_SIZE+kernel.HARDDISK_SIZE)/kerne
l.SINGLE_PAGE_SIZE; //作业存储区的地址结束
private int next_to_pcb=0; //下一个将要读入的作业序号
private int write_job_page_num=job_page_location_start; //写入作业的编号
public ArrayList<JCB> job_list=new ArrayList<JCB>(); //作业后备队列
设置起始地址用来限制访问空间,避免越界访问引起系统错误。
1.2 JCB 设计
1.2.1 JCB 数据成员
private short job_id; //作业 ID
private short priority; //作业/进程的优先级
rivate int job_intime; //作业进入时间
private short instruction_num; //作业包含的指令数目
private short pages_num; //作业所占用的页面数目
private ArrayList<Short> all_instructions=new ArrayList<Short>();
//所有指令的链表
private short in_page_num=0; //该 JCB 所在的页号
以上数据总大小小于 512B,故可使用一页进行存储。
1.2.2 计算作业所占页面数
public short CalculatePagesNum()
{
//每条指令占 8 个字节,1 页有 64 条指令,加上 JCB 占 1 页空间
if(this.instruction_num==0)
《计算机操作系统》课程设计测试报告 信息科技学院计算机科学与技术系 第 2 页
return 1+1;
else if((this.instruction_num%64==0)&&(this.instruction_num!=0))
return (short) (this.instruction_num/64+1);
else
return (short) ((this.instruction_num/64+1)+1);
}
由于 JCB 的设计为第一页存放作业信息,故每个作业所占空间为指令数/8 向
上取整再加一。
1.3 将作业转存到外存
public void SaveJobToHardDisk(JCB jcb)
{
//将作业保存到外存,d1 是 JCB 数据块,d2 是包含所有指令的
ArrayList,每条指令占 8 字节
Page jcb_page=new Page((short) this.write_job_page_num++);
//获取应写入 JCB 的那一页
jcb_page.SetPageData((short)0, (short) 'j'); //写入 JCB 的标识,01 位
jcb_page.SetPageData((short)2, (short) job_id++);//写入作业的序号 ID,23
位
jcb_page.SetPageData((short)4, jcb.GetPriority());//写入作业优先级,45 位
jcb_page.SetPageData((short)6, (short) jcb.GetJobIntime());
//写入作业进入时间,67 位
jcb_page.SetPageData((short)8, jcb.GetInstruction_num()); //写入指令数
目,89 位
jcb.SetPagesNum(jcb.CalculatePagesNum());//计算该进程所需要占的页面
数
jcb_page.SetPageData((short)10, jcb.GetPagesNum());
//写入占用页面数目,1011 位
//开始随机填充接下来的部分,模拟数据区
for(short i=12;i<kernel.SINGLE_PAGE_SIZE;i+=2)
{
jcb_page.SetPageData(i, (short) CPU.random.nextInt());;
}
//将所有指令写入接下来的页
int already_write_instruction_num=0;
for(short i=0;i<jcb.GetPagesNum()-1;i++)
{
Page t=new Page((short) (this.write_job_page_num+i)); //获取该页面
//写入页的内容
for(short j=0;j<512;j+=8)
{
if(already_write_instruction_num<=jcb.GetInstruction_num())
//指令还未写完
{
//写入指令
《计算机操作系统》课程设计测试报告 信息科技学院计算机科学与技术系 第 3 页
t.SetPageData(j, jcb.GetAll_Instructions().get(already_write_instruction_num++));
//随机填充数据
for(short k=(short) (j+2);k<j+kernel.SINGLE_INSTRUCTION_SIZE;k+=2)
t.SetPageData(k, (short) CPU.random.nextInt());
}
else //指令已经写完
{
//随机填充数据
for(short k=(short) j;k<j+kernel.SINGLE_INSTRUCTION_SIZE;k+=2)
t.SetPageData(k, (short) CPU.random.nextInt());
}
}
}
this.write_job_page_num+=jcb.GetPagesNum()-1; //指针后移
}
按照计算好的页号需求量,在外存的连续空间上写入作业信息。
1.4 获取所有 JCB 信息
public JCB[] GetAllJCB()
{
int job_num=GetJobNum(); //获取总作业数量
JCB []all_jcb=new JCB[job_num]; //创建存储所有 jcb 的对象数组
int read_job_num=0; //已经读取的作业数量
int read_page_num=this.job_page_location_start;
//当前读取的页面页号,初始化为存储区开始点
while(read_job_num!=job_num)
{
//获取当前页面
Page pa=new Page((short) read_page_num);
if(pa.GetPageData((short) 0)!='j') //当前页不是 JCB 所在页
continue; //直接跳过,读取下一页面
//实例化 JCB 并存入数据
all_jcb[read_job_num]=new JCB();
all_jcb[read_job_num].SetInPageNum((short) read_page_num);
//设置 JCB 所在页面序号
all_jcb[read_job_num].SetJobid(pa.GetPageData((short) 2));
//设置作业的 ID
all_jcb[read_job_num].SetPriority(pa.GetPageData((short) 4));
//设置作业优先级
all_jcb[read_job_num].SetJobIntime(pa.GetPageData((short) 6));
//设置作业进入时间
all_jcb[read_job_num].SetInstructionNum(pa.GetPageData((short) 8));
//设置作业指令数量
all_jcb[read_job_num].SetPagesNum(pa.GetPageData((short) 10));
//设置作业占用页面数
《计算机操作系统》课程设计测试报告 信息科技学院计算机科学与技术系 第 4 页
//获取所有指令
read_page_num++; //读取下一页面
Page instru_page=new Page((short) read_page_num); //获取指令页面
for(int i=0;i<all_jcb[read_job_num].GetInstruction_num();i++)
{
all_jcb[read_job_num].GetAll_Instructions().add(instru_page.GetPageData((short)
((i%kernel.INSTRUCTIONS_PER_PAGE)*kernel.SINGLE_INSTRUCTION_SIZ
E)));
if((i+1)%kernel.INSTRUCTIONS_PER_PAGE==0)
{
read_page_num++;
instru_page=new Page((short) read_page_num);//获取下一页
面
}
}
if(all_jcb[read_job_num].GetInstruction_num()%kernel.INSTRUCTIONS_PER_P
AGE==0)
read_page_num--;
else
read_page_num++;
read_job_num++; //已经读取完一个作业
}
return all_jcb;
}
将所有作业信息读取,存放到 JCB 数组中,为作业转换为进程做准备。
2. 进程的三级调度
2.1 高级调度
public void HighLevelScheduling()
{
//高级调度
//检测后备队列是否有新的未被导入的作业
MainUI.main_ui.run_info+="系统时间:"+kernel.SYSTEM_TIME+"高级调度--
";
JobModule.job_module.RefreshJobList(); //刷新后备队列
MainUI.main_ui.run_info+="检测后备队列是否有作业--";
if(!JobModule.job_module.IsAllJobToProcess()) //后备队列中还有作业
{
while(!JobModule.job_module.job_list.isEmpty())
{
MainUI.main_ui.run_info+="后备队列有作业--";
JCB jcb=JobModule.job_module.job_list.get(0); //获取最近的一个作业
MainUI.main_ui.run_info+="作业序号:"+jcb.GetJobid()+"等待被调入--";
《计算机操作系统》课程设计测试报告 信息科技学院计算机科学与技术系 第 5 页
//检查 PCB 池是否空间足够
MainUI.main_ui.run_info+="检测 PCB 池是否足够--";
if(ProcessModule.process_module.GetFreePCBNumInPool()>=1)
{
MainUI.main_ui.run_info+="PCB 空间足够--";
//PCB 池空间足够
//检测虚存空间是否足够
MainUI.main_ui.run_info+="检测虚存空间是否足够--";
if(jcb.GetPagesNum()<=PageModule.page_module.GetFreePageNumInDisk()-1)
{
//虚存空间足够
MainUI.main_ui.run_info+="虚存空间足够--";
//第一步,JCB 转换为 PCB
MainUI.main_ui.run_info+="将 JCB 转换为 PCB--";
PCB
pro=ProcessModule.process_module.TurnJCBToPCB(jcb);
//第二步,在虚存中申请对应大小的空间
MainUI.main_ui.run_info+="在虚存中申请空间--";
String
swap_area_apply=PageModule.page_module.ApplyPageInDisk(pro.GetPagesNum()
);
//第三步,将作业的所有指令区调入到虚存中
MainUI.main_ui.run_info+="作业载入--";
ProcessModule.process_module.TransferJobCodeToSwapArea(jcb,swap_area_appl
y);
//第四步,写 PCB 中的页表
MainUI.main_ui.run_info+="写入页表--";
ProcessModule.process_module.WriteProcessPageTable(pro, swap_area_apply);
//第五步,将 PCB 写入到 PCB 池
MainUI.main_ui.run_info+="写 PCB 池--";
ProcessModule.process_module.AddToPCBPool(pro);
//第六步,指针后移
JobModule.job_module.NextJob();
JobModule.job_module.RefreshJobList(); //刷新后备队列
//第七步,将该进程加入到就绪队列,等待被调度
MainUI.main_ui.run_info+="进程加入到就绪队列,等待被调度
\n";
ProcessModule.process_module.TransferProcessToReadyQueue(pro, true);
//pro.ProcessCreate(); //调用进程创建原语
}
else //虚存空间不足没有空间
剩余51页未读,继续阅读
又可乐
- 粉丝: 63
- 资源: 309
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0