《操作系统》
实 验 指 导 书
李征 李娜
网络教研室 2009年9月
目 录
实验一:进程调度
实验二:虚拟存储器
实验三:磁盘调度
实验四:文件管理
实验五:命令解释程序
实验一 进程调度
1. 目的和要求
进程调度是处理机管理的核心内容。本实验要求用C语言编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解FIFO调度算法的具体实现方法。
2. 实验内容
①设计进程控制块PCB表结构。 ②编制FIFO进程调度算法.
3. 实验环境
PC兼容机/Windows、DOS系统/Turbo C 2.0
4. 参考程序
#include \"stdio.h\" #define max 100
#define pfree 0 /*process end*/
#define running 1 /*process running status*/ #define aready 2 /*process aready status */
#define blocking 3 /*process aready blocking status*/ typedef struct node
{
char name; int status;
int precendence; int ax,bx,cx,dx; int pc; int psw;
struct node *next; /*pcb define*/ }pcb;
pcb *createprocess(pcb *head)
{
pcb *p,*q;
int a,b,c,d,m,n; char ID; int s; q=NULL;
printf(\"\\ninput the first seven status pcb:\"); scanf(\"\\n%c\
scanf(\"%d%d%d%d%d%d\while(ID!='*') {
p=(pcb*)malloc(sizeof(pcb)); p->name=ID; p->ax=a; p->bx=b; p->cx=c; p->dx=d; p->pc=m; p->psw=n;
p->precendence=pfree; p->status=aready;
if(head==NULL) head=p; else
q->next=p; q=p;
printf(\"\\ninput the next pcb: \"); scanf(\"\\n%c\
scanf(\"%d%d%d%d%d%d\}
if(q!=NULL) q->next=NULL; q=head; while(q) {
printf(\"\\n peocess name. status.ax. bx. cx. dx. pc. psw.\\n \");
printf(\"%10c%5d%8d%5d%5d%5d%5d%5d%5d\>bx,q->cx,q->dx,q->pc,q->psw); q=q->next; }
return head;/*createprocess end*/ }
void processfifo(pcb *head) /*use fifo */
{
pcb *p; p=head;
printf(\"\\n the process use fifo method.\\n\"); printf(\"running the frist process:\\n\"); while(p!=NULL) {
p->status=running;
printf(\"\\nprocess name status. ax. bx. cx. dx. pc. psw.\");
printf(\"\\n%10c%5d%8d%5d%5d%5d%5d%5d\p->pc,p->psw); /*check process running status */ p->status=0; p=p->next; }
printf(\"\\ncheck weatherfer the process complete: \"); p=head; while(p) {
printf(\"\\n%3c%3d\p=p->next; }
printf(\"\\ngame is over!\\n\"); } main()
{
pcb *head; head=NULL;
head=createprocess(head); processfifo(head); }
2
实验二 虚拟存储器
1. 目的和要求
通过本实验可以加深理解有关虚拟存储器的工作原理,进一步体会和了解页面替换算法的具体实现方法。
2. 实验内容
① 实现三种算法:先进先出;OPT;LRU
② 页面序列从指定的文本文件(TXT文件)中取出
③ 输出:第一行:每次淘汰的页面号,第二行:显示缺页的总次数
3. 实验环境
PC兼容机/Windows、DOS系统/Turbo C 2.0
4. 参考程序
#include #define len sizeof(struct page) struct page { int num; int tag; struct page *next; }; struct page *create(int n) /*建立分配的内存空间,并初始化,返回头结点*/ { int count=1; struct page *p1,*p2,*head; head=p2=p1=(struct page *)malloc(len); p1->tag=-1;p1->num=-1; while(count p1=(struct page *)malloc(len); p1->tag=-1;p1->num=-1; p2->next=p1; p2=p1; } p2->next=null; return(head); } void FIFO(array,n) int array[],n; { int *p; struct page *cp,*dp,*head,*new; int count=0; head=create(n); 3 p=array; while(*p!=-1) { cp=dp=head; for(;cp->num!=*p&&cp->next!=null;) cp=cp->next; if (cp->num==*p) printf(\" ! \" ); else { count++; cp=head; for(;cp->tag!=-1&&cp->next!=null;) cp=cp->next; if(cp->tag==-1) { cp->num=*p; cp->tag=0; printf(\" * \"); } else { new=(struct page*)malloc(len); new->num=*p; new->tag=0; new->next=null; cp->next=new; head=head->next; printf(\" %d \free(dp); } } p++; } printf(\"\\nQueye Zongshu : %d \\n\} void LRU(array,n) int array[],n; { int count=0,*p=array; struct page *head,*cp,*dp,*rp,*new,*endp; head=create(n); while(*p!=-1) { cp=dp=rp=endp=head; for(;endp->next!=null;) endp=endp->next; for(;cp->num!=*p&&cp->next!=null;) { rp=cp;cp=cp->next;} if(cp->num==*p) { printf(\" ! \"); if(cp->next!=null) { 4 if(cp!=head) rp->next=cp->next; else head=head->next; } endp->next=cp; cp->next=null; } else { count++; cp=rp=head; for(;cp->tag!=-1&&cp->next!=null;) cp=cp->next; if(cp->tag==-1) { printf(\" * \"); cp->num=*p; cp->tag=0; } else { new=(struct page *)malloc(len); new->num=*p; new->tag=0; new->next=null; cp->next=new; dp=head; head=head->next; printf(\" %d \free(dp); } } p++; } printf(\"\\nQueye Zongshu : %d \\n\} OPT(array,n) int array[],n; { int *p,*q,count=0,i; struct page *head,*cp,*dp,*new; p=array; head=create(n); while(*p!=-1) { cp=head; for(;cp->num!=*p&&cp->next!=null;) cp=cp->next; if(cp->num!=*p) { count++; cp=head; for(;cp->tag!=-1&&cp->next!=null;) cp=cp->next; 5 if(cp->tag==-1) { printf(\" * \"); cp->num=*p; cp->tag=0; } else { i=1;q=p;q++;cp=head; while(*q!=-1&&i cp->tag=1; i++; } q++;cp=head; } if(i==n) { for(;cp->tag!=0;) cp=cp->next; printf(\" %d \cp->num=*p; } else { cp=head; for(;cp->tag!=0;) cp=cp->next; if(cp==head) { for(;cp->next!=null;) cp=cp->next; new=(struct page *)malloc(len); new->num=*p; new->tag=0; new->next=null; cp->next=new; dp=head; head=head->next; printf(\" %d \free(dp); } else { printf(\" %d \cp->num=*p; } } cp=head; for(;cp->next!=null;) {cp->tag=0;cp=cp->next;} cp->tag=0; } 6 } else printf(\" ! \"); p++; } printf(\"\\nQueye Zongshu : %d \\n\} main() { FILE *fp; char pt; char str[10]; int i,j=0; int page[50],space=0; for(i=0;i<50;i++) page[i]=-1; fp=fopen(\"page.txt\if(fp==NULL) { printf(\"Cann't open the file\\n\"); exit(0); } i=0; while((pt=fgetc(fp))!=EOF)/*将数字字符串转化成整型-开始*/ { if(pt>='0'&&pt<='9') { str[i]=pt;i++; space=0; } else { if(pt==' '||pt=='\\n') { if(space==1) break; else { str[i]='\\0'; page[j]=atoi(str); if(pt=='\\n') break; else { space=1; j++; i=0; } } } } }/*结束*/ if(pt==EOF) {str[i]='\\0';page[j]=atoi(str);} i=0; 7 while(page[i]!=-1) {printf(\" %d \fclose(fp); printf(\"\\n\"); printf(\" ! : mean no moved \\n * : mean have free space \\n\\n\"); printf(\"FIFO \"); FIFO(page,3); printf(\"\\nLRU \"); LRU(page,3); printf(\"\\nOPT \"); OPT(page,3); } 8 实验三 磁盘调度 1. 目的和要求 通过本实验加深理解有关磁盘存储器管理中磁盘调度的工作原理,并编程实现相关调度算法。 2. 实验内容 ①实现三种算法: 1、先来先服务 ;2、最短寻道优先;3、电梯算法 ②磁道服务顺序从指定的文本文件(TXT文件)中取出 ③输出:第一行:磁道的服务顺序;第二行:显示移动总道数 3. 实验环境 PC兼容机/Windows、DOS系统/Turbo C 2.0 4. 参考程序 #include #define len sizeof(struct cidaohao) struct cidaohao { struct cidaohao *pre; int num; struct cidaohao *next; }; FCFS(array) int array[50]; { int i,j,sum=0; printf(\"\\nFCFS : \"); for(i=1;array[i]!=-1;i++) { printf(\" %d \} i=0; for(i=0,j=1;array[j]!=-1;i++,j++) { if(array[i]>array[j]) sum+=(array[i]-array[j]); else sum+=(array[j]-array[i]); } return(sum); } SSTF(head,now) struct cidaohao *head; int now; { struct cidaohao *p,*lp,*rp; int sum=0,front,behind; p=head; printf(\"\\nSSTF :\"); while(p->num!=now) p=p->next;/*确定now在连表中的位置*/ 9 lp=p->pre; rp=p->next; do { if(p->next!=null&&p->pre!=null) { front=p->num-lp->num; behind=rp->num-p->num; if(front>=behind) { sum+=behind; p=rp; printf(\" %d \rp=p->next; } else { sum+=front; p=lp; printf(\" %d \lp=p->pre; } } else { if(p->next==null) { while(lp->num!=0) { sum+=p->num-lp->num; p=lp; printf(\" %d \lp=p->pre; } return(sum); } if(p->pre==null) { while(rp->num!=0) { sum+=rp->num-p->num; p=rp; printf(\" %d \rp=p->next; } return(sum); } } }while(p->next!=null||p->pre!=null); } SCAN(head,n,m) struct cidaohao *head; 10 int n,m; { struct cidaohao *p,*pp; int sum=0; printf(\"\\nSCAN : \"); p=head; while(p->num!=m) p=p->next;/*确定m的位置*/ pp=p; if(n sum+=pp->next->num-pp->num; pp=pp->next; printf(\" %d \} sum+=pp->num-p->pre->num; pp=p->pre; if(pp->num==0) return(sum); else { while(pp->pre!=null) { printf(\" %d \sum+=pp->num-pp->pre->num; pp=pp->pre; } printf(\" %d \return(sum); } } else { while(pp->pre!=null) { sum+=pp->num-pp->pre->num; pp=pp->pre; printf(\" %d \} sum+=p->next->num-pp->num; pp=p->next; if(pp->num==0) return(sum); else { while(pp->next!=null) { printf(\" %d \sum+=pp->next->num-pp->num; pp=pp->next; } printf(\" %d \return(sum); 11 } } } main() { FILE *fp; char pt; char str[10]; int cidao[100],i,j=1,count1=0,count2=0,count3=0,last,space=0; struct cidaohao *p1,*p2,*new,*head;/*用于建立连表的变量*/ struct cidaohao *p,*lp,*rp; for(i=0;i<50;i++) cidao[i]=-1; i=0; fp=fopen(\"cipan.txt\让fp指向文件*/ if(fp==NULL) { printf(\"Cann't open this file \"); exit(0); } printf(\"\\nPlease input cidaohao now : \"); scanf(\"%d\ while((pt=fgetc(fp))!=EOF)/*将数字字符串转化成整型-开始*/ { if(pt>='0'&&pt<='9') { str[i]=pt;i++; space=0; } else { if(pt==' '||pt=='\\n') { if(space==1) break; else { str[i]='\\0'; cidao[j]=atoi(str); if(pt=='\\n') break; else { space=1; j++; i=0; } } } } }/*结束*/ if(pt==EOF) {str[i]='\\0';cidao[j]=atoi(str);} fclose(fp); i=0; count1=FCFS(cidao);/*FCFS调度的移动总量*/ 12 printf(\"\\nThe Total : %d \\n\ p1=p2=head=(struct cidaohao* )malloc(len);/*开始建立双连表*/ p1->pre=null; p1->num=cidao[0]; p1->next=null; i=1; while(cidao[i]!=-1) { if(cidao[i] p1=(struct cidaohao *)malloc(len); p1->next=head; p1->pre=null; p1->num=cidao[i]; head->pre=p1; head=p1; } else { while(p1->next!=null&&p1->num<=cidao[i])/*搜索合适位置*/ { p2=p1; p1=p1->next; } if (p1->num>cidao[i])/*插入中间的情况*/ { new=(struct cidaohao*)malloc(len); new->num=cidao[i]; new->next=p1; new->pre=p2; p1->pre=new; p2->next=new; } else {/*插入尾部*/ new=(struct cidaohao*)malloc(len); new->num=cidao[i]; new->next=null; new->pre=p1; p1->next=new; } p1=head;/*始终保证插入结束后p1指向头结点*/ } i++;/*截取下一个cidao[i]*/ } count2=SSTF(head,cidao[0]); printf(\"\\nThe Total : %d \ printf(\"\\n\\nPleast input last cipanhao : \"); scanf(\"%d\ count3=SCAN(head,last,cidao[0]); printf(\"\\nThe Total : %d \\n\} 13 实验四 文件管理 1. 目的和要求 通过独立使用高级语言编写和调试一个简单的文件系统,达到模拟文件管理工作的目的,并进一步使学生对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2. 实验内容 设计一个简单的文件系统,对文件的操作设计如下命令(使用菜单选择): creat 建立文件 delete 删除文件 list 文件列表 bye 退出 编写程序并调试通过,运行出结果,画出流程图 3. 实验环境 PC兼容机/Windows、DOS系统/Turbo C 2.0 4. 参考程序 #include struct filenode { char *filename; int lenth; struct filenode *next; } *filehead=NULL; list(struct filenode *fhead) { struct filenode *p; if(!fhead) {printf(\"File is not Exist...\\n\");return;} p=fhead; printf(\"FILE NAME FILE LENTH\\n\"); while(p) { printf(\" %10s%8d\\n\ p=p->next; } } creat(char *fname) { int len; struct filenode *p,*q,*p1; p=p1=filehead; while(p) { if(!strcmp(fname,p->filename)) {printf(\"File Alredy Exist!\\n\"); return; } 14 p1=p; p=p->next; } q=malloc(sizeof(struct filenode)); printf(\"Please Input File Lenth:\"); scanf(\"%d\ strcpy(q->filename,fname); q->lenth=len; q->next=NULL; p1->next=q; if(!filehead) filehead=q; } delete(char *fname) { struct filenode *p,*q; p=q=filehead; while(p) { if(!strcmp(fname,p->filename)) { q->next=p->next; free(p); printf(\"File Alredy Deleted!\\n\"); return; } p=p->next; } printf(\"File is not Exist!\\n\"); } quit() { struct filenode *p,*q; p=filehead; while(p) { q=p; p=p->next; free(q); } } void main() { int choice; char *newname=\"\/*struct filenode *filehead;*/ /*filehead=NULL; malloc(sizeof(struct filenode));*/ while(1) 15 { printf(\"\\n\"); printf(\"***********FILE SYSTEM************\\n\"); printf(\"* 1--CREAT FILE 2--DELETE FILE *\\n\"); printf(\"* 3--LIST FILE 4--QUIT *\\n\"); printf(\"***********************************\\n\"); printf(\"\\n\"); printf(\"Please Input Your Choice:\"); scanf(\"%d\ switch(choice) { case 1:printf(\"Input New File Name:\"); scanf(\"%s\ creat(newname); break; case 2:printf(\"Input delete File Name:\"); scanf(\"%s\ delete(delname); break; case 3:list(filehead);break; case 4:quit();exit(0); } } } 16 实验五 命令解释程序 1. 目的和要求 理解命令解释程序工作原理。 2. 实验内容 利用高级语言编写一个微型命令解释程序,接收并解释执行以下命令: dir 列出当前目录 cop 文件1 文件2 拷贝文件 era 文件名 删除文件 dat 显示日期 tim 显示时间 end 结束,退出 画出程序流程图,编写程序,实现上述功能。 3. 实验环境 PC兼容机/Windows、DOS系统/Turbo C 2.0 4. 参考程序 #include int i,num; char *comm=\"\char gjz[6][4]={\"dir\ while(1) { printf(\"*****************\\n\"); printf(\"*dir:List File *\\n\"); printf(\"*cop:Copy File *\\n\"); printf(\"*era:Delete File*\\n\"); printf(\"*dat:Date *\\n\"); printf(\"*tim:Time *\\n\"); printf(\"*end:Quit *\\n\"); printf(\"*****************\\n\"); printf(\"Please Input Command:\\n\"); scanf(\"%s\for(i=0;i<6;i++) { if(!strcmp(comm,gjz[i])) {num=i; break;} num=9; } command=\"\"; src=\"\"; des=\"\"; delf=\"\"; switch(num) { case 0:command=\"dir\";break; case 1:printf(\"Please Input Source File:\"); scanf(\"%s\ 17 printf(\"\\nPlease Input Destination:\"); scanf(\"%s\ command=strcat(command,\"copy \"); command=strcat(command,src); command=strcat(command,\" \"); command=strcat(command,des); break; case 2:printf(\"Please Input Delete File:\"); scanf(\"%s\ command=strcat(command,\"del \"); command=strcat(command,delf); break; case 3:command=\"date\";break; case 4:command=\"time\";break; case 5:printf(\"Bye Bye\");exit(0); default:printf(\"Err Command,Input Command Again!\\n\"); } if(num>=0&&num<=5) system(command); } } 18 因篇幅问题不能全部显示,请点此查看更多更全内容