华 南 师 范 大 学 实 验 报 告
学生姓名 张俊发 学 号 20082101032 专 业 计算机科学与技术(师范) 年级班级 08本2班 课程名称 操作系统实验 实验项目 进程调度的设计与实现 实验类型 □验证 □设计 □综合 实验时间 2010年6月1日
实验指导老师 伊传勇 实验评分
int id;
srand(clock()); id=rand()0; while(pcbid[id]) {
i++;
id=rand()0; if(i>1000) {
MessageBox(NULL,\进程空间已满!\警告!\ return; } }
pcbid[id]=true; tmp->pid=id;
tmp ->priority = rand()P; tmp->next=NULL;
tmp->status=\
tmp ->life = rand()%5 +1;
InsertPcb(tmp); /*按照优先级从高到低,插入到就绪队列*/ }
//将进程PCB插入对应优先级的就绪队列尾部 void InsertLast(PCB *in) {
PCB *fst; int k;
k=in->priority; fst=ready[k];
if(ready[k]==NULL) {
in->next=ready[k]; ready[k]=in; } else {
while(fst->next!=NULL) {
6
华 南 师 范 大 学 实 验 报 告
学生姓名 张俊发 学 号 20082101032 专 业 计算机科学与技术(师范) 年级班级 08本2班 课程名称 操作系统实验 实验项目 进程调度的设计与实现 实验类型 □验证 □设计 □综合 实验时间 2010年6月1日
实验指导老师 伊传勇 实验评分
fst=fst->next; }
in->next = fst->next; fst->next = in; } }
//进程调度函数,(利用多线程编程,是线程函数) DWORD WINAPI MultiDispatch(LPVOID lpParameter) {
HWND hwnd=(HWND)lpParameter; int k = 49; PCB* run; while(IsRun) {
while(ready[k]==NULL && k>=0) k--;
run=ready[k];
while(run != NULL) {
run->status=\
::PostMessage(hwnd,WM_OUTDATA,0,0); Sleep(500); run->life--;
run->priority=run->priority/2; if(run->life == 0) {
ready[k]=run->next; pcbid[run->pid]=false; delete run; } else {
run->status=\ ready[k]=run->next; InsertLast(run); } k=49;
7
华 南 师 范 大 学 实 验 报 告
学生姓名 张俊发 学 号 20082101032 专 业 计算机科学与技术(师范) 年级班级 08本2班 课程名称 操作系统实验 实验项目 进程调度的设计与实现 实验类型 □验证 □设计 □综合 实验时间 2010年6月1日
实验指导老师 伊传勇 实验评分
while(ready[k]== NULL && k>=0) k--;
run=ready[k]; }
if(run==NULL) {
::PostMessage(hwnd,WM_OUTDATA,0,0); IsRun=false; } }
return 0; }
//进程信息输出函数
void CProcessDlg::Output(WPARAM wParam,LPARAM lParam) {
int k=49; PCB *p; CString str; m_edit1=_T(\ while(k>=0) {
if(ready[k] != NULL) {
p=ready[k]; while(p!=NULL) {
str.Format(\ m_edit1+=str+\ p = p->next; } } k--; }
UpdateData(FALSE); }
//控件响应函数,按键添加进程
8
华 南 师 范 大 学 实 验 报 告
学生姓名 张俊发 学 号 20082101032 专 业 计算机科学与技术(师范) 年级班级 08本2班 课程名称 操作系统实验 实验项目 进程调度的设计与实现 实验类型 □验证 □设计 □综合 实验时间 2010年6月1日
实验指导老师 伊传勇 实验评分
void CProcessDlg::OnAddprocess() {
// TODO: Add your control notification handler code here UpdateData(); int i=0;
int num=m_edit2; for(i=0;i ::PostMessage(m_hWnd,WM_OUTDATA,0,0); if(!IsRun) { if(hThread!=NULL) CloseHandle(hThread); IsRun=true; hThread=CreateThread(NULL,0,MultiDispatch,(LPVOID)m_hWnd,0,NULL); //创建线程 } } //键盘消息响应函数,按ctrl+f添加进程 BOOL CProcessDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class UINT nKeyCode =pMsg->wParam; if(pMsg->message==WM_KEYDOWN) { if(nKeyCode==_T('F')&&(::GetKeyState(VK_CONTROL)&0x8000)) { PcbCreate(); ::PostMessage(m_hWnd,WM_OUTDATA,0,0); if(!IsRun) { if(hThread!=NULL) CloseHandle(hThread);//关闭线程 IsRun=true; hThread=CreateThread(NULL,0,MultiDispatch,(LPVOID)m_hWnd,0,NULL);//创 9 华 南 师 范 大 学 实 验 报 告 学生姓名 张俊发 学 号 20082101032 专 业 计算机科学与技术(师范) 年级班级 08本2班 课程名称 操作系统实验 实验项目 进程调度的设计与实现 实验类型 □验证 □设计 □综合 实验时间 2010年6月1日 实验指导老师 伊传勇 实验评分 建线程 } } } return CDialog::PreTranslateMessage(pMsg); } //暂停进程调度 void CProcessDlg::OnButstop() { // TODO: Add your control notification handler code here if(IsRun && hThread!=NULL) SuspendThread(hThread);//挂起线程 GetDlgItem(IDC_BUTSTOP)->EnableWindow(FALSE);//禁用控件 GetDlgItem(IDC_BUTSTART)->EnableWindow(TRUE);//启用控件 } //开始进程调度 void CProcessDlg::OnButstart() { // TODO: Add your control notification handler code here if(IsRun && hThread!=NULL) ResumeThread(hThread);//唤醒线程 GetDlgItem(IDC_BUTSTART)->EnableWindow(FALSE); GetDlgItem(IDC_BUTSTOP)->EnableWindow(TRUE); } 10