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

上传人:飞*** 文档编号:32025099 上传时间:2018-02-10 格式:DOC 页数:11 大小:334.50KB
返回 下载 相关 举报
设计一个按优先数调度算法实现处理器调度的进程_第1页
第1页 / 共11页
设计一个按优先数调度算法实现处理器调度的进程_第2页
第2页 / 共11页
设计一个按优先数调度算法实现处理器调度的进程_第3页
第3页 / 共11页
设计一个按优先数调度算法实现处理器调度的进程_第4页
第4页 / 共11页
设计一个按优先数调度算法实现处理器调度的进程_第5页
第5页 / 共11页
点击查看更多>>
资源描述

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

1、实验报告2012 2013 学年第 一 学期课程 操作系统原理实验名称设计一个按优先数调度算法实现处理器调度的进程小组成员阮广杰、陈智磊、高天翔、董云鹏专业班级 10 级计本三班指导教师 屠 菁2012 年 11 月 29 号操作系统实验报告实验目的:在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下处理器调度,设计一个按优先数调度算法实现处理器调度的进程,通过运行程序,能够清楚的表述优先数调度的过程,进一步掌握优先数调度算法的实现。实验内容:设计一个按优先数调度算法实现处理

2、器调度的进程。实验步骤:概要设计:(1)假定系统有 5 个进程,每个进程用一个 PCB 来代表。PCB 的格式为:进程名、指针、要求运行时间、优先数、状态。进程名P1P5。指针按优先数的大小把 5 个进程连成队列,用指针指出下一个进程PCB 的首地址。要求运行时间假设进程需要运行的单位时间数。优先数赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态假设两种状态,就绪,用 R 表示,和结束,用 E 表示。初始状态都为就绪状态。(2) 每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间” 。(3) 处理器总是选队首进程运行。采用动态改变优先数的办法,进程每运行 1 次,优先数减

3、 1,要求运行时间减 1。(4) 进程运行一次后,若要求运行时间不等于 0,则将它加入队列,否则,将状态改为“结束” ,退出队列。(5) 若就绪队列为空,结束,否则,重复(3)。详细设计:1、程序中使用的数据结构及符号说明:typedef struct PCBchar name50;/ 进程名 以序号代替LPVOID lp;/ 指向进程的长指针,模拟的,所以没用到。int tm;/ 需要运行的时间int prior;/ 初始的优先数char state;/ 状态 struct PCB *next; / 指向下一个 PCB 块PCB;2、程序主要部分流程图:输入 P初始化 P 个进程。由链表形式

4、存 PCB,返回head 指向头指针P=head;t=headT=NULL?调用 output(); P=head;结束 P=NULL?p-stae!=E&p-priort-priorP=p-nextT=pOutput(head,t)t-prior-;t-tm-;t=NULL;p=head;P=NULL?P-stat!=ET=pP=p-next;开始 3、源程序清单:/Main.cpp/ prior.cpp : Defines the entry point for the application./#include stdafx.h#include resource.h#include Ma

5、inDlg.h#include int APIENTRY WinMain(HINSTANCE hInstance,/当前进程句柄HINSTANCE hPrevInstance,/ 前次进程句柄LPSTR lpCmdLine,/ 启动信息int nCmdShow)/Enable IPAddress、Calendar.etcInitCommonControls();/系统调用函数DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, Main_Proc);return 0;/MainDlg.cpp#include stdafx.h#include

6、 #include #include resource.h#include MainDlg.h#include cross.h#include time.hint MAX_NUM;/ 用户输入进程数char *pst1=-rn;char *pst2=rn;typedef struct PCBchar name50;/ 进程名 以序号代替LPVOID lp;/ 指向进程的长指针,模拟的,所以没用到。int tm;/ 需要运行的时间int prior;/ 初始的优先数 char state;/ 状态struct PCB *next; / 指向下一个 PCB 块PCB;int begin(int p

7、,HWND hwnd); / 开始模拟PCB *initialize();/ 初始化 PCB 块,建立 PCB 链表void run(PCB *head,HWND hwnd);/模拟运行优先数调度void output(PCB *head,PCB *select,HWND hwnd);/输出全部 PCB 块信息void addText(HWND hwnd,char *pstr);/处理输出细节BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch(uMsg)HANDLE_MSG(hWnd,

8、WM_INITDIALOG, Main_OnInitDialog);HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);/ 处理 按钮的消息HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);return FALSE;BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)return TRUE;void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)switch(id)cas

9、e IDC_SURE:TCHAR strin256; unsigned int i=0;int p=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(strini) p=p*10+(int)strini-48;/ 字符串变数字else Mes

10、sageBox(hwnd,TEXT(请输入数字),TEXT( 警告),MB_OK); return;i+; if(0=p) MessageBox(hwnd,TEXT(请输入大于 0 的数字),TEXT( 警告),MB_OK); return;begin(p,hwnd);break;case IDC_CLEAR:SetDlgItemText(hwnd,IDC_EDITIN,);SetDlgItemText(hwnd,IDC_EDITOUT,);break;default:break;void Main_OnClose(HWND hwnd)EndDialog(hwnd, 0);int begin(

11、int p,HWND hwnd)MAX_NUM=p;PCB *head;char *pstr=TEXT( 序号 时间 优化数 状态 rn);/ 定义字符串指针,指向 里的内容head=(PCB *)malloc(sizeof(PCB);head=initialize();/ 初始化 PCB 块addText(hwnd,pstr);/ 输出 pstr 内容run(head,hwnd);/ 模拟运行 return 0;PCB *initialize()int i=0,temp; PCB *head;PCB *ptemp,*qtemp;srand(unsigned)time(NULL);/ 初始化随

12、机数种子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;return head;void run(PCB *head,

13、HWND hwnd)PCB *h=head;/ 头指针PCB *t=head;/ 最大优先数PCB *p=h;/ 遍历链表PCB *temp;/int flag=0;while(t!=NULL)p=h;while(p!=NULL)if(p-state!=E)p=p-next;/ 找最大的优先数进程output(head,t,hwnd);/ 输出所有进程信息t-prior-;/ 优先数减一t-tm-;/ 运行时间减一if(t-tm=0) t-state=E; / 当进程运行时间为 0,标志为 Etemp=t;t=NULL;p=h;/ p 指向头while(p!=NULL) if(p-state=

14、R) t=p; break; else p=p-next; /找到第一个就绪状态的进程output(head,temp,hwnd);void output(PCB *head,PCB *select,HWND hwnd) PCB *h=head;addText(hwnd,pst1);while(h!=NULL) char ch256;wsprintf(ch, %-13s%-13d%-13d%c,h-name,h-tm,h-prior,h-state); addText(hwnd,ch); if(h=select) addText(hwnd, *); addText(hwnd,rn);h=h-n

15、ext;addText(hwnd,pst2);void addText(HWND hwnd,char *pstr)/ 向文本框添加 pstr 内容HWND hEdit = GetDlgItem (hwnd, IDC_EDITOUT);/ 获取文本框句柄int ndx = GetWindowTextLength (hEdit); /获取文本框内容长度SetFocus (hEdit);/ 设置文本框焦点SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx); / 设置文本框选定内容 选定末尾SendMessage (hEdit, EM_REPLACESEL, 0

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号