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

下载本文档

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

文档简介

1、精品文库徐州工程学院管理学院实验报告实验课程名称: 计算机操作系统实验地点:南主楼七楼机房2013年3月至2013年4月专业信息管理与信息系统班级学生姓名学号指导老师欢迎下载精品文库实验报告实验项目: 分时系统实验学时: 2实验日期: 2013-3-14实验要求:加深学生对多道系统中进程管理的理解,了解进程的各种状态及其转换过程,分时系统中时间片的设置及进程在时间片开始和结束时的调度过程。实验内容:( 1)利用程序设计语言模拟分时系统中多个进程按时间片轮转调度算法进行进程调度的过程;( 2)假设有五个进程 A ,B, C, D, E,它们的到达时间及要求服务的时间分别为:进程名ABCDE到达时

2、间01234服务时间43424时间片大小为1,利用程序模拟A , B ,C, D, E 五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。( 3)修改时间片大小为 2,利用程序模拟 A , B, C, D ,E 五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。( 4)修改时间片大小为 4,利用程序模拟 A , B, C, D ,E 五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。时间片大小为1 的情况如右图a(1),a(2):进程周转时间带 权 周转时间A123B93C143.5D84E133.25完成顺序: BDAC

3、E( a1)a(2)欢迎下载精品文库b(1)C(1)时间片大小为2 情况如 b(1),b(2) :进程周转时间带权周转时进程周转时间带权周转时间间A82A41B124B62C133.25C92.25D73.5D105E133.25E133.25完成顺序: ADBCE完成顺序: ABCDEb(2)c (2)欢迎下载精品文库时间片大小为4 情况如 c (1)、 c(2):思考时间片的大小对调度算法产生什么影响?对计算机的性能产生什么影响?在时间片轮转算法中,时间片的大小对系统性能有很大的影响,如选择很小的时间片将有利于短作业,因为它能较快地完成,但会频繁地发生中断、进程上下文的切换,从而增加系统的

4、开销,降低了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

5、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,s

6、truct 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=NUL

