操作系统 单处理器的进程调度实验报告.docx
- 文档编号:24332203
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:10
- 大小:51.87KB
操作系统 单处理器的进程调度实验报告.docx
《操作系统 单处理器的进程调度实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统 单处理器的进程调度实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
操作系统单处理器的进程调度实验报告
操作系统单处理器的进程调度实验报告
实验二单处理器系统的进程调度
年级2009级学号2009443004姓名郭占强成绩
专业生物信息学实验地点生科楼409指导教师王硕
实验项目单处理器系统的进程调度
实验日期2011年11月25日
一、实验目的
加深对进程概念的理解,明确进程和程序的区别;
深入了解系统如何组织进程、创建进程;
进一步认识如何实现处理器调度。
二、实验要求
编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。
实验具体包括:
首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;
最后编写主函数对所作工作进程测试。
三、实验原理:
单处理器系统的进程调度
四、实验程序设计
#include
#include
#defineRUNNING1//用RUNNING表示进程处于运行态#defineWAIT2//用wait表示进程处于就绪态
#defineFINISH3//用FINISH表示进程已经执行完毕#defineTIME_PIECE5//用TIME_PIECE表示时间片大小#defineMAX_PROCESS_NUM10//假定系统允许进程个数为10
intAX,BX,CX,DX,PC,PSW,TIME;//模拟寄存器
intrun;//定义指向正在运行进程的进程控制块的指针intpfree;//定义指向空闲进程控制块队列的指针
struct{
inthead;
inttail;
}ready;//定义指向就绪队列的头指针head和尾指针tail
struct{
-1-
intname;//进程标识符
intstatus;//进程状态
intax,bx,cx,dx;//进程现场信息,通用寄存器内容intpc;//进程现场信息,程序计数器内容
intpsw;//进程现场信息,程序状态字寄存器内容inttime;//进程每次申请的时间片大小
inttotalTime;//执行进程需要的总时间
intremainingTime;//进程剩余的执行时间
intnext;//下一个进程控制块的位置
}pcbarea[MAX_PROCESS_NUM];//定义模拟进程控制块区域的数组
//进程控制块初始化
voidInit(){
inti;
run=ready.head=ready.tail=-1;//运行指针、就绪指针清空pfree=0;//空闲指针指向第一个进程
for(i=0;i pcbarea[i].next=i+1;pcbarea[MAX_PROCESS_NUM-1].next=-1; } //创建进程 voidCreate(intprocess_name,intax,intbx,intcx,intdx,intpc,intpsw,inttotalTime){ inti; if(pfree==-1){ //空闲进程控制块队列为空 printf("无空闲进程控制块,进程创建失败\n"); return; } i=pfree;//取空闲进程控制块队列的第一个 pfree=pcbarea[pfree].next;//pfree后移 //填写该进程控制块内容 pcbarea[i].name=process_name;pcbarea[i].status=WAIT;pcbarea[i].ax=ax; pcbarea[i].bx=bx; pcbarea[i].cx=cx; pcbarea[i].dx=dx; pcbarea[i].pc=pc; pcbarea[i].psw=psw; pcbarea[i].time=TIME_PIECE; -2- pcbarea[i].totalTime=totalTime;pcbarea[i].remainingTime=totalTime;if(ready.head! =-1){ //就绪队列不空时,置入就绪队列 pcbarea[ready.tail].next=i; ready.tail=i; pcbarea[ready.tail].next=-1;} else{ //就绪队列空时,置入就绪队列 ready.head=i; ready.tail=i; pcbarea[ready.tail].next=-1;} printf("\n"); } //进程调度函数 voidSheduling(){ getchar(); if(ready.head==-1){ //空闲进程控制块队列为空,退出 printf("进程调度完毕~\n\n\n"); return; } run=ready.head;//就绪队列头指针赋给run,即让就绪队列的队头运行ready.head=pcbarea[ready.head].next;//就绪队列头指针后移if(ready.head==-1) ready.tail=-1;//就绪队列为空,修正尾指针ready.tail pcbarea[run].status=RUNNING;//修改进程控制块状态 //恢复该进程现场信息 AX=pcbarea[run].ax; BX=pcbarea[run].bx; CX=pcbarea[run].cx; DX=pcbarea[run].dx; PC=pcbarea[run].pc; PSW=pcbarea[run].psw; TIME=pcbarea[run].time;//设置相对时钟寄存器的时间片 //打印进程以及系统的状态信息 printf("\n进程编号: %d\n",pcbarea[run].name);printf("进程状态: 运行\n"); printf("寄存器内容: \n"); printf("AX: %d\n",AX); -3- printf("BX: %d\n",BX); printf("CX: %d\n",CX); printf("DX: %d\n",DX); printf("PC: %d\n",PC); printf("PSW: %d\n",PSW); printf("TIME: %d\n\n",TIME); printf("\n**时间片用完**\n"); AX=BX=CX=DX=PC=PSW=TIME=0;//时间片用完立即归还CPU资源 //若进程执行完毕,则回收进程控制块 if(pcbarea[run].remainingTime<=TIME_PIECE){ getchar(); pcbarea[run].remainingTime=0; pcbarea[run].status=FINISH; ready.head=pcbarea[run].next; //打印进程以及系统的状态信息 printf("\n进程编号: %d\n",pcbarea[run].name); printf("进程状态: 完成\n"); printf("寄存器内容: \n"); printf("AX: %d\n",AX); printf("BX: %d\n",BX); printf("CX: %d\n",CX); printf("DX: %d\n",DX); printf("PC: %d\n",PC); printf("PSW: %d\n",PSW); printf("TIME: %d\n\n",TIME); //将该进程控制块置入空闲队列 if(pfree==-1){ pfree=run; pcbarea[pfree].next=-1; } else{ pcbarea[pfree].next=run; pfree=run; pcbarea[run].next=-1; } } //若进程还没执行完毕,则将其置入就绪队列,等待下次的时间片到来else{ getchar(); pcbarea[run].remainingTime-=TIME_PIECE; pcbarea[run].status=WAIT; -4- //将进程置入就绪队列中 if(ready.tail! =-1) pcbarea[ready.tail].next=run; else ready.head=ready.tail=run; pcbarea[run].next=-1; ready.tail=run; //打印进程以及系统的状态信息 printf("\n进程编号: %d\n",pcbarea[run].name); printf("进程状态: 等待\n"); printf("寄存器内容: \n"); printf("AX: %d\n",AX); printf("BX: %d\n",BX); printf("CX: %d\n",CX); printf("DX: %d\n",DX); printf("PC: %d\n",PC); printf("PSW: %d\n",PSW); printf("TIME: %d\n\n",TIME); } Sheduling();//如果还有进程没有执行完毕,则继续递归调度 } voidmain(){ intprocess_name,ax,bx,cx,dx,pc,psw,totalTime; inti; charquit;//用于选择退出进程模拟系统 do{ i=MAX_PROCESS_NUM; printf("==========================模拟单处理器系统的进程调度==========================\n\n\n"); Init(); printf("**创建进程,输入负数可结束创建**\n\n"); printf("输入一个进程的编号(现在还可以创建%d个进程): ",i); scanf("%d",&process_name); while(process_name>0){ printf("请输入该进程中ax、bx、cx、dx、pc、psw的初始现场信息: "); scanf("%d%d%d%d%d%d",&ax,&bx,&cx,&dx,&pc,&psw); printf("请输入该进程运行所需的总时间: "); scanf("%d",&totalTime); Create(process_name,ax,bx,cx,dx,pc,psw,totalTime); if(i>0) --i; -5- printf("输入一个进程的编号(现在还可以创建%d个进程): ",i); scanf("%d",&process_name); } system("cls"); printf("请按回车开始调度……"); getchar(); Sheduling(); printf("退出请按0,重新测试请按任意键: "); quit=getchar(); system("cls"); }while(quit! ='0'); printf("\n\n"); } 五、实验结果与分析 测试样本数据如下: 112345610 223434615 342532320 432233210 -1 -6- 调度结果1423 -7-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 单处理器的进程调度实验报告 处理器 进程 调度 实验 报告