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

实验一进程管理

一、目的

进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。

二、实验内容及要求

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、程序流程图

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()

{

listBox1.Items.Add("*********当前就绪队列的信息!*********");

listBox1.Items.Add("进程ID 进程状态A资源数B资源数C资源数所需时间片已运行时间片");

disp(hready);

listBox1.Items.Add("*********当前就阻塞列的信息!*********");

listBox1.Items.Add("进程ID 进程状态A资源数B资源数C资源所需时间片已运行时间片");

disp(hblock);

}

//运行就绪数组的头进程,运行一个时间片,轮转一个时间片,时间片轮转调度算法

public void running()

{

ArrayList hready1 = new ArrayList();

hready1 = hready;

pcb p1 = new pcb();

p1=(pcb)hready1[0];

p1.state='R';

p1.rtime= p1.rtime + 1;

h=h+1;

listBox1.Items.Add("\r\n~~~~~~~当前正在运行进程ID是:" +p1.id + "~~~~~~~~\r\n");

listBox1.Items.Add("\r\n进程ID 进程状态A资源数B资源数C资源数所需时间片已运行时间片\r\n");

listBox1.Items.Add(p1.id + " " +p1.state+ " " + p1.ra + " " + p1.rb + " " + p1.rc + " " + p1.ntime + " " + p1.rtime);

if (p1.ntime==p1.rtime)

{

listBox1.Items.Add(p1.id.ToString()+"的进程已经完成!\r\n");

a = a + p1.ra;

b = b + p1.rb;

c = c + p1.rc;

hready.RemoveAt(0);

}

else

{

p1.state='W';

hready1.Add(p1);

hready.RemoveAt(0);

}

}

//检测当前资源数目是否满足阻塞数组里进程的需求

public void testblock()

{

ArrayList hblock1 = new ArrayList();

hblock1 = hblock;

for (int m = 0; m < hblock1.Count; m++)

{

p1 = (pcb)hblock1[m];

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

{

p1.state='W';

hready.Add(p1);

a = a - p1.ra;

b = b - p1.rb;

c = c - p1.rc;

listBox1.Items.Add("ID号为:"+p1.id + "的进程由阻塞队列转入就绪队列~~\r\n");

hblock.RemoveAt(m);

m--;

}

}

}

//检测是否有新的进程产生,随机产生新进程

public void testnew()

{

int t;

if (r>0)//r为随机产生的进程数目

{

t = random.Next(9) + 1;

if (t <= 7)

{

listBox1.Items.Add("\r\n有新的进程申请加入:~~");

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));

jincheng.rtime = 0;

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';

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

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

listBox1.Items.Add("资源满足新进程请求,该进程进入就绪队列~~\r\n");

else

{

jincheng.state = 'B';

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

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

listBox1.Items.Add("资源不满足新进程请求,该进程进入阻塞队列~~\r\n");

}

}

}

r = r - 1;

}

//系统三类资源变化情况的显示

public void rescore()//系统三类资源变化情况的显示

{

if (a > a1) { textBox1.Text = a1.ToString(); }

if (a < 0) { textBox1.Text = "0"; }

if (a >= 0 && a < a1) { textBox1.Text = a.ToString(); }

if (b > b1) { textBox2.Text = b1.ToString(); }

if (b < 0) { textBox2.Text = "0"; }

if (b >= 0 && b <= b1) { textBox2.Text = b.ToString(); }

if (c > c1) { textBox3.Text = c1.ToString(); }

if (c < 0) { textBox3.Text = "0"; }

if (c >= 0 && c <= c1) { textBox3.Text = c.ToString(); }

}

//时间片轮转调度算法(先来先服务FCFS算法)

public void runFcfs()

{

if (hready.Count>0)

{

outputall();

running();

testblock();

testnew();

rescore();

}

else

{

timer1.Enabled = false;

textBox1.Text = a1.ToString();

textBox2.Text = b1.ToString();

textBox3.Text = c1.ToString();

listBox1.Items.Add("\r\n<<<<<<<<所有进程都已经运行结束!>>>>>>>~\r\n");

}

//计时器触发时间片轮转调度算法

private void timer1_Tick(object sender, EventArgs e)

runFcfs();

}

//开始模拟按钮单击执行函数

private void button1_Click(object sender, EventArgs e) {

runmain();

button1.Enabled = false;

textBox1.Enabled = false;

textBox2.Enabled = false;

textBox3.Enabled = false;

textBox4.Enabled = false;

textBox5.Enabled = false;

textBox6.Enabled = false;

textBox7.Enabled = false;

textBox8.Enabled = false;

textBox9.Enabled = false;

}

//清除屏幕按钮单击执行函数

private void button2_Click(object sender, EventArgs e) {

textBox1.Text = "";

textBox2.Text = "";

textBox3.Text = "";

textBox4.Text = "";

textBox5.Text = "";

textBox6.Text = "";

textBox7.Text = "";

textBox8.Text = "";

textBox9.Text = "";

listBox1.Items.Clear();

textBox4.Enabled = true;

textBox5.Enabled = true;

textBox6.Enabled = true;

textBox7.Enabled = true;

textBox8.Enabled = true;

textBox9.Enabled = true;

button1.Enabled = true;

}

