操作系统综合实验验优:OSLab小型操作系统仿真实验(大大小小实验)
最后的大实验快去验优,废话少说,直接开冲:
#include<iostream.h>
typedef struct pcb{char name[10];int ntime;//要求运行时间int rtime;//已运行时间char estate;//状态struct pcb *next;//指针指向下一个进程
}*pointer;
void Creatlist(pointer &head,pointer &f,pointer &l,pointer q[]){pointer p;head=new pcb;head->next=NULL;f=head;for(int i=1;i<=5;i++){p=new pcb; p->next=NULL;cout<<"作业名字:"<<endl;cin>>p->name;cout<<"作业需要运行时间:"<<endl;cin>>p->ntime;p->rtime=0;p->estate='R';f->next=p;f=f->next;q[i]=p;}f=head->next;l=p;l->next=f;
}
void Cout(pointer &head,pointer q[])//输出运行的进程及其状态{for(int i=1;i<=5;i++){cout<<"标识符:"<<q[i]->name<<" "<<"要求运行时间:"<<q[i]->ntime<<" "<<"已运行时间:"<<q[i]->rtime<<"状态:"<<q[i]->estate;cout<<endl;cout<<endl;}
}
void diaodusuanfa(pointer &head,pointer &f,pointer &l,pointer r[])//处理机调度算法{pointer p,q;q=l;p=head->next;while((p->next!=p)||(p->ntime!=p->rtime)){p->rtime=p->rtime+1;cout<<p->name<<"已运行时间+1。"<<endl;if(p->ntime==p->rtime){p->estate='E';cout<<p->name<<"已结束。"<<endl;q->next=p->next;p=q->next;}else{p=p->next;q=q->next;}Cout(head,r);}
}
void main(){pointer h,f,l,q[5];Creatlist(h,f,l,q);Cout(h,q);diaodusuanfa(h,f,l,q);
}
(执行结果是类似第二张图片的,下面还有类似的结果,状态栏的R表示未完成,E表示完成)
(4)源程序
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//生成begin-end随机数
int random(int begin,int end){ if (begin == 0) return rand() % (end + 1); else return rand() % (end - begin + 1) + begin;
}
//生成指令序列
void make(int* instruction) { int m; int n; for (int i = 0; i < 320; i += 4) { //在[0,319]间随机选取起点m,若m=319,顺序执行一条可能会超出范围 m = random(0, 318); //执行地址为m+1的指令 instruction[i] = m + 1; n = m + 1; //在[0,m+1]中随机选取一条指令并执行,该指令的地址为m',若m ≥317,顺序执行2条可能会超出范围 do { m = random(0, n); }while(m>=317); //顺序执行一条指令,其地址为m' + 1 instruction[i+1]=m; //在后地址[m'+2,319]中随机选取一条指令并执行 instruction[i+2]=m+1; //若m=319,顺序执行一条可能会超出范围 m = random(m + 2, 318); instruction[i + 3] = m; }
}
//指令序列变换为页地址流
void makePage(int* page, int* instruction) { for (int i = 0; i < 320; i++) page[i] = instruction[i] / 10; //每页存储十条指令
}
int main()
{ int instruction[320]; int page[320]; int replacement[320],i; for ( i = 0; i < 320; i++){ replacement[i]=100; //显示状态} int t=0; make(instruction); makePage(page, instruction); cout <<"页面访问顺序为:"<<endl; for ( i = 0; i < 320; i++) cout << page[i] << " "; cout << endl; int a;//存放自定义的内存容量 cout << "请输入自定义的内存容量:" << endl; cin >> a; int *memory = new int[a];//内存块 int *queue = new int[a];//队列:(FIFO)先进先出算法,由此查询需要替换的是哪个页面 for ( i = 0; i < a; i++) { memory[i] = 100; queue[i] = 100;//初始化 } int count = 0;//缺页次数 int flag;//标记 int x;//暂时存储队首元素 int y;//标记 for (int j = 0; j < 320; j++) { for (i = 0; i < a; i++) { if(page[j] == memory[i]) { flag = 0;//命中,不缺页 break; } flag = 1; } if (flag==1)//缺页 { count=count+1;//缺页次数+1 for ( i = 0; i < a; i++) //内存块是否全满? { if (memory[i] == 100)//100是初始值,即内存块未全满 { queue[i] = page[j];//直接入队 memory[i] = page[j];//直接进入内存 y = 1; break; } y = 0; } if (y == 0) {//内存块全满且没有命中,要替换 x = queue[0];//队列第一个出列:先进先出 replacement[t] = x; t++; for (i = 0; i < a-1; i++) { queue[i] = queue[i + 1];//队列前移; } queue[a-1] = page[j];//新的页号放在队尾 for (i = 0; i < a; i++) { if (memory[i] == x) memory[i] = page[j];//找到对应的页号,替换 } } } cout << "访问第" << j + 1 << "次后物理块的占有情况:(100表示空,没有存放页号,其余表示存放的页面号):" << endl; for ( i = 0; i < a; i++) { cout << memory[i] << " "; cout << endl; } } cout << "被置换的页面依次为:" << endl; for ( i = 0; i < 320; i++) { if (replacement[i] != 100) cout << replacement[i] << " "; } cout << endl; cout << "缺页次数:" << count << endl; double p = count / (320 * 1.0); cout << "命中率为:" << (1.0 - p) << endl; system("pause"); return 0;
}
#define n 4//假定设备类型为4
#define j 10//假定设备总数为10 void init() { counts = 6; OS[0].name = 'P';//未分配均命名为P OS[0].start = 0;//初始位置0 OS[0].size = 5; OS[0].flag = 1;//分配标志未分配 = 1 OS[1].name = '1';//未分配命名为P OS[1].start = 5;//初始位置0 OS[1].size = 5; OS[1].flag = 0;//分配标志已分配 = 0 OS[2].name = '3'; OS[2].start = 10; OS[2].size = 4; OS[2].flag = 0; OS[3].name = 'P'; OS[3].start = 14; OS[3].size = 12; OS[3].flag = 1; OS[4].name = '2'; OS[4].start = 26; OS[4].size = 6; OS[4].flag = 0; OS[5].name = 'P'; OS[5].start = 32; OS[5].size = COUNT - 32; OS[5].flag = 1; } //插入数据 void insert(int m, int st, int en) { int i; counts++;//数组长度加一 for (i = counts; i > m; i--)//从插入位 由后往前后移 { OS[i] = OS[i - 1]; } OS[m].start = st;//插入 OS[m].size = en; } //删除数据 void move(int m) { int i; for (i = m; i < counts - 1; i++)//从删除位 由前往后前移 { OS[i] = OS[i + 1]; } counts--;//数组长度减一 } //合并没有分配的相邻块 void remove(int m, int st, int en) { if (!OS[m - 1].flag && !OS[m + 1].flag) //如果m前后都已分配 不分配 { OS[m].name = 'P'; OS[m].flag = 1; } if (OS[m - 1].flag) //如果m前未分配,后已分配 与前一个合并 { OS[m - 1].size = OS[m - 1].size + en; move(m); } if (OS[m + 1].flag) //如果m后未分配,前已分配 与后一个合并 { OS[m].size = OS[m].size + OS[m + 1].size; OS[m].name = 'P'; OS[m].flag = 1; move(m + 1); } } //输出 void show() { int i; cout << "(名称 起址 长度 状态)" << endl; for (i = 0; i < counts; i++) { if (OS[i].flag)//未分配 cout << "P "; else//已分配 cout << OS[i].name << " "; cout << " " << OS[i].start << " " << OS[i].size << " "; //依次输出块的name,起始位置,长度 if (OS[i].flag) cout << "未分配" << endl; else cout << "已分配" << endl; } } //申请资源 int apply() { int i = 0; int applyflag = 0;//标记 while (!applyflag && i < counts)//遍历数组 查找连续的可分配资源是否存在? { if (OS[i].size >= num && OS[i].flag)//比较块大小、是否已分配来找空间 { if (OS[i].size == num)//大小相等 直接修改 { OS[i].name = c; OS[i].flag = 0; } else// 偏大 修改信息同时更新原先块为已分配和未分配两部分 { insert(i + 1, OS[i].start + num, OS[i].size - num); OS[i + 1].flag = 1; OS[i + 1].name = 'P'; OS[i].start = OS[i].start; OS[i].name = c; OS[i].size = num; OS[i].flag = 0; } applyflag = 1;//申请成功的标记 } i++; } if (applyflag) { cout << "申请成功" << endl; return 1; } else { cout << "没有足够大的空闲空间" << endl; return 0; } } //释放资源 int free() { int i = 0; int freeflag = 0;//标记 while (!freeflag && i < counts)//遍历数组 查找作业是否存在 { if (OS[i].name == c)//找到作业 { remove(i, OS[i].start, OS[i].size); freeflag = 1;//修改标记 } i++; } if (freeflag) { cout << "释放成功" << endl; return 1; } else { cout << "未找到匹配的进程名称" << endl; return 0; } } void shengqing(JC *p) { c = p->name; //申请内存空间 num = p->size; apply(); show(); cout << endl; } void shifang(JC *r) { c = r->name; //释放上一个的内存空间 num = r->size; free(); show(); cout << endl; } void create(JC *head) { JC *q = new JC(); cout << "依次输入进程名,进程大小,进程到达时间,进程估计运行时间:" << endl; char name; int size, tape, ta, ts; char printer; int x = 0; q->to = x;//完成时间 q->totalTime = x;//周转时间 q->weightTotalTime = x;//带权周转时间 q->flag = 0;//未运行 cin >> name; q->name = name;//名字 cin >> size; q->size = size;//大小 cin >> ta; q->ta = ta;//到达时间 cin >> ts; q->ts = ts;//估计运行时间 head->next = q; q->next = NULL; } void out(JC *p)//输出当前进程状态量 { while (p != NULL) { cout << p->name << " "; cout << p->ta <<" "; cout << p->ts <<" "; cout << p->to <<" "; cout << p->totalTime <<" "; cout << p->weightTotalTime <<" "; cout << endl; p = p->next; } }
void operation(JC *t, JC *r)//计算该进程完成时间,周转时间,带权周转时间 { t->to = (r->to) + (t->ts);//完成时间=上一个运行进程的完成时间+当前进程估计运行的时间 t->totalTime = (t->to) - (t->ta);//周转时间=当前进程完成时间-到达时间 t->weightTotalTime = (t->totalTime) / ((t->ts)*1.0);//平均周转时间=周转时间/估计运行的时间 } int main() { int i;init();//初始化 JC *head = new JC(); JC *p = head; JC *r, *t = NULL; cout << "状态输出格式为:进程名,进程到达时间,进程估计运行时间,进程完成的时间,周转时间,带权周转时间:" << endl; cout << "内存空间初始分配情况:" << endl; show(); cout << endl; cout << "请输入进程总个数" << endl; int x; cin >> x; for (i = 0; i < x; i++) { create(p); p = p->next; }//按到达时间先后创建进程链队 p = head->next;//指向第一个进程 cout << "初始状态" << endl; out(p);//打印初始状态 cout << "第1次选中进程" << p->name << endl; p->to = p->ts; p->totalTime = (p->to) - (p->ta); p->weightTotalTime = (p->totalTime) / ((p->ts)*1.0); p->flag = 1; out(p); shengqing(p); cout << endl; r = p;//r记住前一个已运行的进程 i = 2; p = p->next; while (x != 1) { while (p != NULL) { if ((p->flag) != 1)//当前结点指向的进程未运行 { double y; y = ((r->to) - (p->ta)) / ((p->ts)*1.0);//计算优先权 if (y > priority) { t = p; priority = y; } p = p->next; } else if ((p->flag) == 1) { p = p->next; } } operation(t, r);//计算 cout << "第" << i << "次选中进程" << t->name << endl; t->flag = 1; out(head->next);//显示此时进程状态 shifang(r); cout << endl; r = t; shengqing(r); cout << endl; x--; i++; priority = 0; p = (head->next); } system("pause"); return 0; }
(7)实验参考文献
EOS 操作系统实验教程 海西慧学编著
上述整体到这里就没了,不过还有一个java操作系统验优程序,放下面:
感兴趣的自己去研究吧
//RAM内存类
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class RAM {Scanner input = new Scanner(System.in);static IdlePartition idle = new IdlePartition();private Integer size; //总内存大小private Integer initialAddress; //起址private Integer endAddress; //末址private Integer blockNum ; //块数private ArrayList blockSize; //块大小private ArrayList blockAddress; //每块的起址private ArrayList blockStatus; //每块的状态public RAM(Integer size, Integer initialAddress) {this.size = size;this.initialAddress = initialAddress;this.endAddress = this.initialAddress + this.size;this.blockNum = 10;Random random = new Random();Integer sum = 0;this.blockSize = new ArrayList();this.blockAddress = new ArrayList();this.blockStatus = new ArrayList();for (int i = 0; i < 9; i++) {this.blockAddress.add(sum);this.blockSize.add(random.nextInt(100)+30);sum += (Integer)(this.blockSize.get(i));this.blockStatus.add("未分配");}this.blockSize.add(this.size - sum);this.blockAddress.add(sum);this.blockStatus.add("未分配");Printer();}public IdlePartition Changing(){ArrayList initialAddress1 = new ArrayList(); //起始地址ArrayList lenth = new ArrayList(); //长度ArrayList status = new ArrayList(); //状态for (int i = 0; i < this.blockNum; i++) {if (this.blockStatus.get(i) == "未分配"){initialAddress1.add(this.blockAddress.get(i));lenth.add(this.blockSize.get(i));status.add(this.blockStatus.get(i));}}idle.setInitialAddress(initialAddress1);idle.setLenth(lenth);idle.setStatus(status);return idle;}public void Printer(){System.out.println("***********内存分块说明表*************");System.out.printf("%-7s%-10s%-10s%-10s\n","编号","起址","长度","状态");for (int i = 0; i < this.blockNum; i++) {System.out.printf( "%2d%10d%s%10d%s%10s\n",i+1,this.blockAddress.get(i),"K",this.blockSize.get(i) ,"K",this.blockStatus.get(i) );}}public void Printer1(IdlePartition idlePartition){System.out.println("***********空闲说明表*************");System.out.printf("%-7s%-10s%-10s%-10s\n","编号","起址","长度","状态");for (int i = 0; i < idlePartition.getStatus().size(); i++) {System.out.printf( "%2d%10d%s%10d%s%10s\n",i+1,idlePartition.getInitialAddress().get(i),"K",idlePartition.getLenth().get(i) ,"K",idlePartition.getStatus().get(i) );}}/*** 查找空闲分区*/public void FindingIdlePartition(IdlePartition idlePartition,Integer size,Integer a){for (int i = 0; i < idlePartition.getStatus().size(); i++) {if (size == 0) {System.out.println("申请无效!");return;}if ((Integer)(this.blockSize.get(i)) >= size && this.blockStatus.get(i).equals("未分配")) {this.blockStatus.set(i,"作业" + a + "正在使用中");if ((Integer)(idlePartition.getLenth().get(i)) == size){this.blockSize.set(i,size);return;}else {//使用空间,并建立新的空闲分区this.blockAddress.add(i+1,(Integer)(this.blockAddress.get(i)) + size);this.blockStatus.add(i+1,"未分配");this.blockSize.add(i+1,((Integer)this.blockSize.get(i)) - size);this.blockSize.set(i,size);this.blockNum++;return;}}}System.out.println("未找到适当的内存,请重新申请!!!");}/*** 作业i申请空间*/public void Applying(Integer i){System.out.print("请输入要申请的作业" + i + "占用内存:");FindingIdlePartition(idle,input.nextInt(),i);}/*** 作业i释放空间*/public void Freeing(Integer i){for (int j = 0; j < this.blockNum; j++) {if (this.blockStatus.get(j).equals("作业" + i + "正在使用中")){this.blockStatus.set(j,"未分配");this.blockSize.set(j,(Integer)this.blockSize.get(j)+(Integer)this.blockSize.get(j+1));this.blockSize.remove(j+1);this.blockAddress.remove(j+1);this.blockStatus.remove(j+1);this.blockNum--;return;}}System.out.println("未找到作业" + i + "正在使用中,请重新输入!!!");}public ArrayList getBlockAddress() {return blockAddress;}public ArrayList getBlockStatus() {return blockStatus;}public Integer getBlockNum() {return blockNum;}public ArrayList getBlockSize() {return blockSize;}public Integer getSize() {return size;}public void setSize(Integer size) {this.size = size;}public Integer getInitialAddress() {return initialAddress;}public void setInitialAddress(Integer initialAddress) {this.initialAddress = initialAddress;}public Integer getEndAddress() {return endAddress;}}
// IdlePartition空闲区类
import java.util.ArrayList;
public class IdlePartition {private ArrayList initialAddress; //起始地址private ArrayList lenth; //长度private ArrayList status; //状态public IdlePartition() {}public ArrayList getInitialAddress() {return initialAddress;}public void setInitialAddress(ArrayList initialAddress) {this.initialAddress = initialAddress;}public ArrayList getLenth() {return lenth;}public void setLenth(ArrayList lenth) {this.lenth = lenth;}public ArrayList getStatus() {return status;}public void setStatus(ArrayList status) {this.status = status;}
}
//Test测试类
import java.util.Scanner;public class Test {public static void main(String[] args) {RAM ram = new RAM(1024,0);ram.Changing();ram.Printer1(ram.Changing());Scanner input = new Scanner(System.in);while(true){System.out.println("1、申请\t2、释放(输入其它数字退出)");System.out.print("请输入要对作业进行的操作序号:");switch (input.nextInt()){case 1:System.out.print("请输入要申请的作业序号:");ram.Applying(input.nextInt());break;case 2:System.out.print("请输入要释放的作业序号:");ram.Freeing(input.nextInt());break;default:System.exit(0);break;}ram.Changing();ram.Printer1(ram.Changing());ram.Printer();}}
}
操作系统综合实验验优:OSLab小型操作系统仿真实验(大大小小实验)相关推荐
- 数据结构课程设计实验验优参考(附数据结构上机实验、上机考试代码)
计算机的几个专业的数据结构考试内容有所不一样,好像上机还是什么不太一样.软件工程那边的老师还要求学会C++读取文件,后面我也会附上读取文件的相关代码,其余的实验上机.上机考试代码等等在资料区下载即可. ...
- 华北科技学院计算机系qq群,华北科技学院操作系统综合实验.doc
华北科技学院操作系统综合实验 华北科技学院计算机学院综合性实验 实 验 报 告 课程名称 计算机操作系统 实验学期 2014 至 2015 学年 第 1 学期 学生所在系部 计算机 年级 大三 专业班 ...
- Linux操作系统综合实验
Linux操作系统综合实验 管理员需每天做一定的重复工作,请按照下列要求编制一个解决方案,并编程实现该方案. (1) 在下午6 :30删除/home/stu/abc目录下的全部子目录和全部文件: (2 ...
- linux文件目录操作实验报告,Linux操作系统实验4文件和目录操作
<Linux操作系统>课程实验报告 实验4 文件和目录操作 一.实验目的 1.理解Linux文件系统的结构和目录组织方式: 2.掌握Linux常用目录和文件命令的使用. 二.实验内容与要求 ...
- 实验2 SQL Server 表操作
实验2 SQL Server 表操作 一.实验目的 1.了解表设计和表结构相关知识. 2.掌握管理工具创建.修改.查看和删除表的方法. 3.掌握T-SQL语句创建.修改.查看和删除表的方法. 4.了解 ...
- 医学计算机应用基础实验报告word,word的操作——实验报告
计算机实验报告 计算机应用基础实验报告 姓名 班级 学号 实验日期 课程名称 计算机应用基础 指导教师 成绩 实验名称:Word 的基本操作 一.实验目的 1.熟悉文字的输入及格式设置 2.掌握段落的 ...
- mysql实验训练2 数据查询操作_实验训练2:数据查询操作
<实验训练2:数据查询操作>由会员分享,可在线阅读,更多相关<实验训练2:数据查询操作(6页珍藏版)>请在人人文库网上搜索. 1.实验训练2:数据查询操作请到电脑端查看实验目的 ...
- mysql实验训练2 数据查询操作_实验训练2:数据查询操作.doc
实验训练2:数据查询操作.doc 实验训练2数据查询操作请到电脑端查看实验目的基于实验1创建的汽车用品网上商城数据库Shopping,理解MySQL运算符.函数.谓词,练习Select语句的操作方法. ...
- linux文件目录基本操作实验结论,实验 Linux文件和目录操作
实验Linux文件和目录操作(1) 一.实验内容 练习Linux文件和目录操作命令. 二.实验目的 掌握文件与目录管理命令 掌握文件内容查阅命令 三.实验题目 1. 文件与目录管理 (1) 查看Cen ...
最新文章
- Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定管道
- TM1810-3, TM1810-2 LED恒流驱动IC
- QTP的那些事---通过html标签的属性获取对象(类似onclick的属性)
- DCMTK:使用dcmimage 库将DICOM图像转换为PPM或PGM
- idea如何连接本地mysql_IDEA如何连接MYSQL
- C++:23 再议const的用法(下)
- 炒股炒成亿万富翁? 胡润财富报告称人数还不少
- 这可能是最好的RxJava 2.x 入门教程学习系列
- 如何将一棵树转换成二叉树
- t–sql pl–sql_T-SQL for DBA –使用T-SQL进行快速数据分析的三种方法
- java过滤器应用实例_Servlet过滤器Filter的简单介绍(附示例)
- beaker-用于会话和缓存的WSGI中间件
- 汽车零部件行业追溯系统的应用
- 用php搭建微信公众号,用PHP搭建一个自己的微信公众号
- JS实现上一个、下一个、置顶、置底操作
- 【案例】用 turtle 绘制一个月饼
- [HAOI2012]外星人——数论欧拉函数
- Arouter 跳转失败activityResumeTrigger: not whiteListed
- VSCode STM32跨平台开发环境搭建
- 计算机密码学学习笔记(二)——Shannon理论