操作系统实验报告_实验报告操作系统

其他范文 时间:2020-02-27 11:12:24 收藏本文下载本文
【www.daodoc.com - 其他范文】

操作系统实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“实验报告操作系统”。

实验二

进程调度

1.目的和要求

通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。

2.实验内容

阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。

编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。

程序要求如下:

1)输出系统中进程的调度次序; 2)计算CPU利用率。

3.实验环境

Windows操作系统、VC++6.0 C语言

4设计思想:

(1)

程序中进程可用PCB表示,其类型描述如下:

struct PCB_type

{

int pid;

//进程名 int

state;

//进程状态

2——表示“执行”状态

1——表示“就绪”状态

0——表示“阻塞”状态

int cpu_time;//运行需要的CPU时间(需运行的时间片个数)

} 用PCB来模拟进程;

(2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。队列类型描述如下:

struct QueueNode{

struct PCB_type

PCB;

Struct QueueNode *next;} 并设全程量:

struct QueueNode *ready_head=NULL,//ready队列队首指针

*ready_tail=NULL , //ready队列队尾指针

*blocked_head=NULL,//blocked队列队首指针 *blocked_tail=NULL;//blocked队列队尾指针(3)设计子程序:

start_state();

读入假设的数据,设置系统初始状态,即初始化就绪队列和阻塞队列。

dispath();

模拟调度,当就绪队列的队首进程运行一个时间片后,放到就绪队列末尾,每次都是队首进程进行调度,一个进程运行结束就从就绪队列中删除,当到t个时间片后,唤醒阻塞队列队首进程。

calculate();

就绪进程运行一次,usecpu加1,当就绪队列为空时unusecpu加1,CPU利用率为use_cpu/(use_cpu+unuse_cpu)。

5源代码:

#include #include

struct PCB_type {

int pid;

//进程名

int

state;

//进程状态

//2--表示“执行”状态

//1--表示“就绪”状态

//0--表示“阻塞”状态

int cpu_time;//运行需要的CPU时间(需运行的时间片个数)};struct QueueNode{

struct PCB_type

PCB;

struct QueueNode *next;};struct QueueNode *ready_head=NULL,//ready队列队首指针

*ready_tail=NULL,//ready队列队尾指针

*block_head=NULL,//blocked队列队首指针

*block_tail=NULL;

//blocked队列队尾指针

int use_cpu,unuse_cpu;

void start_state()//读入假设的数据,设置系统初始状态 {

int n,m;

int i;

struct QueueNode *p,*q;

printf(“输入就绪节点个数n:”);

scanf(“%d”,&n);

printf(“输入阻塞节点个数m:”);

scanf(“%d”,&m);

p=(struct QueueNode *)malloc(sizeof(struct QueueNode));

p->next =NULL;

ready_head=ready_tail=p;

for(i=0;i

{

p=(struct QueueNode *)malloc(sizeof(struct QueueNode));

p->next =NULL;

p->PCB.state=1;

printf(“输入就绪进程%d的pid和cpu_time:”,i+1);

scanf(“%d%d”,&p->PCB.pid,&p->PCB.cpu_time);

ready_tail->next=p;

ready_tail=p;

}

q=(struct QueueNode *)malloc(sizeof(struct QueueNode));

q->next =NULL;

block_head=block_tail=q;

for(i=0;i

{

q=(struct QueueNode *)malloc(sizeof(struct QueueNode));

q->next=NULL;

q->PCB.state=0;

printf(“输入阻塞进程%d的pid和cpu_time:”,i+1);

scanf(“%d%d”,&q->PCB.pid,&q->PCB.cpu_time);

block_tail->next=q;

block_tail=q;

}

printf(“n处于就绪状态的进程有:n”);

p=ready_head->next;

i=1;

while(p)

{printf(“进程%d的pid和cpu_time:%5d%5d%5dn“,i,p->PCB.pid,p->PCB.state,p->PCB.cpu_time);

p=p->next;

i++;

} } void dispath()

//模拟调度 {

int x=0,t;

use_cpu=0;

unuse_cpu=0;

printf(”输入t:“);

scanf(”%d“,&t);

printf(”开始调度n“);

while(ready_head!=ready_tail||block_head!=block_tail)

{

struct QueueNode *p,*q;

if(ready_head!=ready_tail)

{

p=ready_head->next;

ready_head->next=p->next;

p->next=NULL;

if(ready_head->next==NULL)

{

ready_tail=ready_head;

}

p->PCB.state=2;

printf(”进程%d调度t“,p->PCB.pid);

state和

use_cpu++;

x++;

p->PCB.cpu_time--;

if(p->PCB.cpu_time)

{

ready_tail->next=p;

ready_tail=p;

}

else

{

printf(”进程%d完成t“,p->PCB.pid);

free(p);

}

}

else

{

unuse_cpu++;

x++;

printf(”空闲一个时间片t“);

}

if(x==t&&block_head!=block_tail)

{

q=block_head->next;

block_head->next=q->next;

q->next=NULL;

if(block_head->next==NULL)

{

block_tail=block_head;

}

ready_tail->next=q;

ready_tail=q;

x=0;

}

} } void calculate()

//计算CPU利用率 { printf(”ncpu的利用率%.2fn“,(float)use_cpu/(use_cpu+unuse_cpu));

} void main(){start_state();

dispath();

calculate();} 6运行结果:

7实验总结:

实验帮我复习了数据结构和C语言,且巩固课本知识,知道了如何定义结构体,如何在链接队列中增删节点。模拟进程调度帮我们巩固了进程三状态之间的变迁。懂得调式的重要性。总之,我们明白了理论联系实际。多看书,多上机。

实验三

可变分区存储管理

1.目的和要求

通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。

2.实验内容

阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。

假定系统的内存共640K,初始状态为操作系统本身占用64K。在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完成;在t3时间之后,作业E请求50K的内存空间;在t4时间之后,作业D完成。要求编程序分别输出t

1、t

2、t

3、t4时刻内存的空闲区的状态。

3.实验环境

Windows操作系统、VC++6.0 C语言

4.设计思想

模拟内存分配和回收,要设置两个链队列,一个空闲区链和一个占用区链,空闲区链节点有起始地址,大小和指向下一节点的指针等数据域,占用区链节点有起始地址,大小,作业名和指向下一节点的指针等数据域,本实验用最坏适应算法,每次作业申请内存都是从空闲链队头节点分配,如果相等,就删除空闲头结点,如果小于申请的,就不分配,否则就划分内存给作业,剩下的内存大小,重新插入空闲链队,按从大到小,接着把作业占用的内存放到占用区链节点的末尾。每次作业运行完,就要回收其占用的内存大小,把作业节点按从大到小插入到空闲链队中。5.源代码:

#include #include struct freelinkNode{ int len;int addre;

struct freelinkNode *next;};struct busylinkNode{ char name;

int len;int addre;struct busylinkNode *next;};struct freelinkNode *free_head=NULL;

//自由链队列(带头结点)队首指针

struct busylinkNode *busy_head=NULL;

//占用区队列队(带头结点)首指针

struct busylinkNode *busy_tail=NULL;

//占用区队列队尾指针 void start(void)/* 设置系统初始状态*/ { struct freelinkNode *p;

struct busylinkNode *q;

free_head=(struct freelinkNode*)malloc(sizeof(struct freelinkNode));

free_head->next=NULL;// 创建自由链头结点

busy_head=busy_tail=(struct busylinkNode*)malloc(sizeof(struct busylinkNode));

busy_head->next=NULL;// 创建占用链头结点

p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode));

p->addre=64;

p->len=640-64;//OS占用了64K

p->next=NULL;

free_head->next=p;

q=(struct busylinkNode *)malloc(sizeof(struct busylinkNode));

q->name='S';/* S表示操作系统占用

*/

q->len=64;q->addre=0;q->next=NULL;