//运行的主函数

public void runmain()

{

input();

imer1.Enabled = true;

3、运行界面和运行结果

界面中,可以任意设定需要模拟的进程总数(如5),初始化进程个数(如3),还有A、B、C三类资源的总数(如10、10、10)。为了方便显示,还可以设定时间片的长度(如500毫秒)。除此之外,在运行过程中,所有的资源都是随机生成的,并且其中新进程的产生也是随机的,但是产生的进程总数不会多于开始设定的模拟的进程总数,以防止不断产生新进程,程序不断运行。在显示窗口的上方,还会实时显示资源的变化情况,方便对运行的观察。当运行结束后,可以通过工具栏中的显示选项中的保存结果按钮,将结果保存成txt文件格式,方便运行后的结果分析。

五、心得体会

本次实验,我的任务是设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制、同步与通讯机构,系统在运行过程中能显示各进程的状态及有关参数的变化情况,从而观察诸进程的运行过程及系统的管理过程,我是用C#写的,在我的电脑能够运行通过,虽不能尽善尽美,但也基本能实现老师的要求。

两个星期的实验,虽然时间有点短,但我也收获不少,这次实验,加深了我对进程概念及进程管理的理解;比较熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。也让我认识到自己的不足,操作系统的有些知识,我知道的还不多,没有掌握好,还需要多多学学,不断提升自己的能力。

实验中,我们小组分工合作,共同学习,虽然在实验中遇到了一些问题,但在老师和同学的细心指导和热心帮助下解决了。同时,了解到团队精神的重要性,也为以后的学习和工作打下了坚实的基础,同时积累了宝贵的经验。

进程管理实验报告_共10篇 .doc

★进程管理实验报告_共10篇 范文一:_进程管理实验报告进程管理实验报告 一、进程与线程 1.实验目的: 1.通过本实验学习Linux中创建进程的方法。 2.学习系统调用fork的使用方法。 3.学习系统调用exec族调用的使用方法。 2.实验准备 1.进程的创建 创建一个进程的系统调用很简单,只要调用fork函数就可以了。 #include pid_tfork(); 当一个进程调用了fork以后,系统会创建一个子进程,这个子进程和父进程是不同的地方只有它的进程ID和父进程ID,其他的都一样,就像父进程克隆(clone)自己一样,当然创建两个一模一样的进程是没有意义的,为了区分父进程和子进程,我们必须跟踪fork调用返回值。当fork调用失败的时候(内存不足或者是用户的最大进程数已到)fork返回—1,否则fork的返回值有重要的作用。对于父进程fork返回子进程ID,而对于fork 子进程返回0,我们就是根据这个返回值来区分父子进程的。 2.关于fork的说明 使用该函数时,该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。

将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数可以是一个子进程获得其所有子进程的进程ID。 而fork函数使子进程得到的返回值是0的理由是:一个子进程只会有一个父进程,所以子进程总是可以调用函数getpid获得其父进程的进程ID。 3.系统调用exec族调用的说明 父进程创建子进程后,子进程一般要执行不同的程序。为了调用系统程序,我们可以使用系统调用exec族调用。Exec族调用有以下五个函数: intexecl(constchar*path,constchar*arg,?); intexeclp(constchar*file,constchar*arg,?); intexecle(constchar*path,constchar*arg,?); intexecv(constchar*path,constchar*argv[]); intexecvp(constchar*file,constchar*argv[]); exec族调用可以执行给定程序。关于exec族调用的详细解说可以参考系统手册。 3.实验内容及步骤 编程实现使用fork函数创建子进程,以及在子进程中调用exec族调用的程序。 1、进入Linux操作系统中的终端显示如下: 在系统shell提示符下输入vi及文件名后,进就入vi画面。如果系统内还不存在该文件,就意味着要穿件文件。如果系统内存在该文件,就意味着要该文件。下面就是用vi器创建文件的实例。

操作系统实验报告----进程管理

实验内容:进程管理 一、实验目的 1、掌握Linux中进程的创建方法及执行情况; 2、加深对进程、进程树等概念的理解; 3、掌握Linux中如何加载子进程自己的程序; 4、掌握父进程通过创建子进程完成某项任务的方法; 5.、掌握系统调用exit()和_exit()调用的使用。 6、分析进程竞争资源的现象,学习解决进程互斥的方法;进一步认识并发执行的实质 二、实验内容 (一)进程的创建 1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中 有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符。 #include main() { int p,x; p=fork(); if(p>0) { x=fork(); if(x>0) printf("father\n"); else printf("child2"); } else printf("child1"); } 输出结果: child1 child2 father 2、运行以下程序,分析程序执行过程中产生的进程情况。 #include main() { int p,x; p=fork(); if (p>0) fork(); else{ fork();

fork(); } sleep(15); } 实验步骤: 编译连接 gcc –o forktree forktree.c 后台运行 ./forktree & 使用 pstree –h 查看进程树 运行结果: ├─gnom e-terminal─┬─bash─┬─forktree─┬─forktree─┬─forktr ee───forktree ││││└─forktree │││└─forktree ││└─pstree 分析:程序运行,系统首先创建一个进程forktree,执行到p=fork()创建一个子进程forktree,子进程获得处理机优先执行,父进程等待;执行else,当执行到第一个fork()函数时,子进程创建了一个进程forktree,称之为孙进程,孙进程获得处理机往下执行,子进程等待;执行到第二个fork()函数时,孙进程又创建一个进程forktree,称之为重孙进程,重孙进程很快执行完,将处理机还给孙进程,孙进程很快执行完,将处理机还给子进程;子进程继续往下执行,执行到第二个fork()函数,又创建一个进程forktree,称之为第二孙进程,并获得处理机执行,此进程很快执行完,将处理机还给子进程,子进程也很快执行完,将处理机还给父进程,父进程P>0执行if语句,运行fork()函数,又创建一个进程forktree,称之为第二子进程,此进程获得处理机执行很快运行完,将处理机还给父进程,父进程运行sleep(15)语句,休眠15秒,用pstree命令查询进程树。 3、运行程序,分析运行结果。 #include main() { int p,x,ppid,pid; x=0; p=fork(); if(p>0) { printf("parent output x=%d\n",++x); ppid=getpid(); printf("Thi id number of parent is:ppid=%d\n",ppid); } else { printf("child output x=%d\n",++x); pid=getpid(); printf("Thi id number of child is:pid=%d\n",pid);

