自考操作系統(tǒng)上機(jī)_第1頁
自考操作系統(tǒng)上機(jī)_第2頁
自考操作系統(tǒng)上機(jī)_第3頁
自考操作系統(tǒng)上機(jī)_第4頁
自考操作系統(tǒng)上機(jī)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

一、進(jìn)程調(diào)度進(jìn)程調(diào)度算法有FIFO,優(yōu)先數(shù)調(diào)度算法,時(shí)間片輪轉(zhuǎn)調(diào)度算法,分級(jí)調(diào)度算法,目前主要是考FIFO和優(yōu)先數(shù)調(diào)度算法(靜態(tài)優(yōu)先級(jí))。進(jìn)程調(diào)度算法的數(shù)據(jù)結(jié)構(gòu)主要有:進(jìn)程函數(shù)定義:建立進(jìn)程函數(shù),進(jìn)程調(diào)度函數(shù)一個(gè)網(wǎng)友做的一個(gè)FIFO調(diào)度算法的示例:#include"stdio.h"#definemax100#definepfree0/*processend*/#definerunning1/*processrunningstatus*/#defineaready2/*processareadystatus*/#defineblocking3/*processareadyblockingstatus*/typedefstructnode{charname;intstatus;intprecendence;intax,bx,cx,dx;intpc;intpsw;structnode*next;/*pcbdefine*/}pcb;pcb*createprocess(pcb*head){pcb*p,*q;inta,b,c,d,m,n;charID;ints;q=NULL;printf("\ninputthefirstsevenstatuspcb:");scanf("\n%c",&ID);scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&m,&n);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=pre;p->status=aready;if(head==NULL)head=p;elseq->next=p;q=p;printf("\ninputthenextpcb:");scanf("\n%c",&ID);scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&m,&n);}if(q!=NULL)q->next=NULL;q=head;while(q){printf("\npeocessname.status.ax.bx.cx.dx.pc.psw.\n");printf("%10c%5d%8d%5d%5d%5d%5d%5d%5d",q->name,q->status,q->precendence,q->ax,q->bx,q->cx,q->dx,q->pc,q->psw);q=q->next;}returnhead;/*createprocessend*/}voidprocessfifo(pcb*head)/*usefifo*/{pcb*p;p=head;printf("\ntheprocessusefifomethod.\n");printf("runningthefristprocess:\n");while(p!=NULL){p->status=running;printf("\nprocessnamestatus.ax.bx.cx.dx.pc.psw.");printf("\n%10c%5d%8d%5d%5d%5d%5d%5d",p->name,p->status,p->ax,p->bx,p->cx,p->dx,p->pc,p->psw);/*checkprocessrunningstatus*/p->status=0;p=p->next;}printf("\ncheckweatherfertheprocesscomplete:");p=head;while(p){printf("\n%3c%3d",p->name,p->status);p=p->next;}printf("\ngameisover!\n");}}}main(){pcb*head;head=NULL;head=createprocess(head);processfifo(head);}.二、模擬存儲(chǔ)管理中內(nèi)存空間的管理和分配內(nèi)存空間的管理分為固定分區(qū)管理方式,可變分區(qū)管理方式,頁式存儲(chǔ)管理,段式存儲(chǔ)管理。下面是頁式存儲(chǔ)管理和可變分區(qū)管理的兩個(gè)例子:如2002(?)的北京大學(xué)主考的上機(jī)試題:內(nèi)存被劃分成2048塊(頁)。用32位字長(zhǎng)的字存放位示圖,為0的位表示該塊尚未分配,為1的位表示該塊已分配。實(shí)習(xí)檢查:1、運(yùn)行程序,由檢查教師給出文件名,該文件中存有內(nèi)存目前狀況的位示圖的數(shù)據(jù)(0和1的文件)。(程序應(yīng)做提示,界面友好)。2、 你所編制的程序應(yīng)讀入數(shù)據(jù),存放在相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中。3、 顯示友好的用戶界面,由檢查教師輸入內(nèi)存申請(qǐng)(總塊數(shù))。4、 根據(jù)申請(qǐng)和位示圖狀態(tài),為用戶分配內(nèi)存,并建立頁表。5、輸出位示圖和頁表。我這個(gè)題目編了一個(gè),但是還沒有輸進(jìn)去,相信大家都能做出來。數(shù)據(jù)結(jié)構(gòu):用一個(gè)數(shù)組來表示內(nèi)存狀況,頁表。函數(shù)定義:內(nèi)存申請(qǐng)函數(shù)以下是論壇上網(wǎng)友提供的另一道模擬內(nèi)存分配與回收的試題的答案,具體試題不知道是什么:#definen10/*假定系統(tǒng)允許的最大作業(yè)為,假定模擬實(shí)驗(yàn)中n值為10*/#definem10/*假定系統(tǒng)允許的空閑區(qū)表最大為m,假定模擬實(shí)驗(yàn)中m值為10*/#defineminisize100struct{floataddress;/*已分分區(qū)起始地址*/floatlength;/*已分分區(qū)長(zhǎng)度,單位為字節(jié)*/intflag;/*已分配區(qū)表登記欄標(biāo)志,用"0"表示空欄目*/}used_table[n];/*已分配區(qū)表*/struct{floataddress;/*空閑區(qū)起始地址*/floatlength;/*空閑區(qū)長(zhǎng)度,單位為字節(jié)*/intflag;/*空閑區(qū)表登記欄標(biāo)志,用"0"表示空欄目,用"1"表示未分配*/}free_table[m];/*空閑區(qū)表*/allocate(J,xk)charJ;floatxk;/*采用最優(yōu)分配算法分配xk大小的空間*/{inti,k;floatad;k=-1;for(i=0;i<m;i++)/*尋找空間大于xk的最小空閑區(qū)登記項(xiàng)k*/if(free_table[i].length>=xk&&free_table[i].flag==1)if(k==-1||free_table[i].length<free_table[k].length)k=i;if(k==-1)/*未找到可用空閑區(qū),返回*/{printf("無可用空閑區(qū)\n");return;}/*找到可用空閑區(qū),開始分配:若空閑區(qū)大小與要求分配的空間差小于msize大小,則空閑區(qū)全部分配;若空閑區(qū)大小與要求分配的空間差大于minisize大小,則從空閑區(qū)劃出一部分分配*/if(free_table[k].length-xk<=minisize){free_table[k].flag=0;ad=free_table[k].address;xk=free_table[k].length;}else{free_table[k].length=free_table[k].length-xk;ad=free_table[k].address+free_table[k].length;}/*修改已分配區(qū)表*/i=0;while(used_table[i].flag!=0&&i<n)/*尋找空表目*/i++;if(i>=n)/*無表目填寫已分分區(qū)*/{printf(”無表目填寫已分分區(qū),錯(cuò)誤\n");/*修正空閑區(qū)表*/if(free_table[k].flag==0)/*前面找到的是整個(gè)空閑分區(qū)*/free_table[k].flag=1;else{/*前面找到的是某個(gè)空閑分區(qū)的一部分*/free_table[k].length=free_table[k].length+xk;return;}}else{/*修改已分配表*/used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=J;}return;}/*主存分配函數(shù)結(jié)束*/reclaim(J)charJ;/*回收作業(yè)名為J的作業(yè)所占主存空間*/{inti,k,j,s,t;floatS,L;/*尋找已分配表中對(duì)應(yīng)登記項(xiàng)*/s=0;while((used_table[s].flag!=J||used_table[s].flag==0)&&s<n)s++;if(s>=n)/*在已分配表中找不到名字為J的作業(yè)*/{printf(”找不到該作業(yè)\n");return;}/*修改已分配表*/used_table[s].flag=0;/*取得歸還分區(qū)的起始地址S和長(zhǎng)度L*/S=used_table[s].address;L=used_table[s].length;j=-1;k=-1;i=0;/*尋找回收分區(qū)的空閑上下鄰,上鄰表目k,下鄰表目j*/while(i<m&&(j==-1||k==-1)){if(free_table[i].flag==1){if(free_table[i].address+free_table[i].length==S)k=i;/*找到上鄰*/if(free_table[i].address==S+L)j=i;/*找到下鄰*/}i++;}if(k!=-1)if(j!=-1)/*上鄰空閑區(qū),下鄰空閑區(qū),三項(xiàng)合并*/{free_table[k].length=free_table[j].length+free_table[k].length+L;free_table[j].flag=0;}else/*上鄰空閑區(qū),下鄰非空閑區(qū),與上鄰合并*/free_table[k].length=free_table[k].length+L;elseif(j!=-1)/*上鄰非空閑區(qū),下鄰為空閑區(qū),與下鄰合并*/{free_table[j].address=S;free_table[j].length=free_table[j].length+L;}else/*上下鄰均為非空閑區(qū),回收區(qū)域直接填入*/{/*在空閑區(qū)表中尋找空欄目*/t=0;while(free_table[t].flag==1&&t<m)t++;if(t>=m)/*空閑區(qū)表滿,回收空間失敗,將已分配表復(fù)原*/{printf("主存空閑表沒有空間,回收空間失敗\n");used_table[s].flag=J;return;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return;}/*主存回收函數(shù)結(jié)束*/main(){inti,a;floatxk;charJ;/*空閑分區(qū)表初始化:*/free_table[0].address=10240;free_table[0].length=102400;free_table[0].flag=1;for(i=1;i<m;i++)free_table[i].flag=0;/*已分配表初始化:*/for(i=0;i<n;i++)used_table[i].flag=0;while(1){printf("選擇功能項(xiàng)(0-退出,1-分配主存,2-回收主存,3-顯示主存)\n");printf("選擇功項(xiàng)(0~3):");scanf("%d",&a);switch(a){case0:exit(0);/*a=0程序結(jié)束*/case1:/*a=1分配主存空間*/printf("輸入作業(yè)名J和作業(yè)所需長(zhǎng)度xk:");scanf("%*c%c%f",&J,&xk);allocate(J,xk);/*分配主存空間*/break;case2:/*a=2回收主存空間*/printf("輸入要回收分區(qū)的作業(yè)名");scanf("%*c%c",&J);reclaim(J);/*回收主存空間*/break;case3:/*a=3顯示主存情況*//*輸出空閑區(qū)表和已分配表的內(nèi)容*/printf("輸出空閑區(qū)表:\n起始地址分區(qū)長(zhǎng)度標(biāo)志\n");for(i=0;i<m;i++)printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length,free_table[i].flag);printf("按任意鍵,輸出已分配區(qū)表\n");getch();printf("輸出已分配區(qū)表:\n起始地址分區(qū)長(zhǎng)度標(biāo)志\n");for(i=0;i<n;i++)if(used_table[i].flag!=0)printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length,used_table[i].flag);elseprintf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length,used_table[i].flag);break;default:printf("沒有該選項(xiàng)\n");}/*case*/}/*while*/}/*主函數(shù)結(jié)束*/三、虛擬存儲(chǔ)管理器的頁面調(diào)度頁面調(diào)度算法主要有:FIFO,最近最少使用調(diào)度算法(LRU),最近最不常用調(diào)度算法(LFU),最佳算法(OPT)這幾種算法的調(diào)度都有可能在考試中碰到。關(guān)于這一類型,大家還可以參看書本251頁的實(shí)驗(yàn)指導(dǎo)。如2001年考題:要求:1。實(shí)現(xiàn)三種算法:1。先進(jìn)先出2。OPT3。LRU2。 頁面序列從指定的文本文件(TXT文件)中取出3。 輸出:第一行:每次淘汰的頁面號(hào)第二行:顯示缺頁的總次數(shù)以下是網(wǎng)友做的答案:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#definenull0#definelensizeof(structpage)structpage{intnum;inttag;structpage*next;};structpage*create(intn)/*建立分配的內(nèi)存空間,并初始化,返回頭結(jié)點(diǎn)*/{intcount=1;structpage*p1,*p2,*head;head=p2=p1=(structpage*)malloc(len);p1->tag=-1;p1->num=-1;while(count<n){count++;p1=(structpage*)malloc(len);p1->tag=-1;p1->num=-1;p2->next=p1;p2=p1;}p2->next=null;return(head);}voidFIFO(array,n)intarray[],n;{int*p;structpage*cp,*dp,*head,*new;intcount=0;head=create(n);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=(structpage*)malloc(len);new->num=*p;new->tag=0;new->next=null;cp->next=new;head=head->next;printf("%d",dp->num);free(dp);}}p++;}printf("\nQueyeZongshu:%d\n",count);}voidLRU(array,n)intarray[],n;{intcount=0,*p=array;structpage*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){if(cp!=head)rp->next=cp->next;elsehead=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=(structpage*)malloc(len);new->num=*p;new->tag=0;new->next=null;cp->next=new;dp=head;head=head->next;printf("%d",dp->num);free(dp);}}p++;}printf("\nQueyeZongshu:%d\n",count);}OPT(array,n)intarray[],n;{int*p,*q,count=0,i;structpage*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;if(cp->tag==-1){printf("*");cp->num=*p;cp->tag=0;}else{i=1;q=p;q++;cp=head;while(*q!=-1&&i<n){for(;*q!=cp->num&&cp->next!=null;)cp=cp->next;if(*q==cp->num){cp->tag=1;i++;}q++;cp=head;}if(i==n){for(;cp->tag!=0;)cp=cp->next;printf("%d",cp->num);cp->num=*p;}else{cp=head;for(;cp->tag!=0;)cp=cp->next;if(cp==head){for(;cp->next!=null;)cp=cp->next;new=(structpage*)malloc(len);new->num=*p;new->tag=0;new->next=null;cp->next=new;dp=head;head=head->next;printf("%d",dp->num);free(dp);}else{printf("%d",cp->num);cp->num=*p;}}cp=head;for(;cp->next!=null;){cp->tag=0;cp=cp->next;}cp->tag=0;}}elseprintf("!");p++;}printf("\nQueyeZongshu:%d\n",count);}main(){FILE*fp;charpt;charstr[10];inti,j=0;intpage[50],space=0;for(i=0;i<50;i++)page[i]=-1;fp=fopen("page.txt","r+");if(fp==NULL){printf("Cann'topenthefile\n");exit(0);}i=0;while((pt=fgetc(fp))!=EOF)/*將數(shù)字字符串轉(zhuǎn)化成整型一開始*/{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;}}}}}/*結(jié)束*/if(pt==EOF){str[i]='\0';page[j]=atoi(str);}i=0;while(page[i]!=-1){printf("%d",page[i]);i++;}fclose(fp);printf("\n");printf("!:meannomoved\n*:meanhavefreespace\n\n");printf("FIFO");FIFO(page,3);printf("\nLRU");LRU(page,3);printf("\nOPT");OPT(page,3);}四、文件管理文件管理的試題比較多,主要就是模擬*作系統(tǒng)中的建立文件、打開文件、讀文件、寫文件、關(guān)閉文件、、刪除文件、、建立目錄、、顯示目錄內(nèi)容、顯示文件內(nèi)容、改變文件屬性等*作。大家可以參考書本253頁的上機(jī)指導(dǎo)。北大2001年試題:建立一個(gè)樹型文件目錄假設(shè)程序啟動(dòng)運(yùn)行后在根目錄下且根目錄為空。實(shí)習(xí)檢查:1、運(yùn)行程序,由檢查教師給出文件名,該文件中存有相應(yīng)的若干命令。(程序應(yīng)做提示,界面友好)。2、要求實(shí)現(xiàn)兩個(gè)命令:mkdir目錄名(目錄已存在,應(yīng)給出錯(cuò)誤信息。)cd目錄名(目錄不存在,應(yīng)給出錯(cuò)誤信息。)3、你所編制的程序應(yīng)讀入文件,并執(zhí)行其中的每一條命令。4、在屏幕上顯示文件目錄的結(jié)構(gòu)。(界面自己設(shè)計(jì),但要清晰明了。)2002年北京大學(xué)的試題:*作系統(tǒng)上機(jī)考試題*作系統(tǒng)上機(jī)考試題題目:模擬文件系統(tǒng)要求:模擬一個(gè)文件系統(tǒng),包括目錄文件,普通文件,并實(shí)現(xiàn)對(duì)它們的一些基本*作。假定每個(gè)目錄文件最多只能占用一個(gè)塊;一個(gè)目錄項(xiàng)包括文件名(下一級(jí)目錄名),文件類型,文件長(zhǎng)度,指向文件內(nèi)容(下一級(jí)目錄)的指針內(nèi)容。普通文件可以只用目錄項(xiàng)(FCB)代表。(詳細(xì)的數(shù)據(jù)結(jié)構(gòu)見后面的說明)程序功能方面的要求:需要實(shí)現(xiàn)一個(gè)命令行*作界面,包含如下命令:改變目錄格式:CD〈目錄名〉功能:工作目錄轉(zhuǎn)移到指定的目錄下,只要求完成改變到當(dāng)前目錄的某一個(gè)子目錄下的功能,不要求實(shí)現(xiàn)相對(duì)目錄以及絕對(duì)目錄。創(chuàng)建文件格式:CREATE〈文件名〉〈文件長(zhǎng)度〉功能:創(chuàng)立一個(gè)指定名字的新文件,即在目錄中增加一項(xiàng),不考慮文件內(nèi)容,但必須能輸入文件長(zhǎng)度。刪除文件格式:DEL〈希望刪除的文件名〉功能:刪除指定的文件顯示目錄格式:LSALL功能:顯示全部目錄以及文件,輸出時(shí)要求先輸出接近根的目錄,再輸出子目錄。圖示如圖。創(chuàng)建目錄格式:MD〈目錄名〉功能:在當(dāng)前路徑下創(chuàng)建指定的目錄刪除目錄格式:RD〈目錄名〉功能:刪除當(dāng)前目錄下的指定目錄,如果該目錄為空,則可刪除,否則應(yīng)提示是否作刪除,刪除*作將該目錄下的全部文件和子目錄都刪除。對(duì)于上述功能要求,完成1-4為及格,完成1-5為良,完成1-6為優(yōu)。程序?qū)崿F(xiàn)方面的要求:對(duì)于重名(創(chuàng)建時(shí)),文件不存在(刪除時(shí)),目錄不存在(改變目錄時(shí))等錯(cuò)誤*作情況,程序應(yīng)該作出相應(yīng)處理并給出錯(cuò)誤信息,但是程序不得因此而退出。界面友好,程序強(qiáng)壯。界面的提示符為#,提示的命令以及調(diào)試的方法應(yīng)和前面的要求一致。不要自己設(shè)計(jì)命令或者附加不要求的功能。在考卷的說明部分(背面)有一段程序的源代碼以及對(duì)源代碼的說明,考試的編碼應(yīng)在這個(gè)程序的基礎(chǔ)上修改而成。這段源代碼中規(guī)定了文件系統(tǒng)使用的數(shù)據(jù)結(jié)構(gòu)和需要實(shí)現(xiàn)的函數(shù)框架,請(qǐng)將你的實(shí)現(xiàn)代碼填寫到合適的位置中去,可以自己添加輔助數(shù)據(jù)結(jié)構(gòu)、變量、常量以及函數(shù),但是不得改變已有的代碼(如數(shù)據(jù)結(jié)構(gòu)的定義以及函數(shù)的名稱以及參數(shù)說明)??荚囂峤坏脑闯绦蛘?qǐng)命名為filesys.c。6程序設(shè)計(jì)環(huán)境使用TC2.0,在DOS*作系統(tǒng)下完成全部程序代碼。初始化程序代碼:#include"stdio.h"#include"string.h"#include"malloc.h"structNomalFile{charname[50];/*filename*/inttype;/*0-directoryfile,1-commonfile*/intsize;/*filesize*/};structDirectoryNode{inttag;/*0-dumpnode,1-realnode*/charname[50];inttype;/*0-directoryfile1-commanfile*/union{structNomalFile*p_nomFile;/*pointtocommanfile*/structDirectoryFile*p_dirFile;/*pointtodirctoryfile*/}p_File;/*lookoninitializingcode*/};structDirectoryFile{/*directoryfilecomposedbyanodearray*//*nodes*/structDirectoryNodenodesArray[10];};/*initializingfilesystem*/voidinit(){inti,j;structDirectoryFileroot;structNomalFile*newNomFile;structDirectoryNode*newNode;structDirectoryFile*newDirFile;structDirectoryFile*curDirFile;for(i=0;i<10;i++)/*initialadirectory*/root.nodesArray[i].tag=0;newDirFile=(structDirectoryFile*)malloc(1100);for(i=0;i<10;i++)newDirFile->nodesArray[i].tag=0;root.nodesArray[0].tag=1;strcpy(root.nodesArray[0].name,"A");root.nodesArray[0].type=0;root.nodesArray[0].p_File.p_dirFile=newDirFile;newDirFile=(structDirectoryFile*)malloc(1100);for(i=0;i<10;i++)newDirFile->nodesArray[i].tag=0;root.nodesArray[1].tag=1;strcpy(root.nodesArray[1].name,"B");root.nodesArray[1].type=0;root.nodesArray[1].p_File.p_dirFile=newDirFile;newDirFile=(structDirectoryFile*)malloc(1100);for(i=0;i<10;i++)newDirFile->nodesArray[i].tag=0;root.nodesArray[2].tag=1;strcpy(root.nodesArray[2].name,"C");root.nodesArray[2].type=0;root.nodesArray[2].p_File.p_dirFile=newDirFile;newNomFile=(structNomalFile*)malloc(108);strcpy((*newNomFile).name,"F1");(*newNomFile).type=1;(*newNomFile).size=500;printf("%s\n",(*newNomFile).name);root.nodesArray[3].tag=1;strcpy(root.nodesArray[3].name,(*newNomFile).name);root.nodesArray[3].type=(*newNomFile).type;root.nodesArray[3].p_File.p_nomFile=newNomFile;newNomFile=(structNomalFile*)malloc(108);strcpy((*newNomFile).name,"F2");(*newNomFile).type=1;(*newNomFile).size=50;printf("%s\n",(*newNomFile).name);root.nodesArray[4].tag=1;strcpy(root.nodesArray[4].name,(*newNomFile).name);root.nodesArray[4].type=(*newNomFile).type;root.nodesArray[4].p_File.p_nomFile=newNomFile;newNomFile=(structNomalFile*)malloc(108);strcpy((*newNomFile).name,"F3");(*newNomFile).type=1;(*newNomFile).size=5;printf("%s\n",(*newNomFile).name);root.nodesArray[5].tag=1;strcpy(root.nodesArray[5].name,(*newNomFile).name);root.nodesArray[5].type=(*newNomFile).type;root.nodesArray[5].p_File.p_nomFile=newNomFile;curDirFile=root.nodesArray[1].p_File.p_dirFile;newNomFile=(structNomalFile*)malloc(108);strcpy((*newNomFile).name,"F4");(*newNomFile).type=1;(*newNomFile).size=123;printf("%s\n",(*newNomFile).name);curDirFile->nodesArray[0].tag=1;strcpy(curDirFile->nodesArray[0].name,(*newNomFile).name);curDirFile->nodesArray[0].type=(*newNomFile).type;curDirFile->nodesArray[0].p_File.p_nomFile=newNomFile;printf("%s\n",curDirFile->nodesArray[0].p_File.p_nomFile->name);curDirFile=root.nodesArray[2].p_File.p_dirFile;newDirFile=(structDirectoryFile*)malloc(1100);for(i=0;i<10;i++)newDirFile->nodesArray[i].tag=0;curDirFile->nodesArray[0].tag=1;strcpy(curDirFile->nodesArray[0].name,"D");curDirFile->nodesArray[0].type=0;curDirFile->nodesArray[0].p_File.p_dirFile=newDirFile;newNomFile=(structNomalFile*)malloc(108);strcpy((*newNomFile).name,"F5");(*newNomFile).type=1;(*newNomFile).size=321;printf("%s\n",(*newNomFile).name);curDirFile->nodesArray[1].tag=1;strcpy(curDirFile->nodesArray[1].name,(*newNomFile).name);curDirFile->nodesArray[1].type=(*newNomFile).type;curDirFile->nodesArray[1].p_File.p_nomFile=newNomFile;curDirFile=curDirFile->nodesArray[0].p_File.p_dirFile;newNomFile=(structNomalFile*)malloc(108);strcpy((*newNomFile).name,"F6");(*newNomFile).type=1;(*newNomFile).size=10;printf("%s\n",(*newNomFile).name);curDirFile->nodesArray[0].tag=1;strcpy(curDirFile->nodesArray[0].name,(*newNomFile).name);curDirFile->nodesArray[0].type=(*newNomFile).type;curDirFile->nodesArray[0].p_File.p_nomFile=newNomFile;newNomFile=(structNomalFile*)malloc(108);strcpy((*newNomFile).name,"F7");(*newNomFile).type=1;(*newNomFile).size=70;printf("%s\n",(*newNomFile).name);curDirFile->nodesArray[1].tag=1;strcpy(curDirFile->nodesArray[1].name,(*newNomFile).name);curDirFile->nodesArray[1].type=(*newNomFile).type;curDirFile->nodesArray[1].p_File.p_nomFile=newNomFile;}intcd(char*str){return0;}/*changecurrentdirctory*/intcreate(char*str,intnum){return0;}/*createfile*/intdelete(char*str){return0;}/*deletefile*/voidlsall(){}/*displayalldirectoryfiles*/intmd(char*str){return0;}/*createdirctory*/intrd(char*str){return0;}/*deletedirctory*/voidmain(){}五、磁盤調(diào)度2001年的試題磁盤調(diào)度算法要求:1。實(shí)現(xiàn)三種算法:1。先來先服務(wù)2。最短尋道優(yōu)先(老師會(huì)給當(dāng)前磁頭的位置)3。電梯算法2。 磁道服務(wù)順序從指定的文本文件(TXT文件)中取出3。 輸出:第一行:磁道的服務(wù)順序第二行:顯示移動(dòng)總道數(shù)參考題目:書P130以下是網(wǎng)友的答案:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#definenull0#definelensizeof(structcidaohao)structcidaohao{structcidaohao*pre;intnum;structcidaohao*next;};FCFS(array)intarray[50];{inti,j,sum=0;printf("\nFCFS:");for(i=1;array[i]!=-1;i++){printf("%d",array[i]);}i=0;for(i=0,j=1;array[j]!=-1;i++,j++){if(array[i]>array[j])sum+=(array[i]-array[j]);elsesum+=(array[j]-array[i]);}return(sum);}SSTF(head,now)structcidaohao*head;intnow;{structcidaohao*p,*lp,*rp;intsum=0,front,behind;p=head;printf("\nSSTF:");while(p->num!=now)p=p->next;/*確定now在連表中的位置*/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",p->num);rp=p->next;}else{sum+=front;p=lp;printf("%d",p->num);lp=p->pre;}}else{if(p->next==null){while(lp->num!=0){sum+=p->num-lp->num;p=lp;printf("%d",p->num);lp=p->pre;}return(sum);}if(p->pre==null){while(rp->num!=0){sum+=rp->num-p->num;p=rp;printf("%d",p->num);rp=p->next;}return(sum);}}}while(p->next!=null||p->pre!=null);}SCAN(head,n,m)structcidaohao*head;intn,m;{structcidaohao*p,*pp;intsum=0;printf("\nSCAN:");p=head;while(p->num!=m)p=p->next;/*確定m的位置*/pp=p;if(n<m){while(pp->next!=null){sum+=pp->next->num-pp->num;pp=pp->next;printf("%d",pp->num);}sum+=pp->num-p->pre->num;pp=p->pre;if(pp->num==0)return(sum);else{while(pp->pre!=null){printf("%d",pp->num);sum+=pp->num-pp->pre->num;pp=pp->pre;}printf("%d",pp->num);return(sum);}}else{while(pp->pre!=null){sum+=pp->num-pp->pre->num;pp=pp->pre;printf("%d",pp->num);}sum+=p->next->num-pp->num;pp=p->next;if(pp->num==0)return(sum);else{while(pp->next!=null){printf("%d",pp->num);sum+=pp->next->num-pp->num;pp=pp->next;}printf("%d",pp->num);return(sum);}}}main(){FILE*fp;charpt;charstr[10];intcidao[100],i,j=1,count1=0,count2=0,count3=0,last,space=0;structcidaohao*pl,*p2,*new,*head;/*用于建立連表的變量*/structcidaohao*p,*lp,*rp;for(i=0;i<50;i++)cidao[i]=-l;i=0;fp=fopen("cipan.txt","r+");/*讓fp指向文件*/if(fp==NULL){printf("Cann'topenthisfile");exit(0);}printf("\nPleaseinputcidaohaonow:");scanf("%d",&cidao[0]);while((pt=fgetc(fp))!=EOF)/*將數(shù)字字符串轉(zhuǎn)化成整型一開始*/{if(pt>='0'&&pt<='9'){str[i]=pt;i++;space=0;}else{if(pt==''||pt=='\n'){if(space==l)break;else{str[i]='\0';cidao[j]=atoi(str);if(pt=='\n')break;else{space=l;j++;i=0;}}}}}/*結(jié)束*/if(pt==EOF){str[i]='\0';cidao[j]=atoi(str);}fclose(fp);i=0;count1=FCFS(cidao);/*FCFS調(diào)度的移動(dòng)總量*/printf("\nTheTotal:%d\n",count1);pl=p2=head=(structcidaohao*)malloc(len);/*開始建立雙連表*/p1->pre=null;pl->num=cidao[0];pl->next=null;i=l;while(cidao[i]!=-l){if(cidao[i]<head->num)/*插入頭結(jié)點(diǎn)*/{pl=(structcidaohao*)malloc(len);pl->next=head;pl->pre=null;pl->num=cidao[i];head->pre=pl;head=pl;}else{while(p1->next!=null&&p1->num<=cidao[i])/*搜索合適位置*/{p2=pl;p1=p1->next;}if(p1->num>cidao[i])/*插入中間的情況*/{new=(structcidaohao*)malloc(len);new->num=cidao[i];new->next=p1;new->pre=p2;p1->pre=new;p2->next=new;}else{/*插入尾部*/new=(structcidaohao*)malloc(len);new->num=cidao[i];new->next=null;new->pre=p1;p1->next=new;}pl=head;/*始終保證插入結(jié)束后pl指向頭結(jié)點(diǎn)*/}i++;/*截取下一個(gè)cidao[i]*/}count2=SSTF(head,cidao[0]);printf("\nTheTotal:%d",count2);printf("\n\nPleastinputlastcipanhao:");scanf("%d",&last);count3=SCAN(head,last,cidao[0]);printf("\nTheTotal:%d\n",count3);}六、作業(yè)調(diào)度作業(yè)調(diào)度主要有FIFO,運(yùn)算時(shí)間短的作業(yè)優(yōu)先,優(yōu)先數(shù)調(diào)度算法,響應(yīng)比最高者優(yōu)先調(diào)度算法,均衡調(diào)度算法。中山大學(xué)2002l2月*作系統(tǒng)上機(jī)實(shí)驗(yàn),實(shí)例:模擬批處理作業(yè)的調(diào)度。要求:1) 設(shè)計(jì)你用來存放'輸入井'中作業(yè)的數(shù)據(jù)結(jié)構(gòu)。2) 編寫一個(gè)實(shí)現(xiàn)'響應(yīng)比最高者優(yōu)先算法'的程序。(寫出類C算法)七、實(shí)現(xiàn)多道程序的轉(zhuǎn)換調(diào)度(作業(yè)調(diào)度和進(jìn)程調(diào)度結(jié)合在一起)如2001年試題:1。實(shí)現(xiàn)多道程序的轉(zhuǎn)換調(diào)度(作業(yè)調(diào)度和進(jìn)程調(diào)度結(jié)合在一起)(1)作業(yè)流信息是從指定文本文件(TXT文件)中讀取作業(yè)信息:作業(yè)號(hào)進(jìn)入系統(tǒng)時(shí)間估計(jì)運(yùn)行時(shí)間優(yōu)先級(jí)內(nèi)存需求量磁帶機(jī)需求量都為整型(2) 作業(yè)調(diào)度算法:1。先來先服務(wù)2,最短作業(yè)優(yōu)先(二者選一)進(jìn)程調(diào)度算法:1。先來先服務(wù)2。基于優(yōu)先級(jí)的算法(靜態(tài)優(yōu)先級(jí))(二者選一)(3) 輸出:作業(yè)序列格式:作業(yè)號(hào)時(shí)間間隔1800-810(/*8:00-8:10*/)2810-9001900-930平均周轉(zhuǎn)時(shí)間:總的周轉(zhuǎn)時(shí)間/作業(yè)總數(shù)周轉(zhuǎn)時(shí)間就是作業(yè)結(jié)束時(shí)間減去作業(yè)進(jìn)入系統(tǒng)時(shí)間網(wǎng)友的答案:#include<stdio.h>#include<string.h>#include<process.h>#include<stdlib.h>#include<conio.h>#definenull0#definelensizeof(structjnote)structjcb{intstate;intnum;intin;intrun;intpri;intmem;inttape;}job[50];structjnote{intid;intin;intstart;intrun;intend;intpri;intsize;inttape;int*maddr;structjnote*next;};intrest=4,memory[101],*mh=memory,logo=0,fid=0;structjcb*p=job;structjnote*jh=null,*rp=null,*jp=null;txt()/*從txt文件中作業(yè)流*/{FILE*fp;charpt;inti,space=0,j=0,data[100],h,k,count;charstr[10];for(i=0;i<100;i++)data[i]=-1;for(i=0;i<20;i++){job[i].num=-1;job[i].tape=-1;job[i].state=-1;}i=0;fp=fopen("job.txt","r+");if(fp==NULL){printf("Cann'tthefile\n");exit(0);}while((pt=getc(fp))!=EOF){if(pt>='0'&&pt<='9'){str[i]=pt;i++;space=0;}else{if(pt==''||pt=='\n'){if(space==1)continue;else{str[i]='\0';data[j]=atoi(str);j++;i=0;space=1;}}}}for(h=0,k=0;data[k]!=-1;k++,h++){job[h].num=data[k];k++;job[h].in=data[k];k++;job[h].run=data[k];k++;job[h].pri=data[k];k++;job[h].mem=data[k];k++;job[h].tape=data[k];}if(job[h-1].tape==-1){str[i]='\0';job[h-1].tape=atoi(str);}clrscr();for(i=0;job[i].num!=-1;i++);return(i);}rpend(start,run)/*計(jì)算進(jìn)程的結(jié)束時(shí)間*/intstart,run;{intend=0;inti=start%100+run;end=(start/100+i/60)*100+i%60;return(end);}time_time(end,in)/*計(jì)算周轉(zhuǎn)時(shí)間或計(jì)算剩余的運(yùn)行時(shí)間*/intin,end;{inttime;time=end/100*60+end%100-(in/100*60+in%100);return(time);}int*m_pd(intsize)/*內(nèi)存判斷*/{int*mp,*cp;inti=0;mp=cp=mh;while(*mp!=-1){while(*cp==0){cp++;i++;}if(i>=size)return(mp);while(*cp==1)cp++;mp=cp;}return(null);}zy_div_free(mp,msize,tape,h)/*資源分配與釋放*/int*mp,msize,tape,h;{int*cp,i=msize;cp=mp;if(h==1){for(;i>0;i--){*cp=1;cp++;}rest=rest-tape;return(1);}if(h==2){for(;i>0;i--){*cp=0;cp++;}rest=rest+tape;return(2);}}selectrp(plogo,time)/*選擇當(dāng)前運(yùn)行進(jìn)程*/intplogo,time;{structjnote*newj;structjnote*temp;if(jh==null&&rp==null){p=job;for(;p->state==0;)p++;zy_div_free(mh,p->mem,p->tape,1);p->state=0;newj=(structjnote*)malloc(len);rp=newj;rp->run=p->run;rp->end=0;rp->id=p->num;rp->in=p->in;rp->start=p->in;rp->pri=p->pri;rp->size=p->mem;rp->tape=p->tape;rp->maddr=mh;rp->next=null;rp->run=p->run;rp->end=0;return(0);}else{if(jh!=null&&rp==null){rp=jh;jh=jh->next;rp->next=null;rp->start=time;if(plogo==2)selectrp(plogo,time);elsereturn(-1);}else{if(jh!=null&&rp!=null){if(plogo==2){if(logo==0){if(jh->pri>rp->pri){temp=jh;jh=jh->next;temp->next=rp;printf("%d:%d%d\n",rp->id,rp->start,temp->in);rp->run-=time_time(temp->in,rp->start);rp->start=0;rp=temp;rp->start=rp->in;return(0);}}if(fid==1){if(jh->pri>rp->pri){temp=jh;jh=jh->next;temp->next=rp;rp=temp;rp->start=time;selectrp(plogo,time);}else{rp->start=time;return(0);}}}return(0);}else{rp->start=time;return(0);}}}return(0);}WORK(jlogo,plogo,count)intjlogo,plogo,count;{intk=count,sum=0,time,t;/*sum是周轉(zhuǎn)時(shí)間之和*/structjnote*cp,*p1,*newj;int*mp;selectrp(plogo,0);while(k>0){p=job;do{if(p->state==0)p++;while(p->state==-1&&p->num!=-1&&((logo==0&&p->in<rpend(rp->start,rp->run))||(logo==1&&p->in<=rpend(rp->start,rp->run)))){mp=m_pd(p->mem);if(rest>=p->tape)t=1;elset=0;if(mp!=null&&t==1){zy_div_free(mp,p->mem,p->tape,1);p->state=0;newj=(structjnote*)malloc(len);newj->id=p->num;newj->in=p->in;newj->start=0;newj->run=p->run;newj->end=0;newj->pri=p->pri;newj->size=p->mem;newj->tape=p->tape;newj->maddr=mp;newj->next=null;if(jh==null){jh=newj;jp=jh;}else{if(jlogo==1){jp->next=newj;jp=newj;}/*作業(yè)為FCFS*/else/*作業(yè)為最短運(yùn)行時(shí)間優(yōu)先*/{jp=cp=jh;if(newj->run>=jp->run&&jp->next!=null){cp=jp;jp=jp->next;}else{if(newj->run<jp->run){if(cp==jp){newj->next=jp;jh=newj;}else{cp->next=newj;newj->next=jp;}}elsejp->next=newj;}}}if(plogo==2)selectrp(plogo,0);}p++;}}while(p->state==0);if(logo==0){zy_div_free(rp->maddr,rp->size,rp->tape,2);logo=1;}else{rp->end=rpend(rp->start,rp->run);/*此時(shí)計(jì)算結(jié)束時(shí)間*/printf("%d:%d%d\n",rp->id,rp->start,rp->end);sum+=time_time(rp->end,rp->in);/*計(jì)算周轉(zhuǎn)時(shí)間總和*/if(k-1==0){p1=rp;rp=rp->next;free(p1);break;}time=rp->end;p1=rp;rp=rp->next;free(p1);k--;fid=1;selectrp(plogo,time);fid=0;logo=0;}}printf("Theaveragetime:%d\n",sum/count);}init(){inti;for(i=0;job[i].num!=-1;i++)job[i].state=-1;logo=0;fid=0;}main(){inti,count;count=txt();/*返回作業(yè)總數(shù)*/for(i=0;i<100;i++)memory[i]=0;memory[i]=-l;mh=memory;/*內(nèi)存清0,處于未分配狀態(tài),最后一個(gè)用于標(biāo)識(shí)*/printf("Job_Process\n\n");printf("FCFS_FCFS:\n");WORK(1,1,count);/*作業(yè)FCFS,進(jìn)程FCFS*/init();printf("\nSHORT_FCFS:\n");WORK(2,1,count);/*作業(yè)最短運(yùn)行時(shí)間優(yōu)先,進(jìn)程FCFS*/printf("\n\nPleasepresskeybordtoseetheresultofprocessisPRI");getchar();clrscr();init();printf("Job_Process\n");printf("\nFCFS_PRI:\n");WORK(1,2,count);init();printf("\nSHORT_PRI:\n");WORK(2,2,count);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論