busy_head->next=q;busy_tail=q;} void requireMemo(char name, int require)/*模拟内存分配*/ { freelinkNode *w,*u,*v;busylinkNode *p;if(free_head->next->len>=require){

p=(struct busylinkNode*)malloc(sizeof(struct busylinkNode));

p->name=name;

p->addre=free_head->next->addre;

p->len=require;

p->next=NULL;

busy_tail->next=p;

busy_tail=p;} else

printf(”Can't allocate“);

w=free_head->next;

free_head->next=w->next;

if(w->len==require)

{

free(w);} else {

w->addre=w->addre+require;

w->len=w->len-require;}

u=free_head;

v=free_head->next;

while((v!=NULL)&&(v->len>w->len)){

u=v;

v=v->next;}

u->next=w;

w->next=v;} void freeMemo(char name)/* 模拟内存回收*/ { int len;

int addre;busylinkNode *q,*p;freelinkNode *w,*u,*v;q=busy_head;

p=busy_head->next;

while((p!=NULL)&&(p->name!=name))

{

q=p;

p=p->next;}

if(p==NULL){

printf(”%c is not exist“,name);} else

{

if(p==busy_tail)

{

busy_tail=q;

}

else

{

q->next=p->next;

len=p->len;

addre=p->addre;

free(p);

w=(struct freelinkNode*)malloc(sizeof(struct freelinkNode));

w->len=len;

w->addre=addre;

u=free_head;

v=free_head->next;

while((v!=NULL)&&(v->len>len))

{ u=v;v=v->next;

}

u->next=w;

w->next=v;

} } } void past(int time)/* 模拟系统过了time 时间*/ { printf(”过了时间%d后:n“,time);} void printlink()/* 输出内存空闲情况(自由链的结点)*/ {

freelinkNode *p;

printf(”内存的空闲情况为:n“);

p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode));

p=free_head->next;

while(p!=NULL)

{

printf(”内存的起始地址和内存的大小%5dt%5d:n“,p->addre,p->len);

p=p->next;

} }

void main(){

int t1=1,t2=2,t3=3,t4=4;

start();

past(t1);

requireMemo('A',8);

requireMemo('B',16);

requireMemo('C',64);

requireMemo('D',124);

printlink();

past(t2);

freeMemo('C');

printlink();

past(t3);

requireMemo('E',50);

printlink();

past(t4);

freeMemo('D');

printlink();} 6.运行结果:

7.实验总结:

巩固编程能力,和调式能力,复习课本知识,明白理论联系实际的重要性,动手能力非常重要,多看书,多独立思考,品味痛苦的过程,享受成功的喜悦。

操作系统实验报告

院系:数计学院

班级:大类6班 学号:100511624 姓名:明章辉

指导教师:徐军利

操作系统实验报告

许昌学院《操作系统》实验报告书学号:姓名:闫金科班级:成绩: 5006140057 14物联网工程 2016年02月实验一 Linux的安装与配置一、实验目的1.熟悉Linux系统的基本概念,比如Linux......

操作系统实验报告

实验项目二 进程管理一、实验目的1.理解进程的概念,掌握父、子进程创建的方法。2.认识和了解并发执行的实质,掌握进程的并发及同步操作。二、实验内容1.编写一C语言程序,实现在......

S操作系统实验报告

DOS操作系统实验报告(2)班级_____________姓名_____________学号_____________一、写出下列命令(设当前目录为C:\):1、将c盘windows目录中主名长度为1-4个字符的所有文件拷贝到d......

操作系统实验报告一

实验报告一一、实验目的通过本实验,掌握Linux的基本操作以及Linux的文本编辑,对Linux有一个基本的了解。 二、实验任务1、Linux的基本操作1) 在图形交互方式下实现对用户、用户......

操作系统实验报告[材料]

计算机学院实验报告课 程实验名称 专 业班 级学 号学生姓名 操作系统 进程的控制 计算机操作系统 131110196 邹明镇 嘉应学院计算机学院 1305 一、实验目的熟悉进程的......

下载操作系统实验报告word格式文档
下载操作系统实验报告.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

热门文章
点击下载本文