当前位置:文档之家› 操作系统进程调度实验报告

操作系统进程调度实验报告

操作系统进程调度实验报告
操作系统进程调度实验报告

哈尔滨工业大学计算机科学与技术学院

实验报告

课程名称:操作系统

课程类型:必修

实验项目名称:进程调度

实验题目:先来先服务和优先级调度的实现

班级:

学号:

姓名:

一、实验目的

二、实验要求及实验环境

由于在多道程序或多个任务系统中,系统同时处于就绪状态的进程有若干个,即能运行的进程数远大于处理机个数,为了使系统中的个进程能有条不紊的进行,必须选用某种调度策略,以选择进程占用处理机。通过设计模拟单处理机的调度算法,以巩固和加深处理机的调度的概念。

三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

1.逻辑设计

(1)先来先服务

<1>初始化:用户输入进程数目,到达时间,运行时间,把它按照到达时间插

入就绪队列。

<2>调度:如果进程的到达时间比当前的系统时间早,而且他处于就绪队列的

第一个,那么它就是最早到达的进程,他获得处理机,并且一直占用,直到运行结束。

当所有进程运行结束的时候调度完成。

(2)优先级:

〈1〉初始化:用户输入进程数目,到达时间,运行时间,把它按照优先级插入就绪队列。

〈2〉调度:如果有就绪进程。首先取出当前就绪队列的第一个进程,它的优先级最高,把它从就绪队列里面取出,插入运行队列,允许他运行一个时间片,这

时系统时间加一,该进程的优先级也加一,表示优先级下降,如果现在他运行完成,

那么把它插入完成队列,否则插入就绪队列。继续调度,直至所有进程全部完成。

2.物理设计

(1)pcb表:

struct pcb{

int id; //进程编号

int arrivetime; //到达时间

int priority; //优先级

int runtime; //运行时间

string state; //状态

struct pcb* next; //下一个进程

};

(2)在pcb上面进行的操作:

//按照优先级初始化

void init();

//是否存在就绪的进程

bool exist(pcb* ready);

//按优先级把进程插入队列的函数

void insert(pcb* temp,pcb* temp1);

//按先来先服务把进程插入队列的函数

void insert1(pcb* temp,pcb* temp1);

//按照优先调度函数

void scheduler();

//打印这个队列的函数

void print(pcb* temp);

//判断是否有改变

bool changed(int a,int b);

//按照先来先服务初始化

void init1();

//先来先服务调度

void scheduler1();

四、测试结果

(1)先来先服务:

FCFS INPUT 1,FPFS INPUT 2:1

how many process? 3

process 1:

input id: 1

input arrivetime: 1

input runtime: 5

process 2:

input id: 2

input arrivetime: 4

input runtime: 7

process 3:

input id: 3

input arrivetime: 3

input runtime: 5

current time is 1

process 1 starts.

ready processs are:process 3, process 2,

current time is 6

process 1 is done.

ready processs are:process 3, process 2,

current time is 6

process 3 starts.

ready processs are:process 2,

current time is 11

process 3 is done.

ready processs are:process 2,

current time is 11

process 2 starts.

current time is 18

process 2 is done.

Press any key to continue

(2)优先级:

FCFS INPUT 1,FPFS INPUT 2:2 how many process? 3

process 1:

input id: 1

input priority: 2

input runtime: 5

process 2:

input id: 2

input priority: 1

input runtime: 6

process 3:

input id: 3

input priority: 5

input runtime: 4

current time is 1

process 2 starts.

ready processs are:process 1, process 3, current time is 2

process 1 starts.

ready processs are:process 2, process 3, current time is 3

process 2 starts.

ready processs are:process 1, process 3, current time is 4

process 1 starts.

ready processs are:process 2, process 3, current time is 5

process 2 starts.

ready processs are:process 1, process 3, current time is 6

process 1 starts.

ready processs are:process 2, process 3, current time is 7

process 2 starts.

ready processs are:process 3, process 1, current time is 8

process 3 starts.

ready processs are:process 1, process 2, current time is 9

process 1 starts.

ready processs are:process 2, process 3,

current time is 10

process 2 starts.

ready processs are:process 3, process 1,

current time is 11

process 3 starts.

