? 根据需要设置系统内存的大小
? 选择不同的进度调度算法进行进程调度模拟 ? 设置进程的各种属性值创建进程
? 根据进程不同的状态放在不同的位置显示进程调度过程中的动态变化情况 ? 在某一时间点击按钮进行进程调度模拟
? 进程调度模拟过程中可以暂停调度过程,查看进程的状态变化过程 ? 通过双击状态列表中的某个进程可以查看进程的各属性值 ? 对执行进程、就绪进程进行强制“阻塞”操作 ? 对等待进程进行强制“就绪”操作
? 将没有执行完毕的进程进行强制“杀死”操作
4、程序总控流程图
(见下页)
[键入文字]
6
开始 创建新的进程 设置内存大小 选择不同的调度算法 新添加的进程所需要的资源因为主存的限制按先后顺序进入就绪队列或是等待队列 本图只是系统运行时的大致过程 开始调度 按不同的调度算法开始进行 对处于不同状态队列的进程进行阻塞、就绪、杀死等操作 暂停操作可以停止进程调度并可以继续执行 双击某个进程可以查看进程的属性、复位操作清空各状态队列等 只要各进程状态队列不空,根据不同的条件,进程状态而改执行进程执行条件不满足则立即进入等待队列或是就绪队列 一旦有执行进程执行完毕或是转为别的状态,就从就绪队列选择一个执行 只要剩余内存允许,就从等待队列中选择进程进入就绪队列 直至各队列全为结束
5、数据结构设计
[键入文字]
7
5.1、PCB结构
5.2、进程状态结构
[键入文字]
8
5.3、控件结构
6、程序代码结构
? 程序主要函数如下,各函数通过关联相关变量进行消息传递 ? CProgressExDlg::CProgressExDlg(CWnd* pParent /*=NULL*/)
: CDialog(CProgressExDlg::IDD, pParent)
构造函数,调用基类CProgressExDlg,并传递两个参数:一个CProgressExDlg类的IDD成员,一个是父窗口指针。
? void CProgressExDlg::DoDataExchange(CDataExchange* pDX)
主要用来完成对话框数据的交换和校验。 ? void CProgressExDlg::OnButPause()
用于暂停进程调度操作
? void CProgressExDlg::OnButStart()
用于启动进程调度
? void CProgressExDlg::OnButton1()
用于复位,清除各进程
? void CProgressExDlg::OnButton2()
[键入文字]
9
用于创建进程
? void CProgressExDlg::OnButtonBlock()
用于使选定进程进入就绪状态
? void CProgressExDlg::OnButtonKill()
用于杀死选定进程
? void CProgressExDlg::OnButtonNotify()
用于阻塞选定进程
? HBRUSH CProgressExDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
用于设置显示进程属性时的字体和颜色
? void CProgressExDlg::OnDblclkListReadypro()
用于双击就绪队列中的某个进程,进而显示其属性 ? void CProgressExDlg::OnDblclkListRunpro()
用于双击执行队列中的某个进程,进而显示其属性 ? void CProgressExDlg::OnDblclkListWaitpro()
用于双击等待队列中的某个进程,进而显示其属性 ? BOOL CProgressExDlg::OnInitDialog()
初始化对话框
? void CProgressExDlg::OnPaint()
绘制对话框
? void CProgressExDlg::OnTimer(UINT nIDEvent)
处理各种调度算法
7、程序主要代码解析
由于代码较多,以下只列出了先来先服务算法和最短作业优先算法的代码。
if (nIDEvent == 0) //为先来先服务调度算法
{
if (((((CListBox *)GetDlgItem(IDC_LIST_RUNPRO))->GetCount())==0) (ReadyVec.size()!=0)) //如果没有进程运行,先择优先级最高的进入运行 {
sort(ReadyVec.begin(),ReadyVec.end(),Compare);
((CListBox *)GetDlgItem(IDC_LIST_READYPRO))->ResetContent(); for (int i = 0; i CString buf ; buf.Format(\ [键入文字] && 10