操作系统进程管理与调度的模拟
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define AFX_OS_H__C7DDDD64_40F9_409F_A5C4_F3B92D488D50__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class Os
{
public:
PCB pcb[PCBNUM];
//
#include "stdafx.h"
#include "List.h"
#include "Os.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <process.H>
using namespace std;
public:
Status AppendPCB(PCB *datap);//将指定PCB加入链表
PCB *DeletePCB(int pid);//删除指定的PCB结点
void DisplayList();//显示整个链表
void DisplayPCB(PCB *pcb);//显示PCB中的详细信息
Ioreq:进程还需要的外部设备,作为进程调度的参考。
Timereq:进程要求的执行时间,用于控制进程的运行。
time_cpu:已经执行的时间,用于控制进程的运行。
Address:地址指针。通过它来运行模拟进程要执行的代码。
B、 链表设计成一个类(List)。表的示意图如下:
C、
PCB1
PCB2
PCB3
strcpy(name,"Process");
}
cout<<"\n按任意键运行........"<<endl;
getch();
while(i<max)
{
i++;
_itoa(i,s,10);//系统函数,将数转换成10进制
strcpy(temp,name);
strcat(temp,s);
os.CreateProcess(temp);
void displayMenu()
{
cout<<"操作系统进程管理与调度的模拟"<<endl;
cout<<"1.先来先服务"<<endl;
cout<<"2.最短作业优先"<<endl;
cout<<"3.优先级算法"<<endl;
cout<<"4.时间片轮转算法"<<endl;
cout<<"0.退出"<<endl;
displayMenu();
scanf("%d",&choice);
switch(choice)
{
case 0:exit(0);break;
case 1:os.SetStrategy(0);break;
case 2:os.SetStrategy(1);break;
case 3:os.SetStrategy(2);break;
List(char* nodetype="就绪");//构造函数,初始化
virtual ~List();
};
#endif // !defined(AFX_LIST_H__6D78FEEC_384C_415E_97A1_83FD6734BF4C__INCLUDED_)
// Os.h: interface for the Os class.
PCB4
PCB5
PCB6
PCB7
PCB8
PCB9
...
4
3
0
8
7
9
0
1
链表类的数据及其所支持的操作如下图:
各操作函数功能说明如下:
Status AppendPCB(PCB *datap);
将指定PCB加入链表。
PCB *DeletePCB(int pid);删除指定的PCB结点
void DisplayList();显示整个链表
题目:进程管理与调度模拟系统
一、实验目的
1、掌握进程在三种基本状态中变化的原理与过程。
2、掌握“先来先服务”、“短作业优先”、“优先级”、“时间片轮转”调度算法的原理与特点。
二、实验内容:
采用面向对象的程序设计方法来设计进程管理与调度模拟系统。要写出各个程序模块必要分析说明。
三、实验分析:
在进程管理与调度模拟系统中,共涉及到两个类和一个结构体:PCB结构体、链队列类和OS类。操作系统启动后,在系统内将存在PCB池,用来存放进程的PCB结构,PCB池的大小决定了系统中能同时存在的进程数量。在本系统中,假定系统能同时存在的进程数为20个,用一个PCB的数组来表示。PCB池中的PCB会有四种状态:运行状态、就绪状态、阻塞状态和空闲状态,所以,在操作系统中将会有四种队列:运行队列、就绪对列、阻塞队列和空闲队列。进程的创建随着操作系统的调度,将会在这四种队列中变迁。
int time_cpu;//已经执行的时间;
void (*fuction)(Os *);//模拟进程要执行的代码的地址
}PCB;
class List
{
private:
int NodeNum;
char *status;//链表的状态
PCB *ListHead;//指向链表的第一个进程
PCB *ListTail;//指向链表的最后一个进程
//
//////////////////////////////////////////////////////////////////////
#include "ConstVar.h"
#include "List.h"
#if !defined(AFX_OS_H__C7DDDD64_40F9_409F_A5C4_F3B92D488D50__INCLUDED_)
#if !defined(AFX_LIST_H__6D78FEEC_384C_415E_97A1_83FD6734BF4C__INCLUDED_)
#define AFX_LIST_H__6D78FEEC_384C_415E_97A1_83FD6734BF4C__INCLUDED_
#if _MSC_VER > 1000
{
cout<<"\n你的输入不正确,缺省为建立10个进程."<<endl;
max=10;
}
cout<<"\n请输入你想建立的进程名前缀:";
scanf("%s",name);
if(strlen(name)>19||strlen(name)==0)
{
cout<<"\n你的输入不正确,将以缺省前缀Process**运行"<<endl;
Status BlockProcess();
Status WakeupProcess();
void InsertIntoReady(PCB* pcb);
friend void program(Os *os);
public:
void scheduler();
void SetStrategy(int strat);
void SetListTail(PCB*pcb);设置尾指针
List(char* nodetype="就绪");构造函数,初始化
virtual ~List();虚函数
链表的构造函数:
void List::SetNodeNum(int k)设置链表结点数
{NodeNum=k;return;}
void List::SetStatus(char *s);设置状态标识
List Running,Ready,Blocked,Free;
int strategy;
public:
void initPCB(PCB *pcb);
void initOS();
Status CreateProcess(char *name);
Status DeleteProcess(int id);
#pragma once
#endif // _MSC_VER > 1000
#include "ConstVar.h"
#include <iostream>
using namespace std;
class Os;
typedef struct PCB
{
int id;//进程标识符;
char *name;//进程名字;
{status=s;return;}
void List::SetListHead(PCB*pcb)设置头指针
{ListHead=pcb;}
void List::SetListTail(PCB*pcb)设置尾指针
{ListTail=pcb;}
完全代码如下:
// Process.cpp : Defines the entry point for the console application.
time_cpu
address
Id:进程内部标识符。用于标识一个进程name:进程外部标识符。也用于标识一个进程。
Status:进程当前状态。作为进程调度的参考。Priority:进程优先级。作为进程调度的参考。
Next:状态指针。用于指向同状态的下一个PCB
Iodevice:外设清单。作为进程调度的参考。Blockfor:阻塞原因,作为唤醒进程的标志。
//cout<<temp<<endl;
}wenku.baidu.com
os.scheduler();
_getch();
if(!cin) break;
}
/*return 0;*/
}
// List.h: interface for the List class.
//
//////////////////////////////////////////////////////////////////////
Status isEmpty();//判断链表是否为空
Status GetFirstPCB(PCB* &pcb);//取第一个结点
void SetStatus(char *s);//设置状态标识
void SetListHead(PCB*pcb);//设置头指针
void SetListTail(PCB*pcb);//设置尾指针
void SetNodeNum(int k);设置链表结点数
Status isEmpty();判断链表是否为空
Status GetFirstPCB(PCB* &pcb);取第一个结点
void SetStatus(char *s);设置状态标识
void SetListHead(PCB*pcb);设置头指针
case 4:os.SetStrategy(3);break;
default:
cout<<"\n你的选择不正确,将以缺省值运行"<<endl;
os.SetStrategy(0);break;
}
cout<<"\n请输入你想建立的进程数量(最大20):";
scanf("%d",&max);
if (max<1||max>20)
PCB* FindPCB(int pid,PCB* &pre);//查找指定的结点
PCB* FindPCB(int pnum);//查找链表中的第pnum个结点
char* GetListStatus();//取得当前链表PCB结点的状态
int GetNodeNum();//取得链表的结点数
void SetNodeNum(int k);//设置链表结点数
PCBstatus status;//进程当前状态;
struct PCB *next;//指向同状态的下一个PCB
int priority;//进程优先级;
int IOdevice;//外设清单
int IOreq;//进程还需要的外部设备;
int blockfor;//阻塞原因;
int timereq;//进程要求的执行时间
void DisplayPCB(PCB *pcb);
显示PCB中的详细信息
PCB* FindPCB(int pid,PCB* &pre);
查找指定的结点
PCB* FindPCB(int pnum);
查找链表中的第pnum个结点
char* GetListStatus();
取得当前链表PCB结点的状态
int GetNodeNum();取得链表的结点数
四、实验过程:
1、设计PCB和链表
A、PCB采用结构体设计,用于描述进程运行所需的全部信息,作为OS对并发执行的进程进行控制和管理的根据,其贯穿进程的整个生命周期,是进程存在的唯一标志。其结构图如下:
id
name
status
next
priority
IOdevice
IOreq
blockfor
timereq
cout<<"请输入您的选择:1为缺省值---";
}
int main(int argc, char* argv[])
{
Os os;
int choice,max,i=0;
char name[80]="Process";
char s[10],temp[20];
while (1)
{
system("cls");
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class Os
{
public:
PCB pcb[PCBNUM];
//
#include "stdafx.h"
#include "List.h"
#include "Os.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <process.H>
using namespace std;
public:
Status AppendPCB(PCB *datap);//将指定PCB加入链表
PCB *DeletePCB(int pid);//删除指定的PCB结点
void DisplayList();//显示整个链表
void DisplayPCB(PCB *pcb);//显示PCB中的详细信息
Ioreq:进程还需要的外部设备,作为进程调度的参考。
Timereq:进程要求的执行时间,用于控制进程的运行。
time_cpu:已经执行的时间,用于控制进程的运行。
Address:地址指针。通过它来运行模拟进程要执行的代码。
B、 链表设计成一个类(List)。表的示意图如下:
C、
PCB1
PCB2
PCB3
strcpy(name,"Process");
}
cout<<"\n按任意键运行........"<<endl;
getch();
while(i<max)
{
i++;
_itoa(i,s,10);//系统函数,将数转换成10进制
strcpy(temp,name);
strcat(temp,s);
os.CreateProcess(temp);
void displayMenu()
{
cout<<"操作系统进程管理与调度的模拟"<<endl;
cout<<"1.先来先服务"<<endl;
cout<<"2.最短作业优先"<<endl;
cout<<"3.优先级算法"<<endl;
cout<<"4.时间片轮转算法"<<endl;
cout<<"0.退出"<<endl;
displayMenu();
scanf("%d",&choice);
switch(choice)
{
case 0:exit(0);break;
case 1:os.SetStrategy(0);break;
case 2:os.SetStrategy(1);break;
case 3:os.SetStrategy(2);break;
List(char* nodetype="就绪");//构造函数,初始化
virtual ~List();
};
#endif // !defined(AFX_LIST_H__6D78FEEC_384C_415E_97A1_83FD6734BF4C__INCLUDED_)
// Os.h: interface for the Os class.
PCB4
PCB5
PCB6
PCB7
PCB8
PCB9
...
4
3
0
8
7
9
0
1
链表类的数据及其所支持的操作如下图:
各操作函数功能说明如下:
Status AppendPCB(PCB *datap);
将指定PCB加入链表。
PCB *DeletePCB(int pid);删除指定的PCB结点
void DisplayList();显示整个链表
题目:进程管理与调度模拟系统
一、实验目的
1、掌握进程在三种基本状态中变化的原理与过程。
2、掌握“先来先服务”、“短作业优先”、“优先级”、“时间片轮转”调度算法的原理与特点。
二、实验内容:
采用面向对象的程序设计方法来设计进程管理与调度模拟系统。要写出各个程序模块必要分析说明。
三、实验分析:
在进程管理与调度模拟系统中,共涉及到两个类和一个结构体:PCB结构体、链队列类和OS类。操作系统启动后,在系统内将存在PCB池,用来存放进程的PCB结构,PCB池的大小决定了系统中能同时存在的进程数量。在本系统中,假定系统能同时存在的进程数为20个,用一个PCB的数组来表示。PCB池中的PCB会有四种状态:运行状态、就绪状态、阻塞状态和空闲状态,所以,在操作系统中将会有四种队列:运行队列、就绪对列、阻塞队列和空闲队列。进程的创建随着操作系统的调度,将会在这四种队列中变迁。
int time_cpu;//已经执行的时间;
void (*fuction)(Os *);//模拟进程要执行的代码的地址
}PCB;
class List
{
private:
int NodeNum;
char *status;//链表的状态
PCB *ListHead;//指向链表的第一个进程
PCB *ListTail;//指向链表的最后一个进程
//
//////////////////////////////////////////////////////////////////////
#include "ConstVar.h"
#include "List.h"
#if !defined(AFX_OS_H__C7DDDD64_40F9_409F_A5C4_F3B92D488D50__INCLUDED_)
#if !defined(AFX_LIST_H__6D78FEEC_384C_415E_97A1_83FD6734BF4C__INCLUDED_)
#define AFX_LIST_H__6D78FEEC_384C_415E_97A1_83FD6734BF4C__INCLUDED_
#if _MSC_VER > 1000
{
cout<<"\n你的输入不正确,缺省为建立10个进程."<<endl;
max=10;
}
cout<<"\n请输入你想建立的进程名前缀:";
scanf("%s",name);
if(strlen(name)>19||strlen(name)==0)
{
cout<<"\n你的输入不正确,将以缺省前缀Process**运行"<<endl;
Status BlockProcess();
Status WakeupProcess();
void InsertIntoReady(PCB* pcb);
friend void program(Os *os);
public:
void scheduler();
void SetStrategy(int strat);
void SetListTail(PCB*pcb);设置尾指针
List(char* nodetype="就绪");构造函数,初始化
virtual ~List();虚函数
链表的构造函数:
void List::SetNodeNum(int k)设置链表结点数
{NodeNum=k;return;}
void List::SetStatus(char *s);设置状态标识
List Running,Ready,Blocked,Free;
int strategy;
public:
void initPCB(PCB *pcb);
void initOS();
Status CreateProcess(char *name);
Status DeleteProcess(int id);
#pragma once
#endif // _MSC_VER > 1000
#include "ConstVar.h"
#include <iostream>
using namespace std;
class Os;
typedef struct PCB
{
int id;//进程标识符;
char *name;//进程名字;
{status=s;return;}
void List::SetListHead(PCB*pcb)设置头指针
{ListHead=pcb;}
void List::SetListTail(PCB*pcb)设置尾指针
{ListTail=pcb;}
完全代码如下:
// Process.cpp : Defines the entry point for the console application.
time_cpu
address
Id:进程内部标识符。用于标识一个进程name:进程外部标识符。也用于标识一个进程。
Status:进程当前状态。作为进程调度的参考。Priority:进程优先级。作为进程调度的参考。
Next:状态指针。用于指向同状态的下一个PCB
Iodevice:外设清单。作为进程调度的参考。Blockfor:阻塞原因,作为唤醒进程的标志。
//cout<<temp<<endl;
}wenku.baidu.com
os.scheduler();
_getch();
if(!cin) break;
}
/*return 0;*/
}
// List.h: interface for the List class.
//
//////////////////////////////////////////////////////////////////////
Status isEmpty();//判断链表是否为空
Status GetFirstPCB(PCB* &pcb);//取第一个结点
void SetStatus(char *s);//设置状态标识
void SetListHead(PCB*pcb);//设置头指针
void SetListTail(PCB*pcb);//设置尾指针
void SetNodeNum(int k);设置链表结点数
Status isEmpty();判断链表是否为空
Status GetFirstPCB(PCB* &pcb);取第一个结点
void SetStatus(char *s);设置状态标识
void SetListHead(PCB*pcb);设置头指针
case 4:os.SetStrategy(3);break;
default:
cout<<"\n你的选择不正确,将以缺省值运行"<<endl;
os.SetStrategy(0);break;
}
cout<<"\n请输入你想建立的进程数量(最大20):";
scanf("%d",&max);
if (max<1||max>20)
PCB* FindPCB(int pid,PCB* &pre);//查找指定的结点
PCB* FindPCB(int pnum);//查找链表中的第pnum个结点
char* GetListStatus();//取得当前链表PCB结点的状态
int GetNodeNum();//取得链表的结点数
void SetNodeNum(int k);//设置链表结点数
PCBstatus status;//进程当前状态;
struct PCB *next;//指向同状态的下一个PCB
int priority;//进程优先级;
int IOdevice;//外设清单
int IOreq;//进程还需要的外部设备;
int blockfor;//阻塞原因;
int timereq;//进程要求的执行时间
void DisplayPCB(PCB *pcb);
显示PCB中的详细信息
PCB* FindPCB(int pid,PCB* &pre);
查找指定的结点
PCB* FindPCB(int pnum);
查找链表中的第pnum个结点
char* GetListStatus();
取得当前链表PCB结点的状态
int GetNodeNum();取得链表的结点数
四、实验过程:
1、设计PCB和链表
A、PCB采用结构体设计,用于描述进程运行所需的全部信息,作为OS对并发执行的进程进行控制和管理的根据,其贯穿进程的整个生命周期,是进程存在的唯一标志。其结构图如下:
id
name
status
next
priority
IOdevice
IOreq
blockfor
timereq
cout<<"请输入您的选择:1为缺省值---";
}
int main(int argc, char* argv[])
{
Os os;
int choice,max,i=0;
char name[80]="Process";
char s[10],temp[20];
while (1)
{
system("cls");