ready processs are:process 1, process 2,

current time is 12

process 1 is done.

ready processs are:process 2, process 3,

current time is 13

process 2 is done.

ready processs are:process 3,

current time is 15

process 3 is done.

Press any key to continue

五、系统不足与经验体会

系统不足:

(1)没有从文件读入和输出,输入比较复杂。

体会:

(1)深刻理解了优先级算法和先来先服务算法。(2)理解了系统调度的基本流程。

六、附录:源代码(带注释)

#include

using namespace std;

//定义pcb结构

struct pcb{

int id; //进程编号

int arrivetime; //到达时间

int priority; //优先级

int runtime; //运行时间

string state; //状态

struct pcb* next; //下一个进程};

int current=0;

int num;

pcb* ready;

pcb* running;

pcb* done;

//按照优先级初始化

void init();

//是否存在就绪的进程

bool exist(pcb* ready);

//按优先级把进程插入队列的函数

void insert(pcb* temp,pcb* temp1);

//按先来先服务把进程插入队列的函数

void insert1(pcb* temp,pcb* temp1);

//按照优先调度函数

void scheduler();

//打印这个队列的函数

void print(pcb* temp);

//判断是否有改变

bool changed(int a,int b);

//按照先来先服务初始化

void init1();

//先来先服务调度

void scheduler1();

int main(){

int choose;

cout<<"FCFS INPUT 1,FPF INPUT 2:";

cin>>choose;

switch (choose){

case 2:

init();

scheduler();

break;

case 1:

init1();

scheduler1();

break;

default:

cerr<<"error!"<

}

return 0;

}

void init(){

//就绪队列置空

ready= new pcb;

ready->next=NULL;

ready->priority=0;

//运行队列置空

running = new pcb;

running->next=NULL;

//完成队列置空

done= new pcb;

done->next=NULL;

//temp用来保存输入的进程

pcb* temp;

//输入进程数

cout<<"how many process? ";

cin>>num;

int cnt;

//输入进程信息,并将其插入就绪队列

for(cnt=1;cnt<=num;cnt++){

temp=new pcb;

cout<<"process "<

cout<<"input id: ";

cin>>temp->id;

cout<<"input priority: ";

cin>>temp->priority;

cout<<"input runtime: ";

cin>>temp->runtime;

temp->next=NULL;

temp->state="ready";

insert(temp,ready);

}

}

//判断是否有就绪进程

bool exist(pcb* ready){

pcb* temp;

temp=ready;

//一直找到进程结尾,找到就返回真

while(temp->next!=NULL){

if(!temp->next->https://www.doczj.com/doc/5a5665088.html,pare("ready"))

return true;

}

return false;

}

//第一个参数代表要插入的进程,第二个参数是要插入的队列的表头void insert(pcb* temp,pcb* temp1){

//一直找到队尾

while(temp1->next!=NULL){

//按照优先级数目低的进程优先级高,按照优先级有高到低排列

if(temp->prioritynext->priority){

temp->next=temp1->next;

temp1->next=temp;

break;

}

temp1=temp1->next;

}

if(temp1->next==NULL)

temp1->next=temp;

}

void scheduler(){

pcb* temp;

//这个整数表示前一个时间段运行的进程号

int pre=0;

//当存在就绪进程就调度

while(exist(ready)){

//temp指向就绪进程的第一个,显然是优先级最高的,把它从就绪队列中取出,放入运行队列

temp=ready->next;

running->next=temp;

ready->next=temp->next;

temp->state="running";

temp->next=NULL;

//当他运行一个时间段,优先级下降,时间增加,所需的运行时间减少

temp->priority++;

current++;

temp->runtime--;

//如果当前运行的进程和刚才有改变,在屏幕上显示

if(changed(pre,temp->id)&&exist(ready)){

cout<<"current time is "<

//运行时间为0表示完成,否则显示他开始执行

if(temp->runtime==0)

cout<<"process "<id<<" is done."<

else

cout<<"process "<id<<" starts."<

//打印当前就绪的队列

cout<<"ready processs are:";

print(ready);

}

//这个进程运行完了一个时间片把它插入就绪队列,如果万成了就插入完成队列

if(temp->runtime!=0){

temp->state="ready";

insert(temp,ready);

}

else{

temp->state="done";

insert(temp,done);

}

//记录正在运行的进程

pre=temp->id;

}

cout<<"current time is "<

cout<<"process "<id<<" is done."<

//打印一个队列

void print(pcb* temp){

while(temp->next!=NULL){

cout<<"process "<next->id<<", ";

temp=temp->next;

}

cout<

}

//判断当前运行的进程是否有改变

bool changed(int a,int b){

if(a!=b)

return true;

else

return false;

}

void init1(){

//创建就绪队列

ready= new pcb;

ready->next=NULL;

ready->priority=0;

//创建运行队列

running = new pcb;

running->next=NULL;

//创建完成队列

done= new pcb;

done->next=NULL;

//用来保存正在输入的进程

pcb* temp;

cout<<"how many process? ";

cin>>num;

int cnt;

//输入进程信息,把它按先来先服务把它插入就绪队列for(cnt=1;cnt<=num;cnt++){

temp=new pcb;

cout<<"process "<

cout<<"input id: ";

cin>>temp->id;

cout<<"input arrivetime: ";

cin>>temp->arrivetime;

cout<<"input runtime: ";

cin>>temp->runtime;

temp->next=NULL;

temp->state="ready";

insert1(temp,ready);

}

}

void scheduler1(){

pcb* temp;

int pre=0;

while(exist(ready)){

temp=ready->next;

//就是如果到达时间小于系统时间,且它处于当就绪队列的队首就表示他到的最早,可以执行

if(temp->arrivetime<=current){

//把它从就绪队列里取出,运行完

running->next=temp;

ready->next=temp->next;

temp->state="running";

temp->next=NULL;

cout<<"current time is "<

cout<<"process "<id<<" starts."<

if(exist(ready))

cout<<"ready processs are:";

print(ready);

//把所有处理机给他,让他运行完

current+=temp->runtime;

cout<<"current time is "<

cout<<"process "<id<<" is done."<

//打印就绪队列

if(exist(ready))

cout<<"ready processs are:";

print(ready);

//把它插入完成队列

insert(temp,done);

current--;

}

current++;

}

}

//第一个参数代表要插入的进程,第二个参数是要插入的队列的表头

void insert1(pcb* temp,pcb* temp1){

//一直找到队尾

while(temp1->next!=NULL){

//按照到达时间有先到后排序

if(temp->arrivetime < temp1->next->arrivetime ){ temp->next=temp1->next;

temp1->next=temp;

break;

}

temp1=temp1->next;

}

if(temp1->next==NULL)

temp1->next=temp;

}

实验二--单处理器系统的进程调度

实验二单处理器系统的进程调度 (附实验报告) 1.实验目的 加深对进程概念的理解,明确进程和程序的区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程的组织方式; 进程的创建; 进程的调度。 3.实验内容

编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进程测试。 4.提示与讲解 这个实验主要要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。 考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB 记录各个进程执行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只使用了必不可少的信息。一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下四类: ①标识信息 每个进程都要有一个惟一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序中,采用编号方式,也就是为每个进程依次分配一个不相同的正整数。 ②说明信息

用于记录进程的基本情况,例如进程的状态、等待原因、进程程序存放位置、进程数据存放位置等等。实验中,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。 ③现场信息 现场信息记录各个寄存器的内容。当进程由于某种原因让出处理器时,需要将现场信息记录在进程控制块中,当进行进程调度时,从选中进程的进程控制块中读取现场信息进行现场恢复。现场信息就是处理器的相关寄存器内容,包括通用寄存器、程序计数器和程序状态字寄存器等。在实验中,可选取几个寄存器作为代表。用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字寄存器。 ④管理信息 管理信息记录进程管理和调度的信息。例如进程优先数、进程队列指针等。实验中,仅包括队列指针。 因此可将进程控制块结构定义如下: struct pcb {int name; int status;

实验一进程调度实验报告书

淮海工学院计算机工程学院实验报告书 课程名:《操作系统原理A》 题目:进程调度 班级:软件132 学号:2013122907 姓名:孙莹莹

操作系统原理实验——进程调度实验报告 一、目的与要求 1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C 语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。本实验可加深对进程调度算法的理解。 2)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果) 3)于2015年4月18日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。 二、实验内容或题目 1)设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。 2)模拟调度程序可任选两种调度算法之一实现(有能力的同学可同时实现两个调度算法)。 3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。 4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。 三、实验步骤与源程序 (1)流程图

