操作系统报告_第1页
操作系统报告_第2页
操作系统报告_第3页
操作系统报告_第4页
操作系统报告_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

徐州工程学院管理学院实验报告实验课程名称 : 计算机操作系统 实验地点: 南主楼七楼机房 2013 年 3 月至 2013 年 4 月 专 业 信息管理与信息系统 班 级 学生姓名 学 号 指导老师 精品文档交流实验报告实验项目:分时系统实验学时:2 实验日期:2013-3-14实验要求:加深学生对多道系统中进程管理的理解,了解进程的各种状态及其转换过程,分时系统中时间片的设置及进程在时间片开始和结束时的调度过程。实验内容:(1)利用程序设计语言模拟分时系统中多个进程按时间片轮转调度算法进行进程调度的过程;(2)假设有五个进程A,B,C,D,E,它们的到达时间及要求服务的时间分别为:进程名ABCDE到达时间01234服务时间43424时间片大小为1,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。(3)修改时间片大小为2,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 a(2) (4)修改时间片大小为4,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。时间片大小为1的情况如右图a(1),a(2):进程周转时间带权周转时间A123B93C143.5D84E133.25完成顺序:BDACE (a1) C(1) b(1)时间片大小为2情况如b(1),b(2):进程周转时间带权周转时间A41B62C92.25D105E133.25完成顺序:ABCDE进程周转时间带权周转时间A82B124C133.25D73.5E133.25完成顺序:ADBCEb(2) c (2)时间片大小为4情况如c (1)、 c(2):思考时间片的大小对调度算法产生什么影响?对计算机的性能产生什么影响?在时间片轮转算法中,时间片的大小对系统性能有很大的影响,如选择很小的时间片将有利于短作业,因为它能较快地完成,但会频繁地发生中断、进程上下文的切换,从而增加系统的开销,降低了CPU效率;反之,如选择太长的时间片,使得每个进程都能在一个时间片内完成,时间片轮转算法便退化为FCFS算法,无法满足交互式用户的需求。一个较为可取的大小是,时间片略大于一次典型的交互所需要的时间。这样可使大多数进程在一个时间片内完成。附:#include stdio.h struct process int have_done_time;/已经运行时间int done_time;/完成时间int turn_around_time;/周转时间float wei_turn_around_time;/带权周转时间struct process * next;int time=-1;int time_slice=4;/时间片初始值为1Isempty(struct process* head)void pushline(struct process* head,struct process* rn)if (rn=NULL)void popline(struct process* head,struct process* x)if(!Isempty(head)*x=head-next;head-next=(*x)-next;(*x)-next=NULL;void isnewcome(struct process* head,struct process* readyline)struct process* (head-next=NULL)return;if(head-next-arri_time=time&head-next!=NULL)struct process* head;struct process* newnode;struct process* tail;struct process* readyline;/队列readyline=(struct process*)malloc(sizeof(process);readyline-next=NULL; head=readyline-next; p=readyline; readyline=readyline-next;n-next=q;/加入就绪队列 else q=q-next; /便利链表将到达进程加入就绪队列 /运行当前进程 if(readyline=NULL) break;int i;struct process* rightnow;struct process* p;cout内存分配错误endl;newnode=(struct process*)malloc(sizeof(process);cout请输入进程名newnode-name;if(newnode-name=#)break;cout请输入进程到达时间newnode-arri_time;cout请输入进程服务时间newnode-serv_time;newnode-done_time=0;newnode-turn_around_time=0;while(p!=NULL) coutname进程next; time+;rightnow-turn_around_time=rightnow-done_time-rightnow-arri_time+1;rightnow-wei_turn_around_time=(float)rightnow-turn_around_time/rightnow-serv_time;cout*endlname have done!endl;coutturn_around_time:turn_around_timeendl;coutwei_turn_around_time:wei_turn_around_timeendl;cout*turn_around_time=rightnow-done_time-rightnow-arri_time+1;rightnow-wei_turn_around_time=(float)rightnow-turn_around_time/rightnow-serv_time;cout*endlname have done!endl;coutturn_around_time:turn_around_timeendl;coutwei_turn_around_time:wei_turn_around_timeendl;cout*next;实验项目:PV操作-生产者与消费者实验学时:2 实验日期:2013-3-21实验要求:实验内容:1. 由用户指定要产生的进程及其类别,存入就绪队列。2. 调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为空。3. 输入两个进程,分别为生产者和消费者,按照先生产后消费顺序输入,观察并记录运行结果;调整输入进程的顺序,观察并记录运行结果4. 输入多个进程,随机分配为生产者和消费者,按(1)两种进程数量相同、(2)生产者多于消费者、(3)生产者少于消费者三种情况,观察并记录运行结果5. 多次输入多个进程,随机分配为生产者和消费者,使缓冲区中产品最后都被消费完,观察并记录运行结果输入两个进程,分别为生产者和消费者,按照先生产后消费顺序输入,观察并记录运行结果调整输入进程的顺序,先消费后生产,观察并记录运行结果输入多个进程,随机分配为生产者和消费者,按不同情况观察并记录运行结果(1)两种进程数量相同 (2)生产者多于消费者 (3)生产者少于消费者多次输入多个进程,随机分配为生产者和消费者,使缓冲区中产品最后都被消费完,观察并记录运行结果 附:#include stdio.h#define getpch(type) (type*)malloc(sizeof(type) int productnum=0; /产品数量int processnum=0;/进程计数器int full=0; int empty=buffersize; / semaphorechar bufferbuffersize; / 缓冲区int bufferpoint=0; / 缓冲区指针struct pcb /* 定义进程控制块PCB */int flag; / flag=1 表示生产者; flag=2 表示消费者while(linkhead!=NULL)p=linkhead;linkhead=linkhead-processlink;free(p);return p;void linklist(PCB* p,PCB* listhead)int processproc()/给PCB分配内存。int i,f,num;char ch;linkqueue(p,&readytail); /并把这些进程放入就绪队列中。return true;bool waitempty()/ 如果缓冲区满,该进程进入生产者等待队列;if(empty=0)cout:) 进程numlabel缓冲区存数,该进程进入生产者等待队列processlink=NULL)void linkqueue(PCB* process,PCB* tail) / 把就绪队列里的进程放入生产者队列的尾 (*tail)-processlink=process; (*tail)=process; return ;void freelink(PCB* linkhead)/清除队列PCB* p;linkqueue(exe,&producertail);/缓冲区满,进程压入生产者等待队列队尾return false;elseempty-;/缓冲区未满,则进行生产操作return true;void signalempty()/将等待中的生产者进程进入就绪队列PCB* p;if(hasElement(producerhead)p=getq(producerhead,&producertail);linkqueue(p,&readytail);cout:) 等待中的生产者进程进入就绪队列,它的进程号为numlabelendl;p=getq(consumerhead,&consumertail);linkqueue(p,&readytail);cout:) 等待中的消费者进程进入就绪队列,它的进程号是numlabelendl;full+;void producerrun()/进程运行if(!waitempty()/缓冲区为空return;/缓冲区不为空,执行消费者进程cout:) 进程numlabel开始向缓冲区存数productproduct;/放入缓冲区bufferpoint+;/缓冲区指针后移cout:) 进程numlabel向缓冲区存数操作结束endl;signalfull();/等待的消费队列进入就绪队列linklist(exe,over);void comsuerrun()if(!waitfull()/缓冲区不为空return;cout:) 进程numlabel开始向缓冲区取数product=bufferbufferpoint-1;bufferpoint-;cout:) 进程numlabel向缓冲区取数操作结束,取数是productprocesslink;while(p!=NULL)printf(:) 进程%d,它是一个,p-numlabel);p-flag=1? cout生产者endl:cout消费者endl;couttt* 欢迎光临 *flag=f;/进程标志,1为生产者,2为消费者processnum+;/进程计数器加1p-numlabel=processnum;/进程编号记为进程计数器p-state=w;/置为等待p-processlink=NULL;if(p-flag=1)/输入1为生产者进程;cout:) 您要产生的进程是生产者cout:) 请输入您要该进程产生的字符endlproduct=ch;productnum+;cout:) 该进程产生的内容是productendl; /输入2为消费者进程;cout:) 产生的进程是消费者,它是第numlabel个进程numlabel);exe-flag=1t消费者endl;cout:) 就绪队列没有进程endl;if(hasElement(consumerhead) cout:) 消费者等待队列中有进程:endl;display(consumerhead);else if(hasElement(producerhead) cout:) 生产者等待队列中有进程:endl;display(producerhead);else cout:) 生产者等待队列中没有进程endl;cout:) 想继续吗?(y/n)endl;c=getchar();ch=getchar();if(c=y | c=Y)Flag=1;else if(c=n | c=N)Flag=0;elseFlag=0;cout:) 输入有误endl;PCB*p=NULL;coutendlnum;for(i=0;inum;i+)/产生相应的的进程:cout:) 输入1生产者进程endl; cout:) 输入2消费者进程end实验项目:银行家算法实验学时:2 实验日期:2013-3-28实验要求:实验内容:1. 由用户指定要产生的进程及其类别,存入就绪队列。2. 调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为空。3. 输入两个进程,分别为生产者和消费者,按照先生产后消费顺序输入,观察并记录运行结果;调整输入进程的顺序,观察并记录运行结果4. 输入多个进程,随机分配为生产者和消费者,按(1)两种进程数量相同、(2)生产者多于消费者、(3)生产者少于消费者三种情况,观察并记录运行结果5. 多次输入多个进程,随机分配为生产者和消费者,使缓冲区中产品最后都被消费完,观察并记录运行结果(1) 系统是安全的。系统可用资源a b c:9 8 6 满足进程1,进程1完成后,释放 1 2 2,可用资源变为:a b c:10 10 8,满足进程0,进程0完成后,释放1 0 1,可用资源变为:a b c:11 10 9,满足进程2,因为所有进程均可以执行,所以系统安全。(2)系统是不安全的。因为系统目前可用资源不满足任何一个进程。(1) (3)系统可用资源a b c:9 8 6 满足进程1,进程1完成后,释放 1 2 2,可用资源变为:a b c:10 10 8,满足进程0,进程0完成后,释放1 0 1,可用资源变为:a b c:11 10 9,满足进程2,因为所有进程均可以执行,所以系统安全。(4)系统是不安全的。因为系统目前可用资源为 a b c:8 7 6 不满足任何一个进程,资源不够。(5)系统不安全。因为在(1)的基础上增加1个作业,资源需求为(11 11 11),可用资源 a b c:9 8 6,经过进程1后,变为10 10 8 ,因为满足进程0,运行进程0 ,可用资源变为11 10 9,满足进程2,运行进程2,结束后,可用资源变成11 11 9,因为增加了1个作业,所以不满足进程3,进行不能继续运行,所以系统不安全。采取措施:修改资源,修改可用资源数量为(9 8 8) 如下:int temp100=0;/存放安全序列int Work100=0;/存放系统可提供资源int M=100;/作业的最大数为100int N=100;/资源的最大数为100void showdata()/显示资源矩阵 int i,j; cout系统目前可用的资源Avaliable:endl; for(i=0;iN;i+) coutAvaliablej ;/输出分配资源 coutendl; coutMax Allocation Needendl; cout进程名 ; for(j=0;j3;j+) for(i=0;iN;i+) coutnamei ;void share()/利用银行家算法对申请资源对进行判定cout请输入要求分配的资源进程号(0-M-1i;/输入须申请的资源号 cinRequestj;/输入需要申请的资源系统安全。附:#include#include#include#define False 0#define True 1x100100=0;/各进程所需各类资源的最大需求int Avaliable100=0;/系统可用资源char name100=0;/资源的名称int Allocation100100=0;/系统已分配资源int Need100100=0;/还需要资源int Request100=0;/请求资源向量 for (j=0;jNeedij)/判断申请是否大于需求,若大于则出错 cout进程 i申请的资源大于它需要的资源;cout 分配不合理,不予分配!Avaliablej)/判断申请是否大于当前资源,若大于则 /出错cout进程i申请的资源大于系统现在可利用的资源;void changeresources()/修改资源函数cout系统目前可用的资源Avaliable:endl; for(int i=0;iN;i+) coutnamei:Avaliableiendl;cout输入系统可用资源Avaliable:Avaliable0Avaliable1Avaliable2;cout请输入各进程的最大需求量(m*n矩阵)Max:endl; cout请输入各进程已经申请的资源量(m*n矩阵)Allocation:endl; if(flag) cout申请的资源大于最大需求量,请重新输入!n;while(flag); showdata();/显示各种资源 safe();/用银行家算法判定系统是否安全 while(choice) cout*银行家算法演示*endl; cout 1:增加资源 endl; cout 2:删除资源 endl; cout 3:修改资源 endl; cout 4:分配资源 endl; cout 5:增加作业 endl; cout0:离开 endl;cout*endl; coutchoice; case 0: choice=0;break; default: cout请正确选择功能号(0-5)!endl;break; return 1;cout 分配出错,不予分配!endl;ch=n;break;if(ch=y) changdata(i);/根据进程需求量变换资源showdata();/根据进程需求量显示变换后的资源safe();/根据进程需求量进行银行家算法判断void addresources()/添加资源 int n,flag;coutn;flag=N;N=N+n;for(int i=0;in;i+) coutnameflag; coutAvaliableflag+;showdata();safe();void delresources()/删除资源char ming;int i,flag=1;coutming;for(i=0;iN;i+) if(ming=namei) flag=0; break; if(i=N) cout该资源名称不存在,请重新输入:;while(flag);for(int j=i;jN-1;j+)实验项目:可变分区实验学时:2 实验日期:2013-4-2实验要求:实验内容:设置系统内存空间为10,一共有5个进程15,所需内存空间大小依次为2、6、5、2、4(1)使用系统提供的命令按照进程号由低到高送入内存,记录内存分配过程并说明最后内存中的空闲区的个数及各个空闲区大小(2)将输入顺序颠倒送入内存,记录内存分配过程并说明最后内存中的空闲区的个数及各个空闲区大小(1)使用系统提供的命令按照进程号由低到高送入内存 最后空闲区内存的个数为2,2个空闲区的大小都是1.(2) 如果最后释放进程4:最后内存中的空闲区个数为1,空闲区的大小为4如果最后释放的是进程1:最后内存中的空闲区个数为1,空闲区的大小为2附: int i=1; unsigned num; while(choice!=e) coutendl请选择操作:endl; coutm: 分配进程空间endl; coutf: 释放进程空间endl; coute: 结束操作choice; if(choice=m) /若选择分配进程 coutendlm_size;if(arrayi.p_addr=lmalloc(m_size) /调用lmalloc,分配内存,若成功分配 arrayi.p_size=m_size; /给进程数组赋值 coutendl此次分配进程为:进程itendl; i+;print_proess(); /每次分配进程后,打印(输出)系统当前进程的总情况if(arraynum.p_size=0) /判断此进程是否驻于内存cout无此进程!endl;continue; /回到while elselfree(arraynum.p_size,arraynum.p_addr); /执行lfree函数 arraynum.p_size=0; /令进程数组中该进程的大小置0cout释放中.endl;cout进程num已释放!endl;print_proess(); /每次释放进程后,亦打印(输出)系统当前进程的总情况 /else /whilechar *lmalloc(unsigned size) /分配进程函数 unsigned a;/*循环首次适应法*/#include struct map unsigned m_size; /空闲区大小char *m_addr; /空闲区首地址struct map *next,*prior; ; /定义链表以管理空闲区struct process unsigned p_size; /进程大小 char *p_addr; /进程首地址;process array100; /定义数组以管理进程map * head; /定义头指针map * cursor; /定义指向当前的游标指针unsigned siz,room;char choice; /定义分配的整个内存空间的大小void create(); /初始化管理空闲区的链表void begin(); /主体函数char *lmalloc(unsigned size); /分配进程函数void lfree; /释放进程函数void print_proess(); /打印当前进程情况void main() /主函数 create(); begin();void create() /初始化循环链表 head=new map; head-prior=head;head-next=head; /创建头指针cursor=head;coutsiz; room=siz;head-m_addr=(char *)malloc /初始化首地址head-m_size=room; /初始化整个空闲区大小printf(分配的首地址:);printf(%p,head-m_addr); coutendl;cout分配的总空间大小: endl;for(int j=1;jm_size=size) /判断是否当前空闲区大于进程大小 aa=bp-m_addr;a=bp-m_size;bp-m_size-=size; /将空闲区扣除进程大小bp-m_addr+=size; /调整空闲区首地址if(bp-m_size=0) /若该空闲区正好用完if(bp=head & bp-next!=head) /若该结点为头结点且空闲区链表不止一个结点 /删除该结点if(bp=head & bp-next=head) /若为唯一的结点 cout系统空间正好全部被占用!next; while(bp!=cursor); /直到正好走遍链表的所有结点 cout对不起,没有可分配的合适空间m_addraa) /如果所释放的进程地址小于第一个空闲区的首地址if(aa+size=head-m_addr | head-m_size=0) /进程尾部与下一空闲区粘连head-m_addr=aa; head-m_size+=size; /修改此空闲区的首地址和大小 else/进程尾部与空闲区不粘连head=ps; /创建一个新的空闲区结点,记录此次释放进程/if lse /释放的进程所在内存位置前已有空闲区bp=head; do bp=bp-next;while(bp-m_addr=aa & bp!=head); /走到该进程后的一个空闲区结点if(bp-prior-m_addr+bp-prior-m_size=aa) /该进程与前一空闲区粘连bp-prior-m_size+=size; /修改空闲区大小if(aa+size=bp-m_addr & bp!=head) /若该进程亦与后一空闲区粘连且后空闲区并非第一个空闲区(循环链表)bp-prior-m_size+=bp-m_size; /修改空闲区大小p=bp; if(cursor=p) /若后空闲区结点为当前游标结点,游标指向上一结点cursor=p-prior;pt-m_size=size;pt-next=bp;pt-prior=bp-prior; bp-prior-next=pt;bp-prior=pt /为进程创建新的空闲区结点elsebp-m_addr-=size;bp-m_size+=size; /else/lfree实验项目:请求分页实验学时:2 实验日期:2013-4-2实验要求:实验内容:以课本126页图4-27的例子,设置物理块为3个,总页面个数为12个,按照序列输入,记录结果并与书中结果比较是否符合先入先出算法的结果;然后将输入页面序列颠倒输入,观察并记录结果1 以课本126页图4-27中的例子,设置物理块为3个,总页面个数为12个,按照序列输入,记录结果并与书中结果比较是否符合先入先出算法的结果。/flag:标记当前序号页面是否已驻入内存(-1:否)/block_num:驻留内存时间最长的页面所在的物理块序号/time标记对应序号的物理块中页面驻留时间int i,j,max_stay=0,count=0;int get=-1,flag=-1,block_num=-1;get=j; /物理块j即将(/等待)驻入新页面break;for(j=0;jm;j+)/查找序号相同的页面if(Blockj=Pagei)/物理块j中页面与当前期望调入内存的页面相同flag=j; break;for(j=0;jmax_stay)max_stay=timej;block_num=j; /block_num标记当前序号物理块中页面驻留时间最久if(flag=-1)/不存在相同页面if(get!=-1)/物理块即将(/等待)驻入新页面Blockblock_num=Pagei;timeblock_num=0;for(j=0;jSize;j+)timej+;count+;else不符合先入先出算法(2)附:#include #include /使用setw()时用到的头文件#include /使用getchar()时用到的头文件using namespace std;#define Max 30/某进程调入内存中的最大页面数#define Size 10/系统为某进程分配的最大物理块数void Init(int Block,int m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论