操作系统实验 实验1 进程描述与控制

信息学院 操作系统实验报告 姓名:杨博敏 学号:1305290206 专业:软件工程 班级:软件1302班 实验名称:进程控制与描述

实验一进程控制与描述 3.1 Windows“任务管理器”的进程管理 3.1.1 Windows XP的任务管理器 Windows XP的任务管理器提供了用户计算机上正在运行的程序和进程的相关信息,也显示了最常用的度量进程性能的单位。使用任务管理器,可以打开监视计算机性能的关键指示器,快速查看正在运行的程序的状态,或者终止已停止响应的程序。也可以使用多个参数评估正在运行的进程的活动,以及查看CPU 和内存使用情况的图形和数据。其中: 1) “应用程序”选项卡显示正在运行程序的状态,用户能够结束、切换或者启动程序。 2) “进程”选项卡显示正在运行的进程信息。例如,可以显示关于CPU 和内存使用情况、页面错误、句柄计数以及许多其他参数的信息。 3) “性能”选项卡显示计算机动态性能,包括CPU 和内存使用情况的图表,正在运行的句柄、线程和进程的总数,物理、核心和认可的内存总数(KB) 等。 3.1.2 练习与实验 在本节“练习与实验”中,通过在Windows任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能。 1. 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 需要准备一台运行Windows XP Professional操作系统的计算机。

2. 实验内容与步骤 启动并进入Windows环境,单击Ctrl+Alt+Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。 在本次实验中,你使用的操作系统版本是: _____windowsXP_______________________________________________ 当前机器中由你打开,正在运行的应用程序有: 1)Microsoft_Word Windows“任务管理器”的窗口由4个选项卡组成,分别是: 1)应用程序 2) 进程 3) 性能 4)用户 当前“进程”选项卡显示的栏目分别是(可移动窗口下方的游标/箭头,或使窗口最大化进行观察) : 1) 映像名称 2) 用户名 3) CPU 4)内存使用 (1) 使用任务管理器终止进程 步骤1:单击“进程”选项卡,一共显示了__48个进程。请试着区分一下,其中: 系统(SYSTEM) 进程有___23___个,填入表3.1中。 表3.1 实验记录 注:在Windows 2000中,“用户名”需要自己判断。这一点,在Windows XP中有了改进。 服务(SERVICE) 进程有_5_个,填入表3.2中。

操作系统实验1_进程管理

仲恺农业工程学院实验报告纸 实验一进程管理 一、实验目的 通过实验使学生进一步了解进程、进程状态、进程控制等基本概念。基本能达到下列具体的目标: 1、理解进程 PCB 的概念,以及 PCB 如何实现、如何组织以及管理。 2、复习数据结构中如何对链的操作,包括建链、删除、插入结点等,来实 现进程的管理。 二、实验内容 1、建立一个结点,即 PCB 块包括用户标识域、状态域(执行、等待、就 绪)、 link 域。 2、建立三个队列(执行队列、就绪队列、等待队列)。 3、根据进程状态转换实现对三个队列的具体操作。具体的驱动可以采用时 间片算法或手动调度的形式完成三个状态之间的转换 4、用 switch 选择语句选择状态。 5、按照自己的设定能完成所有的状态转换的运行(包括创建和运行结束)。 三、实验步骤 1、复习进程管理三状态模型部分内容。 2、预习C++ Builder或VC++、Delphi、JBuilder线程编程。 3、运行示例程序,进一步明确实验要求。可以采用控制台模式或窗口模式。 4、上机编程、调试程序。 四、主要代码 1.通过java的awt和swing包进行相关界面的布局,相关代码为: Panel p1=new Panel(new FlowLayout(FlowLayout.LEFT)); Panel p2=new Panel(new FlowLayout());

