设计一个按优先数调度算法实现处理器调度的进程.docx

上传人:b****4 文档编号:24087211 上传时间:2023-05-24 格式:DOCX 页数:14 大小:170.17KB
下载 相关 举报
设计一个按优先数调度算法实现处理器调度的进程.docx_第1页
第1页 / 共14页
设计一个按优先数调度算法实现处理器调度的进程.docx_第2页
第2页 / 共14页
设计一个按优先数调度算法实现处理器调度的进程.docx_第3页
第3页 / 共14页
设计一个按优先数调度算法实现处理器调度的进程.docx_第4页
第4页 / 共14页
设计一个按优先数调度算法实现处理器调度的进程.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

设计一个按优先数调度算法实现处理器调度的进程.docx

《设计一个按优先数调度算法实现处理器调度的进程.docx》由会员分享,可在线阅读,更多相关《设计一个按优先数调度算法实现处理器调度的进程.docx(14页珍藏版)》请在冰豆网上搜索。

设计一个按优先数调度算法实现处理器调度的进程.docx

设计一个按优先数调度算法实现处理器调度的进程

实验报告

 

2012~2013学年第一学期

 

课程

操作系统原理

实验名称

设计一个按优先数调度算法实现处理器调度的进程

小组成员

阮广杰、陈智磊、高天翔、董云鹏

专业班级

10级计本三班

指导教师

屠菁

 

2012年11月29号

 

操作系统实验报告

实验目的:

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

本实验模拟在单处理器情况下处理器调度,设计一个按优先数调度算法实现处理器调度的进程,通过运行程序,能够清楚的表述优先数调度的过程,进一步掌握优先数调度算法的实现。

实验内容:

设计一个按优先数调度算法实现处理器调度的进程。

实验步骤:

概要设计:

(1)假定系统有5个进程,每个进程用一个PCB来代表。

PCB的格式为:

进程名、指针、要求运行时间、优先数、状态。

进程名——P1~P5。

指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。

要求运行时间——假设进程需要运行的单位时间数。

优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。

状态——假设两种状态,就绪,用R表示,和结束,用E表示。

初始状态都为就绪状态。

(2)每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。

(3)处理器总是选队首进程运行。

采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。

(4)进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结束”,退出队列。

(5)若就绪队列为空,结束,否则,重复(3)。

详细设计:

1、程序中使用的数据结构及符号说明:

typedefstructPCB{

charname[50];//进程名以序号代替

LPVOIDlp;//指向进程的长指针,模拟的,所以没用到。

inttm;//需要运行的时间

intprior;//初始的优先数

charstate;//状态

structPCB*next;//指向下一个PCB块

}PCB;

2、程序主要部分流程图:

3、源程序清单:

//Main.cpp

//prior.cpp:

Definestheentrypointfortheapplication.

//

#include"stdafx.h"

#include"resource.h"

#include"MainDlg.h"

#include

intAPIENTRYWinMain(HINSTANCEhInstance,//当前进程句柄

HINSTANCEhPrevInstance,//前次进程句柄

LPSTRlpCmdLine,//启动信息

intnCmdShow)//

{

//EnableIPAddress、Calendar.etc

InitCommonControls();//系统调用函数

DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,Main_Proc);

return0;

}

//MainDlg.cpp

#include"stdafx.h"

#include

#include

#include"resource.h"

#include"MainDlg.h"

#include"cross.h"

#include"time.h"

intMAX_NUM;//用户输入进程数

char*pst1="------------------------------------------------------------------------------\r\n";

char*pst2="=======================================\r\n";

typedefstructPCB{

charname[50];//进程名以序号代替

LPVOIDlp;//指向进程的长指针,模拟的,所以没用到。

inttm;//需要运行的时间

intprior;//初始的优先数

charstate;//状态

structPCB*next;//指向下一个PCB块

}PCB;

intbegin(intp,HWNDhwnd);//开始模拟

PCB*initialize();//初始化PCB块,建立PCB链表

voidrun(PCB*head,HWNDhwnd);// 模拟运行优先数调度

voidoutput(PCB*head,PCB*select,HWNDhwnd);// 输出全部PCB块信息

voidaddText(HWNDhwnd,char*pstr);// 处理输出细节

BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)

{

switch(uMsg)

{

HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);

HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);//处理按钮的消息

HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);

}

returnFALSE;

}

BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)

{

returnTRUE;

}

voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)

