操作系统实验报告实验一进程管理.docx

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.

实验一进程管理

一、目的

程度是理机管理的核心内容。本要求写和一个的程度程序。通本

加深理解有关程控制、程列的概念,并体会和了解程度算法的具体施法。

二、实验内容及要求

1、程控制PCB 的构( PCB 构通常包括以下信息:程名(程ID )、程先数、

片、程所占用的CPU 、程的状、当前列指等。可根据的不同,PCB 构的内容可以作适当的增)。了便于理,程序中的某程运行以片位算。各程的

数以及程需运行的片数的初始均由用定。

2 、系源( r1⋯r w),共有w,每数目r1⋯ r w。随机生 n程 P i( id,s(j,k) ,t),0<= i<= n,0<= j<=m,0<=k<=dt 运行,在运行程中,会随机申新的源。

3、每个程可有三个状(即就状W 、运行状R、等待或阻塞状B),并假初始状

就状。建立程就列。

4、制程度算法:片度算法

本程序用算法 n 个程行度,程每行一次,CPU 片数加 1,程需要的片

数减 1。在度算法中,采用固定片(即:每行一次程,程的行片数已行了1个位),, CPU 片数加 1,程需要的片数减1,并排列到就列的尾上。

三、实验环境

操作系境:Windows 系。

程言: C# 。

四、实验思路和设计

1、程序流程

.

开始

对进程进行初始化,建立就绪队列、阻塞队列。Input()

触发时钟,调用时间片轮转调度算法。runFcfs()

就绪队列为空?结束

输出就绪队列和阻塞队列的信息。

outputall()

取就绪队列的第一个进程,判断其运行的时间片

是否达到所需次数。如果达到,则释放资源

如果没达到,则运行一个时间片。running()

检查阻塞队列,对于当前资源数目满足阻塞队列的进程,

由阻塞转入就绪队列。testblock()

检查是否有新进程产生,如果有,则判断系统资源是否

够用,如果够用,则分配给该进程,插入就绪队列。如

果不够用,则插入阻塞队列。testnew()

显示三类资源情况。rescore()

2、主要程序代

//PCB 构体

struct pcb

{

public int id;//程 ID

public int ra;//所需源 A 的数量

public int rb;//所需源 B 的数量

public int rc;//所需源 C 的数量

public int ntime;//所需的片个数

public int rtime;//已运行的片个数

public char state; // 程状, W (等待)、 R(运行)、 B(阻塞)

//public int next;

}

ArrayList hready = new ArrayList();

ArrayList hblock = new ArrayList();

Random random = new Random();

//ArrayList p = new ArrayList();

int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m要模的程个数,n 初始化程个数

//r 可随机生的程数(r=m-n)

//a, b,c 分 A , B, C 三源的量

//i 城数,i=1 ⋯ n

//h 运行的片次数,time1Inteval 片大小(毫秒)

//程行初始化,建立就数、阻塞数。

public void input()// 程行初始化,建立就列、阻塞列

{

m = int.Parse(textBox4.Text);

n = int.Parse(textBox5.Text);

a = int.Parse(textBox6.Text);

b = int.Parse(textBox7.Text);

c = int.Parse(textBox8.Text);

a1 = a;

b1 = b;

c1 = c;

r = m - n;

time1Inteval = int.Parse(textBox9.Text);

timer1.Interval = time1Inteval;

for (i = 1; i <= n; i++)

{

pcb jincheng = new pcb();

jincheng.id = i;

jincheng.ra = (random.Next(a) + 1);

jincheng.rb = (random.Next(b) + 1);

jincheng.rc = (random.Next(c) + 1);

jincheng.ntime = (random.Next(1, 5));

listBox1.Items.Add(" 产生进程ID : " + jincheng.id);

listBox1.Items.Add(" 所需 A 资源数目: " + jincheng.ra);

listBox1.Items.Add(" 所需 B 资源数目: " + jincheng.rb);

listBox1.Items.Add(" 所需 C 资源数目: " + jincheng.rc);

listBox1.Items.Add(" 所需时间片数:" + jincheng.ntime);

if ((a - jincheng.ra) >= 0 && (b - jincheng.rb) >= 0 && (c - jincheng.rc) >= 0)

{

a = a - jincheng.ra;

b = b - jincheng.rb;

c = c - jincheng.rc;

jincheng.state = 'W';

hready.Add(jincheng);// 加入就绪队列

}

else

{

jincheng.state = 'B';

hblock.Add(jincheng);// 加入阻塞队列

}

listBox1.Items.Add(" 当前进程状态:" + jincheng.state);

}

}

//从数组起始地址开始输出该数组的内容

public void disp(ArrayList list)

{

ArrayList list1 = new ArrayList();

list1 = list;

if (list1.Count > 0)

{

for (int j = 0; j < list1.Count; j++)

{

pcb p = (pcb)list1[j];

listBox1.Items.Add("" + p.id.ToString() + "" + p.state.ToString() + "" + p.ra.ToString() + "" + p.rb.ToString() + "" + p.rc.ToString()+"" + p.ntime.ToString() + "" + p.rtime.ToString() + "\r\n");

}

}

else

{

listBox1.Items.Add("\r\n\t该队列中没有进程!\r\n");

}

}

//输出就绪数组和阻塞数组的信息

public void outputall()

{

相关文档
最新文档