//三个显示进程的文本框 JTextField readyList,runningList,waitingList,input; //三个进程的链表 ArrayList reList=new ArrayList(); ArrayList ruList=new ArrayList(); ArrayList waList=new ArrayList(); Iterator iterRunning,iterReady,iterWaiting; public MyFrame(){ this.setLayout(new BorderLayout()); this.add(p1,BorderLayout.NORTH); this.add(p2,BorderLayout.CENTER); init(); this.setTitle("进程三态转换"); setBounds(300,300,500,300); setVisible(true); } void init(){ Box box1=Box.createHorizontalBox(); box1.add(new JLabel("进程就绪队列:")); readyList=new JTextField(35); readyList.setEditable(false); box1.add(readyList); Box box2=Box.createHorizontalBox(); box2.add(new JLabel("进程阻塞队列:")); waitingList=new JTextField(35); waitingList.setEditable(false); box2.add(waitingList);

操作系统 实验一 进程管理

实验报告一进程管理 一、实验目的 1、加深对进程概念的理解,明确进程和程序的区别; 2、进一步认识并发执行的实现; 3、分析进程重用资源的现象,学习解决进程互斥和同步的方法; 4、了解和熟悉进程通信的方法。 二、实验内容 编程实现: 1、进程的创建与撤销; 2、进程的互斥与同步; 3、进程的通信。 三、实验环境 Linux(Windows)、C语言。 四、实验原理(方法)与实验步骤 1、进程的创建实验原理: 进程创建函数fork()原型: fork()函数,创建一个新进程。 格式:int fork() 其中返回int取值意义如下: 0:创建子进程,从子进程返回的值 >0:从父进程返回的子进程id值 -1:创建失败 进程的创建 1,系统的初始化 2,一个进程在运行过程中开启了子进程 3,用户的交互式请求,而创建一个新进程(如双击qq) 4,一个批处理作业的初始化(只在大型机的批处理系统中应用) 关于进程的创建,UNIX和WINDOWS 1,在unix中系统调用的是:fork,fork会创建一个与父进程一摸一样的副本 2,在windows中该系统调用是:cresteprocess ,既负责处理进程的创建,也负责把正确的程序装入新进程 在进程创建时,调用do_fork函数来创建新进程,那么和调度相关的操作主要有两个,一个是sched_fork,这是对一个进程进行调度的初始化,另外一个就是wake_up_new_task,这个是把刚刚创建的子进程唤醒加入到调度器中管理。

2、进程同步原理? 进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。 比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。而当进程A产生信息放入缓冲区时,进程B才会被唤醒。 3、进程的通信,管道文件名? 进程间通信是指在不同进程之间传播或交换信息。 IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 一、管道 管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。 1、特点: 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。 一、管道 管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。 原型: #include int pipe(int fd[2]); // 返回值:若成功返回0,失败返回-1 特点: 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。 消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。特点: 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。 信号量与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。 特点: 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。

操作系统实验1--进程管理

设计一个有N个进程的进程调度程序。 一、实验目的 通过一个简单的进程调度模拟程序的实现,加深对各种进程调度算法,进程切换的理解。二实验内容 1、进程调度算法:采用动态最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)。 2、每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息: 进程名---进程标示数ID 优先数PRIORITY 优先数越大优先权越高 到达时间---进程的到达时间为进程输入的时间。、 进程还需要运行时间ALLTIME,进程运行完毕ALLTIME=0, 已用CPU时间----CPUTIME、 进程的阻塞时间STARTBLOCK-表示当进程在运行STARTBLOCK个时间片后,进程将进入阻塞状态 进程的阻塞时间BLOCKTIME--表示当进程阻塞BLOCKTIME个时间片后,进程将进入就绪状态 进程状态—STATE 队列指针NEXT 用来将PCB排成队列。 3、调度原则: 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 进程在就绪队列中带一个时间片,优先数加1 每个进程的状态可以是就绪R(READY)、运行R(Run)阻塞B(BLOCK)、或完成F (Finish)四种状态之一。 就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减3,然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。 三实验要求 完成验内容并写出实验报告,报告应具有以下内容: 1.实验目的。 2.实验内容。 3.程序及运行情况。 4.实验过程中出现的问题及解决方法。

实验一进程管理实验