(2)实验步骤 1)PCB的结构:优先级算法中,设PCB的结构如下图所示,其中各数据项的含义如下: Id:进程标识符号,取值1—5。 Priority:优先级,随机产生,范围1—5。 Used:目前已占用的CPU时间数,初值为0;当该进程被调用执行时,每执行一个时间片,Used加1。 Need:进程尚需的CPU时间数,初值表示该进程需要运行的总时间,取值范围为5—10。并随机产生,每运行一个时间片need减1;need为0则进程结束。 Status:进程状态R(运行),W(就绪),F(完成);初始时都处于就绪状态。 Next:指向就绪队列中下一个进程的PCB的指针。 2)初始状态及就绪队列组织: 5个进程初始都处于就绪状态,进程标识1—5,used初值都为0。各进程的优先级随机产生,范围1—5。处于就绪状态的进程,用队列加以组织,队列按优先级由高到低依次排列,队首指针设为head,队尾指针为tail。 3)调度原则以及运行时间的处理: 正在执行的进程每执行一个时间片,其优先级减1(允许优先级为负)。进程调度将在以下情况发生:当正在运行的程序其优先级小于就绪队列队首进程的优先级时。程序中进程的运行时间以逻辑时间片为单位。

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

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

操作系统进程同步实验报告

实验三:进程同步实验 一、实验任务: (1)掌握操作系统的进程同步原理; (2)熟悉linux的进程同步原语; (3 )设计程序,实现经典进程同步问题。 二、实验原理: (1)P、V操作 PV操作由P操作原语和V操作原语组成(原语是不可中断的过程) ,对信号量进行操作,具体定义如下: P( S):①将信- 号量S的值减1,即S=S-1; ②如果S30,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 V( S):①将信号量S的值加1,即S=S+1 ; ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。 (2)信号量 信号量(semaphore )的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的 值仅能由PV操作来改变。 一般来说,信号量S30时,S表示可用资源的数量。执行一次P操作意味着请求分配一 个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S 的值加1;若S均,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。 (3)linux的进程同步原语 ①wait();阻塞父进程,子进程执行; ②#in clude #in clude key_t ftok (char*path name, char proj) ;它返回与路径path name 相对应的一个键值。 ③int semget(key_t key, int n sems, int semflg) 参数key是一个键值,由ftok获得,唯一标识一个信号灯集,用法与msgget()中的key 相同;参数nsems指定打开或者新创建的信号灯集中将包含信号灯的数目;semflg参数是一些标志位。参数key和semflg的取值,以及何时打开已有信号灯集或者创建一个新的信号灯集与msgget()中的对应部分相同。该调用返回与健值key相对应的信号灯集描述字。调用返回:成功返回信号灯集描述字,否则返回-1。 ④int semop(i nt semid, struct sembuf *sops, un sig ned n sops); semid是信号灯集ID , sops指向数组的每一个sembuf结构都刻画一个在特定信号灯上的操作。nsops为sops指向数组的大小。 ⑤int semctl(int semid , int semnum , int cmd , union semun arg) 该系统调用实现对信号灯的各种控制操作,参数semid指定信号灯集,参数cmd指定 具体的操作类型;参数semnum指定对哪个信号灯操作,只对几个特殊的cmd操作有意义;