{

switch(id)

{

caseIDC_SURE:

{

TCHARstrin[256];

unsignedinti=0;

intp=0;

SetDlgItemText(hwnd,IDC_EDITOUT,"");//输出文本框设置空

GetDlgItemText(hwnd,IDC_EDITIN,strin,sizeof(strin));//获取文本内容

if(strlen(strin)==0){

MessageBox(hwnd,TEXT("请输入数字"),TEXT("警告"),MB_OK);

}

while(i!

=strlen(strin))

{

if(isdigit(strin[i]))p=p*10+(int)strin[i]-48;//字符串变数字

else{MessageBox(hwnd,TEXT("请输入数字"),TEXT("警告"),MB_OK);return;}

i++;

}

if(0==p){MessageBox(hwnd,TEXT("请输入大于0的数字"),TEXT("警告"),MB_OK);return;}

begin(p,hwnd);

}

break;

caseIDC_CLEAR:

{

SetDlgItemText(hwnd,IDC_EDITIN,"");

SetDlgItemText(hwnd,IDC_EDITOUT,"");

}

break;

default:

break;

}

}

voidMain_OnClose(HWNDhwnd)

{

EndDialog(hwnd,0);

}

intbegin(intp,HWNDhwnd)

{

MAX_NUM=p;

PCB*head;

char*pstr=TEXT("序号时间优化数状态\r\n");//定义字符串指针,指向""里的内容

head=(PCB*)malloc(sizeof(PCB));

head=initialize();//初始化PCB块

addText(hwnd,pstr);//输出pstr内容

run(head,hwnd);//模拟运行

return0;

}

PCB*initialize()

{

inti=0,temp;

PCB*head;

PCB*ptemp,*qtemp;

srand((unsigned)time(NULL));//初始化随机数种子

while(i!

=MAX_NUM)

{

ptemp=(PCB*)malloc(sizeof(PCB));

itoa(i,ptemp->name,10);

temp=rand()%11+1;//获取随机数

ptemp->tm=temp;

temp=rand()%11+1;

ptemp->prior=temp;

temp=rand()%11+1;

ptemp->state='R';

if(i==0){head=ptemp;qtemp=ptemp;}

else{qtemp->next=ptemp;qtemp=ptemp;}

i++;

}

qtemp->next=NULL;

returnhead;

}

voidrun(PCB*head,HWNDhwnd)

{

PCB*h=head;//头指针

PCB*t=head;//最大优先数

PCB*p=h;//遍历链表

PCB*temp;

//intflag=0;

while(t!

=NULL)

{

p=h;

while(p!

=NULL)

{

if((p->state!

='E')&&(p->prior>t->prior))t=p;

p=p->next;

}//找最大的优先数进程

output(head,t,hwnd);//输出所有进程信息

t->prior--;//优先数减一

t->tm--;//运行时间减一

if(t->tm==0)t->state='E';//当进程运行时间为0,标志为E

temp=t;

t=NULL;

p=h;//p指向头

while(p!

=NULL)if(p->state=='R'){t=p;break;}elsep=p->next;//找到第一个就绪状态的进程

}

output(head,temp,hwnd);

}

voidoutput(PCB*head,PCB*select,HWNDhwnd)

{

PCB*h=head;

addText(hwnd,pst1);

while(h!

=NULL)

{

charch[256];

wsprintf(ch,"%-13s%-13d%-13d%c",h->name,h->tm,h->prior,h->state);

addText(hwnd,ch);

if(h==select){addText(hwnd,"****");}

addText(hwnd,"\r\n");

h=h->next;

}

addText(hwnd,pst2);

}

voidaddText(HWNDhwnd,char*pstr)//向文本框添加pstr内容

{

HWNDhEdit=GetDlgItem(hwnd,IDC_EDITOUT);//获取文本框句柄

intndx=GetWindowTextLength(hEdit);//获取文本框内容长度

SetFocus(hEdit);//设置文本框焦点

SendMessage(hEdit,EM_SETSEL,(WPARAM)ndx,(LPARAM)ndx);//设置文本框选定内容选定末尾

SendMessage(hEdit,EM_REPLACESEL,0,(LPARAM)((LPSTR)pstr));//以pstr替代上述选定内容

}运行结果截图:

四、实验总结:

本实验主要是用链表实现的,整个过程思路很简单,但是实现起来较困难。

实验难点在于:

怎么实现文本框的控制,怎么用指针的形式来指向每个要处理的优先数,怎样实现优先数的比较等。

通过本次实验:

我们更加清楚的认识到处理器调度的过程:

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

本实验模拟在单处理器情况下处理器调度,设计一个按优先数调度算法实现处理器调度的进程。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1