最后的大实验快去验优,废话少说,直接开冲:




















#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小型操作系统仿真实验(大大小小实验)相关推荐

  1. 数据结构课程设计实验验优参考(附数据结构上机实验、上机考试代码)

    计算机的几个专业的数据结构考试内容有所不一样,好像上机还是什么不太一样.软件工程那边的老师还要求学会C++读取文件,后面我也会附上读取文件的相关代码,其余的实验上机.上机考试代码等等在资料区下载即可. ...

  2. 华北科技学院计算机系qq群,华北科技学院操作系统综合实验.doc

    华北科技学院操作系统综合实验 华北科技学院计算机学院综合性实验 实 验 报 告 课程名称 计算机操作系统 实验学期 2014 至 2015 学年 第 1 学期 学生所在系部 计算机 年级 大三 专业班 ...

  3. Linux操作系统综合实验

    Linux操作系统综合实验 管理员需每天做一定的重复工作,请按照下列要求编制一个解决方案,并编程实现该方案. (1) 在下午6 :30删除/home/stu/abc目录下的全部子目录和全部文件: (2 ...

  4. linux文件目录操作实验报告,Linux操作系统实验4文件和目录操作

    <Linux操作系统>课程实验报告 实验4 文件和目录操作 一.实验目的 1.理解Linux文件系统的结构和目录组织方式: 2.掌握Linux常用目录和文件命令的使用. 二.实验内容与要求 ...

  5. 实验2 SQL Server 表操作

    实验2 SQL Server 表操作 一.实验目的 1.了解表设计和表结构相关知识. 2.掌握管理工具创建.修改.查看和删除表的方法. 3.掌握T-SQL语句创建.修改.查看和删除表的方法. 4.了解 ...

  6. 医学计算机应用基础实验报告word,word的操作——实验报告

    计算机实验报告 计算机应用基础实验报告 姓名 班级 学号 实验日期 课程名称 计算机应用基础 指导教师 成绩 实验名称:Word 的基本操作 一.实验目的 1.熟悉文字的输入及格式设置 2.掌握段落的 ...

  7. mysql实验训练2 数据查询操作_实验训练2:数据查询操作

    <实验训练2:数据查询操作>由会员分享,可在线阅读,更多相关<实验训练2:数据查询操作(6页珍藏版)>请在人人文库网上搜索. 1.实验训练2:数据查询操作请到电脑端查看实验目的 ...

  8. mysql实验训练2 数据查询操作_实验训练2:数据查询操作.doc

    实验训练2:数据查询操作.doc 实验训练2数据查询操作请到电脑端查看实验目的基于实验1创建的汽车用品网上商城数据库Shopping,理解MySQL运算符.函数.谓词,练习Select语句的操作方法. ...

  9. linux文件目录基本操作实验结论,实验 Linux文件和目录操作

    实验Linux文件和目录操作(1) 一.实验内容 练习Linux文件和目录操作命令. 二.实验目的 掌握文件与目录管理命令 掌握文件内容查阅命令 三.实验题目 1. 文件与目录管理 (1) 查看Cen ...

最新文章

  1. Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定管道
  2. TM1810-3, TM1810-2 LED恒流驱动IC
  3. QTP的那些事---通过html标签的属性获取对象(类似onclick的属性)
  4. DCMTK:使用dcmimage 库将DICOM图像转换为PPM或PGM
  5. idea如何连接本地mysql_IDEA如何连接MYSQL
  6. C++:23 再议const的用法(下)
  7. 炒股炒成亿万富翁? 胡润财富报告称人数还不少
  8. 这可能是最好的RxJava 2.x 入门教程学习系列
  9. 如何将一棵树转换成二叉树
  10. t–sql pl–sql_T-SQL for DBA –使用T-SQL进行快速数据分析的三种方法
  11. java过滤器应用实例_Servlet过滤器Filter的简单介绍(附示例)
  12. beaker-用于会话和缓存的WSGI中间件
  13. 汽车零部件行业追溯系统的应用
  14. 用php搭建微信公众号,用PHP搭建一个自己的微信公众号
  15. JS实现上一个、下一个、置顶、置底操作
  16. 【案例】用 turtle 绘制一个月饼
  17. [HAOI2012]外星人——数论欧拉函数
  18. Arouter 跳转失败activityResumeTrigger: not whiteListed
  19. VSCode STM32跨平台开发环境搭建
  20. 计算机密码学学习笔记(二)——Shannon理论

热门文章

  1. 投融资模式之BT模式
  2. php interface 抽象类,解析PHP中的抽象类(abstract class)和 接口(interface)
  3. matlab对矩阵的排列顺序,matlab数组按照指定顺序重排
  4. 爬虫进阶:反反爬虫技术--2 使用可变IP
  5. Java 多线程线程安全(面试概念解答二)
  6. ERP : 投入控制
  7. 客服快速回复的聊天神器
  8. 在中科院计算所实习的一年(更新中。。)
  9. 史上最全手机简史,无线通讯佳话还在持续...
  10. 移动直播app软件直播平台怎么创建