操作系统实验报告实验一进程管理.docx
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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()
{