進程創(chuàng)建模擬實現(xiàn)_第1頁
進程創(chuàng)建模擬實現(xiàn)_第2頁
進程創(chuàng)建模擬實現(xiàn)_第3頁
進程創(chuàng)建模擬實現(xiàn)_第4頁
進程創(chuàng)建模擬實現(xiàn)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

題目1進程創(chuàng)建模擬實現(xiàn)1.1題目的主要研究內(nèi)容及預(yù)期達(dá)到的目標(biāo)至少創(chuàng)建10個進程;創(chuàng)建進程樹中4層以上的樹型結(jié)構(gòu)。理解進程創(chuàng)建相關(guān)理論;掌握進程創(chuàng)建方法;掌握進程相關(guān)數(shù)據(jù)結(jié)構(gòu)。1.2題目研究的工作基礎(chǔ)或?qū)嶒灄l件硬件環(huán)境:裝有Linux操作系統(tǒng)(虛擬機)的計算機一臺。軟件環(huán)境:vim編輯器、VisualC++。1.3設(shè)計思想(1)進程樹進程的創(chuàng)建過程是操作系統(tǒng)重要的處理過程之一。在系統(tǒng)中運行的進程都是由進程創(chuàng)建出來的,創(chuàng)建進程的進程與被創(chuàng)建的進程之間構(gòu)成父子關(guān)系,子進程還可以再創(chuàng)建它的子進程,由此可以構(gòu)成一顆進程樹,如圖1-1所示。根進程進程 進程子進程 子進程 子進程 子進程 子進程//\孫進程孫進程孫進程孫進程圖1-1進程樹(2)根進程子進程的創(chuàng)建是基于父進程的,因此一直追溯上去,總有一個進程是原始的,是沒有父進程的,這個進程是根進程。根進程沒有可復(fù)制和參考的對象,它所擁有的所有信息和資源都是強制設(shè)置的,不可復(fù)制的,這個過程稱為手工設(shè)置,也就是說根進程是“純手工打造”的,它是操作系統(tǒng)中“最原始”的一個進程,它是個模子,后面的任何進程都是基于根進程生成的。在Linux系統(tǒng)中的這個根進程的進程號是0,也把它叫做0號進程。創(chuàng)造0號進程主要包括兩部分:一是創(chuàng)建進程0運行時所需的所有信息,即填充0號進程;二是調(diào)度0號進程的執(zhí)行,即讓它“動”起來,只有動起來,才是真正意義上的進程,符合進程動態(tài)的概念。(3)進程的創(chuàng)建過程一但操作系統(tǒng)發(fā)現(xiàn)了要求創(chuàng)建進程的事件后,便調(diào)用進程創(chuàng)建原語按下述步驟創(chuàng)建一個新進程。A、 申請空白PCB為新進程申請獲得唯一的數(shù)字標(biāo)識符,并從PCB集合中索取一個空白PCB。如果無空白PCB,可以創(chuàng)建一個新的PCB。在本實驗中,每次動態(tài)創(chuàng)建PCB。B、 為新進程分配資源為新進程分配內(nèi)存空間和??臻g。C、 初始化進程控制塊a) 初始化標(biāo)識信息;b) 初始化處理機狀態(tài)信息;c) 初始化處理機控制信息。D、 將新進程插入就緒隊列1?4流程圖開始開始圖1-2進程創(chuàng)建流程圖1.5主要程序代碼(1)主程序源代碼:#include"basic.h"pnode*proot;〃系統(tǒng)進程樹的樹根pnode*plink;〃系統(tǒng)進程樹的連接頭intcreatepc(int*para){pnode*p,*pl,*pp;〃定義進程節(jié)點intpflag;//標(biāo)識pflag=0;for(p=plink;p;p=p->next){if(p->node->pid==para[0])//檢查進程是否已經(jīng)存在{printf("進程%d已經(jīng)存在!\n",para[0]);return-l;}if(p->node->pid==para[l])//查找父進程{pflag=l;pp=p;}}if(!pflag){printf("父進程%d不存在\n",para[1]);return-2;}//初始化一個新的進程控制塊pl=newpnode;//為pl創(chuàng)建一個新的節(jié)點p1->node=newpcb;//為pl節(jié)點創(chuàng)建一個新的進程控制塊p1->node->pid=para[0];〃對p1進程id進行賦值p1->node->ppid=para[1];〃對p1父進程id進行賦值p1->node->prio=para[2];〃對p1的優(yōu)先級進行賦值p1->sub=NULL;〃初始化p1->next=NULL;〃初始化p1->brother=NULL;〃初始化//添加進程樹if(!pp->sub)pp->sub=p1;elsefor(p=pp->sub;p->brother;p=p->brother);p->brother=p1;}//添加進程連接for(p=plink;p->next;p=p->next);p->next=p1;return0;}//顯示進程信息voidshowdetail(){pnode*p,*p1;p=plink;〃定位到頭節(jié)點for(;p;)//打印所有sub的信息{printf("%d(優(yōu)先級%d):",p->node->pid,p->node->prio);p1=p->sub;for(;pl;)//打印出pl的控制塊(sub)信息{printf("%d(優(yōu)先級%d)",pl->node->pid,pl->node->prio);pl=pl->brother;}printf("\n");p=p->next;}printf("\n");}intmain(){initerror();shortcflag,pflag;charcmdstr[32];proot=newpnode;proot->node=newpcb;proot->node->pid=0;proot->node->ppid=-l;proot->node->prio=0;proot->next=NULL;proot->sub=NULL;proot->brother=NULL;plink=proot;for(;;){cflag=0;pflag=0;printf("cmd:");scanf("%s",cmdstr);if(!strcmp(cmdstr,"exit"))〃退出程序,strcmp函數(shù)比較兩個字符串,相同返回0break;if(!strcmp(cmdstr,"showdetail"))//顯示進程信息{cflag=1;pflag=1;showdetail();}else//創(chuàng)建進程{int*para;char*s,*s1;s=strstr(cmdstr,"createpc");//strstr()函數(shù)搜索一個字符串在另一個字符串中的第一次出現(xiàn)。找到所搜索的字符串,if(s) //則該函數(shù)返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,則返回NULL。{cflag=1;para=(int*)malloc(3);s1=substr(s,instr(s,'(')+1,strlen(s)-2);//得到參數(shù)字符串para=strtoarray(sl);〃得到參數(shù)para[0],para[l],para[2]createpc(para);//創(chuàng)建進程pflag=l;}}if(!cflag)geterror(0);elseif(!pflag)geterror(l);}}(2)basic.h源代碼:#ifndefbasic_h#include<stdio.h>#include<string.h>#include<stdlib.h>#definebasic_hchar*errormsg[256];//進程控制塊structpcb{intpid;〃進程idintppid;//父進程idintprio;//優(yōu)先級};//進程節(jié)點structpnode{pcb*node;〃控制塊節(jié)點pnode*sub;〃用來存放控制中第一個進入的兄弟節(jié)點pnode*brother;〃兄弟節(jié)點pnode*next;〃下一個節(jié)點};//信號量structsemphore{charname[5];//名稱intcount;//計數(shù)值intcurpid;//當(dāng)前進程idpnode*wlist;//等待鏈表};#definegeterror(eno)printf("%s\n",errormsg[eno])voidiniterror(){errormsg[0]=(char*)malloc(20);errormsg[0]=(char*)"錯誤的指令!";errormsg[1]=(char*)malloc(20);errormsg[1]=(char*)"錯誤的參數(shù)!";}//得到字符串的字串char*substr(char*s,intstart,intend){char*s1;inti;intlen=strlen(s);if(start<0||end>=len||start>end)returnNULL;sl=(char*)malloc(end-start+2);〃強制轉(zhuǎn)換for(i=0;i<=end-start;i++)s1[i]=s[i+start];//從'('的下一個字符開始以此向s1[i]賦值,一直到')'的前一個結(jié)束s1[i]='\0';returns1;}//查找字符串中的位置intinstr(char*s,charc)〃返回start的值{unsignedi;for(i=0;i<strlen(s);i++)if(s[i]==c)returni;return-1;}//更改字符串?dāng)?shù)組數(shù)據(jù)int*strtoarray(char*s){int*a,count,x1;unsignedinti;charc,*s1,*s2;if(!s){printf(”字符串不能為空!\n");returnNULL;}count=0;s1=s;for(i=0;i<strlen(s1);i++)if(s1[i]==',')count++;count++;a=(int*)malloc(count);c=',';for(i=0;i<(unsignedint)count;i++){x1=instr(s1,c);if(x1>=0)

s2=substr(s1,0,x1s2=substr(s1,0,x1-1);elses2=s1;a[i]=atoi(s2);〃將字符串轉(zhuǎn)換成數(shù)組if(c==',')s1=substr(s1,x1+1,strlen(s1)-1);}returna;}#endif1.6運行結(jié)果及分析A.匚PPA.CPP*a.outbasic.hbasic?h~ztang@ubuntu:~/os/ljinchengchuangjianS*/zcnd:createpc(l,0?2)end:createpcf2^6,3)cmd:createpc(3,1,4)end:createpc(4,1,3)end:createpc(5,Z,3)end:createpcffi,2,4)end:createpc(7,3,6)end:createpc(8f3,2)lend:createpc(9,4,5)cmd:createpc(10,4,6)cndicreatepctll^S,3)cmdicreatepc(12,6,5)2) 2(優(yōu)先級4) 4(優(yōu)先級3) 6(優(yōu)先級08(優(yōu)先級5) 10(優(yōu)先級6)優(yōu)先級2) 2(優(yōu)先級4) 4(優(yōu)先級3) 6(優(yōu)先級08(優(yōu)先級5) 10(優(yōu)先級6

溫馨提示

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

評論

0/150

提交評論