实验一进程管理实验 一、实验目的 1.熟悉实验环境 2.熟悉控制台环境下的操作命令 3.理解进程的概念,明确进程和程序的区别; 4.查看进程和销毁进程 二、实验内容 1.了解当前系统的运行健康状况 2.查看和销毁进程 3.了解注册表管理程序 4.熟悉控制台下操作计算机的命令 三、实验任务和要求 1、了解当前系统的运行健康状况 使用“Ctrl+Alt+Del”组合键打开 Windows 自带的任务管理器,查看并对比分析当前系统中运行的进程情况,各进程占用的主要资源情况,据此了解当前系统的运行健康状况。 要求:熟悉当前系统进程占用CPU的情况,内存的工作状态 2、 进入“详细信息”页中,查看当前系统中运行的进程情况,结合进程描述信息,理解各进程的功能,解释为什么有许多重复的进程。 要求:查阅资料,解答什么是进程为什么有许多重复的进程? 3、查看系统中进程的信息 查看系统中进程的详细信息,了解所列表项的含义 要求:熟练运用控制台命令查看和销毁进程 4、注册表管理程序 使用 Win+R 组合键打开运行窗口,输入 Regedit 命令,按回车后打开注册表管理程序,查看其基本结构(只能看,不能修改) 备注:注册表是Windows内部一个巨大的树状分层的数据库(Windows目录下的和),存放着各种参数,直接控制着Windows的启动、硬件驱动程序的装载

以及一些Windows应用程序的运行,从而在整个系统中起着核心作用。 每个软件的安装都有注册表的生成,所以通过修改注册表还可以设置软件参数等,解决一般电脑软件所无法解决的设置问题。 要求:查阅资料,解答注册表的作用是什么? 5、系统配置管理程序 使用 Win+R 组合键打开运行窗口,输入 msconfig 命令,按回车后打开系统配置管理程序。 查看部分选项(只能看,不能修改) 要求:查阅资料,解答系统配置的作用是什么? 6、控制台命令 使用快捷键 Win+R,然后键入CMD,尝试常用的操作系统命令 例如:help Help|more Ver Cd Type Path Copy Dir net user Net star net config net share Schtasks Date TaskList tskill PID ...... 要求:熟悉常用的控制台命令,理解控制台命令与图形用户界面各自的特点。

操作系统-进程管理实验报告

操作系统-进程管理实验报告实验一进程管理 1.实验目的: (1)加深对进程概念的理解,明确进程和程序的区别; (2)进一步认识并发执行的实质; (3)分析进程争用资源的现象,研究解决进程互斥的方法; (4)了解Linux系统中进程通信的基本原理。 2.实验预备内容 (1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解; (2)阅读Linux的fork()源码文件,分析进程的创建过程。 3.实验内容 (1)进程的创建: 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让

每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。 源代码如下: #include #include #include #include #include int main(int argc,char* argv[]) { pid_t pid1,pid2; pid1 = fork(); if(pid1<0){ fprintf(stderr,"childprocess1 failed"); exit(-1); } else if(pid1 == 0){ printf("b\n"); }

else{ pid2 = fork(); if(pid2<0){ fprintf(stderr,"childprocess1 failed"); exit(-1); } else if(pid2 == 0){ printf("c\n"); } else{ printf("a\n"); sleep(2); exit(0); } } return 0; } 结果如下: 分析原因: pid=fork();

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

操作系统实验报告进程管理 操作系统实验报告:进程管理 引言 操作系统是计算机系统中的核心软件,负责管理计算机的硬件资源和提供用户 与计算机之间的接口。进程管理是操作系统的重要功能之一,它负责对计算机 中运行的各个进程进行管理和调度,以保证系统的高效运行。本实验报告将介 绍进程管理的基本概念、原理和实验结果。 一、进程管理的基本概念 1. 进程与线程 进程是计算机中正在运行的程序的实例,它拥有独立的内存空间和执行环境。 线程是进程中的一个执行单元,多个线程可以共享同一个进程的资源。进程和 线程是操作系统中最基本的执行单位。 2. 进程状态 进程在运行过程中会经历不同的状态,常见的进程状态包括就绪、运行和阻塞。就绪状态表示进程已经准备好执行,但还没有得到处理器的分配;运行状态表 示进程正在执行;阻塞状态表示进程由于某些原因无法继续执行,需要等待某 些事件的发生。 3. 进程调度 进程调度是操作系统中的一个重要任务,它决定了哪个进程应该获得处理器的 使用权。常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)和时 间片轮转等。 二、进程管理的原理

