搜索
您的当前位置:首页重庆交通大学

重庆交通大学

来源:智榕旅游


重庆交通大学 综合性设计性实验报告

班 级: 计 科 专业 2008级一班

姓 名: 刘笑

实验项目名称: 模 拟 进 程 并 发 执 行

实验项目性质: 操 作 系 统 多 任 务

实验所属课程: 计算机操作系统

实验室(中心): 语 音 大 楼 8 楼 801

指 导 教 师 : 刘刘

实验完成时间: 2010 年 11 月 4 日

教师评阅意见:

实验成绩: 签名: 年 月 日

一、实验目的

1、通过实验来模拟进程的并发执行,来深入了解什么事操作系统的进程,以及进程有些什么特性。

2、了解进程间是如何做到并发执行的,进程间是如何做到资源共享的。以及验证进程在运行过程中的进度是随机的,不可控制的。

3、通过实验来了解进程的三种状态以及状态间的转换条件。 4、加深对进程概念的理解; 5、认识进程并发执行的实质

6、分析进程争用资源的现象,学习解决进程互斥的方法。

二、实验内容及要求

用直观的方式模拟进程执行时的过程,显示在屏幕上。

实现一个能够直观反应单个进程执行与多个进程并发执行时由于资源竞争而引起的进程执行速度变化的过程。且进程的初始状态和进度都是随机的,不可控制的。

三、实验步骤:

1、整个程序用c语言编写,演示程序demo为主控程序, init为初始化, scheduler实现进程调度,从scheduler返回后演示结束.

2、scheduler调用find寻找一个就绪进程.

3、find采用优先权的进程调度算法,规定优先权反比于进程的id,将选中的id返回给scheduler.

4、循环调度直至进程全部阻塞后返回demo结束演示。若find返回值为i,则为task i恢复运行现场后使进程taski运行.

四、源程序

#include \"stdio.h\" #include \"math.h\" int m1,m2; int i;

char addr; struct {int id;

char status; int waiter; }pcb[4]; struct {int g; char ad; }stack[4]; struct

{int value; int waiter; }sem[3];

int Digui (int j)

{if(pcb[j].waiter!=0) Digui(j=pcb[j].waiter); else return j; }

int p(int se,int pd,char ad) {sem[se].value=sem[se].value-1; if(sem[se].value>=0) return 1;

else {stack[pd].g=i; stack[pd].ad=ad;

if(sem[se].waiter==0) sem[se].waiter=pd;

else{pcb[Digui(sem[se].waiter)].waiter=pd; pcb[pd].waiter=0;} pcb[pd].status='b'; return 0;} }

int v(int se,int pd,char ad) {sem[se].value=sem[se].value+1; if(sem[se].value<0) return 1;

else if(sem[se].value>=0) {stack[pd].g=i; stack[pd].ad=ad;

pcb[sem[se].waiter].status='r'; sem[se].waiter=pcb[sem[se].waiter].waiter; pcb[sem[se].waiter].waiter=0; return 0;} }

int task1()

{ if(addr==’m’) goto m;

printf(“task1 running\\nâ€); i=1;

a: printf(“task1 calls p on sem1\\nâ€); if(p(1,1,’m’)==0 return(0);

m: printf(“task1 printing m1=%d\\nâ€,m1); printf(“task i=%d\\nâ€,i); i=i+5; goto a; }

int task2()

{ if(addr==’m’) goto m; if(addr==’n’) goto n; printf(“task2 running\\nâ€);

a: printf(“task2 calls p on sem2\\nâ€); if(p(2,2,’m’)==0) return(0); m: m1=2*m2;

printf(“task2 calls v on sem1 m1=%d\\nâ€,m1); if(v(1,2,’n’)==0) return(0); n: printf(“task2 i=%d\\nâ€,i); i=i+10; goto a; }

int task3() {

if(addr==’m’) goto m; if(addr==’n’) goto n; printf(“task3 running\\n); i=1;

a: if(i>4) goto b; m2=i;

printf(“task3 calls v on sem m2=%d\\nâ€,m2); if(v(2,3,’m’)==0) return(0); m: i++; goto a;

b: printf(“task3 calls p on sem2\\nâ€); if(p(2,3,’n’)==0) return(0); n: ; }

void init() {int j; m1=0;m2=0; i=0;addr=0;

for(j=1;j<=3;j++) {pcb[j].id=j; pcb[j].status='r';pcb[j].waiter=0;} for(j=1;j<=2;j++) {sem[j].value=0;sem[j].waiter=0;}

for(j=1;j<=3;j++) {stack[j].g=0;stack[j].ad='0';} }

int find() {int j=0;

int s,first;

for(s=1;s<=3;s++) if(pcb[s].status=='b') j++; if(j==3) return first=0; else {first=3;

for(s=1;s<=3;s++) if(pcb[s].status=='r'&&pcb[s].idi=stack[first].g;addr=stack[first].ad; return first;} }

int scheduler() {switch(find())

{case 0 : printf(\"All the process have been blocked.\"); printf(\"End!\"); return 0;}

case 1 : if(task1()==0) scheduler();return 1;break; case 2 : if(task2()==0) scheduler();return 1;break;

五、实验中遇到的问题及解决方法:

试验中遇到的问题:试验中,进程调度算法的实现是很大的难点之一,特别是循环调度有很大的障碍,以及编程与实际的结合,各个进程如何以串行的方式进行;进程在各个状态间的转换、转换原因等。

解决方法:实验中的困难,激发了我学习的积极性,通过查阅相关文本资料,以及向有关同学学习探讨,加强了我分析问题,解决问题的能力’更增加了我与同学交流沟通和共同解决问题的能力。巩固了上课是所学的知识,加深了对c++界面程序设计的理解,达到了学以致用的目的。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top