操作系统的进程调度 实验报告

《计算机操作系统2》实验报告 实验一题目:操作系统的进程调度 姓名:学号:12125807 实验日期:2014.12 实验要求: 1.设计一个有n个进程工行的进程调度程序。每个进程由一个进程控制块(PCB)表示。 进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。 2.调度程序应包含2~3种不同的调度算法,运行时可任意选一种,以利于各种算法的分 析比较。 3.系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程 实验目的: 1.进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实习要 求学生独立地用高级语言编写和调试一个简单的进程调度程序。调度算法可任意选择或自行设计。例如,简单轮转法和优先数法等。本实习可加深对于进程调度和各种调度算法的理解。 实验内容: 1.编制和调试示例给出的进程调度程序,并使其投入运行。 2.自行设计或改写一个进程调度程序,在相应机器上调试和运行该程序,其功能应该不亚 于示例。 3.直观地评测各种调度算法的性能。 示例: 1.题目 本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。各进程的优先数或轮转时间片数、以及进程需要运行的时间片数,均由伪随机数发生器产生。 进程控制块结构如下:

PCB 进程标识数 链指针 优先数/轮转时间片数 占用CPU时间片数 进程所需时间片数 进程状态 进程控制块链结构如下: 其中:RUN—当前运行进程指针; HEAD—进程就绪链链首指针; TAID—进程就绪链链尾指针。 2.算法与框图 (1) 优先数法。 进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。 (2) 简单轮转法。 进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。(3) 程序框图如下图所示。