1. 进程控制块(PCB) PCB是操作系统中用于管理进程的数据结构,它包含了进程的各种属性和状态 信息,如进程标识符、程序计数器、寄存器值等。通过PCB,操作系统可以对 进程进行管理和控制。 2. 进程创建与撤销 进程的创建是指操作系统根据用户的请求创建一个新的进程。进程的撤销是指 操作系统根据某种条件或用户的请求终止一个正在运行的进程。进程的创建和 撤销是操作系统中的基本操作之一。 3. 进程同步与通信 多个进程之间可能需要进行同步和通信,以实现数据共享和协作。常见的进程 同步与通信机制包括互斥锁、信号量和管道等。 三、实验结果与分析 在本次实验中,我们使用了一个简单的进程管理模拟程序,模拟了进程的创建、撤销和调度过程。通过该程序,我们可以观察到不同调度算法对系统性能的影响。 实验结果显示,先来先服务(FCFS)调度算法在一些情况下可能导致长作业等 待时间过长,影响系统的响应速度。而最短作业优先(SJF)调度算法可以有效 减少长作业的等待时间,提高系统的吞吐量。时间片轮转调度算法则可以保证 所有进程公平地获得处理器的使用权。 此外,我们还观察到进程同步与通信的重要性。在多个进程之间进行数据共享时,正确的同步和通信机制可以避免数据竞争和死锁等问题,提高系统的稳定 性和可靠性。

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

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 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、程序流程图 [

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 = ; n = ; a = ; b = ; c = ; a1 = a; b1 = b; 、 c1 = c; r = m - n; time1Inteval = ; = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); = i;

进程管理实验报告

进程管理实验报告 进程管理实验报告 引言: 进程管理是操作系统中的重要概念,它负责调度和控制计算机系统中的各个进程,确保它们能够有序地执行。本实验旨在通过实际操作和观察,深入了解进 程管理的原理和方法,并通过实验结果分析其影响因素和优化策略。 实验一:进程创建与终止 在本实验中,我们首先进行了进程的创建和终止实验。通过编写简单的程序, 我们能够观察到进程的创建和终止过程,并了解到进程控制块(PCB)在其中 的作用。 实验结果显示,当一个进程被创建时,操作系统会为其分配一个唯一的进程ID,并为其分配必要的资源,如内存空间、文件描述符等。同时,操作系统还会为 该进程创建一个PCB,用于存储该进程的相关信息,如进程状态、程序计数器等。 当我们手动终止一个进程时,操作系统会释放该进程所占用的资源,并将其 PCB从系统中删除。这样,其他进程便可以继续使用这些资源,提高系统的效 率和资源利用率。 实验二:进程调度算法 进程调度算法是决定进程执行顺序的重要因素。在本实验中,我们通过模拟不 同的进程调度算法,比较它们在不同场景下的表现和效果。 我们选择了三种常见的进程调度算法:先来先服务(FCFS)、最短作业优先(SJF)和轮转调度(RR)。通过设置不同的进程执行时间和优先级,我们观察

到不同调度算法对系统吞吐量和响应时间的影响。 实验结果显示,FCFS算法适用于执行时间较短的进程,能够保证公平性,但在执行时间较长的进程出现时,会导致等待时间过长,影响系统的响应速度。SJF 算法在执行时间较长的进程时表现出色,但对于执行时间较短的进程,可能会导致饥饿现象。RR算法能够在一定程度上平衡各个进程的执行时间,但对于执行时间过长的进程,仍然会影响系统的响应速度。 实验三:进程同步与互斥 在多进程环境中,进程之间的同步和互斥是必不可少的。在本实验中,我们通过模拟进程间的竞争和互斥关系,观察进程同步与互斥的实现方式和效果。 我们选择了信号量机制和互斥锁机制作为实现进程同步和互斥的方法。通过设置不同的信号量和锁的初始值,并在进程间进行共享资源的访问,我们观察到不同机制对进程执行顺序和资源访问的影响。 实验结果显示,信号量机制能够实现进程间的同步和互斥,但需要手动维护信号量的值,容易出现错误。互斥锁机制能够更简单地实现进程间的互斥,但对于同步的支持较弱。因此,在实际应用中,我们需要根据具体场景选择合适的同步和互斥机制。 结论: 通过本次实验,我们深入了解了进程管理的原理和方法。我们了解到进程的创建和终止过程,以及进程控制块在其中的作用。我们还比较了不同的进程调度算法在不同场景下的表现和效果,以及进程同步与互斥的实现方式和效果。这些实验结果为我们进一步优化系统性能和提高资源利用率提供了指导和依据。

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

试验二进程调度算法的设计 实习内容 进程调度是处理机治理的核心内容。试验要编写和调试一个简洁的进程调度程序实现下面两种算法: 短进程优先调度算法〔SPF〕和时间片轮转调度算法〔RR〕 实习目的 通过对进程调度算法的设计,深入理解进程调度的原理。加深理解有关进程把握块、进程队列的概念。并体会了短进程优先调度算法和时间片轮转调度算法的具体实施方法。 实习原理 根底概念:进程是程序在一个数据集合上运行的过程,它是系统进展资源安排和调度的一个独立单位。 进程调度,是把握协调进程对CPU 的竞争,即按确定的调度算法从就绪队列中选中一个进程,把 CPU 的使用权交给被选中的进程。 算法思想: 短进程优先调度算法〔SPF〕原理:在就绪队列中选择进入系统的作业所要求的 CPU 时间为标准,总选取估量计算时间最短的作业投入运行。 时间片轮转调度算法 RR 原理:进程调度按确定时间片〔q〕轮番运行各个进程,进程按到达时间在就绪队列中排队,调度程序每次把 CPU 安排给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参与下一轮调度,CPU 安排给就绪队列的首进程。 实习编程思路和流程 每个进程有一个进程把握块〔PCB〕表示。进程把握块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU 时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定〔也可以由随机数产生〕。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进展计算。

