进程调度.docx
- 文档编号:12194088
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:21
- 大小:291.24KB
进程调度.docx
《进程调度.docx》由会员分享,可在线阅读,更多相关《进程调度.docx(21页珍藏版)》请在冰豆网上搜索。
进程调度
操作系统实习报告日期:
2011年5月15日
实习题目:
作业调度
完成人
姓名:
侯静
组号:
学号0943041267
实习内容简要描述
实验内容:
要求实现用户空间内的作业调度系统,通过作业调度系统实现以下的操作:
(1)提交自己的作业。
(2)将自己提交的作业移出。
(3)查看作业状态。
实验目的:
理解操作系统中调度的概念和调度算法;
学习Linux下进程控制以及进程通讯的知识
理解在操作系统中作业是如何被调度的,如何协调与控制作业对CPU的使用
主要代码结构
(附注释)
dep.c代码:
#include
#include
#include
#include
#include
#include
#include"job.h"
intmain(intargc,char*argv[])
{
structjobcmddeqcmd;
intfd;
if(argc!
=2){
printf("Usage:
deqjid\n"
"\tjid\t\tthejobid\n");
return1;
}
deqcmd.type=DEQ;
deqcmd.defpri=0;
deqcmd.owner=getuid();
deqcmd.argnum=1;
strcpy(deqcmd.data,*++argv);
printf("jid%s\n",deqcmd.data);
if((fd=open("/tmp/server",O_WRONLY))<0)
printf("deqopenfifofailed");//?
?
?
if(write(fd,&deqcmd,DATALEN)<0)//?
?
?
printf("deqwritefailed");
close(fd);
return0;
}
Enq.c代码:
#include
#include
#include
#include
#include
#include
#include"job.h"
intmain(intargc,char*argv[])
{
intp=0;
intfd;
charc,*offset;
structjobcmdenqcmd;
if(argc==1){
printf("Usage:
enq[-pnum]e_fileargs\n"
"\t-pnum\t\tspecifythejobpriority\n"
"\te_file\t\ttheabsolutepathoftheexefile\n"
"\targs\t\ttheargspassedtothee_file\n");
return1;
}
while(--argc>0&&(*++argv)[0]=='-'){
c=*++argv[0];
switch(c){
case'p':
p=atoi(*(++argv));
argc--;
break;
default:
printf("Illegaloption%c\n",c);
return1;
}
}
if(p<0||p>3)
p=0;
enqcmd.type=ENQ;
enqcmd.defpri=p;
enqcmd.owner=getuid();
enqcmd.argnum=argc;
offset=enqcmd.data;
while(argc-->0){
strcpy(offset,*argv);
strcat(offset,":
");
offset=offset+strlen(*argv)+1;
argv++;
}
#ifdefDEBUG
printf("enqcmdcmdtype\t%d\n"
"enqcmdowner\t%d\n"
"enqcmddefpri\t%d\n"
"enqcmddata\t%s\n",
enqcmd.type,enqcmd.owner,enqcmd.defpri,enqcmd.data);
#endif
if((fd=open("/tmp/server",O_WRONLY))<0)
printf("enqopenfifofailed");
if(write(fd,&enqcmd,DATALEN)<0)
printf("enqwritefailed");
close(fd);
return0;
}
Job.c代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"job.h"
voidsig_handler(intsig,siginfo_t*info,void*notused);
voidschedule();
intallocjid();
voiddo_enq(structjobinfo*newjob,structjobcmdenqcmd);
voiddo_deq(structjobcmddeqcmd);
voiddo_stat(structjobcmdstatcmd);
voidupdateall();
structwaitqueue*jobselect();
voidjobswitch();
intjobid=0;
intsiginfo=1;
intfifo;
intglobalfd;
structwaitqueue*head=NULL;
structwaitqueue*next=NULL,*current=NULL;
intmain()
{
structtimevalinterval;
structitimervalnew,old;
structstatstatbuf;//?
?
?
structsigactionnewact,oldact1,oldact2;
if(stat("/tmp/server",&statbuf)==0){//?
?
?
?
?
?
if(remove("/tmp/server")<0)
printf("removefailed");
}
if(mkfifo("/tmp/server",0666)<0)
printf("mkfifofailed");
if((fifo=open("/tmp/server",O_RDONLY|O_NONBLOCK))<0)
printf("openfifofailed");
if((globalfd=open("/dev/null",O_WRONLY))<0)//?
?
?
?
?
printf("openglobalfilefailed");
newact.sa_sigaction=sig_handler;
sigemptyset(&newact.sa_mask);
newact.sa_flags=SA_SIGINFO;
sigaction(SIGCHLD,&newact,&oldact1);
sigaction(SIGVTALRM,&newact,&oldact2);
interval.tv_sec=0;
interval.tv_usec=100;
new.it_interval=interval;
new.it_value=interval;
setitimer(ITIMER_VIRTUAL,&new,&old);
while(siginfo==1)
;
close(fifo);
close(globalfd);
return0;
}
voidsig_handler(intsig,siginfo_t*info,void*notused)
{
intstatus;
intret;
switch(sig){
caseSIGVTALRM:
schedule();
return;
caseSIGCHLD:
ret=waitpid(-1,&status,WNOHANG);
if(ret==0)
return;
if(WIFEXITED(status)){//?
?
?
?
?
?
?
?
?
?
?
?
current->job->state=DONE;
printf("normaltermation,exitstatus=%d\n",WEXITSTATUS(status));
}else
if(WIFSIGNALED(status)){
printf("abnormaltermation,signalnumber=%d\n",WEXITSTATUS(status));
}else
if(WIFSTOPPED(status)){
printf("childstopped,signalnumber=%d\n",WSTOPSIG(status));
}
return;
default:
return;
}
}
voidschedule()
{
structjobinfo*newjob=NULL;
structjobcmdcmd;
intcount=0;
bzero(&cmd,DATALEN);
if((count=read(fifo,&cmd,DATALEN))<0)
printf("readfifofailed");
#ifdefDEBUG//?
?
?
?
?
?
?
?
?
/
if(count){
printf("cmdcmdtype\t%d\n"
"cmddefpri\t%d\n"
"cmddata\t%s\n",
cmd.type,cmd.defpri,cmd.data);
}else
printf("nodataread\n");
#endif
switch(cmd.type){
caseENQ:
do_enq(newjob,cmd);
break;
caseDEQ:
do_deq(cmd);
break;
caseSTAT:
do_stat(cmd);
break;
default:
break;
}
updateall();
next=jobselect();
jobswitch();
}
voiddo_enq(structjobinfo*newjob,structjobcmdenqcmd)
{
structwaitqueue*newnode,*p;
inti=0,pid;
char*offset,*argvec,*q;
char**arglist;
sigset_tzeromask;
sigemptyset(&zeromask);
newjob=(structjobinfo*)malloc(sizeof(structjobinfo));
newjob->jid=allocjid();
newjob->defpri=enqcmd.defpri;
newjob->curpri=enqcmd.defpri;
newjob->ownerid=enqcmd.owner;
newjob->state=READY;
newjob->create_time=time(NULL);//?
?
?
?
newjob->wait_time=0;
newjob->run_time=0;
arglist=(char**)malloc(sizeof(char*)*(enqcmd.argnum+1));
newjob->cmdarg=arglist;
offset=enqcmd.data;
argvec=enqcmd.data;
while(i if(*offset==': '){ *offset++='\0'; q=(char*)malloc(offset-argvec); strcpy(q,argvec); arglist[i++]=q; argvec=offset; }else offset++; } arglist[i]=NULL; #ifdefDEBUG printf("enqcmdargnum%d\n",enqcmd.argnum); for(i=0;i printf("parseenqcmd: %s\n",arglist[i]); #endif newnode=(structwaitqueue*)malloc(sizeof(structwaitqueue)); newnode->next=NULL; newnode->job=newjob; if(head){ for(p=head;p->next! =NULL;p=p->next); p->next=newnode; }else head=newnode; if((pid=fork())<0) printf("enqforkfailed"); if(pid==0){ newjob->pid=getpid(); raise(SIGSTOP); #ifdefDEBUG printf("beginrunning\n"); for(i=0;arglist[i]! =NULL;i++) printf("arglist%s\n",arglist[i]); #endif dup2(globalfd,1); if(execv(arglist[0],arglist)<0) printf("execfailed\n"); exit (1); }else{ newjob->pid=pid; } } intallocjid() { return++jobid; } voiddo_deq(structjobcmddeqcmd) { intdeqid,i; structwaitqueue*p,*prev,*select,*selectprev; deqid=atoi(deqcmd.data); #ifdefDEBUG printf("deqjid%d\n",deqid); #endif if(current&¤t->job->jid==deqid){ printf("terminatecurrentjob\n"); kill(SIGKILL,current->job->pid); for(i=0;(current->job->cmdarg)[i]! =NULL;i++) free((current->job->cmdarg)[i]); free(current->job->cmdarg); free(current->job); free(current); current=NULL; }else{ select=NULL; selectprev=NULL; for(prev=NULL,p=head;p! =NULL;prev=p,p=p->next) if(p->job->jid==deqid) break; if(p! =NULL){ if(prev==NULL) head=NULL; else prev->next=p->next; for(i=0;(p->job->cmdarg)[i]! =NULL;i++) free((p->job->cmdarg)[i]); free(p->job->cmdarg); free(p->job); free(p); p=NULL; } } } voiddo_stat(structjobcmdstatcmd) { structwaitqueue*p; chartimebuf[BUFLEN]; printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\tSTATE\n"); if(current){ strcpy(timebuf,ctime(&(current->job->create_time))); timebuf[strlen(timebuf)-1]='\0'; printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", current->job->jid, current->job->pid, current->job->ownerid, current->job->run_time, current->job->wait_time, timebuf, "RUNNING"); } for(p=head;p! =NULL;p=p->next){ strcpy(timebuf,ctime(&(p->job->create_time))); timebuf[strlen(timebuf)-1]='\0'; printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", current->job->jid, current->job->pid, current->job->ownerid, current->job->run_time, current->job->wait_time, timebuf, "READY"); } } voidupdateall() { structwaitqueue*p; if(current) current->job->run_time+=1; for(p=head;p! =NULL;p=p->next){ p->job->wait_time+=100; if(p->job->wait_time>=1000&&p->job->curpri<3) p->job->curpri++; } } structwaitqueue*jobselect() { structwaitqueue*p,*prev,*select,*selectprev; inthighest=-1; select=NULL; selectprev=NULL; for(prev=NULL,p=head;p! =NULL;prev=p,p=p->next) if(p->job->curpri>highest){ select=p; selectprev=prev; highest=p->job->curpri; } if(select! =NULL){ if(selectprev! =NULL) selectprev->next=select->next; else head=NULL; } returnselect; } voidjobswitch() { structwaitqueue*p; inti; if(current! =NULL&¤t->job->state==DONE){ for(i=0;(current->job->cmdarg)[i]! =NULL;i++) free((current->job->cmdarg)[i]); free(current->job->cmdarg); free(current->job); free(current); current=NULL; } if(next==NULL&¤t==NULL) return; else if(next! =NULL&¤t==NULL){ printf("beginstartnewjob\n"); current=next; next=NULL; current->job->state=RUNNING; kill(current->job->pid,SIGCONT); return; }else if(next! =NULL&¤t! =NULL){ printf("beginswitch\n"); kill(current->job->pid,SIGSTOP); current->job->curpri=current->job->defpri; current->job->wait_time=0; current->job->state=READY; if(head! =NULL){ for(p=head;p->next! =NULL;p=p->next) ; p->next=current; }else head=current; current=next; next=NULL; current->job-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度