7、L;int i;head=readyline->next;struct process* rightnow;p=readyline;struct process* p;cout<<" 内存分配错误 "<<endl;readyline=readyline->next;n->next=q;newnode=(struct process*)malloc(sizeof(process);/ 加入就绪队列 cout<<" 请输入进程名 "<<endl;elsecin>>newnode-&

8、gt;name;q=q->next; /便利链表将到达进程加入if(newnode->name='#')就绪队列break;/ 运行当前进程 cout<<" 请输入进程到达时间"<<endl;if(readyline=NULL)cin>>newnode->arri_time;break;cout<<" 请输入进程服务时间"<<endl;欢迎下载精品文库cin>>newnode->serv_time;newnode->done_time=0

9、;newnode->turn_around_time=0;while(p!=NULL) cout<<p->name<<" 进程 "<<endl; p=p->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;

10、 cout<<"*"<<endl<<rightnow->name<<" have done!"<<endl; cout<<"turn_around_time:"<<rightnow->turn_around_time<<endl; cout<<"wei_turn_around_time:"<<rightnow->wei_turn_around_time<<endl;

11、cout<<"*"<<endl; 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<<"*"<<endl<<rightnow->name<<" have done!

12、"<<endl; cout<<"turn_around_time:"<<rightnow->turn_around_time<<endl; cout<<"wei_turn_around_time:"<<rightnow->wei_turn_around_time<<endl; cout<<"*"<<endl;goto ss; /else/ pushline(readyline,rightnow);/* re

13、adyline=head->next;实验项目: PV 操作 -生产者与消费者实验学时: 2实验日期: 2013-3-21实验要求:实验内容:1. 由用户指定要产生的进程及其类别,存入就绪队列。2. 调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over 链表。重复这一过程直至就绪队列为空。3. 输入两个进程,分别为生产者和消费者,按照先生产后消费顺序输入,观察并记录运行结果;调整输入进程的顺序,观察并记录运行结果4. 输入多个进

14、程, 随机分配为生产者和消费者, 按 (1)两种进程数量相同、 (2)生产者多于消费者、 (3)生产者少于消费者三种情况,观察并记录运行结果5. 多次输入多个进程,随机分配为生产者和消费者,使缓冲区中产品最后都被消费完,观察并记录运行结果输入两个进程,分别为生产者和消费者,按照先生产后消费顺序输入,观察并记录运行结果欢迎下载精品文库调整输入进程的顺序,先消费后生产,观察并记录运行结果输入多个进程,随机分配为生产者和消费者,按不同情况观察并记录运行结果(1) 两种进程数量相同欢迎下载精品文库(2) 生产者多于消费者(3) 生产者少于消费者多次输入多个进程,随机分配为生产者和消费者,使缓冲区中产品

15、最后都被消费完,观察并记录运行结果欢迎下载精品文库欢迎下载精品文库附:#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表

16、示生产者 ; flag=2 表示消费者int numlabel;/ 进程编号while(linkhead!=NULL)char product;/ 产品char state;/进程状态p=linkhead;struct pcb * processlink;*exe=NULL,*over=NULL;/ over 链表linkhead=linkhead->processlink;typedef struct pcb PCB;free(p);PCB* readyhead=NULL, * readytail=NULL;/ 就绪队列return p;PCB* consumerhead=NULL,

17、* /消费者队列void linklist(PCB* p,PCB* listhead)PCB* producerhead=NULL, /生产者队列int InitQueue (PCB* head,PCB* tail)int processproc()/ 初始化队列bool hasElement(PCB*pro)/ 判断队列是否为空if(pro->processlink=NULL)void linkqueue(PCB* process,PCB* tail)/ 把就绪队列里的进程放入生产者队列的尾(*tail)->processlink=process;(*tail)=process;

18、return ;void freelink(PCB* linkhead)/ 清除队列PCB* p;/ 给 PCB 分配内存。int i,f,num;char ch;linkqueue(p,&readytail);/ 并把这些进程放入就绪队列中。returntrue;boolwaitempty()/如果缓冲区满,该进程进入生产者等待队列;if(empty<=0)cout<<":)进程 "<<exe->numlabel<<"缓冲区存数, 该进程进入生产者等待队列 "<<endl;欢迎下载精品

19、文库linkqueue(exe,&producertail);/ 缓冲区满,进程压入生产者等待队列队尾 return false;elseempty-;/ 缓冲区未满,则进行生产操作return true;void signalempty()/ 将等待中的生产者进程进入就绪队列PCB* p;if(hasElement(producerhead)p=getq(producerhead,&producertail);linkqueue(p,&readytail);cout<<":) 等待中的生产者进程进入就绪队列,它的进程号为 "<&l

20、t;p->numlabel<<endl; p=getq(consumerhead,&consumertail);linkqueue(p,&readytail);cout<<":) 等待中的消费者进程进入就绪队列,它的进程号是 "<<p->numlabel<<endl; full+;void producerrun()/ 进程运行if(!waitempty()/缓冲区为空return;/缓冲区不为空,执行消费者进程cout<<":)进程 "<<exe->

21、;numlabel<<" 开始向缓冲区存数"<<exe->product<<endl;bufferbufferpoint=exe->product;/放入缓冲区bufferpoint+;/ 缓冲区指针后移cout<<":)进程 "<<exe->numlabel<<" 向缓冲区存数操作结束"<<endl;signalfull();/ 等待的消费队列进入就绪队列linklist(exe,over);void comsuerrun()if(

22、!waitfull()/缓冲区不为空return;cout<<":)进程 "<<exe->numlabel<<" 开始向缓冲区取数"<<endl;exe->product=bufferbufferpoint-1;bufferpoint-;cout<<":)进程 "<<exe->numlabel<<" 向缓冲区取数操作结束,取数是 "<<exe->product<<endl;displa

23、y(PCB*p)p=p->processlink;while(p!=NULL)printf(":)进程 %d,它是一个 ",p->numlabel);p->flag=1? cout<<" 生产者 "<<endl:cout<<" 消费者 "<<endl;cout<<"tt*欢迎光临*"<<endl;readyhead=readytail=getpch(PCB);/ 初始化就绪队列指针if(!readyhead)return;In

24、itQueue(readyhead,readytail);/ 初始化就绪队列 consumerhead=consumertail=getpch(PCB);/ 初始化消费者指针欢迎下载精品文库exe=getq(readyhead,&readytail);printf(":)进程 %是一个 ",exe->numlabel);exe->flag=1t<<" 消费者 "<<endl;cout<<":)就绪队列没有进程"<<endl;if(hasElement(consumer

25、head) cout<<":)消费者等待队列中有进程:"<<endl;display(consumerhead);else if(hasElement(producerhead) cout<<":) 生产者等待队列中有进程 :"<<endl;display(producerhead);else cout<<":)生产者等待队列中没有进程 "<<endl; cout<<":) 想继续吗 ?(y/n)"<<endl; c=g

26、etchar();ch=getchar();if(c='y' | c='Y') Flag=1;else if(c='n' | c='N')Flag=0;else Flag=0;cout<<":) 输入有误 "<<endl; PCB*p=NULL;cout<<endl<<endl;printf(":)请输入进程个数:");cin>>num;for(i=0;i<num;i+)/ 产生相应的的进程:cout<<"

27、;:) 输入 1 生产者进程 "<<endl; cout<<":) 输入 2 消费者进程 "<<endp->flag=f;/ 进程标志, 1 为生产者,2 为消费者processnum+;/ 进程计数器加1p->numlabel=processnum;/ 进 程 编号记为进程计数器p->state='w'/ 置为等待p->processlink=NULL;if(p->flag=1)/ 输入 1 为生产者进程;cout<<":) 您要产生的进程是生产者 cout&

28、lt;<":) 请输入您要该进程产生的字符 "<<endl<<endl;scanf("%c",&ch);getchar();p->product=ch;productnum+;cout<<":)该进程产生的内容是 "<<p->product<<endl; / 输入 2 为消费者进程;cout<<":) 产生的进程是消费者 , 它 是 第 "<<p->numlabel<<" 个 进

29、 程 "<<endl;实验项目: 银行家算法实验学时: 2实验日期: 2013-3-28实验要求:实验内容:1. 由用户指定要产生的进程及其类别,存入就绪队列。2. 调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over 链表。重复这一过程直至就绪队列为空。3. 输入两个进程,分别为生产者和消费者,按照先生产后消费顺序输入,观察并记录运行结果;调整输入进程的顺序,观察并记录运行结果4. 输入多个进程, 随机分配为生

30、产者和消费者, 按 (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,因为所有进程均可以执行,所以系统安全。欢迎下载精品文库(1)( 2)系统是不安全的。因为系统目前可用资源不满足任何一个进

31、程。(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,运行进程

32、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

33、;for(i=0;i<N;i+)cout<<Avaliablej<<""/ 输出分配资源cout<<endl;cout<<"Max Allocation Need"<<endl;cout<<" 进程名"系统安全。for(j=0;j<3;j+)附:for(i=0;i<N;i+)#include<iostream.h>cout<<namei<<" "#include<string.h>

34、;#include<stdio.h>void share()/ 利用银行家算法对申请资源#define False 0对进行判定#define True 1cout<<" 请输入要求分配的资源进程号x100100=0;/ 各进程所需各类资源的最大需求(0-"<<M-1<<"):"int Avaliable100=0;/系统可用资源cin>>i;/ 输入须申请的资源号char name100=0;/资源的名称cin>>Requestj;/ 输入需要申请的资int Allocation1

35、00100=0;/系统已分配资源源int Need100100=0;/ 还需要资源int Request100=0;/请求资源向量欢迎下载精品文库for (j=0;j<N;j+)if(Requestj>Needij)/ 判断申请是否大于需求,若大于则出错cout<<" 进程 "<<i<<" 申请的资源大于它需要的资源"cout<<" 分配不合理, 不予分配! "<<endl;ch='n'break;else if(Requestj>Avali

36、ablej)/判断申请是否大于当前资源,若大于则 / 出错cout<<" 进程 "<<i<<" 申请的资源大于系统现在可利用的资源"cout<<" 分配出错,不予分配 !"<<endl;void changeresources()/ 修改资源函数ch='n'cout<<" 系统目前可用的资源Avaliable:"<<endl;break;for(int i=0;i<N;i+)if(ch='y')

37、 cout<<namei<<":"<<Avaliablei<<endl;changdata(i);/ 根据进程需求量变换资源cout<<" 输入系统可用资源 Avaliable:"<<endl;showdata();/ 根据进程需求量显示变换后的资源cin>>Avaliable0>>Avaliable1>>Avaliable2;safe();/ 根据进程需求量进行银行家算法判断cout<<" 请 输 入 各 进 程 的 最 大

38、 需 求 量void addresources()/ 添加资源("<<m<<"*"<<n<<"矩阵 )Max:"<<endl;int n,flag;cout<<" 请输入各进程已经申请的资源量cout<<" 请输入需要添加资源种类的数量:"("<<m<<"*"<<n<<"矩阵 )Allocation:"<<endl;cin&

39、gt;>n;if(flag)flag=N;cout<<" 申请的资源大于最大需求量,请重新N=N+n;输入 !n"for(int i=0;i<n;i+)cout<<" 名称 :"while(flag);cin>>nameflag;showdata();/显示各种资源cout<<" 数量 :"safe();/用银行家算法判定系统是否安全cin>>Avaliableflag+;while(choice)showdata();cout<<"*银行家

40、算法演示safe();*"<<endl;cout<<"1:增加资源"<<endl;void delresources()/ 删除资源cout<<"2:删除资源"<<endl;char ming;cout<<"3:修改资源"<<endl;int i,flag=1;cout<<"4:分配资源"<<endl;cout<<" 请输入需要删除的资源名称:"cout<<

41、;5:增加作业"<<endl;docout<<"0: 离开"<<endl;cin>>ming;cout<<"*for(i=0;i<N;i+)*"<<endl;if(ming=namei)cout<<" 请选择功能号: "flag=0;cin>>choice;break;case 0: choice=0;break;default:cout<<" 请 正 确 选 择 功 能 号if(i=N)(0-5)!&

42、quot;<<endl;break;cout<<" 该资源名称不存在,请重新输入:"while(flag);return 1;for(int j=i;j<N-1;j+)欢迎下载精品文库实验项目: 可变分区实验学时: 2实验日期: 2013-4-2实验要求:实验内容:设置系统内存空间为10,一共有5 个进程 15,所需内存空间大小依次为2、 6、 5、 2、 4(1) 使用系统提供的命令按照进程号由低到高送入内存,记录内存分配过程并说明最后内存中的空闲区的个数及各个空闲区大小(2) 将输入顺序颠倒送入内存,记录内存分配过程并说明最后内存中的空闲区

43、的个数及各个空闲区大小(1) 使用系统提供的命令按照进程号由低到高送入内存最后空闲区内存的个数为2,2 个空闲区的大小都是1.欢迎下载精品文库( 2)如果最后释放进程4:最后内存中的空闲区个数为1,空闲区的大小为4如果最后释放的是进程1:最后内存中的空闲区个数为1,空闲区的大小为2附:欢迎下载/* 循环首次适应法 */ #include <iostream.h>struct mapunsigned m_size;/空闲区大小char *m_addr; / 空闲区首地址struct map *next,*prior; / 定义链表以管理空闲区struct processunsigne

44、d 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 mai

45、n()/主函数create(); begin();void create()/初始化循环链表head=new map;head->prior=head;head->next=head; / 创建头指针 cursor=head;cout<<" 请输入要分配的系统的总空间大小 :" cin>>siz;room=siz;head->m_addr=(char *)malloc / 初始化首地址head->m_size=room; / 初始化整个空闲区大小printf(" 分配的首地址:");printf("

46、;%p",head->m_addr);cout<<endl;cout<<" 分配的总空间大小:"< <<endl;for(int j=1;j<=100;j+)arrayj.p_size=0; / 使其大小全为0void begin()unsigned m_size;精品文库int i=1;unsigned num;while(choice!='e') cout<<endl<<" 请选择操作 :"<<endl; cout<<&qu

47、ot;m: 分配进程空间 "<<endl; cout<<"f: 释放进程空间 "<<endl;cout<<"e: 结 束 操 作 "<<endl;/选择操作cin>>choice;if(choice='m')/若选择分配进程cout<<endl<<" 请输入要分配空间的大小 :"cin>>m_size;if(arrayi.p_addr=lmalloc(m_size) /调用 lmalloc, 分配内存,

48、若成功分配arrayi.p_size=m_size;/ 给进程数组赋值 cout<<endl<<" 此 次分配进程为 :进程 "<<i<<'t'<<endl;i+;print_proess();/每次分配进程后,打印(输出 )系统当前进程的总情况if(arraynum.p_size=0)/判断此进程是否驻于内存cout<<" 无此进程 !"<<endl;continue; / 回到 whileelselfree(arraynum.p_size,arrayn

49、um.p_addr);/执行 lfree 函数arraynum.p_size=0;/ 令进程数组中该进程的大小置 0cout<<" 释放中 ."<<endl;cout<<" 进程 "<<num<<" 已释放 !"<<endl;print_proess();/每次释放进程后,亦打印(输出 )系统当前进程的总情况 /else /whilechar *lmalloc(unsigned size)/分配进程函数unsigned a;欢迎下载精品文库bp=cursor;/ 采用循环首次适应法,从游标指针cursor 开始查找空闲区do/ 循环查找是否存在合适的空闲区if(bp->m_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)/若该结点为头结点且空闲区链表不止一个结点/删除该结

温馨提示

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

评论

0/150

提交评论