就绪进程获得CPU 后都只能运行一个时间片。用已占用CPU 时间加1 来表示。 假设运行一个时间片后,进程的已占用CPU 时间已到达所需要的运行时间,则撤消该进程,假设运行一个时间片后进程的已占用CPU 时间还未达所需要的运行时间,也就是进程还需要连续运行,此时应将进程的优先数减1〔即降低一级〕,然后把它插入就绪队列等待CPU。 每进展一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进展检查。重复以上过程,直到所要进程都完成为止。 调度算法的流程图如下:

进程管理_实验报告一流程图

实验一 课程名称:操作系统 课程类型:必修 实验项目名称:进程管理 实验题目:短作业优先算法、动态可剥夺优先数算法和基本循环轮转算法。 一、实验目的 进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实验要求学生独立的用高级语言编写和调试一个简单的模拟进程调度的程序。通过本实验,加深学生理解有关进程控制块、进程队列的概念,并体会和了解短作业优先、优先数和时间片轮转调度算法的具体实施办法。 二、实验要求及实验环境 (1)设计一个有n 个进程的进程调度程序(具体个数可由键盘输入)。每一个进程用一个进程控制块PCB 来代表。PCB 中应包含下列信息:进程名、进程优先数、进程的状态、进程需要运行的时间及利用CPU运行的时间等。进程的个数、各进程的优先数、轮转时间片数以及进程运行需要地时间可由

键盘输入。 (2)调度程序应包含2~3 种不同的调度算法,运行时可任选一种。 (3)每个进程处于运行Run、就绪ready 和完成Finish 三种状态之一,假定初始状态都为就绪状态ready。(也可没有Finish状态,可以在设计程序时实现处以Finish状态的进程删掉)。 (4)系统能显示各进程状态和参数的变化情况。(5)动态可剥夺优先数算法是:在创建进程时给定一个初始的优先数,当进程获得一次cpu后其优先数就减少1,如果就绪队列中有优先级更高的将剥夺运行中的进程。 三、设计思想 (本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系) 1.程序流程图 (见下图) 2.逻辑设计 使用链表表示就绪队列,每个元素包括进程名、进程优先数、进程的状态、进程需要运行的时间及利用CPU运行的时间等信息。 该结构需支持以下操作:取头节点,在表尾插入节

电大操作系统实验报告进程管理实验

电大操作系统实验报告进程管理实验 一、实验题目:进程管理实验 二、实验目的和要求: 实验目的:(1)加深对进程概念的理解,尤其是进程的动态性、并发性。 2)了解进程如何被创建和终止。 3)学会查看进程的状态信息。 4)学会使用进程管理命令。 5)学会在后台运行进程。 实验要求:(1)理解有关进程的概念,能用ps命令列出系统中进程的有关信息,并进行分析。 2)理解进程的创建及族系关系。 3)能使用&,jobs,bg,at等命令控制进程的运行。 4)了解终止进程的方法。 三、实验内容: 1.使用ps命令查看系统中运行进程的信息。 2.利用系统调用实现进程的创建、终止、等待、睡眠等操作。四、实验技术和方法: 五、实验环境:

说明:列出本实验使用到的软件平台和工具,如Linux系统版本,shell类型,vi编辑工具等。) 在虚拟机中的LinuxRedHat Linux 9 六、实验步骤和结果: 说明:详细给出实验步骤和结果。实验步骤不一定与《实验指南》中的完全一致。对实验结果,除文字说明外,对一些关键结果,需要给出一些界面截图。) 1、输入ps命令 PS命令用来报告体系当前的进程状况。 2、输入ps–e命令 能够显示体系中运行的所有进程,包孕体系进程和用户进程。 3、输入ps–f命令 能够获得进程具体信息。 4、输入ps–el命令 显示进程环境变量列出长表。 二、进程控制 1、后台进程 1)$grep“注册用户名”/etc/passwd。/tmp/abc &

2)ps–p pid 2、作业控制 1)进程休眠60秒Sleep 60 & 2)进程休眠30秒Sleep 30 & 3)查看进程状况Jobs 4)把睡眠30秒的sleep命令放在前台执行fg%2 5)当提示符出现后,再查看进程状况jobs 3、发送中断信号 1)后台运行sleep命令$sleep 120 & 2)查看sleep进程的状态$ps–p pid 3)停止sleep命令$kill -9 pid 4)再查看sleep进程的状态$ps–p pid 四、减轻体系负载 at命令】 让一个命令在指定的时间运行,并把结果输出在一个文件中

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