进程调度算法模拟实验

华北科技学院计算机系综合性实验 实验报告 课程名称操作系统C 实验学期2012至2013学年第2学期学生所在系部计算机系 年级专业班级 学生姓名学号 任课教师杜杏菁 实验成绩 计算机系制

《操作系统C》课程综合性实验报告 开课实验室:基础六机房2013年6月3日 实验题目进程调度算法模拟 一、实验目的 通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。 二、设备与环境 1.硬件设备:PC机一台 2.软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java等编程语言环境。 三、实验内容 (1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。 (2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段: ?进程标识数ID。 ?进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。 ?进程已占用CPU时间CPUTIME。 ?进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 ?进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进 入阻塞状态。 ?进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将 转换成就绪状态。 ?进程状态STATE。 ?队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: ?进程在就绪队列中呆一个时间片,优先数增加1。 ?进程每运行一个时间片,优先数减3。 (4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。

操作系统实验报告(进程调度算法)

操作系统实验报告(进程调度算法)

实验1 进程调度算法 一、实验内容 按优先数调度算法实现处理器调度。 二、实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。 三、实验原理 设计一个按优先数调度算法实现处理器调度的程序。 (1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为: 进程名 指针 要求运行时 间 优先数

状态 其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。 指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。 要求运行时间——假设进程需要运行的单位时间数。 优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。 状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。 (2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。 (3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例: 队首标志 K2

1P1 K 2 P2 K 3 P3 K 4 P4 K 5 P5 0 K4K5K3K1 2 3 1 2 4 1 5 3 4 2 R R R R R PC B1 PC B2 PC B3 PC B4 PC B5 (4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行: 优先数-1 要求运行时间-1 来模拟进程的一次运行。 提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。

操作系统实验报告(进程的创建)(DOC)

实验题目进程的创建小组合作否姓名班级学号 一、实验目的 1、了解进程的创建。 2、了解进程间的调用以及实现。 3、分析进程竞争资源的现象,学习解决互斥的方法。 4、加深对进程概念的理解,认识并发执行的本质。 二.实验环境 Windows 系统的计算机一台,安装了Linux虚拟机 三、实验内容与步骤 1、fork()系统调用的使用例子 程序代码: #include #include #include int glob=3; int main(void) { pid_t pid;int loc=3; printf("before fork();glod=%d,loc=%d.\n",glob,loc); if((pid=fork())<0) { printf("fork() error. \n"); exit(0); } else if(pid==0) { glob++; loc--; printf("child process changes glob and loc: \n"); } else

wait(0); printf("parent process doesn't change the glob and loc:\n"); printf("glob=%d,loc=%d\n",glob,loc); exit(0); } 运行结果: 2、理解vofork()调用: 程序代码: #include #include #include int glob=3; int main(void) { pid_t pid; int loc=3; if((pid=vfork())<0) { printf("vfork() error\n"); exit(0); } else if(pid==0) { glob++; loc--; printf("child process changes the glob and loc\n"); exit(0); } else printf ("parent process doesn't change the glob and loc\n"); printf("glob=%d,val=%d\n",glob,loc);

山东大学操作系统实验报告4进程同步实验

山东大学操作系统实验报告4进程同步实验

计算机科学与技术学院实验报告 实验题目:实验四、进程同步实验学号: 日期:20120409 班级:计基地12 姓名: 实验目的: 加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥 操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。了解 Linux 系统中 IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。 实验内容: 抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。 硬件环境: 处理器:Intel? Core?i3-2350M CPU @ 2.30GHz ×4 图形:Intel? Sandybridge Mobile x86/MMX/SSE2 内存:4G 操作系统:32位 磁盘:20.1 GB 软件环境: ubuntu13.04 实验步骤: (1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。

(2)新建ipc.c文件,编写producer和consumer 共用的IPC的具体相应函数。 (3)新建Producer文件,首先定义producer 的一些行为,利用系统调用,建立共享内存区域,设定其长度并获取共享内存的首地址。然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。 (4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。 运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。

实验一处理器调度实验报告

处理器调度一、实验内容 选择一个调度算法,实现处理器调度。 二、实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。 当就绪状态进程 个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下处理器调度,帮助学生加深了解处理器调度的工作。 三、实验题目 设计一个按优先数调度算法实现处理器调度的程序 提示: (1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进 程控制块的格 式为: 其中,进程名----作为进程的标识,假设五个进程的进程名分别是R, P2, P3, P4,R。 指针—按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块

首地址,最后一个进程中的指针为“ 0”。 要求运行时间-- 假设进程需要运行的单位时间数。 优先数-赋予进程的优先数,调度时总是选取优先数大的进程先执行。 状态-可假设有两种状态,“就绪”状态和“结束“状态,五个进程的初 始状态都为 “就绪“状态,用“ R”表示,当一个进程运行结束后,它的状态变为“结束”, 用“ E”表示。 (2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数” 和“要求运行时间”。 (3)为了调度方便,把五个进程按给定的优先数从大到小连成队列,用一单元指出队首 进程,用指针指出队列的连接情况。例: 队首标志 (4)处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优 先数就减“ 1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的 启动运行,而是执行: 优先数- 1 要求运行时间-1 来模拟进程的一次运行提醒注意的是:在实际的系统中,当一个进程被选中运

操作系统原理-进程调度实验报告

一、实验目的 通过对进程调度算法的设计,深入理解进程调度的原理。 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。 进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。 进程通过定义一个进程控制块的数据结构(PCB)来表示;每个进程需要赋予进程ID、进程到达时间、进程需要运行的总时间的属性;在RR中,以1为时间片单位;运行时,输入若干个进程序列,按照时间片输出其执行序列。 二、实验环境 VC++6.0 三、实验内容 实现短进程优先调度算法(SPF)和时间片轮转调度算法(RR) [提示]: (1) 先来先服务(FCFS)调度算法 原理:每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。 将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短。 按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长。 (2) 时间片轮转调度算法RR

原理:时间片轮转法主要用于进程调度。采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。进程调度按一定时间片(q)轮番运行各个进程. 进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU分配给就绪队列的首进程。 固定时间片轮转法: 1 所有就绪进程按 FCFS 规则排队。 2 处理机总是分配给就绪队列的队首进程。 3 如果运行的进程用完时间片,则系统就把该进程送回就绪队列的队尾,重新排队。 4 因等待某事件而阻塞的进程送到阻塞队列。 5 系统把被唤醒的进程送到就绪队列的队尾。 可变时间片轮转法: 1 进程状态的转换方法同固定时间片轮转法。 2 响应时间固定,时间片的长短依据进程数量的多少由T = N × ( q + t )给出的关系调整。 3 根据进程优先级的高低进一步调整时间片,优先级越高的进程,分配的时间片越长。 多就绪队列轮转法: (3) 算法类型 (4)模拟程序可由两部分组成,先来先服务(FCFS)调度算法,时间片轮转。流程图如下:

操作系统实验_实验1

广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室 2015年11月11日 实验课 操作系统成绩 程名称 实验项 进程管理与进程通信指导老师陈康民目名称 (***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***) 进程管理 (一)进程的创建实验 一、实验目的 1、掌握进程的概念,明确进程的含义 2、认识并了解并发执行的实质 二、实验内容 1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一 个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……', 父进程显示'parent ……',观察结果,分析原因。 三、实验步骤 1、编写一段程序,使用系统调用fork( )创建两个子进程。 代码: #include main( ) { int p1,p2; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) putchar('b'); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) putchar('c'); else putchar('a'); } } 运行结果:

bca,bac, abc ,……都有可能。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。 代码:#include main( ) { int p1,p2,i; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) for(i=0;i<10;i++) printf("daughter %d\n",i); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) for(i=0;i<10;i++) printf("son %d\n",i); else for(i=0;i<10;i++) printf("parent %d\n",i); } } 结果:

操作系统:进程调度实验报告

设计性实验报告 一、实验目的 1.在Linux下用C语言编程模拟优先级进程调度算法和时间片轮转进程调度算法。 2.为了清楚地观察每个进程的调度过程,每次调度程序应将各个进程的情况显示出来。 二、总体设计(设计原理、设计方案及流程等) 1、优先级进程调度算法 采用动态优先级进程调度算法,其基本思想是每次调度总是把处理机分配给优先级最高的进程,同时在运行过程中进程的优先级随着执行或等待的时间而降低或增加。 在该实验中每个进程用一个进程控制块( PCB)表示。进程控制块包含如下信息:进程号,进程名、优先数、需要运行时间、已用CPU时间、进程状态。进程号,名字,优先数,运行的时间,事先人为地指定。每个进程的状态可以是就绪,执行,阻塞或完成4种状态之一。 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。就绪队列中的进程在等待一个时间片后,优先级增1。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时将进程的优先级减1,然后把它插入就绪队列等待CPU。 2、时间片轮转调度算法 采用简单时间片轮转调度算法,其基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。 三、实验步骤(包括主要步骤、代码分析等) 1.打开linux虚拟机,用vim编辑器打开代码进行修改和调整。用gcc编译器进行编译编译运行首先运行优先级算法,如图所示:

进程同步实验报告

实验三进程的同步 一、实验目的 1、了解进程同步和互斥的概念及实现方法; 2、更深一步的了解fork()的系统调用方式。 二、实验内容 1、预习操作系统进程同步的概念及实现方法。 2、编写一段源程序,用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。程序的输出是什么?分析原因。 3、阅读模拟火车站售票系统和实现进程的管道通信源代码,查阅有关进程创建、进程互斥、进程同步的系统功能调用或API,简要解释例程中用到的系统功能或API的用法,并编辑、编译、运行程序,记录程序的运行结果,尝试给出合理的解释。 4、(选做)修改问题2的代码,使得父子按顺序显示字符“a”;“b”、“c”编辑、编译、运行。记录程序运行结果。 三、设计思想 1、程序框架 (1)创建两个子进程:(2)售票系统:

(3)管道通信: 先创建子进程,然后对内容加锁,将输出语句存入缓存,并让子进程自己进入睡眠,等待别的进程将其唤醒,最后解锁;第二个子进程也执行这样的过程。父进程等待子进程后读内容并输出。 (4)修改程序(1):在子进程的输出语句前加上sleep()语句,即等待父进程执行完以后再输出。 2、用到的文件系统调用函数 (1)创建两个子进程:fork() (2)售票系统:DWORD WINAPI Fun1Proc(LPVOID lpPartameter); CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); CloseHandle(hThread1); (HANDLE)CreateMutex(NULL,FALSE,NULL); Sleep(4000)(sleep调用进程进入睡眠状态(封锁), 直到被唤醒); WaitForSingleObject(hMutex,INFINITE); ReleaseMutex(hMutex); (3)管道通信:pipe(fd),fd: int fd[2],其中: fd[0] 、fd[1]文件描述符(读、写); lockf( fd,function,byte)(fd: 文件描述符;function: 1: 锁定 0:解锁;byte: 锁定的字节数,0: 从当前位置到文件尾); write(fd,buf,byte)、read(fd,buf,byte) (fd: 文件描述符;buf : 信息传送的源(目标)地址;byte: 传送的字节数); sleep(5); exit(0); read(fd[0],s,50) (4)修改程序(1):fork(); sleep(); 四、调试过程 1、测试数据设计 (1)创建两个子进程:

作业调度实验报告

作业调度实验报告 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

实验二作业调度 一.实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。 (3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 二.实验目的: 本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解三 .实验过程 <一>单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: 执行程序: 2)实验分析:

1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU 时限等因素。 2、每个作业由一个作业控制块JCB 表示,JCB 可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W 。 3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。 3)流程图: 二.最短作业优先算法 三.高响应比算法 图一.先来先服务流程图 4)源程序: #include <> #include <> #include <> #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 int n; float T1=0,T2=0; int times=0; struct jcb .\n",p->name); free(p); .wait...",time); if(times>1000) 代替 代替

操作系统实验-进程同步与互斥

实验四:进程的管道通信 实验题目 进程的管道通信 实验目的 加深对进程概念的理解,明确进程和程序的区别。学习进程创建的过程,进一步认识进程并发执行的实质。分析进程争用资源的现象,学习解决进程互斥的方法。学习解决进程同步的方法。掌握Linux系统中进程间通过管道通信的具体实现 实验内容 使用系统调用pipe()建立一条管道,系统调用fork()分别创建两个子进程,它们分别向管道写一句话,如: Child process1 is sending a message! Child process2 is sending a message! 父进程分别从管道读出来自两个子进程的信息,显示在屏幕上。 当然,仅仅通过屏幕上输出这两句话还不能说明实现了进程的管道通信,为了能够更好的证明和显示出进程的同步互斥和通信,在其中要加入必要的跟踪条件,如一定的输出语句等,来反映程序的并发执行情况 实验要求 这是一个设计型实验,要求自行、独立编制程序。两个子进程要并发执行。实现管道的互斥使用。当一个子进程正在对管道进行写操

作时,另一个欲写入管道的子进程必须等待。使用系统调用lockf(fd[1],1,0)实现对管道的加锁操作,用lockf(fd[1],0,0)解除对管道的锁定。实现父子进程的同步,当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。 为了清楚的反应进程的同步,在子进程完成相应的操作后,调用sleep()函数睡眠一段时间(程序中定为3s)。父进程先执行wait()函数,当有子进程执行完毕后,会得到子进程的返回结果并清理子进程。若子进程没执行完,父进程一直执行wait()进行监听,知道有一个子进程执行完成为僵尸进程。 程序中用到的系统调用 因为程序时在linux系统上进行编写的,所以其中要利用到相关的linux提供的系统调用。 所用到的系统调用包含在如下头文件中。 #include #include #include #include #include #include fork() 用于创一个子进程。 格式:int fork();

进程调度 实验报告

实验一进程调度实验报告 一、实验目的 多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。 二、实验内容 1.优先权法、轮转法 简化假设 1)进程为计算型的(无I/O) 2)进程状态:ready、running、finish 3)进程需要的CPU时间以时间片为单位确定 2.算法描述 1)优先权法——动态优先权 当前运行进程用完时间片后,其优先权减去一个常数。 2)轮转法 三、流程图

产生n 需的时间片数,已占用CPU 的时间片数置为0 按进程产生的先后次序拉成就绪队列链 =0? 撤销该进程 就绪队列为空吗? =轮转时间片数? N Y Y Y 结束 N 开始 键盘输入进程数n ,和调度方法的选择 优先权法? 轮转法 产生n 个进程,对每个进程产生一个PCB ,并用 随机数产生进程的优先权及进程所需的CPU 时间 按优先权大小,把n 个进程拉成一个就绪队列 撤销进程就绪队列为空? 结束 N Y Y

四、实验要求 1.产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。 2.进程数n不要太大通常取4~8个 3.使用动态数据结构 4.独立编程 5.至少三种调度算法 6.若有可能请在图形方式下,将PCB的调度用图形成动画显示。 五实验源程序 主函数控制台Main.c #include #include #include "fcfs.h" #include "privilege.h" #include "round.h" void main() { int n; cout<<"输入随机产生的进程数目"<>n; int choice=1; while (choice!=5) { cout<<"请输入你的选择"<>choice; switch (choice) { case 1: {struct process *first=creatlist(n);print(first);fcfs(first);break;} case 2: {struct process1 *first1=creatlist1(n);print1(first1);privilege(first1);break;} case 3:{struct process2 *first=creatlist2(n);print2(first);round(first);break;} case 4: {system("cls");break;} case 5: break; default: break; } } //*/ } 先来先服务调度算法:fcfs.h

相关主题
文本预览
相关文档 最新文档