1、处理机调度算法的实现实验报告学院(系)名称:计算机与通信工程学院姓名学号专业班级实验项目实验一:处理机调度算法的实现课程名称操作系统课程代码 0668036实验时间2011 年10月25日 2011 年10月28日 2011 年11月01日 实验地点软件实验室7-215批改意见成绩教师签字: 【实验环境】Windows操作系统环境下的个人微机【实验目的】 通过编写程序实现进程高优先权优先调度算法,使学生进一步掌握进程调度的概 念和算法,加深对处理机分配的理解。【实验要求】1 详细描述实验设计思想、程序结构及各模块设计思路;2 详细描述程序所用数据结构及算法;3 明确给出测试用例和实验结果;4
2、为增加程序可读性,在程序中进行适当注释说明;5 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6 实验报告撰写要求结构清晰、描述准确逻辑性强;7 实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。【实验内容】1 设定系统中有五个进程,每一个进程用一个进程控制块表示。2 输入每个进程的“优先数”和“要求运行时间”。3 为了调度方便,将五个进程按给定的优先数从大到小连成就绪队列。用一单元指出队列首进程,用指针指出队列的连接情况。4 处理机调度总是选队首进程运行。采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。5 若某进程运行时间为零,则将其状态置为
3、“结束”,且退出队列。6 运行所设计程序,显示或打印逐次被选中进程的进程名,以及进程控制块的动态变化过程。【实验步骤、过程】 1、程序流程图 2、程序代码/ Deal_ProcessDlg.cpp : implementation file/#include stdafx.h#include Deal_Process.h#include Deal_ProcessDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used fo
4、r App About#define N 5/定义进程控制块typedef struct PCB int num; int prior; int request_time; char state;PCB;/定义全局变量PCB *pcb=new PCB5;int count=0,_count=0;class CAboutDlg : public CDialogpublic: CAboutDlg();/ Dialog Data /AFX_DATA(CAboutDlg) enum IDD = IDD_ABOUTBOX ; /AFX_DATA / ClassWizard generated virtu
5、al function overrides /AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support /AFX_VIRTUAL/ Implementationprotected: /AFX_MSG(CAboutDlg) /AFX_MSG DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD) /AFX_DATA_INIT(CAboutDlg) /AFX_DATA_INI
6、Tvoid CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CAboutDlg) /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog) /AFX_MSG_MAP(CAboutDlg) / No message handlers /AFX_MSG_MAPEND_MESSAGE_MAP()/ CDeal_ProcessDlg dialogCDeal_ProcessDlg:CDeal_ProcessDlg(CWnd* pPar
7、ent /*=NULL*/) : CDialog(CDeal_ProcessDlg:IDD, pParent) /AFX_DATA_INIT(CDeal_ProcessDlg) m_count1 = _T(); m_prior1 = 0; m_count2 = _T(); m_request_time1 = 0; m_prior2 = _T(); m_request_time2 = _T(); /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxG
8、etApp()-LoadIcon(IDR_MAINFRAME);void CDeal_ProcessDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CDeal_ProcessDlg) DDX_Control(pDX, IDC_Start, m_Start); DDX_Control(pDX, IDC_Confirm, m_Confirm); DDX_Control(pDX, IDC_Request_Time1, m_Edit2); DDX_Control(pDX, IDC_Pri
9、or1, m_Edit1); DDX_Control(pDX, IDC_LIST_F, m_list_f); DDX_Control(pDX, IDC_LIST_W, m_list_w); DDX_Text(pDX, IDC_Count1, m_count1); DDX_Text(pDX, IDC_Prior1, m_prior1); DDX_Text(pDX, IDC_Count2, m_count2); DDX_Text(pDX, IDC_Request_Time1, m_request_time1); DDV_MinMaxInt(pDX, m_request_time1, 0, 100)
10、; DDX_Text(pDX, IDC_Prior2, m_prior2); DDX_Text(pDX, IDC_Request_Time2, m_request_time2); /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CDeal_ProcessDlg, CDialog) /AFX_MSG_MAP(CDeal_ProcessDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_Confirm, OnConfirm) ON_BN_CLICKED(IDC_Start, OnS
11、tart) ON_BN_CLICKED(IDC_Exit, OnExit) /AFX_MSG_MAPEND_MESSAGE_MAP()/ CDeal_ProcessDlg message handlersBOOL CDeal_ProcessDlg:OnInitDialog() CDialog:OnInitDialog(); / Add About. menu item to system menu. / IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);
12、 ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set s
13、mall icon / TODO: Add extra initialization here /添加自己的代码 m_Edit1.ShowWindow(SW_SHOW); m_Edit2.ShowWindow(SW_SHOW); m_Confirm.ShowWindow(SW_SHOW); m_Start.ShowWindow(SW_SHOW); UpdateWindow(); /提示用户进行初始化 m_count1.Format(%d,1); UpdateData(false); /首先设定列表控件风格可以整行选中,并具有作业线 DWORD style=m_list_w.GetExtende
14、dStyle(); m_list_w.SetExtendedStyle(style|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); DWORD style_1=m_list_f.GetExtendedStyle(); m_list_f.SetExtendedStyle(style_1|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); /以下为插入几个列的列标题 CRect rect; m_list_w.GetClientRect(&rect); int nColInterval=rect.Width()/7; m_list_w.In
15、sertColumn(0,进程编号,LVCFMT_LEFT,nColInterval*2); m_list_w.InsertColumn(1,优先数,LVCFMT_LEFT,nColInterval*2); m_list_w.InsertColumn(2,要求运行时间,LVCFMT_LEFT,nColInterval*2); m_list_w.InsertColumn(3,状态,LVCFMT_LEFT,rect.Width()-nColInterval*6); m_list_f.InsertColumn(0,进程编号,LVCFMT_LEFT,nColInterval*2); m_list_f.
16、InsertColumn(1,优先数,LVCFMT_LEFT,nColInterval*2); m_list_f.InsertColumn(2,要求运行时间,LVCFMT_LEFT,nColInterval*2); m_list_f.InsertColumn(3,状态,LVCFMT_LEFT,rect.Width()-nColInterval*6); return TRUE; / return TRUE unless you set the focus to a controlvoid CDeal_ProcessDlg:OnSysCommand(UINT nID, LPARAM lParam)
17、 if (nID & 0xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSysCommand(nID, lParam); / If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by
18、 the framework.void CDeal_ProcessDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect
19、; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; / Draw the icon dc.DrawIcon(x, y, m_hIcon); else CDialog:OnPaint(); / The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CDeal_ProcessDlg:O
20、nQueryDragIcon() return (HCURSOR) m_hIcon;/初始化N个进程void CDeal_ProcessDlg:OnConfirm() / TODO: Add your control notification handler code here UpdateData(true); pcbcount.num=count+1; pcbcount.prior=m_prior1; pcbcount.request_time=m_request_time1; pcbcount.state=W;/表示进程处于就绪状态 /将进程信息显示在就绪进程列表中中 CString s
21、trItem; strItem.Format(_T(%d),count+1); m_list_w.InsertItem(count,strItem);/首先插入一行,其中的字符可以任意,也可以为空 strItem.Format(_T(%d),m_prior1); m_list_w.SetItemText(count,1,strItem);/设置第二列数据,如此可以设置其它列的数据 strItem.Format(_T(%d),m_request_time1); m_list_w.SetItemText(count,2,strItem); m_list_w.SetItemText(count,3,
22、_T(W); if(countN-1) m_count1.Format(%d,count+2); m_prior1=0; m_request_time1=0; UpdateData(false); else /屏蔽初始化组件 m_Edit1.ShowWindow(SW_HIDE); m_Edit2.ShowWindow(SW_HIDE); m_Confirm.ShowWindow(SW_HIDE); MessageBox(初始化完成,系统中现有5个进程,点击“开始”按钮,模拟处理机调度); return; count+;/*理论上将N个进程按给定的优先数从大到小连成就绪队列,但实际上只需找到优
23、先数最高的就绪进程*/int CDeal_ProcessDlg:Get_Max_prior_ready_process() int i,j,max; for(i=0;iN;i+) if(pcbi.state=W) max=i;break; if(i=5) max=i; for(j=max+1;jN;j+) if(pcbj.state=W) if(pcbmax.priorpcbj.prior) max=j; return max;void CDeal_ProcessDlg:Running() Sleep(500);/等待,表示运行了一个时间片 int temp; temp=Get_Max_pri
24、or_ready_process(); if(temp=N) MessageBox(系统内部的进程全部运行完毕!); /屏蔽其他组件 m_count1.Format(); m_count2.Format(); m_prior2.Format(); m_request_time2.Format(); UpdateData(false); return; /修改当前运行进程的PCB if(pcbtemp.request_time) pcbtemp.request_time-=1;/需要运行时间减1 pcbtemp.prior-=1;/优先数减1 /显示当前正在运行的进程信息 m_prior2.Fo
25、rmat(%d,pcbtemp.prior); m_request_time2.Format(%d,pcbtemp.request_time); m_count2.Format(%d,temp+1); UpdateData(false); if(pcbtemp.request_time=0) pcbtemp.state=F; /将该进程信息在就绪进程表中删除 int _num=0; int nIndex; tagLVFINDINFOA info; CString strlist=_T(); _num=m_list_w.GetItemCount(); info.flags=LVFI_PARTIA
26、L|LVFI_STRING; for(int i=0;i_num;i+) strlist.Format(%d,pcbtemp.num); info.psz=strlist;/找到待删除的行 if(nIndex=m_list_w.FindItem(&info)!=-1) m_list_w.DeleteItem(nIndex); break; /将该进程加入到已完成进程列表中 CString strItem; strItem.Format(_T(%d),pcbtemp.num); m_list_f.InsertItem(_count,strItem);/首先插入一行,其中的字符可以任意,也可以为空
27、 strItem.Format(_T(%d),pcbtemp.prior); m_list_f.SetItemText(_count,1,strItem);/设置第二列数据,如此可以设置其它列的数据 strItem.Format(_T(%d),0); m_list_f.SetItemText(_count,2,strItem); m_list_f.SetItemText(_count,3,_T(F); m_list_f.Update(_count); _count+; Running(); void CDeal_ProcessDlg:OnStart() / TODO: Add your control notification handler code here Running(); /屏蔽开始按钮 m_Start.ShowWindow(SW_HIDE);void CDeal_ProcessDlg:OnExit() / TODO: Add your control notification handler code here CDialog:OnOK(); 3、运行结果(1)初始化进程信息,显示到就绪进程列表控件中(2)点击开始按钮,模拟处理机调度,动态显示运行情况(3)将完成的进
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1