操作系统进程管理实验报告 操作系统进程管理实验报告 引言: 操作系统是计算机系统中最核心的软件之一,它负责管理计算机硬件和软件资源,提供良好的用户体验和高效的计算服务。其中,进程管理是操作系统的重 要功能之一,它负责管理和调度计算机中的各个进程,确保它们能够有序地运行,并且能够合理地利用计算机资源。本实验旨在通过实际操作,深入了解操 作系统的进程管理机制,并通过编写简单的进程管理程序,加深对进程管理的 理解。 一、实验目的 本实验的主要目的是通过编写简单的进程管理程序,加深对操作系统进程管理 机制的理解。具体来说,我们将实现以下功能: 1. 创建进程:能够创建新的进程,并为其分配资源。 2. 进程调度:能够根据进程的优先级和调度算法,合理地调度进程的执行顺序。 3. 进程同步:能够实现进程间的同步与互斥,避免资源竞争和死锁问题。 二、实验环境和工具 本实验使用的实验环境和工具如下: 1. 操作系统:Windows 10 2. 编程语言:C++ 3. 开发工具:Visual Studio 2019 三、实验过程和结果 1. 进程创建

在实验中,我们首先实现了进程的创建功能。通过调用操作系统提供的系统调 用接口,我们能够创建新的进程,并为其分配资源。具体的实现过程涉及到进 程控制块(PCB)的创建和初始化,以及资源的分配和管理。通过编写测试程序,我们成功创建了多个进程,并验证了进程创建功能的正确性。 2. 进程调度 进程调度是操作系统中非常重要的功能之一,它决定了进程的执行顺序和时间 片的分配。在实验中,我们实现了简单的进程调度算法,采用了轮转调度算法。通过设计合适的数据结构和算法,我们能够按照一定的优先级和时间片大小, 合理地安排进程的执行顺序。通过编写测试程序,我们验证了进程调度功能的 正确性。 3. 进程同步 在多进程环境下,进程间的同步与互斥是非常重要的问题。在实验中,我们实 现了进程同步功能,通过使用信号量和互斥锁,实现了进程间的同步与互斥。 通过编写测试程序,我们验证了进程同步功能的正确性,并且能够避免资源竞 争和死锁问题。 四、实验总结与心得 通过本次实验,我们深入了解了操作系统的进程管理机制,并通过编写简单的 进程管理程序,加深了对进程管理的理解。具体来说,我们学会了如何创建进程、如何调度进程以及如何实现进程间的同步与互斥。这些知识和技能对于我 们理解操作系统的工作原理,提高计算机系统性能和编写高效的程序都非常重要。 然而,本实验只是进程管理的入门级实验,实际的操作系统进程管理机制非常

操作系统-进程管理与进程同步-实验报告

实验一、进程管理与进程同步 一、实验目的 了解进程管理的实现方法,理解和掌握处理进程同步问题的方法。 二、实验内容 实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算法。 实验步骤:理解安全性算法和银行家算法的核心机制:针对3类资源、5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况;编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申请,调用安全性函数,实现银行家算法;测试:输入可分配和不可分配的请求,测试系统的正确性。 三、实验环境 Windows 2000;Microsoft Visual C++ 6.0 四、程序源码与运行结果 银行家算法代码: #include "malloc.h" #include "stdio.h" #include "stdlib.h" #define alloclen sizeof(struct allocation) #define maxlen sizeof(struct max) #define avalen sizeof(struct available) #define needlen sizeof(struct need) #define finilen sizeof(struct finish) #define pathlen sizeof(struct path) struct allocation { int value; struct allocation *next; }; struct max { int value; struct max *next; }; struct available /*可用资源数*/ { int value; struct available *next; }; struct need /*需求资源数*/ { int value; struct need *next; }; struct path {

操作系统实验报告-进程管理

《计算机操作系统》 模拟进程管理 专业:计算机科学技术与应用 班级:2012计科 学号:201201544108 姓名:钱美娟

实验-- 进程管理 一.目的和要求 通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。 *1、要求设置PCB,进程控制原语,进程调度算法,能描述进程调度中不同进程状态之间的转换,设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制,同步及通信机构,其进程调度算法可任意选择。每个进程用一个PCB表示,其内容可根据具体情况设置。各进程之间应有一定的同步关系。系统在运行过程中能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。 *2、编程实现。 二.实验内容 用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。

三.主体程序 #include "stdio.h" #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 struct pcb { // 定义进程控制块PCB char name[10]; char state; int super; int ntime; int rtime; int retime; int jsuper;//静态优先级 struct pcb *link; }*ready=NULL,*p; typedef struct pcb PCB; sort() // 建立对进程进行优先级排列函数 { PCB *first, *second; int insert=0; if((ready==NULL)||((p->super)>(ready->super))) //优先级最大者,插入队首 { p->link=ready; ready=p; } else //进程比较优先级,插入适当的位置中 { first=ready; second=first->link; while(second!=NULL) { if((p->super)>(second->super)) //若插入进程比当前进程优先数大, { /*插入到当前进程前面*/ p->link=second; first->link=p; second=NULL; insert=1; } else //插入进程优先数最低,则插入到队尾 {

相关文档
最新文档