操作系统实验报告_第1页
操作系统实验报告_第2页
操作系统实验报告_第3页
操作系统实验报告_第4页
操作系统实验报告_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实习题目:作业调度系统完毕人姓名:组号:一学号:实习内容简要描述试验内容:规定实现顾客空间内的作业调度系统,通过作业调度系统实现如下的操作:(1)提交自己的作业。(2)将自己提交的作业移出。(3)查看作业状态。2.试验目的:(1).理解操作系统中调度的概念和调度算法。(2).学习Linux下进程控制以及进程之间通信的知识。(3).理解在操作系统中作业是怎样被调度的,怎样协调和控制各作业对CPU的使用。3.试验环境:windows/xp,Linux系统虚拟机重要代码构造(附注释)见附表(一)成果分析(或错误原因分析)一.试验措施要完毕试验作业调度系统,还需要编写试验代码。在linux系统终端中,写一种可以执行的作业。下面将一种作业的代码写出来。注释:假如上述表格空间不够,可以另附表格进行阐明操作系统实习汇报日期:-5-25成果分析(或错误原因分析)将让面的程序保留为p1.c。接下来就在linux系统终端中进行处理。打开一终端,编译scheduler.c,stat.c,enq.c,deq.c文献。自己定义5个程序,为p1,p2,p3,p4,p5,这5个程序运行时间满足不小于100毫秒,编译这个5个程序。当上面的工作完毕后,在一种终端”A”里面运行”./scheduler”程序,然后再开一种终端”B”,运行“./enqp1”,同理,运行p2,p3,p4,p5,也可以运行statjid和deqjid命令,在A终端里面观测相对应的变化。终端B终端A二.成果分析1.当在A终端中运行scheduler程序后,成果如下表明Scheduler程序已经运行。在B终端中运行./enqp1。在A终端中出现如下的成果:表明新的job已经建立。Jid为1,pid为16914.在B终端中运行./stat。在A终端中出现如下成果:即显示作业状态。4.在B终端运行./deq后,在A终端出现如下成果。表明作业已经出队。在终端B执行p2,p3,p4,p5后将出现与执行p1后相似的成果。重要代码构造(附注释)一:试验代码分析本次试验中需要文献shceduler.c,deq.c,stat.c,enq.c和job.h.。其中shceduler.c是已经完毕好的作业调度程序。下面分析它的代码shceduler.c。scheduler是作业调度程序,负责整个系统的运行。这是一种不停循环运行的进程,其任务是处理作业的入队、出队以及状态查看祈求,在合适的时间调度各作业运行。voidschedule(){ structjobinfo*newjob=NULL;//创立一种新的jobinfo构造,用来寄存job的信息 structjobcmdcmd;//创立一种新的命令行构造,用来寄存job命令的有关信息,包括命令种类,命令优先级,命令的发出者,命令的内容 intcount=0; bzero(&cmd,DATALEN);//该函数将命令行第一种命令置为空 if((count=read(fifo,&cmd,DATALEN))<0)//读fifo文献中的一种job命令。 error_sys("readfifofailed");//////////////////////////////////////////////////////////// switch(cmd.type){//查看job命令行中的的type一项。该项代表此命令行的种类,即stat、deq、enq命令。 caseENQ://假如是ENQ则调用enq命令对应的处理程序do_enq()函数处理 do_enq(newjob,cmd); break; caseDEQ://假如是DEQ,则调用deq命令相对应的程序do_deq()函数处理 do_deq(cmd); break; caseSTAT://假如是STAT,则调用STAT命令相对应的程序do_stat()函数处理 do_stat(cmd); break; default://假如命令是其他命令,则什么都不做 break; }/*schedule()函数通过以上分析的形式对命令的类型进行分析,并调用与类型相对应的处理程序来进行作业调度任务。如下分析这三个处理程序。voiddo_enq(structjobinfo*newjob,structjobcmdenqcmd)//此函数就是处理enq命令的程序。首先在程序中创立两个个waitqueue*newnode,*p;然后就进行newjob的填充,并进行命令的处理。如:*/while(i<enqcmd.argnum){ if(*offset==':'){ *offset++='\0'; q=(char*)malloc(offset-argvec); strcpy(q,argvec); arglist[i++]=q; argvec=offset; }else offset++; }//在对命令行进行处理后,就应当将作业做入队处理。代码如下newnode=(structwaitqueue*)malloc(sizeof(structwaitqueue)); newnode->next=NULL; newnode->job=newjob;//最终输出作业有关信息后整个处理就结束了。打印信息代码如下 newjob->pid=pid; printf("\nnewjob:jid=%d,pid=%d\n",newjob->jid,newjob->pid);voiddo_deq(structjobcmddeqcmd)//这个函数就是deq命令的处理函数。毫无疑问,这个函数首先也需要创//建作业等待队列。structwaitqueue*p,*prev,*select,*selectprev;//程序根据jid来确//定出队的job。首先会在目前正在执行的job中查找,假如符合,则直接进行一下处理printf("terminatejob:%d\n",current->job->jid); kill(SIGTERM,current->job->pid); for(i=0;(current->job->cmdarg)[i]!=NULL;i++){ free((current->job->cmdarg)[i]); (current->job->cmdarg)[i]=NULL; } free(current->job->cmdarg); free(current->job); free(current); current=NULL;//假如不是目前正在执行的job,则在等待队列中查找。//在等待队列中找到后,程序就会将job停止,并释放job占用的资源。voiddo_stat()//分析//Stat命令就是在原则输出上打印出就绪队列中各作业的信息。实现相对//简朴。只需要在等待队列中依次输出job的有关信息即可。二:deq.c和stat.c编写deq.c和stat.c分别执行作业调度系统中的deq命令和stat命令。即作业出栈命令和作业状态查询命令。deq是作业出队命令:格式是deqjid,每一种作业提交时,scheduler调度程序都将为其分派一种惟一的jid。使用deq命令,给scheduler调度程序发出一种出队祈求。scheduler调度程序将使该作业出队,然后清除有关的数据构造。假如该作业目前正在运行,则发信号给它,迫使它停止运行。当然,每个顾客都只能杀掉(kill)自己提交的作业,而非他人的。stat是查看作业状态的命令:格式是stat,在原则输出上打印出就绪队列中各作业的信息。状态信息应当包括如下几点:·进程的pid;·作业提交者的username;·作业执行的时间;·在就绪队列中总的等待时间;·作业创立的时刻;·此时作业的状态(READY、RUNNING)。在读了作业调度源代码scheduler.c文献后,分析enq.c文献,根据enq.c的写法编写程序deq.c和stat.c,这两个程序就是判断输入的命令行与否是合法命令,假如不是,做出提醒;假如是就将该命令存入FIFO文献中。然后scheduler.c程序就会在该文献中提取命令行,做出对应的处理。//stat.c的源代码voidusage()//假如参数个数不对则调用该函数显示对的的命令格式提醒顾客输入对的的命令{ printf("Usage:stat\n" "Printjobstatisticsofalljobs");}intmain(intargc,char*argv[])//主函数{ structjobcmdstatcmd;//命令行数据构造,intfd,fifo; charfifoname[100]; structjobinfoinfo; chartimebuf[BUFLEN]; if(argc!=1) { usage(); return1; } statcmd.type=STAT; statcmd.defpri=0; statcmd.owner=getuid(); statcmd.argnum=0;statcmd.data[0]='\0'; if((fd=open(FIFO,O_WRONLY))<0) error_sys("statopenfifofailed"); if(write(fd,&statcmd,DATALEN)<0)//假如可以打开FIFO文献,写入命令行 error_sys("statwritefailed"); close(fd);return0;}//deq.c的源代码voidusage(){ printf("Usage:deqjid\n" "\tjid\t\tthejobid\n");}intmain(intargc,char*argv[]){ intfd; structjobcmddeqcmd; if(argc!=2) { usage(); return1; } intp=atoi(*(++argv)); if(p<0||p>9)//假如文献ID不为数字,给出错误提醒 { printf("Invalidjobid:mustbeadigit.\n"); usage(); return1; } --argv; /*Initialthedeqcmdstruct*/ deqcmd.type=DEQ; deqcmd.defpri=0; deqcmd.owner=getuid(); deqc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论